diff --git a/.gitignore b/.gitignore index a0a8a7f..b188e26 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.class -jblas-1.2.5.jar -jheatchart-0.6.jar +myvenv +.ipynb_checkpoints +workspace.code-workspace +NAGPythonExamples diff --git a/BXNL/Readme.md b/BXNL/Readme.md new file mode 100644 index 0000000..4532989 --- /dev/null +++ b/BXNL/Readme.md @@ -0,0 +1,101 @@ +[![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](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)] + +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 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. +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 0000000..4175ee1 Binary files /dev/null and b/BXNL/images/b-ral_sif-e04gg-e04gb-NF.png differ diff --git a/BXNL/images/b-ral_sif-e04gg-e04gb-NG.png b/BXNL/images/b-ral_sif-e04gg-e04gb-NG.png new file mode 100644 index 0000000..fe629c6 Binary files /dev/null and b/BXNL/images/b-ral_sif-e04gg-e04gb-NG.png differ diff --git a/BXNL/images/b-ral_sif-e04gg-e04gb-NT.png b/BXNL/images/b-ral_sif-e04gg-e04gb-NT.png new file mode 100644 index 0000000..946ce3c Binary files /dev/null and b/BXNL/images/b-ral_sif-e04gg-e04gb-NT.png differ diff --git a/BXNL/images/est_orbit.png b/BXNL/images/est_orbit.png new file mode 100644 index 0000000..b922ba5 Binary files /dev/null and b/BXNL/images/est_orbit.png differ diff --git a/BXNL/images/estw_orbit.png b/BXNL/images/estw_orbit.png new file mode 100644 index 0000000..27c01ab Binary files /dev/null and b/BXNL/images/estw_orbit.png differ diff --git a/BXNL/images/fig-unfolding.png b/BXNL/images/fig-unfolding.png new file mode 100644 index 0000000..29deb0e Binary files /dev/null and b/BXNL/images/fig-unfolding.png differ diff --git a/BXNL/images/tracks.png b/BXNL/images/tracks.png new file mode 100644 index 0000000..35bfd74 Binary files /dev/null and b/BXNL/images/tracks.png differ diff --git a/BXNL/orbit_ex/Readme.md b/BXNL/orbit_ex/Readme.md new file mode 100644 index 0000000..9c305de --- /dev/null +++ b/BXNL/orbit_ex/Readme.md @@ -0,0 +1,230 @@ +> ## Important Information +> 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/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). + +# 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 +
+ +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 + // 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 + * 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 0000000..ec1b79d Binary files /dev/null and b/BXNL/orbit_ex/img/dat_orbit.png differ diff --git a/BXNL/orbit_ex/img/earth.png b/BXNL/orbit_ex/img/earth.png new file mode 100644 index 0000000..a4e8421 Binary files /dev/null and b/BXNL/orbit_ex/img/earth.png differ diff --git a/BXNL/orbit_ex/img/est_orbit.png b/BXNL/orbit_ex/img/est_orbit.png new file mode 100644 index 0000000..b922ba5 Binary files /dev/null and b/BXNL/orbit_ex/img/est_orbit.png differ diff --git a/BXNL/orbit_ex/img/estw_orbit.png b/BXNL/orbit_ex/img/estw_orbit.png new file mode 100644 index 0000000..27c01ab Binary files /dev/null and b/BXNL/orbit_ex/img/estw_orbit.png differ diff --git a/BXNL/orbit_ex/img/ltx_optprb.png b/BXNL/orbit_ex/img/ltx_optprb.png new file mode 100644 index 0000000..afc4d24 Binary files /dev/null and b/BXNL/orbit_ex/img/ltx_optprb.png differ diff --git a/BXNL/orbit_ex/output.txt b/BXNL/orbit_ex/output.txt new file mode 100644 index 0000000..65558ba Binary files /dev/null and b/BXNL/orbit_ex/output.txt differ diff --git a/BXNL/orbit_ex/source/OrbitEx.java b/BXNL/orbit_ex/source/OrbitEx.java new file mode 100644 index 0000000..b138f2d --- /dev/null +++ b/BXNL/orbit_ex/source/OrbitEx.java @@ -0,0 +1,264 @@ +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); + } + + // 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 + * 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..4fd5f53 --- /dev/null +++ b/BXNL/simple_BXNL/Readme.md @@ -0,0 +1,314 @@ +> ## 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/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). + +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 +
+ +**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 0000000..93e1899 Binary files /dev/null and b/BXNL/simple_BXNL/img/fig2.png differ diff --git a/BXNL/simple_BXNL/img/fig3.png b/BXNL/simple_BXNL/img/fig3.png new file mode 100644 index 0000000..9947dcc Binary files /dev/null and b/BXNL/simple_BXNL/img/fig3.png differ diff --git a/BXNL/simple_BXNL/img/fig4.png b/BXNL/simple_BXNL/img/fig4.png new file mode 100644 index 0000000..5b465c9 Binary files /dev/null and b/BXNL/simple_BXNL/img/fig4.png differ diff --git a/BXNL/simple_BXNL/output.txt b/BXNL/simple_BXNL/output.txt new file mode 100644 index 0000000..fac1386 Binary files /dev/null and b/BXNL/simple_BXNL/output.txt differ 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(); + } + } +} diff --git a/FOAS/Readme.md b/FOAS/Readme.md new file mode 100644 index 0000000..9dbf96c --- /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](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example/Rosenbrock2d.java). It is also adviced to read this [page](./example) that explains the example. + +
+ 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) + * [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..dca5559 --- /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://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). + +# 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 0000000..9305661 Binary files /dev/null and b/FOAS/example/img/plot.png differ diff --git a/FOAS/example/output.txt b/FOAS/example/output.txt new file mode 100644 index 0000000..806dc95 Binary files /dev/null and b/FOAS/example/output.txt differ 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 0000000..ccce006 Binary files /dev/null and b/FOAS/images/KF_DG_unconst_tokyo_notriv-NF.png differ 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 0000000..5cf3b25 Binary files /dev/null and b/FOAS/images/KF_DG_unconst_tokyo_notriv-NG.png differ 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 0000000..4cf3ba3 Binary files /dev/null and b/FOAS/images/KF_DG_unconst_tokyo_notriv-NT.png differ diff --git a/FOAS/images/Rosenbrock2dw.png b/FOAS/images/Rosenbrock2dw.png new file mode 100644 index 0000000..714e8c1 Binary files /dev/null and b/FOAS/images/Rosenbrock2dw.png differ diff --git a/FOAS/images/animated.gif b/FOAS/images/animated.gif new file mode 100644 index 0000000..2f6cd8f Binary files /dev/null and b/FOAS/images/animated.gif differ diff --git a/FOAS/images/handle_solve_bounds_foas_ex.png b/FOAS/images/handle_solve_bounds_foas_ex.png new file mode 100644 index 0000000..34b855f Binary files /dev/null and b/FOAS/images/handle_solve_bounds_foas_ex.png differ 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..de34858 --- /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://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 + +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 0000000..6d9fdcc Binary files /dev/null and b/FOAS/migration/output.txt differ diff --git a/NLDF/GenDFEx.java b/NLDF/GenDFEx.java new file mode 100644 index 0000000..1c06b89 --- /dev/null +++ b/NLDF/GenDFEx.java @@ -0,0 +1,207 @@ +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; + + +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]; // instantiate 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 + // 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); + + 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 + + } + + + 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]); + } + } + } + + 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])); + this.RDX[i* NVAR + 1] = (-1 * RUSER[i] * X[0] * Math.cos(X[1] * RUSER[i])); + } + } + } + + // Dummy Functions required for NLDF solver + public static class CONFUN extends E04GN.Abstract_E04GN_CONFUN { + public void eval(){ + this.eval(); + } + } + + public static class CONGRD extends E04GN.Abstract_E04GN_CONGRD { + public void eval(){ + this.eval(); + } + } + + public static class MONIT extends E04GN.Abstract_E04GN_MONIT { + public void eval(){ + this.eval(); + } + } + + // Utilities for setting up data for problem + public 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 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; + } + + 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){ + 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 + public 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..0fd4012 --- /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](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/numericalalgorithmsgroup/NAGJavaExamples). + +# 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?lang=jv) + +### Using These Example Files + +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 +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 +public static class CONFUN extends E04GN.Abstract_E04GN_CONFUN { + public void eval(){ + this.eval(); + } +} + +public static class CONGRD extends E04GN.Abstract_E04GN_CONGRD { + public void eval(){ + this.eval(); + } +} + +public static class MONIT extends E04GN.Abstract_E04GN_MONIT { + public void 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 + + +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]; // instantiate 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 +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){ + 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 +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]); + } + } +} + +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])); + 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 +public 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 +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){ + 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. And we'll lastly clear the handle completely. + +```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); + +e04rz.eval(handle,ifail); // Destroy the handle +``` + +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 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. + +## 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) diff --git a/NLDF/images/fig1.pdf b/NLDF/images/fig1.pdf new file mode 100644 index 0000000..972a006 Binary files /dev/null and b/NLDF/images/fig1.pdf differ diff --git a/NLDF/images/fig1.png b/NLDF/images/fig1.png new file mode 100644 index 0000000..040e277 Binary files /dev/null and b/NLDF/images/fig1.png differ diff --git a/NLDF/images/fig2.pdf b/NLDF/images/fig2.pdf new file mode 100644 index 0000000..58bdef0 Binary files /dev/null and b/NLDF/images/fig2.pdf differ diff --git a/NLDF/images/fig2.png b/NLDF/images/fig2.png new file mode 100644 index 0000000..c728aa7 Binary files /dev/null and b/NLDF/images/fig2.png differ diff --git a/NLDF/images/fig3.pdf b/NLDF/images/fig3.pdf new file mode 100644 index 0000000..35d6254 Binary files /dev/null and b/NLDF/images/fig3.pdf differ diff --git a/NLDF/images/fig3.png b/NLDF/images/fig3.png new file mode 100644 index 0000000..bb6823b Binary files /dev/null and b/NLDF/images/fig3.png differ diff --git a/NLDF/images/fig4.pdf b/NLDF/images/fig4.pdf new file mode 100644 index 0000000..8002df0 Binary files /dev/null and b/NLDF/images/fig4.pdf differ diff --git a/NLDF/images/fig4.png b/NLDF/images/fig4.png new file mode 100644 index 0000000..4a4a4b6 Binary files /dev/null and b/NLDF/images/fig4.png differ diff --git a/NLDF/images/fig5.png b/NLDF/images/fig5.png new file mode 100644 index 0000000..083b387 Binary files /dev/null and b/NLDF/images/fig5.png differ diff --git a/NLDF/images/fig5_simple.pdf b/NLDF/images/fig5_simple.pdf new file mode 100644 index 0000000..294aea4 Binary files /dev/null and b/NLDF/images/fig5_simple.pdf differ diff --git a/NLDF/images/fig6_simple.pdf b/NLDF/images/fig6_simple.pdf new file mode 100644 index 0000000..a5c6f0d Binary files /dev/null and b/NLDF/images/fig6_simple.pdf differ diff --git a/NLDF/images/fig7.pdf b/NLDF/images/fig7.pdf new file mode 100644 index 0000000..3ac9167 Binary files /dev/null and b/NLDF/images/fig7.pdf differ diff --git a/NLDF/images/nldf_contour.png b/NLDF/images/nldf_contour.png new file mode 100644 index 0000000..b17654f Binary files /dev/null and b/NLDF/images/nldf_contour.png differ diff --git a/QCQP/Readme.md b/QCQP/Readme.md new file mode 100644 index 0000000..4d7a5cd --- /dev/null +++ b/QCQP/Readme.md @@ -0,0 +1,593 @@ +> ## 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/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 + +# 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{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} +$$ + +By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{eq: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) [[1](#cit-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 [[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} +\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. [[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 + +[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. 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/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/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/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 0000000..54aa444 Binary files /dev/null and b/QCQP/img/data.png differ diff --git a/QCQP/img/rel_rtn.png b/QCQP/img/rel_rtn.png new file mode 100644 index 0000000..a81e63c Binary files /dev/null and b/QCQP/img/rel_rtn.png differ diff --git a/QCQP/img/risk_1.png b/QCQP/img/risk_1.png new file mode 100644 index 0000000..81e0baf Binary files /dev/null and b/QCQP/img/risk_1.png differ diff --git a/QCQP/img/risk_2.png b/QCQP/img/risk_2.png new file mode 100644 index 0000000..06f1dbe Binary files /dev/null and b/QCQP/img/risk_2.png differ diff --git a/QCQP/img/risk_3.png b/QCQP/img/risk_3.png new file mode 100644 index 0000000..7dc0f6b Binary files /dev/null and b/QCQP/img/risk_3.png differ diff --git a/QCQP/portfolioOptimizationQCQP.java b/QCQP/portfolioOptimizationQCQP.java new file mode 100644 index 0000000..06b30bf --- /dev/null +++ b/QCQP/portfolioOptimizationQCQP.java @@ -0,0 +1,598 @@ +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 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.util.ArrayList; +import java.io.FileWriter; + +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) { + + 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 + 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++; + } + + // 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]; + } + } + + printMatrixToFile(relRtn, "relRtn.d"); + + // 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 + + 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); + + // 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(); + } + + printVectorToFile(toArray(abRisk), "abRisk.d"); + printVectorToFile(toArray(abRtn), "abRtn.d"); + + // 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; + 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(); + + printVectorToFile(new double[]{srRisk, srRtn}, "sr.d"); + + // 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; + + 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(); + } + + 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 { + 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[][] 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[] 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 t; + } + + 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 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(dataFolder + File.separator + 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(); + } + } + + 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(); + } + } + +} diff --git a/README.md b/README.md index 2b9dc70..0758216 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,92 @@ -![NAG Logo](./nag_logo.png) +> ## 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 -* [Nearest Correlation Matrices]() -* [Quadratically constrained quadratic programming and its applications in portfolio optimization]() +* [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) +* [First-order active-set method (FOAS)](./FOAS) +* [Generalized Nonlinear Data Fitting](./NLDF) ## Examples that ship with the product -The NAG Library for Java ships with a set of usage [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). -## NAG Library for Java installation +## Obtaining a license + +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). + +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). + +## *n*AG Library for Java installation + +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 +* 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 @@ -58,25 +96,25 @@ 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 +* 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 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 diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..a182685 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,89 @@ + + + + + + + + + + + {% seo %} + + + + + +
+
+ {% if site.github.is_project_page %} + View on GitHub + {% endif %} + +
+

+ + + +

+

+ {{ + 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 + Download this project as a tar.gz file +
+ {% endif %} +
+
+ + +
+
+ {{ content }} +
+
+ + + + + {% if site.google_analytics %} + + {% endif %} + + + + + diff --git a/assets/css/style.scss b/assets/css/style.scss new file mode 100644 index 0000000..d9a1e0f --- /dev/null +++ b/assets/css/style.scss @@ -0,0 +1,20 @@ +--- +--- + +@import "{{ site.theme }}"; + +.inner { + max-width: 65%; +} + +table { + margin-right: auto; + margin-left: auto; +} + +#nag_logo { + border: none; + box-shadow: none; + max-height: 74px; + max-width: 144.5px; +} diff --git a/assets/img/logo-white.png b/assets/img/logo-white.png new file mode 100644 index 0000000..b2b57e2 Binary files /dev/null and b/assets/img/logo-white.png differ 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/nag_logo-removebg.png b/nag_logo-removebg.png new file mode 100644 index 0000000..68858dc Binary files /dev/null and b/nag_logo-removebg.png differ diff --git a/nag_logo.png b/nag_logo.png deleted file mode 100644 index 17b2c26..0000000 Binary files a/nag_logo.png and /dev/null differ diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 31f86f4..70c6ebe 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -1,4 +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; @@ -10,8 +13,13 @@ import java.io.FileWriter; public class NcmNag { + + public final static String dataFolder = "data"; 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 +31,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"; @@ -45,13 +57,18 @@ 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); System.out.println(); + + // Nearest Correlation Matrices + + // Using G02AA to compute 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 +86,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"); @@ -91,30 +107,233 @@ 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: "); + printVector(wr); + + System.out.println(); + + 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); + + printDataToFile("G02AA.d", iter, X_G, X_G_norm); + + + // Weighting rows and columns of elements + + // 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 }; + + // 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); Arrays.sort(wr); + + System.out.print("Sorted eigenvalues of X: "); printVector(wr); 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) + " "); + 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); + + + // 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; } - writer.write("\n"); } - writer.close(); - - } catch (IOException e) { - System.out.println(e.getMessage()); - e.printStackTrace(); } + 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); + Arrays.sort(wr); + + System.out.print("Sorted eigenvalues of X: "); + 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("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); + Arrays.sort(wr); + + System.out.print("Sorted eigenvalues of X: "); + 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); } /** @@ -124,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; @@ -134,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); @@ -144,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); @@ -169,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); @@ -184,12 +406,33 @@ 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); return convert1DTo2D(D_, n); } + 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(dataFolder + File.separator + 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 +510,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++) { @@ -326,22 +584,45 @@ 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(); } } - public static void printVector(double[] a) { - for (int i = 0; i < a.length; i++) { - System.out.printf("%7.4f ", a[i]); + 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(); } - System.out.println(); } - public static void printVector(boolean[] a) { + 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 printVector(double[] a) { for (int i = 0; i < a.length; i++) { - System.out.printf("%5b ", a[i]); + System.out.printf("%8.4f ", a[i]); } System.out.println(); } diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index f5d71c9..8c987ae 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,5 +1,741 @@ -# Nearest Correlation Matrices using the NAG Library for Java +> ## 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) 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). -* [ncm_whitepaper_2019.pdf](./ncm_whitepaper_2019.pdf) Nearest Correlation Matrices whitepaper -* [ncm_nag.ipynb](./ncm_nag.ipynb) Nearest Correlation Matrices Tutorial +# Nearest Correlation Matrices +This notebook looks at computing *nearest correlation matrices* using the NAG Library for *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. + +## 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); +``` + +
+ +``` +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. + +```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); +``` + +
+ +``` +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: + + +$$ +\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(); +``` + +
+ +``` +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"; +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); +``` + +
+ +``` +Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 +``` + +
+ +
+ +# 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(); +``` + +
+ +``` +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"; +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); +``` + +
+ +``` +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? + + +* 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; + } + } +} +``` + +
+ +``` +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(); +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(); +``` + +
+ +``` +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"; +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); +``` + +
+ +``` +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. + + +* 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(); +``` + +
+ +``` +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"; +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); +``` + +
+ +``` +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: + + +$$ 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*: + + +**** diff --git a/nearest_correlation_matrices/data/G02AA.d b/nearest_correlation_matrices/data/G02AA.d new file mode 100644 index 0000000..55ed396 --- /dev/null +++ b/nearest_correlation_matrices/data/G02AA.d @@ -0,0 +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 diff --git a/nearest_correlation_matrices/data/G02AB.d b/nearest_correlation_matrices/data/G02AB.d new file mode 100644 index 0000000..85f882b --- /dev/null +++ b/nearest_correlation_matrices/data/G02AB.d @@ -0,0 +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 diff --git a/nearest_correlation_matrices/data/G02AJ.d b/nearest_correlation_matrices/data/G02AJ.d new file mode 100644 index 0000000..ee927b2 --- /dev/null +++ b/nearest_correlation_matrices/data/G02AJ.d @@ -0,0 +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 diff --git a/nearest_correlation_matrices/data/G02AN.d b/nearest_correlation_matrices/data/G02AN.d new file mode 100644 index 0000000..264585c --- /dev/null +++ b/nearest_correlation_matrices/data/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 diff --git a/nearest_correlation_matrices/g02aa.d b/nearest_correlation_matrices/g02aa.d deleted file mode 100644 index 0c6f7b6..0000000 --- a/nearest_correlation_matrices/g02aa.d +++ /dev/null @@ -1,10 +0,0 @@ -3 -0.2959969817070776 -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 -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 diff --git a/nearest_correlation_matrices/generate_img.py b/nearest_correlation_matrices/generate_img.py new file mode 100644 index 0000000..2a74027 --- /dev/null +++ b/nearest_correlation_matrices/generate_img.py @@ -0,0 +1,102 @@ +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_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 + +# 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 +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") + +# 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/G02AA.png b/nearest_correlation_matrices/img/G02AA.png new file mode 100644 index 0000000..cd860bf Binary files /dev/null and b/nearest_correlation_matrices/img/G02AA.png differ diff --git a/nearest_correlation_matrices/img/G02AB.png b/nearest_correlation_matrices/img/G02AB.png new file mode 100644 index 0000000..5513727 Binary files /dev/null and b/nearest_correlation_matrices/img/G02AB.png differ diff --git a/nearest_correlation_matrices/img/G02AJ.png b/nearest_correlation_matrices/img/G02AJ.png new file mode 100644 index 0000000..aa6dda7 Binary files /dev/null and b/nearest_correlation_matrices/img/G02AJ.png differ diff --git a/nearest_correlation_matrices/img/G02AN.png b/nearest_correlation_matrices/img/G02AN.png new file mode 100644 index 0000000..e8ac8ee Binary files /dev/null and b/nearest_correlation_matrices/img/G02AN.png differ diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb deleted file mode 100644 index 9797e34..0000000 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ /dev/null @@ -1,2246 +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 *Python*.\n", - "\n", - "\n" - ] - }, - { - "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 **library.correg.coeffs_pearson_miss_case**.\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 Python.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "d9befd83-b685-483d-b30d-2a3847948ca5" - } - }, - "source": [ - "### Import required modules and set print options" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "nbpresent": { - "id": "bbde4683-adc6-4094-891a-5487f24b873e" - } - }, - "outputs": [], - "source": [ - "import numpy as np\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)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Select the display backend for Jupyter:\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "f9399cc1-faa3-4ec2-a59d-47f60c08759a" - } - }, - "source": [ - "### Initialize our *P* matrix of observations" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "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" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "3a438349-5641-4df8-bdf1-a86b6ee757ab" - } - }, - "source": [ - "### Compute the covariance, ignoring missing values" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "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" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "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)))\n", - " return D @ S @ D \n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "a8b4aa95-2ba3-4f09-8f65-ab45831b1108" - } - }, - "source": [ - "### Compute the *approximate* correlation matrix" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "nbpresent": { - "id": "f417663e-badf-45d3-8f98-0647907657de" - } - }, - "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 = cor_bar(P)\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": "code", - "execution_count": 7, - "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": [ - "print(\"Sorted eigenvalues of G {}\".format(np.sort(np.linalg.eig(G)[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 **library.correg.corrmat_nearest**.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "5fe4edf2-768e-47ef-b5e1-62f64c49ebae" - } - }, - "source": [ - "## Using corrmat_nearest to compute the nearest correlation matrix in the Frobenius norm" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "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": [ - "# \"Call NAG routine library.correg.corrmat_nearest and print the result\n", - "X, itr, _, _ = nl_correg.corrmat_nearest(G)\n", - "print(\"Nearest correlation matrix\\n{}\".format(X))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "nbpresent": { - "id": "9737d750-04fe-4a91-933c-a799449e427e" - } - }, - "outputs": [ - { - "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" - ] - } - ], - "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", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "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": [ - "# 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", - " 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, np.linalg.norm(X-G)),\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 **library.correg.corrmat_nearest_bounded**\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 corrmat_nearest_bounded to compute the nearest correlation matrix with row and column weighting" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "nbpresent": { - "id": "0f8ff272-e0f6-417e-8e2e-650964663d0f" - } - }, - "outputs": [], - "source": [ - "# Define an array of weights\n", - "W = np.array([10, 10, 10, 1, 1, 1, 1, 1], dtype = np.float64)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "nbpresent": { - "id": "0a7c5d11-13ec-4f52-b222-c6540fcdd67c" - } - }, - "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": [ - "# 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", - "print(\"Nearest correlation matrix using row and column weighting\\n{}\".format(X))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "nbpresent": { - "id": "4db463c7-773f-41ec-84a0-ece179fa37da" - } - }, - "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" - ] - } - ], - "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", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "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": [ - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(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 corrmat_nearest_bounded', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\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 **library.correg.corrmat_h_weight**.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "1865afa3-9b32-4bb5-83d0-ddc9c6f709a0" - } - }, - "source": [ - "### Use corrmat_h_weight to compute the nearest correlation matrix with element-wise weighting" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "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": 15, - "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" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "nbpresent": { - "id": "59164e07-d021-4b2f-8dc8-c526c7e4223c" - } - }, - "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": [ - "# \"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", - "print(\"Nearest correlation matrix using element-wise weighting\\n{}\".format(X))" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "nbpresent": { - "id": "a5652370-f1f9-4b64-b5e6-9d5869e82366" - } - }, - "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" - ] - } - ], - "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", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "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": [ - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(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 corrmat_h_weight', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\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 **library.correg.corrmat_shrinking**.\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 corrmat_shrinking to compute the nearest correlation matrix with fixed leading block" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "nbpresent": { - "id": "9e7248c0-f11a-4cd7-8454-3545797ad928" - } - }, - "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": [ - "# 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", - "print(\"Nearest correlation matrix with fixed leading block \\n{}\".format(X))" - ] - }, - { - "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": 21, - "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": [ - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(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 corrmat_shrinking', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\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 **library.correg.corrmat_target** 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 *Python*:\n", - "\n", - "\n", - "**https://www.nag.com/nag-library-python ** \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 -} diff --git a/nearest_correlation_matrices/ncm_nag.pdf b/nearest_correlation_matrices/ncm_nag.pdf deleted file mode 100644 index 488174e..0000000 Binary files a/nearest_correlation_matrices/ncm_nag.pdf and /dev/null differ diff --git a/nearest_correlation_matrices/output.txt b/nearest_correlation_matrices/output.txt new file mode 100644 index 0000000..66156a5 Binary files /dev/null and b/nearest_correlation_matrices/output.txt differ 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": "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\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] 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 69ad820..0000000 Binary files a/nearest_correlation_matrices/|G-X| for G02AA.png and /dev/null differ diff --git a/opt_imp_vol/Readme.md b/opt_imp_vol/Readme.md new file mode 100644 index 0000000..a057bf2 --- /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/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). + +# 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 0000000..0b51c1c Binary files /dev/null and b/opt_imp_vol/graphs.PNG differ 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 0000000..20b4c23 Binary files /dev/null and b/opt_imp_vol/impvolsurf.png differ diff --git a/opt_imp_vol/output.txt b/opt_imp_vol/output.txt new file mode 100644 index 0000000..ddbddd7 Binary files /dev/null and b/opt_imp_vol/output.txt differ diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r new file mode 100644 index 0000000..282acb3 --- /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.1 (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/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/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..fd4bc95 --- /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.1 (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/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(); + } + } +} 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_unsupported/A00AAJE.java b/simple_examples/source/int64_unsupported/A00AAJE.java new file mode 100644 index 0000000..490c163 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/A00ADJE.java b/simple_examples/source/int64_unsupported/A00ADJE.java new file mode 100644 index 0000000..8250321 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/C05AYJE.java b/simple_examples/source/int64_unsupported/C05AYJE.java new file mode 100644 index 0000000..a3bd5f1 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/C05AZJE.java b/simple_examples/source/int64_unsupported/C05AZJE.java new file mode 100644 index 0000000..bec1b03 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/C05MBJE.java b/simple_examples/source/int64_unsupported/C05MBJE.java new file mode 100644 index 0000000..08dd454 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/C05QBJE.java b/simple_examples/source/int64_unsupported/C05QBJE.java new file mode 100644 index 0000000..d7a6435 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/D02NEJE.java b/simple_examples/source/int64_unsupported/D02NEJE.java new file mode 100644 index 0000000..b32ae64 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/DTFSMJE.java b/simple_examples/source/int64_unsupported/DTFSMJE.java new file mode 100644 index 0000000..d1feabb --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/E01DAJE.java b/simple_examples/source/int64_unsupported/E01DAJE.java new file mode 100644 index 0000000..89a89e4 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/E04UCJE.java b/simple_examples/source/int64_unsupported/E04UCJE.java new file mode 100644 index 0000000..20ad573 --- /dev/null +++ b/simple_examples/source/int64_unsupported/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_unsupported/F02EKJE.java b/simple_examples/source/int64_unsupported/F02EKJE.java new file mode 100644 index 0000000..d8f152c --- /dev/null +++ b/simple_examples/source/int64_unsupported/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); + } + + } + +}