diff --git a/.gitignore b/.gitignore index e257658..3adafd7 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ *.out *.app +.DS_Store \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..db68fb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2024, Yoshiya Usui + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 6839ead..70c5d8c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,51 @@ -# TracMT +# TRACMT +Robust transfer function analysis code for magnetotellurics. +In TRACMT, you can use the RRMS estimator developed by Usui et al. (2024) and the fast and robust bootstrap method evaluated by Usui et al (2025). + +_Yoshiya Usui, Makoto Uyeshima, Shin'ya Sakanaka, Tasuku Hashimoto, Masahiro Ichiki, Toshiki Kaida, Yusuke Yamaya, Yasuo Ogawa, Masataka Masuda, Takahiro Akiyama, 2024. New robust remote reference estimator using robust multivariate linear regression, Geophysical Journal International, 238(2), [https://doi.org/10.1093/gji/ggae19_9](https://doi.org/10.1093/gji/ggae199)_ + +_Yoshiya Usui, 2024. Prewhitening of magnetotelluric data using a robust filter and robust PARCOR. Bull. Earthq. Res. Inst. Univ. Tokyo, 99, [https://doi.org/10.15083/0002012817](https://doi.org/10.15083/0002012817)_ + +_Yoshiya Usui, Makoto Uyeshima, Shin'ya Sakanaka, Tasuku Hashimoto, Masahiro Ichiki, Toshiki Kaida, Yusuke Yamaya, Yasuo Ogawa, Masataka Masuda, Takahiro Akiyama, 2025, Application of the fast and robust bootstrap method to the uncertainty analysis of the magnetotelluric transfer function, Geophysical Journal International, 242(1), [https://doi.org/10.1093/gji/ggaf162](https://doi.org/10.1093/gji/ggaf162)_ + +We developed the RRMS estimator by applying the robust multivariate linear regression S-estimator to the two-input-multiple-output relationship between the local EM field and the reference magnetic field that leads to the same equation as by the original remote reference method. +The RRMS estimator can give an unbiased estimate of the MT transfer function and suppress the influence of outliers in the electric field and magnetic +field. + +## How to compile TRACMT +1) Download all source files of TRACMT to a directory. +2) Download source files of CLAPACK (https://www.netlib.org/clapack/) to another directory and make library files. +3) Copy library files of CLAPACK (blas_LINUX.a, lapack_LINUX.a, and libf2c.a) to "lib" directory and copy header files (blaswrap.h, clapack.h, and f2c.h) to "include" directory. +4) If your compiler supports C++11, you can compile TRACMT by "make -f Makefile_C++11" command. + If your compiler does NOT support C++11, download mt19937-64.tgz from http://math.sci.hiroshima-u.ac.jp/m-mat/MT/mt64.html and rename mt19937-64.c to mt19937-64.cpp. + After copying mt19937-64.cpp and mt64.h to the source-file directory of TRACMT, you can compile TRACMT by the make command (Make -f Makefile). +5) To read MTH5 files (Peacock et al., 2022), please use "Makefile_C++11_MTH5" or "Makefile_MTH5". Before compiling TRACMT, HDF5 library should be installed and path to HDF5 libraries should be added as follows.
+ export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/hdf5-1.10.5/lib"
+ export LIBRARY_PATH="${LIBRARY_PATH}:/usr/local/hdf5-1.10.5/lib"
+ export PATH="${PATH}:/usr/local/hdf5-1.10.5/lib"
+ +## Functional Overview +**Input file format**: Text (Ascii) file / .ats files of Metronix instruments / MTH5 files (Peacock et al., 2022) / .dat files of ELOG-MT + +**Prewhitening**: Non-robust prewhitening / Robust prewhitening / Robust prewhitening with robust filter + +**Transfer function estimation method**: Ordinary least square / Non-robust remote reference / Robust remote reference / RRMS estimator + +**Error estimation method**: Parametric approach / Bootstrap method / Jackknife method + +## Release note +_**v1.2.0**_ June. 13, 2024: Initial release. + +_**v1.3.4**_ July. 14, 2024: A parametric error estimation method was added for the RRMS estimator. Some bugs relating to the ELOG reading option and calibration were fixed. + +_**v1.3.6**_ August. 15, 2024: A function to read ELOG-DUAL binary files was modified. + +_**v2.0.0**_ January. 1, 2025: The fast and robust bootstrap method was added. Some equations of the parametric error estimation method were modified. + +_**v2.1.0**_ January. 14, 2025: The equation of the AIC is modified. + +_**v2.2.0**_ February. 10, 2025: The option for reading MTH5 files is added. + +_**v2.3.0**_ October. 22, 2025: The computational efficiency of the RRMS estimator was improved. + diff --git a/Samples/NonRobustRemoteReference/TRACMT.cvg b/Samples/NonRobustRemoteReference/TRACMT.cvg new file mode 100644 index 0000000..acfef8a --- /dev/null +++ b/Samples/NonRobustRemoteReference/TRACMT.cvg @@ -0,0 +1,420 @@ +================================================================================ +Now Frequency(Hz): 0.00146484, Period(s): 682.667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.88469 + Estimated response function: ( 3.7554e-01, 4.2087e-01), ( 3.3244e-01, 4.4139e-01) + Amplitude of the estimated response function: 5.6406e-01, 5.5257e-01 + Phase(deg.) of the estimated response function: 48.3, 53.0 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.943059 + Estimated response function: ( -6.7784e-01, -8.3556e-01), ( -1.5476e-01, -1.5345e-01) + Amplitude of the estimated response function: 1.0759e+00, 2.1794e-01 + Phase(deg.) of the estimated response function: -129.1, -135.2 +================================================================================ +Now Frequency(Hz): 0.00195312, Period(s): 512 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.881175 + Estimated response function: ( 4.5545e-01, 4.7352e-01), ( 3.8421e-01, 5.4449e-01) + Amplitude of the estimated response function: 6.5701e-01, 6.6640e-01 + Phase(deg.) of the estimated response function: 46.1, 54.8 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.952068 + Estimated response function: ( -8.0225e-01, -1.0040e+00), ( -1.8291e-01, -2.1313e-01) + Amplitude of the estimated response function: 1.2852e+00, 2.8086e-01 + Phase(deg.) of the estimated response function: -128.6, -130.6 +================================================================================ +Now Frequency(Hz): 0.00292969, Period(s): 341.333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.810574 + Estimated response function: ( 4.7326e-01, 5.9456e-01), ( 4.3491e-01, 7.6086e-01) + Amplitude of the estimated response function: 7.5992e-01, 8.7639e-01 + Phase(deg.) of the estimated response function: 51.5, 60.2 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.917953 + Estimated response function: ( -9.3048e-01, -1.3085e+00), ( -1.8189e-01, -2.2954e-01) + Amplitude of the estimated response function: 1.6056e+00, 2.9286e-01 + Phase(deg.) of the estimated response function: -125.4, -128.4 +================================================================================ +Now Frequency(Hz): 0.00390625, Period(s): 256 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.795293 + Estimated response function: ( 6.0472e-01, 7.0462e-01), ( 4.3766e-01, 9.1245e-01) + Amplitude of the estimated response function: 9.2854e-01, 1.0120e+00 + Phase(deg.) of the estimated response function: 49.4, 64.4 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.898233 + Estimated response function: ( -1.2107e+00, -1.5316e+00), ( -2.0797e-01, -2.9546e-01) + Amplitude of the estimated response function: 1.9524e+00, 3.6131e-01 + Phase(deg.) of the estimated response function: -128.3, -125.1 +================================================================================ +Now Frequency(Hz): 0.00585938, Period(s): 170.667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.69714 + Estimated response function: ( 8.2872e-01, 9.2629e-01), ( 6.3990e-01, 1.1135e+00) + Amplitude of the estimated response function: 1.2429e+00, 1.2843e+00 + Phase(deg.) of the estimated response function: 48.2, 60.1 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.858605 + Estimated response function: ( -1.5595e+00, -1.8754e+00), ( -3.0034e-01, -3.2833e-01) + Amplitude of the estimated response function: 2.4391e+00, 4.4498e-01 + Phase(deg.) of the estimated response function: -129.7, -132.5 +================================================================================ +Now Frequency(Hz): 0.0078125, Period(s): 128 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.662431 + Estimated response function: ( 1.0339e+00, 1.0460e+00), ( 8.5128e-01, 1.3658e+00) + Amplitude of the estimated response function: 1.4707e+00, 1.6093e+00 + Phase(deg.) of the estimated response function: 45.3, 58.1 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.81653 + Estimated response function: ( -1.7951e+00, -2.2401e+00), ( -4.1262e-01, -3.9622e-01) + Amplitude of the estimated response function: 2.8706e+00, 5.7205e-01 + Phase(deg.) of the estimated response function: -128.7, -136.2 +================================================================================ +Now Frequency(Hz): 0.0117188, Period(s): 85.3333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.562555 + Estimated response function: ( 1.3891e+00, 1.2224e+00), ( 1.0533e+00, 1.8187e+00) + Amplitude of the estimated response function: 1.8504e+00, 2.1017e+00 + Phase(deg.) of the estimated response function: 41.3, 59.9 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.758964 + Estimated response function: ( -2.4524e+00, -2.9277e+00), ( -4.3863e-01, -5.8231e-01) + Amplitude of the estimated response function: 3.8192e+00, 7.2903e-01 + Phase(deg.) of the estimated response function: -130.0, -127.0 +================================================================================ +Now Frequency(Hz): 0.015625, Period(s): 64 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.488236 + Estimated response function: ( 1.5185e+00, 1.3183e+00), ( 1.3435e+00, 2.1202e+00) + Amplitude of the estimated response function: 2.0109e+00, 2.5100e+00 + Phase(deg.) of the estimated response function: 41.0, 57.6 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.671128 + Estimated response function: ( -2.9422e+00, -3.2299e+00), ( -5.5561e-01, -5.7310e-01) + Amplitude of the estimated response function: 4.3691e+00, 7.9821e-01 + Phase(deg.) of the estimated response function: -132.3, -134.1 +================================================================================ +Now Frequency(Hz): 0.0234375, Period(s): 42.6667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.285299 + Estimated response function: ( 1.8094e+00, 1.5365e+00), ( 1.7851e+00, 2.7188e+00) + Amplitude of the estimated response function: 2.3738e+00, 3.2525e+00 + Phase(deg.) of the estimated response function: 40.3, 56.7 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.541271 + Estimated response function: ( -3.7694e+00, -3.9053e+00), ( -8.2834e-01, -9.5551e-01) + Amplitude of the estimated response function: 5.4277e+00, 1.2646e+00 + Phase(deg.) of the estimated response function: -134.0, -130.9 +================================================================================ +Now Frequency(Hz): 0.03125, Period(s): 32 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.182882 + Estimated response function: ( 2.4038e+00, 1.7105e+00), ( 2.2720e+00, 3.4053e+00) + Amplitude of the estimated response function: 2.9502e+00, 4.0937e+00 + Phase(deg.) of the estimated response function: 35.4, 56.3 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.416897 + Estimated response function: ( -4.5305e+00, -4.3722e+00), ( -1.0212e+00, -1.1243e+00) + Amplitude of the estimated response function: 6.2961e+00, 1.5189e+00 + Phase(deg.) of the estimated response function: -136.0, -132.2 +================================================================================ +Now Frequency(Hz): 0.046875, Period(s): 21.3333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0 + Estimated response function: ( 3.4951e+00, 2.1127e+00), ( 2.7520e+00, 4.2758e+00) + Amplitude of the estimated response function: 4.0841e+00, 5.0849e+00 + Phase(deg.) of the estimated response function: 31.2, 57.2 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0.137491 + Estimated response function: ( -5.7019e+00, -4.8532e+00), ( -1.0653e+00, -1.0137e+00) + Amplitude of the estimated response function: 7.4877e+00, 1.4705e+00 + Phase(deg.) of the estimated response function: -139.6, -136.4 +================================================================================ +Now Frequency(Hz): 0.0625, Period(s): 16 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0 + Estimated response function: ( 3.8661e+00, 2.4595e+00), ( 3.7929e+00, 5.6612e+00) + Amplitude of the estimated response function: 4.5821e+00, 6.8144e+00 + Phase(deg.) of the estimated response function: 32.5, 56.2 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0 + Estimated response function: ( -5.7741e+00, -5.9493e+00), ( -1.3897e+00, -1.3007e+00) + Amplitude of the estimated response function: 8.2906e+00, 1.9034e+00 + Phase(deg.) of the estimated response function: -134.1, -136.9 +================================================================================ +Now Frequency(Hz): 0.09375, Period(s): 10.6667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( 3.9019e+00, 2.2656e+00), ( 4.4292e+00, 7.3770e+00) + Amplitude of the estimated response function: 4.5120e+00, 8.6045e+00 + Phase(deg.) of the estimated response function: 30.1, 59.0 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( -6.8066e+00, -7.2849e+00), ( -4.3713e-01, -2.5180e+00) + Amplitude of the estimated response function: 9.9699e+00, 2.5557e+00 + Phase(deg.) of the estimated response function: -133.1, -99.8 +================================================================================ +Now Frequency(Hz): 0.125, Period(s): 8 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( 5.2436e+00, 1.8981e+00), ( 5.8367e+00, 7.6169e+00) + Amplitude of the estimated response function: 5.5766e+00, 9.5961e+00 + Phase(deg.) of the estimated response function: 19.9, 52.5 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( -9.2962e+00, -8.5980e+00), ( 2.5354e-02, -1.6449e+00) + Amplitude of the estimated response function: 1.2663e+01, 1.6451e+00 + Phase(deg.) of the estimated response function: -137.2, -89.1 +================================================================================ +Now Frequency(Hz): 0.1875, Period(s): 5.33333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( 4.7388e+00, 3.6659e+00), ( 8.5635e+00, 9.6804e+00) + Amplitude of the estimated response function: 5.9912e+00, 1.2925e+01 + Phase(deg.) of the estimated response function: 37.7, 48.5 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( -1.1045e+01, -1.1288e+01), ( -2.2411e-01, -5.9487e-01) + Amplitude of the estimated response function: 1.5793e+01, 6.3568e-01 + Phase(deg.) of the estimated response function: -134.4, -110.6 +================================================================================ +Now Frequency(Hz): 0.25, Period(s): 4 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( 5.8663e+00, 4.0237e+00), ( 1.1449e+01, 8.7057e+00) + Amplitude of the estimated response function: 7.1136e+00, 1.4383e+01 + Phase(deg.) of the estimated response function: 34.4, 37.2 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( -1.5791e+01, -8.7705e+00), ( -2.1661e+00, 6.6073e-01) + Amplitude of the estimated response function: 1.8063e+01, 2.2646e+00 + Phase(deg.) of the estimated response function: -151.0, 163.0 +================================================================================ +Now Frequency(Hz): 0.375, Period(s): 2.66667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( -3.4466e+00, -5.2926e+00), ( 2.3350e+01, 8.4248e+00) + Amplitude of the estimated response function: 6.3159e+00, 2.4823e+01 + Phase(deg.) of the estimated response function: -123.1, 19.8 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( -1.3650e+01, -3.9352e+00), ( -4.6476e-02, -1.1209e+01) + Amplitude of the estimated response function: 1.4206e+01, 1.1209e+01 + Phase(deg.) of the estimated response function: -163.9, -90.2 +================================================================================ +Now Frequency(Hz): 0.5, Period(s): 2 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( 1.2138e+00, -1.2061e+00), ( 2.1695e+01, 6.6378e+00) + Amplitude of the estimated response function: 1.7112e+00, 2.2687e+01 + Phase(deg.) of the estimated response function: -44.8, 17.0 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( -5.3388e+00, -5.2437e+00), ( -6.0756e+00, 1.4369e+00) + Amplitude of the estimated response function: 7.4833e+00, 6.2432e+00 + Phase(deg.) of the estimated response function: -135.5, 166.7 +================================================================================ +Now Frequency(Hz): 0.75, Period(s): 1.33333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( -2.1007e+01, 2.5791e+00), ( 1.6554e+01, 1.0975e+01) + Amplitude of the estimated response function: 2.1164e+01, 1.9862e+01 + Phase(deg.) of the estimated response function: 173.0, 33.5 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( 4.6419e+00, -4.1036e+00), ( -1.1865e+01, -1.0362e+01) + Amplitude of the estimated response function: 6.1958e+00, 1.5753e+01 + Phase(deg.) of the estimated response function: -41.5, -138.9 +================================================================================ +Now Frequency(Hz): 1, Period(s): 1 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( 1.1221e+01, 1.0270e+01), ( 2.1550e+01, -2.5333e+01) + Amplitude of the estimated response function: 1.5211e+01, 3.3259e+01 + Phase(deg.) of the estimated response function: 42.5, -49.6 +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( -1.1946e+01, -5.6520e+00), ( -2.0656e+01, -1.9537e+01) + Amplitude of the estimated response function: 1.3216e+01, 2.8432e+01 + Phase(deg.) of the estimated response function: -154.7, -136.6 diff --git a/Samples/NonRobustRemoteReference/TRACMT.log b/Samples/NonRobustRemoteReference/TRACMT.log new file mode 100644 index 0000000..2559946 --- /dev/null +++ b/Samples/NonRobustRemoteReference/TRACMT.log @@ -0,0 +1,418 @@ +Start TRACMT Version v2.0 +Read parameters. ( 0 sec ) +================================================================================ +Summary of control parameters +================================================================================ +Number of threads : 1 +Procedure type : ordinary remote reference +The first M-estimator : not to be used +The second M-estimator : not to be used +Error estimation method : parametric +Number of output variables : 2 +Number of input variables : 2 +Number of remote reference variables : 2 +Sampling frequency (Hz) : 32 +Number of time-series sections : 1 +Ratio of overlapping part to whole segment length : 0.5 +Output level : 0 +Output apparent resistivity and phase to a seperate csv file +Information about the segment lengths and frequencies : + Segment# Length Index Frequency(Hz) Period(sec) + 0 65536 3 1.464843750e-03 6.826666667e+02 + 0 65536 4 1.953125000e-03 5.120000000e+02 + 1 32768 3 2.929687500e-03 3.413333333e+02 + 1 32768 4 3.906250000e-03 2.560000000e+02 + 2 16384 3 5.859375000e-03 1.706666667e+02 + 2 16384 4 7.812500000e-03 1.280000000e+02 + 3 8192 3 1.171875000e-02 8.533333333e+01 + 3 8192 4 1.562500000e-02 6.400000000e+01 + 4 4096 3 2.343750000e-02 4.266666667e+01 + 4 4096 4 3.125000000e-02 3.200000000e+01 + 5 2048 3 4.687500000e-02 2.133333333e+01 + 5 2048 4 6.250000000e-02 1.600000000e+01 + 6 1024 3 9.375000000e-02 1.066666667e+01 + 6 1024 4 1.250000000e-01 8.000000000e+00 + 7 512 3 1.875000000e-01 5.333333333e+00 + 7 512 4 2.500000000e-01 4.000000000e+00 + 8 256 3 3.750000000e-01 2.666666667e+00 + 8 256 4 5.000000000e-01 2.000000000e+00 + 9 128 3 7.500000000e-01 1.333333333e+00 + 9 128 4 1.000000000e+00 1.000000000e+00 +Information about the time-series data : + Section# Channel# Type NSkip NData File + 0 0 Out0 0 2764800 ../ex.txt + 0 1 Out1 0 2764800 ../ey.txt + 0 2 Inp0 0 2764800 ../hx.txt + 0 3 Inp1 0 2764800 ../hy.txt + 0 4 RR0 0 2764800 ../hrx.txt + 0 5 RR1 0 2764800 ../hry.txt +Rotation angle (deg.) : 0 + Channel# Type Azimuth(deg.) + 0 Out0 0 + 1 Out1 90 + 2 Inp0 0 + 3 Inp1 90 + 4 RR0 0 + 5 RR1 90 +Parameters for robust prewhitening : + Least square estimator is used + Maximum degree of AR model: 10 +================================================================================ +Read data from ../ex.txt ( 0 sec ) +Read data from ../ey.txt ( 1 sec ) +Read data from ../hx.txt ( 2 sec ) +Read data from ../hy.txt ( 3 sec ) +Read data from ../hrx.txt ( 4 sec ) +Read data from ../hry.txt ( 4 sec ) +Perform preprocessing ( 5 sec ) +Secton 0, Channel 0 ( 5 sec ) +Subtract mean (-0.889991) ( 5 sec ) +Secton 0, Channel 1 ( 5 sec ) +Subtract mean (1.69968) ( 5 sec ) +Secton 0, Channel 2 ( 5 sec ) +Subtract mean (0.0092652) ( 5 sec ) +Secton 0, Channel 3 ( 5 sec ) +Subtract mean (1.30261) ( 5 sec ) +Secton 0, Channel 4 ( 5 sec ) +Subtract mean (0.0346805) ( 5 sec ) +Secton 0, Channel 5 ( 5 sec ) +Subtract mean (1.2857) ( 5 sec ) +Perform prewhitening for channel 0 ( 5 sec ) +Degree of AR model: 1, Sigma: 7.6076, AIC: 1.90665e+07 ( 5 sec ) +Degree of AR model: 2, Sigma: 7.60293, AIC: 1.90631e+07 ( 5 sec ) +Degree of AR model: 3, Sigma: 7.59862, AIC: 1.906e+07 ( 5 sec ) +Degree of AR model: 4, Sigma: 7.5946, AIC: 1.90571e+07 ( 5 sec ) +Degree of AR model: 5, Sigma: 7.59088, AIC: 1.90544e+07 ( 5 sec ) +Degree of AR model: 6, Sigma: 7.58783, AIC: 1.90521e+07 ( 5 sec ) +Degree of AR model: 7, Sigma: 7.58446, AIC: 1.90497e+07 ( 5 sec ) +Degree of AR model: 8, Sigma: 7.58162, AIC: 1.90476e+07 ( 5 sec ) +Degree of AR model: 9, Sigma: 7.57884, AIC: 1.90456e+07 ( 5 sec ) +Degree of AR model: 10, Sigma: 7.57665, AIC: 1.9044e+07 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (1.9044e+07) ( 6 sec ) +AR coefficients: 0.0320459 0.0276236 0.0274305 0.0273417 0.0271195 0.0250291 0.0274279 0.0257729 0.0263083 0.0240252 ( 6 sec ) +Perform prewhitening for channel 1 ( 6 sec ) +Degree of AR model: 1, Sigma: 7.54273, AIC: 1.90192e+07 ( 6 sec ) +Degree of AR model: 2, Sigma: 7.52209, AIC: 1.9004e+07 ( 6 sec ) +Degree of AR model: 3, Sigma: 7.50561, AIC: 1.89919e+07 ( 6 sec ) +Degree of AR model: 4, Sigma: 7.49133, AIC: 1.89814e+07 ( 6 sec ) +Degree of AR model: 5, Sigma: 7.47891, AIC: 1.89722e+07 ( 6 sec ) +Degree of AR model: 6, Sigma: 7.46782, AIC: 1.8964e+07 ( 6 sec ) +Degree of AR model: 7, Sigma: 7.45798, AIC: 1.89567e+07 ( 6 sec ) +Degree of AR model: 8, Sigma: 7.44899, AIC: 1.895e+07 ( 6 sec ) +Degree of AR model: 9, Sigma: 7.44151, AIC: 1.89444e+07 ( 6 sec ) +Degree of AR model: 10, Sigma: 7.43417, AIC: 1.8939e+07 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (1.8939e+07) ( 6 sec ) +AR coefficients: 0.0497931 0.0484711 0.0453945 0.0449254 0.0443603 0.0443792 0.0440958 0.0444201 0.0425092 0.0444076 ( 6 sec ) +Perform prewhitening for channel 2 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.15041, AIC: 8.62097e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 0.999605, AIC: 7.84398e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.94325, AIC: 7.5231e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.913582, AIC: 7.34638e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.895124, AIC: 7.23352e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.882753, AIC: 7.15657e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.873879, AIC: 7.1007e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.867031, AIC: 7.0572e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.861586, AIC: 7.02236e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.857167, AIC: 6.99392e+06 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (6.99392e+06) ( 6 sec ) +AR coefficients: 0.100812 0.0994283 0.099345 0.0994338 0.100341 0.0991599 0.0983786 0.0996401 0.100555 0.101158 ( 6 sec ) +Perform prewhitening for channel 3 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.15933, AIC: 8.66365e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 1.01002, AIC: 7.90131e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.95364, AIC: 7.58368e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.923737, AIC: 7.40751e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.905428, AIC: 7.29681e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.892914, AIC: 7.21985e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.884029, AIC: 7.16455e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.877216, AIC: 7.12177e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.871841, AIC: 7.08779e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.867445, AIC: 7.05983e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.05983e+06) ( 7 sec ) +AR coefficients: 0.0992426 0.0997661 0.0999695 0.100685 0.0994892 0.0998831 0.0983119 0.0990847 0.0994668 0.100303 ( 7 sec ) +Perform prewhitening for channel 4 ( 7 sec ) +Degree of AR model: 1, Sigma: 1.16254, AIC: 8.67898e+06 ( 7 sec ) +Degree of AR model: 2, Sigma: 1.00903, AIC: 7.89586e+06 ( 7 sec ) +Degree of AR model: 3, Sigma: 0.952405, AIC: 7.57651e+06 ( 7 sec ) +Degree of AR model: 4, Sigma: 0.922235, AIC: 7.39851e+06 ( 7 sec ) +Degree of AR model: 5, Sigma: 0.90364, AIC: 7.28588e+06 ( 7 sec ) +Degree of AR model: 6, Sigma: 0.891244, AIC: 7.2095e+06 ( 7 sec ) +Degree of AR model: 7, Sigma: 0.882213, AIC: 7.15318e+06 ( 7 sec ) +Degree of AR model: 8, Sigma: 0.875262, AIC: 7.10944e+06 ( 7 sec ) +Degree of AR model: 9, Sigma: 0.869864, AIC: 7.07523e+06 ( 7 sec ) +Degree of AR model: 10, Sigma: 0.865547, AIC: 7.04772e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.04772e+06) ( 7 sec ) +AR coefficients: 0.0989261 0.10121 0.0987917 0.100744 0.100552 0.0988028 0.0993482 0.100374 0.0999452 0.0995135 ( 7 sec ) +Perform prewhitening for channel 5 ( 7 sec ) +Degree of AR model: 1, Sigma: 1.16036, AIC: 8.66857e+06 ( 7 sec ) +Degree of AR model: 2, Sigma: 1.01086, AIC: 7.90589e+06 ( 7 sec ) +Degree of AR model: 3, Sigma: 0.953982, AIC: 7.58566e+06 ( 7 sec ) +Degree of AR model: 4, Sigma: 0.924434, AIC: 7.41168e+06 ( 7 sec ) +Degree of AR model: 5, Sigma: 0.906107, AIC: 7.30095e+06 ( 7 sec ) +Degree of AR model: 6, Sigma: 0.893431, AIC: 7.22305e+06 ( 7 sec ) +Degree of AR model: 7, Sigma: 0.884431, AIC: 7.16707e+06 ( 7 sec ) +Degree of AR model: 8, Sigma: 0.877486, AIC: 7.12347e+06 ( 7 sec ) +Degree of AR model: 9, Sigma: 0.872098, AIC: 7.08941e+06 ( 7 sec ) +Degree of AR model: 10, Sigma: 0.867816, AIC: 7.0622e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.0622e+06) ( 7 sec ) +AR coefficients: 0.0995885 0.098903 0.101124 0.0988656 0.0991358 0.100713 0.0990429 0.100438 0.0997109 0.0989688 ( 7 sec ) +=============================================================================== +Perform analysis for segment length : 65536 ( 7 sec ) +Convert time-series data to frequency-domain ( 7 sec ) +Total number of segments : 83 ( 7 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00146484, Period(s): 682.667 ( 10 sec ) +Perform calibration correction ( 10 sec ) +Calculate rotated fields ( 10 sec ) +Calculate response functions by ordinary remote reference ( 10 sec ) +Calculate response functions for output variable 0 ( 10 sec ) +Calculate response functions by the ordinary least square method ( 10 sec ) +Parametric error estimation is performed ( 10 sec ) +Calculate response functions for output variable 1 ( 10 sec ) +Calculate response functions by the ordinary least square method ( 10 sec ) +Parametric error estimation is performed ( 10 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00195312, Period(s): 512 ( 10 sec ) +Perform calibration correction ( 10 sec ) +Calculate rotated fields ( 10 sec ) +Calculate response functions by ordinary remote reference ( 10 sec ) +Calculate response functions for output variable 0 ( 10 sec ) +Calculate response functions by the ordinary least square method ( 10 sec ) +Parametric error estimation is performed ( 10 sec ) +Calculate response functions for output variable 1 ( 10 sec ) +Calculate response functions by the ordinary least square method ( 10 sec ) +Parametric error estimation is performed ( 10 sec ) +=============================================================================== +Perform analysis for segment length : 32768 ( 10 sec ) +Convert time-series data to frequency-domain ( 10 sec ) +Total number of segments : 167 ( 10 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00292969, Period(s): 341.333 ( 12 sec ) +Perform calibration correction ( 12 sec ) +Calculate rotated fields ( 12 sec ) +Calculate response functions by ordinary remote reference ( 12 sec ) +Calculate response functions for output variable 0 ( 12 sec ) +Calculate response functions by the ordinary least square method ( 12 sec ) +Parametric error estimation is performed ( 12 sec ) +Calculate response functions for output variable 1 ( 12 sec ) +Calculate response functions by the ordinary least square method ( 12 sec ) +Parametric error estimation is performed ( 12 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00390625, Period(s): 256 ( 12 sec ) +Perform calibration correction ( 12 sec ) +Calculate rotated fields ( 12 sec ) +Calculate response functions by ordinary remote reference ( 12 sec ) +Calculate response functions for output variable 0 ( 12 sec ) +Calculate response functions by the ordinary least square method ( 12 sec ) +Parametric error estimation is performed ( 12 sec ) +Calculate response functions for output variable 1 ( 12 sec ) +Calculate response functions by the ordinary least square method ( 12 sec ) +Parametric error estimation is performed ( 12 sec ) +=============================================================================== +Perform analysis for segment length : 16384 ( 12 sec ) +Convert time-series data to frequency-domain ( 12 sec ) +Total number of segments : 336 ( 12 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00585938, Period(s): 170.667 ( 14 sec ) +Perform calibration correction ( 14 sec ) +Calculate rotated fields ( 14 sec ) +Calculate response functions by ordinary remote reference ( 14 sec ) +Calculate response functions for output variable 0 ( 14 sec ) +Calculate response functions by the ordinary least square method ( 14 sec ) +Parametric error estimation is performed ( 14 sec ) +Calculate response functions for output variable 1 ( 14 sec ) +Calculate response functions by the ordinary least square method ( 14 sec ) +Parametric error estimation is performed ( 14 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0078125, Period(s): 128 ( 14 sec ) +Perform calibration correction ( 14 sec ) +Calculate rotated fields ( 14 sec ) +Calculate response functions by ordinary remote reference ( 14 sec ) +Calculate response functions for output variable 0 ( 14 sec ) +Calculate response functions by the ordinary least square method ( 14 sec ) +Parametric error estimation is performed ( 14 sec ) +Calculate response functions for output variable 1 ( 14 sec ) +Calculate response functions by the ordinary least square method ( 14 sec ) +Parametric error estimation is performed ( 14 sec ) +=============================================================================== +Perform analysis for segment length : 8192 ( 14 sec ) +Convert time-series data to frequency-domain ( 14 sec ) +Total number of segments : 674 ( 14 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0117188, Period(s): 85.3333 ( 16 sec ) +Perform calibration correction ( 16 sec ) +Calculate rotated fields ( 16 sec ) +Calculate response functions by ordinary remote reference ( 16 sec ) +Calculate response functions for output variable 0 ( 16 sec ) +Calculate response functions by the ordinary least square method ( 16 sec ) +Parametric error estimation is performed ( 16 sec ) +Calculate response functions for output variable 1 ( 16 sec ) +Calculate response functions by the ordinary least square method ( 16 sec ) +Parametric error estimation is performed ( 16 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.015625, Period(s): 64 ( 16 sec ) +Perform calibration correction ( 16 sec ) +Calculate rotated fields ( 16 sec ) +Calculate response functions by ordinary remote reference ( 16 sec ) +Calculate response functions for output variable 0 ( 16 sec ) +Calculate response functions by the ordinary least square method ( 16 sec ) +Parametric error estimation is performed ( 16 sec ) +Calculate response functions for output variable 1 ( 16 sec ) +Calculate response functions by the ordinary least square method ( 16 sec ) +Parametric error estimation is performed ( 16 sec ) +=============================================================================== +Perform analysis for segment length : 4096 ( 16 sec ) +Convert time-series data to frequency-domain ( 16 sec ) +Total number of segments : 1349 ( 16 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0234375, Period(s): 42.6667 ( 17 sec ) +Perform calibration correction ( 17 sec ) +Calculate rotated fields ( 17 sec ) +Calculate response functions by ordinary remote reference ( 17 sec ) +Calculate response functions for output variable 0 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Parametric error estimation is performed ( 17 sec ) +Calculate response functions for output variable 1 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Parametric error estimation is performed ( 17 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.03125, Period(s): 32 ( 17 sec ) +Perform calibration correction ( 17 sec ) +Calculate rotated fields ( 17 sec ) +Calculate response functions by ordinary remote reference ( 17 sec ) +Calculate response functions for output variable 0 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Parametric error estimation is performed ( 17 sec ) +Calculate response functions for output variable 1 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Parametric error estimation is performed ( 17 sec ) +=============================================================================== +Perform analysis for segment length : 2048 ( 17 sec ) +Convert time-series data to frequency-domain ( 17 sec ) +Total number of segments : 2699 ( 17 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.046875, Period(s): 21.3333 ( 19 sec ) +Perform calibration correction ( 19 sec ) +Calculate rotated fields ( 19 sec ) +Calculate response functions by ordinary remote reference ( 19 sec ) +Calculate response functions for output variable 0 ( 19 sec ) +Calculate response functions by the ordinary least square method ( 19 sec ) +Parametric error estimation is performed ( 19 sec ) +Calculate response functions for output variable 1 ( 19 sec ) +Calculate response functions by the ordinary least square method ( 19 sec ) +Parametric error estimation is performed ( 19 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0625, Period(s): 16 ( 19 sec ) +Perform calibration correction ( 19 sec ) +Calculate rotated fields ( 19 sec ) +Calculate response functions by ordinary remote reference ( 19 sec ) +Calculate response functions for output variable 0 ( 19 sec ) +Calculate response functions by the ordinary least square method ( 19 sec ) +Parametric error estimation is performed ( 19 sec ) +Calculate response functions for output variable 1 ( 19 sec ) +Calculate response functions by the ordinary least square method ( 19 sec ) +Parametric error estimation is performed ( 19 sec ) +=============================================================================== +Perform analysis for segment length : 1024 ( 19 sec ) +Convert time-series data to frequency-domain ( 19 sec ) +Total number of segments : 5399 ( 19 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.09375, Period(s): 10.6667 ( 20 sec ) +Perform calibration correction ( 20 sec ) +Calculate rotated fields ( 20 sec ) +Calculate response functions by ordinary remote reference ( 20 sec ) +Calculate response functions for output variable 0 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Parametric error estimation is performed ( 20 sec ) +Calculate response functions for output variable 1 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Parametric error estimation is performed ( 20 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.125, Period(s): 8 ( 20 sec ) +Perform calibration correction ( 20 sec ) +Calculate rotated fields ( 20 sec ) +Calculate response functions by ordinary remote reference ( 20 sec ) +Calculate response functions for output variable 0 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Parametric error estimation is performed ( 20 sec ) +Calculate response functions for output variable 1 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Parametric error estimation is performed ( 20 sec ) +=============================================================================== +Perform analysis for segment length : 512 ( 20 sec ) +Convert time-series data to frequency-domain ( 20 sec ) +Total number of segments : 10799 ( 20 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.1875, Period(s): 5.33333 ( 22 sec ) +Perform calibration correction ( 22 sec ) +Calculate rotated fields ( 22 sec ) +Calculate response functions by ordinary remote reference ( 22 sec ) +Calculate response functions for output variable 0 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Parametric error estimation is performed ( 22 sec ) +Calculate response functions for output variable 1 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Parametric error estimation is performed ( 22 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.25, Period(s): 4 ( 22 sec ) +Perform calibration correction ( 22 sec ) +Calculate rotated fields ( 22 sec ) +Calculate response functions by ordinary remote reference ( 22 sec ) +Calculate response functions for output variable 0 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Parametric error estimation is performed ( 22 sec ) +Calculate response functions for output variable 1 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Parametric error estimation is performed ( 22 sec ) +=============================================================================== +Perform analysis for segment length : 256 ( 22 sec ) +Convert time-series data to frequency-domain ( 22 sec ) +Total number of segments : 21599 ( 22 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.375, Period(s): 2.66667 ( 24 sec ) +Perform calibration correction ( 24 sec ) +Calculate rotated fields ( 24 sec ) +Calculate response functions by ordinary remote reference ( 24 sec ) +Calculate response functions for output variable 0 ( 24 sec ) +Calculate response functions by the ordinary least square method ( 24 sec ) +Parametric error estimation is performed ( 24 sec ) +Calculate response functions for output variable 1 ( 24 sec ) +Calculate response functions by the ordinary least square method ( 24 sec ) +Parametric error estimation is performed ( 24 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.5, Period(s): 2 ( 24 sec ) +Perform calibration correction ( 24 sec ) +Calculate rotated fields ( 24 sec ) +Calculate response functions by ordinary remote reference ( 24 sec ) +Calculate response functions for output variable 0 ( 24 sec ) +Calculate response functions by the ordinary least square method ( 24 sec ) +Parametric error estimation is performed ( 24 sec ) +Calculate response functions for output variable 1 ( 24 sec ) +Calculate response functions by the ordinary least square method ( 24 sec ) +Parametric error estimation is performed ( 24 sec ) +=============================================================================== +Perform analysis for segment length : 128 ( 24 sec ) +Convert time-series data to frequency-domain ( 24 sec ) +Total number of segments : 43199 ( 24 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.75, Period(s): 1.33333 ( 25 sec ) +Perform calibration correction ( 25 sec ) +Calculate rotated fields ( 25 sec ) +Calculate response functions by ordinary remote reference ( 25 sec ) +Calculate response functions for output variable 0 ( 25 sec ) +Calculate response functions by the ordinary least square method ( 25 sec ) +Parametric error estimation is performed ( 25 sec ) +Calculate response functions for output variable 1 ( 25 sec ) +Calculate response functions by the ordinary least square method ( 25 sec ) +Parametric error estimation is performed ( 25 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 1, Period(s): 1 ( 25 sec ) +Perform calibration correction ( 25 sec ) +Calculate rotated fields ( 25 sec ) +Calculate response functions by ordinary remote reference ( 25 sec ) +Calculate response functions for output variable 0 ( 25 sec ) +Calculate response functions by the ordinary least square method ( 25 sec ) +Parametric error estimation is performed ( 25 sec ) +Calculate response functions for output variable 1 ( 25 sec ) +Calculate response functions by the ordinary least square method ( 25 sec ) +Parametric error estimation is performed ( 25 sec ) +End TRACMT ( 25 sec ) diff --git a/Samples/NonRobustRemoteReference/apparent_resistivity_and_phase.csv b/Samples/NonRobustRemoteReference/apparent_resistivity_and_phase.csv new file mode 100644 index 0000000..c9e855f --- /dev/null +++ b/Samples/NonRobustRemoteReference/apparent_resistivity_and_phase.csv @@ -0,0 +1,21 @@ +frequency,period,app_res_0_2,phase_0_2,app_res_0_3,phase_0_3,coherence_0_2+3,app_res_1_2,phase_1_2,app_res_1_3,phase_1_3,coherence_1_2+3,dapp_res_0_2,dphase_0_2,dapp_res_0_3,dphase_0_3,dapp_res_1_2,dphase_1_2,dapp_res_1_3,dphase_1_3 +1.4648437500e-03,6.8266666667e+02,4.3439931212e+01,4.8258024132e+01,4.1688452809e+01,5.3014214814e+01,8.8469008246e-01,1.5805526300e+02,-1.2905058619e+02,6.4849560945e+00,-1.3524485798e+02,9.4305915727e-01,3.3690232144e+00,2.2223702517e+00,3.4635140769e+00,2.3807774441e+00,6.2136295221e+00,1.1263075660e+00,1.3208211789e+00,5.8449817321e+00 +1.9531250000e-03,5.1200000000e+02,4.4201790775e+01,4.6114671043e+01,4.5475091489e+01,5.4792118884e+01,8.8117476976e-01,1.6913516599e+02,-1.2862575255e+02,8.0773816625e+00,-1.3063638437e+02,9.5206812438e-01,3.6600424768e+00,2.3728104457e+00,4.0482366560e+00,2.5511057134e+00,6.2247090309e+00,1.0543924593e+00,1.4833727938e+00,5.2684701321e+00 +2.9296875000e-03,3.4133333333e+02,3.9422126341e+01,5.1480630538e+01,5.2432599053e+01,6.0247384811e+01,8.1057433654e-01,1.7599584294e+02,-1.2541588946e+02,5.8552117518e+00,-1.2839384516e+02,9.1795261351e-01,2.8192223353e+00,2.0491535694e+00,3.7894049717e+00,2.0708890615e+00,5.8225755132e+00,9.4781846380e-01,1.2377879501e+00,6.0674792759e+00 +3.9062500000e-03,2.5600000000e+02,4.4143542485e+01,4.9363170827e+01,5.2434467640e+01,6.4375151174e+01,7.9529312750e-01,1.9515981731e+02,-1.2832541387e+02,6.6839689192e+00,-1.2514079521e+02,8.9823309221e-01,3.3801634274e+00,2.1941651353e+00,4.4135400945e+00,2.4120768517e+00,7.3597276715e+00,1.0804127890e+00,1.6317675464e+00,7.0113387294e+00 +5.8593750000e-03,1.7066666667e+02,5.2729192716e+01,4.8182052659e+01,5.6301329724e+01,6.0116226115e+01,6.9714037413e-01,2.0306618106e+02,-1.2974416401e+02,6.7586186926e+00,-1.3245111721e+02,8.5860507996e-01,3.3124269277e+00,1.7999450940e+00,4.2331392213e+00,2.1544622365e+00,6.3747196406e+00,8.9936081000e-01,1.4383141127e+00,6.1081738115e+00 +7.8125000000e-03,1.2800000000e+02,5.5373578002e+01,4.5333555005e+01,6.6303173500e+01,5.8064666615e+01,6.6243101745e-01,2.1095797199e+02,-1.2870685937e+02,8.3774706370e+00,-1.3616142787e+02,8.1652992410e-01,3.9364069731e+00,2.0369554542e+00,5.2652867417e+00,2.2755926948e+00,7.8105239459e+00,1.0607222319e+00,1.9025883137e+00,6.5202211360e+00 +1.1718750000e-02,8.5333333333e+01,5.8437573450e+01,4.1348027239e+01,7.5383241750e+01,5.9922540845e+01,5.6255496758e-01,2.4893409741e+02,-1.2995152666e+02,9.0707118284e+00,-1.2698899909e+02,7.5896390227e-01,3.6840792837e+00,1.8063478075e+00,5.1720678440e+00,1.9659264221e+00,7.7422263542e+00,8.9102854844e-01,1.8267885581e+00,5.7793133809e+00 +1.5625000000e-02,6.4000000000e+01,5.1760990943e+01,4.0963272318e+01,8.0640264680e+01,5.7638466973e+01,4.8823618087e-01,2.4433951559e+02,-1.3233082051e+02,8.1554356349e+00,-1.3411193012e+02,6.7112788794e-01,4.0194513109e+00,2.2251843996e+00,6.3182040702e+00,2.2451506574e+00,9.4708442748e+00,1.1104904161e+00,2.1790521255e+00,7.6773879253e+00 +2.3437500000e-02,4.2666666667e+01,4.8083059538e+01,4.0337977971e+01,9.0272215363e+01,5.6711840247e+01,2.8529865609e-01,2.5139035783e+02,-1.3398485460e+02,1.3646001184e+01,-1.3092226722e+02,5.4127075001e-01,3.5795687954e+00,2.1332001001e+00,6.6589253788e+00,2.1136895315e+00,8.9021145539e+00,1.0145183185e+00,2.8158790988e+00,5.9220871332e+00 +3.1250000000e-02,3.2000000000e+01,5.5704971072e+01,3.5435669997e+01,1.0725112638e+02,5.6289234236e+01,1.8288167094e-01,2.5370444257e+02,-1.3601879048e+02,1.4764311300e+01,-1.3224793142e+02,4.1689718636e-01,5.0225304352e+00,2.5838570119e+00,9.1700701378e+00,2.4501676819e+00,1.1254288242e+01,1.2709199982e+00,3.5723723600e+00,6.9486637394e+00 +4.6875000000e-02,2.1333333333e+01,7.1166112619e+01,3.1151888685e+01,1.1031797611e+02,5.7234235225e+01,0.0000000000e+00,2.3921212412e+02,-1.3959727801e+02,9.2260852110e+00,-1.3642252652e+02,1.3749136535e-01,6.1173036659e+00,2.4632768659e+00,9.9861813035e+00,2.5941446459e+00,1.1697062865e+01,1.4009723052e+00,3.0119436807e+00,9.3944140839e+00 +6.2500000000e-02,1.6000000000e+01,6.7186815892e+01,3.2462794842e+01,1.4859458243e+02,5.6178846629e+01,0.0000000000e+00,2.1995117514e+02,-1.3414376018e+02,1.1593824880e+01,-1.3689299548e+02,0.0000000000e+00,8.7410625152e+00,3.7297486912e+00,1.7841539826e+01,3.4417808559e+00,1.5789500836e+01,2.0569704208e+00,4.9753916696e+00,1.2390346059e+01 +9.3750000000e-02,1.0666666667e+01,4.3429860513e+01,3.0140602239e+01,1.5794748034e+02,5.9018744701e+01,0.0000000000e+00,2.1205209697e+02,-1.3305620911e+02,1.3933591532e+01,-9.9848555846e+01,0.0000000000e+00,8.6086422504e+00,5.6879062616e+00,2.2782719944e+01,4.1358303983e+00,1.9281914266e+01,2.6058531973e+00,6.8591322543e+00,1.4249010152e+01 +1.2500000000e-01,8.0000000000e+00,4.9756690032e+01,1.9899467883e+01,1.4733574563e+02,5.2537500448e+01,0.0000000000e+00,2.5655127865e+02,-1.3723463362e+02,4.3301730676e+00,-8.9116917318e+01,0.0000000000e+00,1.4944799814e+01,8.6372883093e+00,3.0368940619e+01,5.9154252456e+00,3.6583247388e+01,4.0885503014e+00,5.6125343002e+00,4.0396452284e+01 +1.8750000000e-01,5.3333333333e+00,3.8287795343e+01,3.7725280039e+01,1.7817974707e+02,4.8503439711e+01,0.0000000000e+00,2.6603859751e+02,-1.3437444590e+02,4.3102862340e-01,-1.1064334081e+02,0.0000000000e+00,2.1191952025e+01,1.6066063085e+01,5.2553779861e+01,8.4805726387e+00,5.9528113316e+01,6.4236266607e+00,2.7544624445e+00,3.6000000000e+02 +2.5000000000e-01,4.0000000000e+00,4.0483046079e+01,3.4446274250e+01,1.6548963640e+02,3.7249895138e+01,0.0000000000e+00,2.6101784068e+02,-1.5095164189e+02,4.1029062342e+00,1.6303682644e+02,0.0000000000e+00,3.1821660337e+01,2.3142825901e+01,7.6642870554e+01,1.3389166013e+01,8.9078314793e+01,9.8248255834e+00,1.3304017548e+01,3.6000000000e+02 +3.7500000000e-01,2.6666666667e+00,2.1275077719e+01,-1.2307247151e+02,3.2863961430e+02,1.9839626363e+01,0.0000000000e+00,1.0763695474e+02,-1.6391873627e+02,6.7011511919e+01,-9.0237564498e+01,0.0000000000e+00,4.3429979397e+01,3.6000000000e+02,2.6886698296e+02,2.4145831783e+01,7.1747554228e+01,1.9468280361e+01,8.9171193704e+01,4.1708594952e+01 +5.0000000000e-01,2.0000000000e+00,1.1712247875e+00,-4.4816155073e+01,2.0588790332e+02,1.7012371582e+01,0.0000000000e+00,2.2399698921e+01,-1.3551513404e+02,1.5590968093e+01,1.6669346345e+02,0.0000000000e+00,7.5753105221e+00,3.6000000000e+02,2.1428080610e+02,3.1357893175e+01,1.7702730579e+01,2.3275675508e+01,3.1509626435e+01,3.6000000000e+02 +7.5000000000e-01,1.3333333333e+00,1.1944686208e+02,1.7300053406e+02,1.0519975799e+02,3.3543938500e+01,0.0000000000e+00,1.0236687330e+01,-4.1477825957e+01,6.6177497072e+01,-1.3886878892e+02,0.0000000000e+00,1.6964566872e+02,4.5245516761e+01,1.8535393568e+02,6.1758602935e+01,3.1572335160e+01,3.6000000000e+02,9.3459013428e+01,4.4920407031e+01 +1.0000000000e+00,1.0000000000e+00,4.6277191207e+01,4.2464688138e+01,2.2123687969e+02,-4.9613047546e+01,0.0000000000e+00,3.4931890994e+01,-1.5468047827e+02,1.6167769729e+02,-1.3659513255e+02,0.0000000000e+00,1.2325192597e+02,3.6000000000e+02,5.7971489516e+02,3.6000000000e+02,9.2340982943e+01,3.6000000000e+02,4.2735026826e+02,3.6000000000e+02 diff --git a/Samples/NonRobustRemoteReference/param.dat b/Samples/NonRobustRemoteReference/param.dat new file mode 100644 index 0000000..e6551f6 --- /dev/null +++ b/Samples/NonRobustRemoteReference/param.dat @@ -0,0 +1,51 @@ +NUM_OUT +2 +SAMPLING_FREQ +32 +NUM_SECTION +1 +SEGMENT +10 +65536 2 3 4 +32768 2 3 4 +16384 2 3 4 +8192 2 3 4 +4096 2 3 4 +2048 2 3 4 +1024 2 3 4 +512 2 3 4 +256 2 3 4 +128 2 3 4 +ROTATION +0.0 +AZIMUTH +0.0 90.0 +0.0 90.0 +0.0 90.0 +MESTIMATORS +-1 +-1 +OUTPUT_RHOA_PHS +PREWHITENING +0 +10 +5 +PROCEDURE +0 +ERROR_ESTIMATION +0 +DATA_FILES +2764800 +../ex.txt +0 +../ey.txt +0 +../hx.txt +0 +../hy.txt +0 +../hrx.txt +0 +../hry.txt +0 +END diff --git a/Samples/NonRobustRemoteReference/response_functions.csv b/Samples/NonRobustRemoteReference/response_functions.csv new file mode 100644 index 0000000..48a328e --- /dev/null +++ b/Samples/NonRobustRemoteReference/response_functions.csv @@ -0,0 +1,21 @@ +frequency,period,resp_real_0_2,resp_imag_0_2,resp_real_0_3,resp_imag_0_3,coherence_0_2+3,resp_real_1_2,resp_imag_1_2,resp_real_1_3,resp_imag_1_3,coherence_1_2+3,dresp_0_2,dresp_0_3,dresp_1_2,dresp_1_3 +1.4648437500e-03,6.8266666667e+02,3.7553820017e-01,4.2087363768e-01,3.3243638090e-01,4.4138577273e-01,8.8469008246e-01,-6.7784440534e-01,-8.3555866519e-01,-1.5476304204e-01,-1.5344587919e-01,9.4305915727e-01,2.1873087828e-02,2.2954071290e-02,2.1149082551e-02,2.2194285161e-02 +1.9531250000e-03,5.1200000000e+02,4.5544857553e-01,4.7352371439e-01,3.8421100852e-01,5.4449480370e-01,8.8117476976e-01,-8.0225452024e-01,-1.0040409803e+00,-1.8290990486e-01,-2.1313058674e-01,9.5206812438e-01,2.7201084488e-02,2.9661911055e-02,2.3649508781e-02,2.5789031546e-02 +2.9296875000e-03,3.4133333333e+02,4.7325994887e-01,5.9455662019e-01,4.3491283983e-01,7.6085903553e-01,8.1057433654e-01,-9.3047711320e-01,-1.3085398150e+00,-1.8188757126e-01,-2.2953565043e-01,9.1795261351e-01,2.7172209868e-02,3.1669119087e-02,2.6560092321e-02,3.0955698147e-02 +3.9062500000e-03,2.5600000000e+02,6.0472014875e-01,7.0462195953e-01,4.3765943304e-01,9.1244995303e-01,7.9529312750e-01,-1.2107121638e+00,-1.5316302550e+00,-2.0796664613e-01,-2.9545920539e-01,8.9823309221e-01,3.5549961220e-02,4.2590591203e-02,3.6813030195e-02,4.4103809574e-02 +5.8593750000e-03,1.7066666667e+02,8.2872344233e-01,9.2629262330e-01,6.3989762316e-01,1.1135457113e+00,6.9714037413e-01,-1.5594640887e+00,-1.8754402895e+00,-3.0034351832e-01,-3.2832937427e-01,8.5860507996e-01,3.9039243982e-02,4.8281847422e-02,3.8284496690e-02,4.7348412502e-02 +7.8125000000e-03,1.2800000000e+02,1.0338873781e+00,1.0459958318e+00,8.5127811729e-01,1.3657574023e+00,6.6243101745e-01,-1.7951117014e+00,-2.2401160150e+00,-4.1261865410e-01,-3.9622063683e-01,8.1652992410e-01,5.2275563242e-02,6.3900593401e-02,5.3141305459e-02,6.4958859213e-02 +1.1718750000e-02,8.5333333333e+01,1.3891345140e+00,1.2224491283e+00,1.0532910900e+00,1.8186711360e+00,5.6255496758e-01,-2.4524326255e+00,-2.9277220646e+00,-4.3863034994e-01,-5.8231472358e-01,7.5896390227e-01,5.8328194320e-02,7.2097874138e-02,5.9390820027e-02,7.3411356500e-02 +1.5625000000e-02,6.4000000000e+01,1.5185112514e+00,1.3183136943e+00,1.3434936737e+00,2.1201522179e+00,4.8823618087e-01,-2.9421960630e+00,-3.2299391608e+00,-5.5560572962e-01,-5.7310180788e-01,6.7112788794e-01,7.8078327300e-02,9.8329243113e-02,8.4675322809e-02,1.0663727938e-01 +2.3437500000e-02,4.2666666667e+01,1.8093730204e+00,1.5365229620e+00,1.7851365055e+00,2.7188348414e+00,2.8529865609e-01,-3.7693573785e+00,-3.9053492175e+00,-8.2833789941e-01,-9.5550881111e-01,5.4127075001e-01,8.8357885759e-02,1.1996035627e-01,9.6101356857e-02,1.3047339134e-01 +3.1250000000e-02,3.2000000000e+01,2.4037562191e+00,1.7105138905e+00,2.2719800121e+00,3.4053039984e+00,1.8288167094e-01,-4.5304948017e+00,-4.3721774900e+00,-1.0211877886e+00,-1.1243216359e+00,4.1689718636e-01,1.3300121794e-01,1.7500551855e-01,1.3964777332e-01,1.8375118186e-01 +4.6875000000e-02,2.1333333333e+01,3.4951354558e+00,2.1127199981e+00,2.7519546708e+00,4.2758064900e+00,0.0000000000e+00,-5.7019240790e+00,-4.8531848706e+00,-1.0652917315e+00,-1.0136652544e+00,1.3749136535e-01,1.7552907521e-01,2.3014521543e-01,1.8306734250e-01,2.4002902613e-01 +6.2500000000e-02,1.6000000000e+01,3.8661238649e+00,2.4594646221e+00,3.7929013994e+00,5.6612459746e+00,0.0000000000e+00,-5.7741092844e+00,-5.9493196421e+00,-1.3896584759e+00,-1.3007380964e+00,0.0000000000e+00,2.9806927530e-01,4.0909659139e-01,2.9757762442e-01,4.0842180630e-01 +9.3750000000e-02,1.0666666667e+01,3.9019206664e+00,2.2655600254e+00,4.4292457294e+00,7.3769684613e+00,0.0000000000e+00,-6.8066230237e+00,-7.2848681162e+00,-4.3713076268e-01,-2.5179927972e+00,0.0000000000e+00,4.4717867795e-01,6.2056869745e-01,4.5328307822e-01,6.2904003098e-01 +1.2500000000e-01,8.0000000000e+00,5.2435831843e+00,1.8980955348e+00,5.8367421539e+00,7.6169076432e+00,0.0000000000e+00,-9.2962168092e+00,-8.5979591876e+00,2.5354448993e-02,-1.6449058694e+00,0.0000000000e+00,8.3747986432e-01,9.8897563629e-01,9.0282832323e-01,1.0661452931e+00 +1.8750000000e-01,5.3333333333e+00,4.7387832652e+00,3.6658888826e+00,8.5634725028e+00,9.6804158779e+00,0.0000000000e+00,-1.1044579801e+01,-1.1288420713e+01,-2.2410881813e-01,-5.9486517134e-01,0.0000000000e+00,1.6580454254e+00,1.9060330681e+00,1.7668734138e+00,2.0311380510e+00 +2.5000000000e-01,4.0000000000e+00,5.8663087458e+00,4.0237084012e+00,1.1448673553e+01,8.7057405984e+00,0.0000000000e+00,-1.5790867096e+01,-8.7704513688e+00,-2.1661192484e+00,6.6072701972e-01,0.0000000000e+00,2.7958331837e+00,3.3305148333e+00,3.0822077414e+00,3.6716563284e+00 +3.7500000000e-01,2.6666666667e+00,-3.4465905605e+00,-5.2926160103e+00,2.3350002398e+01,8.4247649729e+00,0.0000000000e+00,-1.3650415635e+01,-3.9351547786e+00,-4.6476456345e-02,-1.1209122391e+01,0.0000000000e+00,6.4465103767e+00,1.0154257166e+01,4.7347498661e+00,7.4579679465e+00 +5.0000000000e-01,2.0000000000e+00,1.2138476800e+00,-1.2060828241e+00,2.1694670304e+01,6.6378489509e+00,0.0000000000e+00,-5.3388269985e+00,-5.2436793936e+00,-6.0755766250e+00,1.4369373350e+00,0.0000000000e+00,5.5337600149e+00,1.1806138254e+01,2.9570534728e+00,6.3087994474e+00 +7.5000000000e-01,1.3333333333e+00,-2.1006524904e+01,2.5790781806e+00,1.6554229461e+01,1.0975271268e+01,0.0000000000e+00,4.6419465867e+00,-4.1036458635e+00,-1.1865446987e+01,-1.0362276864e+01,0.0000000000e+00,1.5029379184e+01,1.7497664286e+01,9.5546024925e+00,1.1123761318e+01 +1.0000000000e+00,1.0000000000e+00,1.1221334153e+01,1.0269742736e+01,2.1550278604e+01,-2.5333177664e+01,0.0000000000e+00,-1.1946320447e+01,-5.6519804277e+00,-2.0656437395e+01,-1.9537146173e+01,0.0000000000e+00,2.0256538096e+01,4.3575331878e+01,1.7467809685e+01,3.7576292680e+01 diff --git a/Samples/OrdinaryRobustRemoteReference/TRACMT.cvg b/Samples/OrdinaryRobustRemoteReference/TRACMT.cvg new file mode 100644 index 0000000..a88699f --- /dev/null +++ b/Samples/OrdinaryRobustRemoteReference/TRACMT.cvg @@ -0,0 +1,2529 @@ +================================================================================ +Now Frequency(Hz): 0.00146484, Period(s): 682.667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.88469 + Estimated response function: ( 3.7554e-01, 4.2087e-01), ( 3.3244e-01, 4.4139e-01) + Amplitude of the estimated response function: 5.6406e-01, 5.5257e-01 + Phase(deg.) of the estimated response function: 48.3, 53.0 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.022806 + Sum of weights: 82.9476 + Squared coherence: 0.885022 + Estimated response function: ( 3.7573e-01, 4.2087e-01), ( 3.3240e-01, 4.4119e-01) + Amplitude of the estimated response function: 5.6419e-01, 5.5240e-01 + Phase(deg.) of the estimated response function: 48.2, 53.0 + Weighted residual power: 0.000981678 +Iteration number = 1 + Scale factor: 0.0227546 + Sum of weights: 82.9452 + Squared coherence: 0.885037 + Estimated response function: ( 3.7574e-01, 4.2087e-01), ( 3.3240e-01, 4.4118e-01) + Amplitude of the estimated response function: 5.6419e-01, 5.5239e-01 + Phase(deg.) of the estimated response function: 48.2, 53.0 + Weighted residual power: 0.000981555 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0227546 + Parameter c: 2.72115 + Sum of weights: 52.3421 + Squared coherence: 0.936934 + Estimated response function: ( 3.6478e-01, 4.3058e-01), ( 3.1974e-01, 4.3805e-01) + Amplitude of the estimated response function: 5.6433e-01, 5.4233e-01 + Phase(deg.) of the estimated response function: 49.7, 53.9 + Weighted residual power: 0.000472609 +Iteration number = 1 + Scale factor: 0.0227546 + Parameter c: 2.72115 + Sum of weights: 52.4908 + Squared coherence: 0.936921 + Estimated response function: ( 3.6093e-01, 4.3574e-01), ( 3.1606e-01, 4.3815e-01) + Amplitude of the estimated response function: 5.6581e-01, 5.4025e-01 + Phase(deg.) of the estimated response function: 50.4, 54.2 + Weighted residual power: 0.000466372 +Iteration number = 2 + Scale factor: 0.0227546 + Parameter c: 2.72115 + Sum of weights: 52.4937 + Squared coherence: 0.937038 + Estimated response function: ( 3.5945e-01, 4.3869e-01), ( 3.1506e-01, 4.3901e-01) + Amplitude of the estimated response function: 5.6715e-01, 5.4036e-01 + Phase(deg.) of the estimated response function: 50.7, 54.3 + Weighted residual power: 0.000464009 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.943059 + Estimated response function: ( -6.7784e-01, -8.3556e-01), ( -1.5476e-01, -1.5345e-01) + Amplitude of the estimated response function: 1.0759e+00, 2.1794e-01 + Phase(deg.) of the estimated response function: -129.1, -135.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0222735 + Sum of weights: 82.9436 + Squared coherence: 0.943228 + Estimated response function: ( -6.7752e-01, -8.3556e-01), ( -1.5541e-01, -1.5301e-01) + Amplitude of the estimated response function: 1.0757e+00, 2.1809e-01 + Phase(deg.) of the estimated response function: -129.0, -135.4 + Weighted residual power: 0.00091751 +Iteration number = 1 + Scale factor: 0.0223012 + Sum of weights: 82.9424 + Squared coherence: 0.943231 + Estimated response function: ( -6.7752e-01, -8.3556e-01), ( -1.5542e-01, -1.5300e-01) + Amplitude of the estimated response function: 1.0757e+00, 2.1809e-01 + Phase(deg.) of the estimated response function: -129.0, -135.4 + Weighted residual power: 0.000917455 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0223012 + Parameter c: 2.72115 + Sum of weights: 52.5864 + Squared coherence: 0.96767 + Estimated response function: ( -6.7183e-01, -8.2903e-01), ( -1.6088e-01, -1.5195e-01) + Amplitude of the estimated response function: 1.0671e+00, 2.2129e-01 + Phase(deg.) of the estimated response function: -129.0, -136.6 + Weighted residual power: 0.000494981 +Iteration number = 1 + Scale factor: 0.0223012 + Parameter c: 2.72115 + Sum of weights: 52.6135 + Squared coherence: 0.967771 + Estimated response function: ( -6.6963e-01, -8.2683e-01), ( -1.6317e-01, -1.5197e-01) + Amplitude of the estimated response function: 1.0640e+00, 2.2298e-01 + Phase(deg.) of the estimated response function: -129.0, -137.0 + Weighted residual power: 0.000492262 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00195312, Period(s): 512 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.881175 + Estimated response function: ( 4.5545e-01, 4.7352e-01), ( 3.8421e-01, 5.4449e-01) + Amplitude of the estimated response function: 6.5701e-01, 6.6640e-01 + Phase(deg.) of the estimated response function: 46.1, 54.8 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0218496 + Sum of weights: 82.6197 + Squared coherence: 0.882984 + Estimated response function: ( 4.5500e-01, 4.7346e-01), ( 3.8344e-01, 5.4390e-01) + Amplitude of the estimated response function: 6.5665e-01, 6.6547e-01 + Phase(deg.) of the estimated response function: 46.1, 54.8 + Weighted residual power: 0.000963873 +Iteration number = 1 + Scale factor: 0.0216392 + Sum of weights: 82.5946 + Squared coherence: 0.883104 + Estimated response function: ( 4.5497e-01, 4.7346e-01), ( 3.8339e-01, 5.4387e-01) + Amplitude of the estimated response function: 6.5663e-01, 6.6541e-01 + Phase(deg.) of the estimated response function: 46.1, 54.8 + Weighted residual power: 0.000962433 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0216392 + Parameter c: 2.72115 + Sum of weights: 51.9848 + Squared coherence: 0.94671 + Estimated response function: ( 4.5796e-01, 4.7390e-01), ( 3.9126e-01, 5.4359e-01) + Amplitude of the estimated response function: 6.5902e-01, 6.6975e-01 + Phase(deg.) of the estimated response function: 46.0, 54.3 + Weighted residual power: 0.000405453 +Iteration number = 1 + Scale factor: 0.0216392 + Parameter c: 2.72115 + Sum of weights: 51.9775 + Squared coherence: 0.947136 + Estimated response function: ( 4.5955e-01, 4.7370e-01), ( 3.9451e-01, 5.4318e-01) + Amplitude of the estimated response function: 6.5998e-01, 6.7133e-01 + Phase(deg.) of the estimated response function: 45.9, 54.0 + Weighted residual power: 0.000403474 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 83 + Squared coherence: 0.952068 + Estimated response function: ( -8.0225e-01, -1.0040e+00), ( -1.8291e-01, -2.1313e-01) + Amplitude of the estimated response function: 1.2852e+00, 2.8086e-01 + Phase(deg.) of the estimated response function: -128.6, -130.6 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0202773 + Sum of weights: 82.6902 + Squared coherence: 0.953928 + Estimated response function: ( -8.0554e-01, -1.0066e+00), ( -1.8058e-01, -2.1369e-01) + Amplitude of the estimated response function: 1.2892e+00, 2.7978e-01 + Phase(deg.) of the estimated response function: -128.7, -130.2 + Weighted residual power: 0.000718665 +Iteration number = 1 + Scale factor: 0.0200992 + Sum of weights: 82.6802 + Squared coherence: 0.953988 + Estimated response function: ( -8.0565e-01, -1.0067e+00), ( -1.8050e-01, -2.1371e-01) + Amplitude of the estimated response function: 1.2894e+00, 2.7974e-01 + Phase(deg.) of the estimated response function: -128.7, -130.2 + Weighted residual power: 0.000717807 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0200992 + Parameter c: 2.72115 + Sum of weights: 54.5999 + Squared coherence: 0.977877 + Estimated response function: ( -8.1360e-01, -1.0059e+00), ( -1.8360e-01, -1.9836e-01) + Amplitude of the estimated response function: 1.2937e+00, 2.7029e-01 + Phase(deg.) of the estimated response function: -129.0, -132.8 + Weighted residual power: 0.000366205 +Iteration number = 1 + Scale factor: 0.0200992 + Parameter c: 2.72115 + Sum of weights: 54.666 + Squared coherence: 0.978069 + Estimated response function: ( -8.1499e-01, -1.0054e+00), ( -1.8576e-01, -1.9361e-01) + Amplitude of the estimated response function: 1.2943e+00, 2.6831e-01 + Phase(deg.) of the estimated response function: -129.0, -133.8 + Weighted residual power: 0.000362375 +Iteration number = 2 + Scale factor: 0.0200992 + Parameter c: 2.72115 + Sum of weights: 54.6546 + Squared coherence: 0.978125 + Estimated response function: ( -8.1503e-01, -1.0052e+00), ( -1.8687e-01, -1.9200e-01) + Amplitude of the estimated response function: 1.2941e+00, 2.6793e-01 + Phase(deg.) of the estimated response function: -129.0, -134.2 + Weighted residual power: 0.000361139 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00292969, Period(s): 341.333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.810574 + Estimated response function: ( 4.7326e-01, 5.9456e-01), ( 4.3491e-01, 7.6086e-01) + Amplitude of the estimated response function: 7.5992e-01, 8.7639e-01 + Phase(deg.) of the estimated response function: 51.5, 60.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0288886 + Sum of weights: 166.415 + Squared coherence: 0.814823 + Estimated response function: ( 4.7388e-01, 5.9538e-01), ( 4.3979e-01, 7.6089e-01) + Amplitude of the estimated response function: 7.6094e-01, 8.7885e-01 + Phase(deg.) of the estimated response function: 51.5, 60.0 + Weighted residual power: 0.00175102 +Iteration number = 1 + Scale factor: 0.0285009 + Sum of weights: 166.298 + Squared coherence: 0.81525 + Estimated response function: ( 4.7421e-01, 5.9551e-01), ( 4.4048e-01, 7.6065e-01) + Amplitude of the estimated response function: 7.6125e-01, 8.7898e-01 + Phase(deg.) of the estimated response function: 51.5, 59.9 + Weighted residual power: 0.00174595 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0285009 + Parameter c: 2.69063 + Sum of weights: 100.247 + Squared coherence: 0.894387 + Estimated response function: ( 4.9245e-01, 5.9734e-01), ( 4.8112e-01, 7.4061e-01) + Amplitude of the estimated response function: 7.7416e-01, 8.8317e-01 + Phase(deg.) of the estimated response function: 50.5, 57.0 + Weighted residual power: 0.00083162 +Iteration number = 1 + Scale factor: 0.0285009 + Parameter c: 2.69063 + Sum of weights: 100.909 + Squared coherence: 0.897317 + Estimated response function: ( 5.0209e-01, 5.9962e-01), ( 5.0016e-01, 7.3271e-01) + Amplitude of the estimated response function: 7.8207e-01, 8.8714e-01 + Phase(deg.) of the estimated response function: 50.1, 55.7 + Weighted residual power: 0.000825873 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.917953 + Estimated response function: ( -9.3048e-01, -1.3085e+00), ( -1.8189e-01, -2.2954e-01) + Amplitude of the estimated response function: 1.6056e+00, 2.9286e-01 + Phase(deg.) of the estimated response function: -125.4, -128.4 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0333414 + Sum of weights: 166.919 + Squared coherence: 0.918131 + Estimated response function: ( -9.3035e-01, -1.3084e+00), ( -1.8163e-01, -2.2931e-01) + Amplitude of the estimated response function: 1.6054e+00, 2.9253e-01 + Phase(deg.) of the estimated response function: -125.4, -128.4 + Weighted residual power: 0.00170763 +Iteration number = 1 + Scale factor: 0.0332804 + Sum of weights: 166.913 + Squared coherence: 0.918144 + Estimated response function: ( -9.3035e-01, -1.3084e+00), ( -1.8161e-01, -2.2931e-01) + Amplitude of the estimated response function: 1.6054e+00, 2.9252e-01 + Phase(deg.) of the estimated response function: -125.4, -128.4 + Weighted residual power: 0.00170733 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0332804 + Parameter c: 2.69063 + Sum of weights: 114.527 + Squared coherence: 0.95728 + Estimated response function: ( -9.3352e-01, -1.3030e+00), ( -1.7784e-01, -2.2987e-01) + Amplitude of the estimated response function: 1.6029e+00, 2.9064e-01 + Phase(deg.) of the estimated response function: -125.6, -127.7 + Weighted residual power: 0.000879729 +Iteration number = 1 + Scale factor: 0.0332804 + Parameter c: 2.69063 + Sum of weights: 114.55 + Squared coherence: 0.957274 + Estimated response function: ( -9.3460e-01, -1.3012e+00), ( -1.7667e-01, -2.2967e-01) + Amplitude of the estimated response function: 1.6020e+00, 2.8976e-01 + Phase(deg.) of the estimated response function: -125.7, -127.6 + Weighted residual power: 0.00087964 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00390625, Period(s): 256 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.795293 + Estimated response function: ( 6.0472e-01, 7.0462e-01), ( 4.3766e-01, 9.1245e-01) + Amplitude of the estimated response function: 9.2854e-01, 1.0120e+00 + Phase(deg.) of the estimated response function: 49.4, 64.4 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0310511 + Sum of weights: 166.784 + Squared coherence: 0.796375 + Estimated response function: ( 6.0490e-01, 7.0408e-01), ( 4.3770e-01, 9.1133e-01) + Amplitude of the estimated response function: 9.2824e-01, 1.0110e+00 + Phase(deg.) of the estimated response function: 49.3, 64.3 + Weighted residual power: 0.00163652 +Iteration number = 1 + Scale factor: 0.0309407 + Sum of weights: 166.773 + Squared coherence: 0.796417 + Estimated response function: ( 6.0491e-01, 7.0403e-01), ( 4.3769e-01, 9.1124e-01) + Amplitude of the estimated response function: 9.2821e-01, 1.0109e+00 + Phase(deg.) of the estimated response function: 49.3, 64.3 + Weighted residual power: 0.00163594 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0309407 + Parameter c: 2.69063 + Sum of weights: 109.585 + Squared coherence: 0.890475 + Estimated response function: ( 6.2530e-01, 6.8916e-01), ( 4.4520e-01, 9.1482e-01) + Amplitude of the estimated response function: 9.3056e-01, 1.0174e+00 + Phase(deg.) of the estimated response function: 47.8, 64.0 + Weighted residual power: 0.000825154 +Iteration number = 1 + Scale factor: 0.0309407 + Parameter c: 2.69063 + Sum of weights: 109.718 + Squared coherence: 0.890703 + Estimated response function: ( 6.3352e-01, 6.8379e-01), ( 4.4827e-01, 9.1508e-01) + Amplitude of the estimated response function: 9.3215e-01, 1.0190e+00 + Phase(deg.) of the estimated response function: 47.2, 63.9 + Weighted residual power: 0.000824492 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 167 + Squared coherence: 0.898233 + Estimated response function: ( -1.2107e+00, -1.5316e+00), ( -2.0797e-01, -2.9546e-01) + Amplitude of the estimated response function: 1.9524e+00, 3.6131e-01 + Phase(deg.) of the estimated response function: -128.3, -125.1 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0320828 + Sum of weights: 166.624 + Squared coherence: 0.899563 + Estimated response function: ( -1.2101e+00, -1.5314e+00), ( -2.0696e-01, -2.9203e-01) + Amplitude of the estimated response function: 1.9518e+00, 3.5793e-01 + Phase(deg.) of the estimated response function: -128.3, -125.3 + Weighted residual power: 0.00174138 +Iteration number = 1 + Scale factor: 0.0320228 + Sum of weights: 166.616 + Squared coherence: 0.899589 + Estimated response function: ( -1.2101e+00, -1.5314e+00), ( -2.0694e-01, -2.9196e-01) + Amplitude of the estimated response function: 1.9517e+00, 3.5786e-01 + Phase(deg.) of the estimated response function: -128.3, -125.3 + Weighted residual power: 0.00174085 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0320228 + Parameter c: 2.69063 + Sum of weights: 111.539 + Squared coherence: 0.956214 + Estimated response function: ( -1.2112e+00, -1.5584e+00), ( -1.9635e-01, -3.2332e-01) + Amplitude of the estimated response function: 1.9737e+00, 3.7827e-01 + Phase(deg.) of the estimated response function: -127.9, -121.3 + Weighted residual power: 0.000787953 +Iteration number = 1 + Scale factor: 0.0320228 + Parameter c: 2.69063 + Sum of weights: 111.669 + Squared coherence: 0.957058 + Estimated response function: ( -1.2109e+00, -1.5662e+00), ( -1.9305e-01, -3.3339e-01) + Amplitude of the estimated response function: 1.9797e+00, 3.8525e-01 + Phase(deg.) of the estimated response function: -127.7, -120.1 + Weighted residual power: 0.000778579 +Iteration number = 2 + Scale factor: 0.0320228 + Parameter c: 2.69063 + Sum of weights: 111.647 + Squared coherence: 0.957266 + Estimated response function: ( -1.2106e+00, -1.5685e+00), ( -1.9204e-01, -3.3643e-01) + Amplitude of the estimated response function: 1.9813e+00, 3.8739e-01 + Phase(deg.) of the estimated response function: -127.7, -119.7 + Weighted residual power: 0.000776143 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00585938, Period(s): 170.667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.69714 + Estimated response function: ( 8.2872e-01, 9.2629e-01), ( 6.3990e-01, 1.1135e+00) + Amplitude of the estimated response function: 1.2429e+00, 1.2843e+00 + Phase(deg.) of the estimated response function: 48.2, 60.1 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0475882 + Sum of weights: 334.961 + Squared coherence: 0.70271 + Estimated response function: ( 8.2515e-01, 9.2992e-01), ( 6.4011e-01, 1.1171e+00) + Amplitude of the estimated response function: 1.2432e+00, 1.2875e+00 + Phase(deg.) of the estimated response function: 48.4, 60.2 + Weighted residual power: 0.00363032 +Iteration number = 1 + Scale factor: 0.0477639 + Sum of weights: 334.979 + Squared coherence: 0.702626 + Estimated response function: ( 8.2517e-01, 9.2988e-01), ( 6.4016e-01, 1.1171e+00) + Amplitude of the estimated response function: 1.2432e+00, 1.2875e+00 + Phase(deg.) of the estimated response function: 48.4, 60.2 + Weighted residual power: 0.00363163 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0477639 + Parameter c: 2.67584 + Sum of weights: 229.978 + Squared coherence: 0.830192 + Estimated response function: ( 8.3095e-01, 9.1333e-01), ( 6.5443e-01, 1.1158e+00) + Amplitude of the estimated response function: 1.2348e+00, 1.2935e+00 + Phase(deg.) of the estimated response function: 47.7, 59.6 + Weighted residual power: 0.00176792 +Iteration number = 1 + Scale factor: 0.0477639 + Parameter c: 2.67584 + Sum of weights: 229.971 + Squared coherence: 0.830423 + Estimated response function: ( 8.3299e-01, 9.0717e-01), ( 6.5910e-01, 1.1151e+00) + Amplitude of the estimated response function: 1.2316e+00, 1.2954e+00 + Phase(deg.) of the estimated response function: 47.4, 59.4 + Weighted residual power: 0.00176226 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.858605 + Estimated response function: ( -1.5595e+00, -1.8754e+00), ( -3.0034e-01, -3.2833e-01) + Amplitude of the estimated response function: 2.4391e+00, 4.4498e-01 + Phase(deg.) of the estimated response function: -129.7, -132.5 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.043179 + Sum of weights: 334.663 + Squared coherence: 0.862036 + Estimated response function: ( -1.5605e+00, -1.8813e+00), ( -3.0019e-01, -3.2961e-01) + Amplitude of the estimated response function: 2.4443e+00, 4.4583e-01 + Phase(deg.) of the estimated response function: -129.7, -132.3 + Weighted residual power: 0.00348942 +Iteration number = 1 + Scale factor: 0.0434217 + Sum of weights: 334.699 + Squared coherence: 0.861959 + Estimated response function: ( -1.5605e+00, -1.8812e+00), ( -3.0017e-01, -3.2963e-01) + Amplitude of the estimated response function: 2.4442e+00, 4.4582e-01 + Phase(deg.) of the estimated response function: -129.7, -132.3 + Weighted residual power: 0.00349146 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0434217 + Parameter c: 2.67584 + Sum of weights: 218.773 + Squared coherence: 0.934817 + Estimated response function: ( -1.5645e+00, -1.9067e+00), ( -2.9279e-01, -3.4999e-01) + Amplitude of the estimated response function: 2.4664e+00, 4.5631e-01 + Phase(deg.) of the estimated response function: -129.4, -129.9 + Weighted residual power: 0.00156197 +Iteration number = 1 + Scale factor: 0.0434217 + Parameter c: 2.67584 + Sum of weights: 218.759 + Squared coherence: 0.93531 + Estimated response function: ( -1.5655e+00, -1.9144e+00), ( -2.9153e-01, -3.5669e-01) + Amplitude of the estimated response function: 2.4730e+00, 4.6067e-01 + Phase(deg.) of the estimated response function: -129.3, -129.3 + Weighted residual power: 0.00155742 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0078125, Period(s): 128 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.662431 + Estimated response function: ( 1.0339e+00, 1.0460e+00), ( 8.5128e-01, 1.3658e+00) + Amplitude of the estimated response function: 1.4707e+00, 1.6093e+00 + Phase(deg.) of the estimated response function: 45.3, 58.1 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0460144 + Sum of weights: 335.168 + Squared coherence: 0.666596 + Estimated response function: ( 1.0353e+00, 1.0504e+00), ( 8.5002e-01, 1.3582e+00) + Amplitude of the estimated response function: 1.4749e+00, 1.6022e+00 + Phase(deg.) of the estimated response function: 45.4, 58.0 + Weighted residual power: 0.00337387 +Iteration number = 1 + Scale factor: 0.0459654 + Sum of weights: 335.155 + Squared coherence: 0.666657 + Estimated response function: ( 1.0354e+00, 1.0505e+00), ( 8.4997e-01, 1.3581e+00) + Amplitude of the estimated response function: 1.4750e+00, 1.6021e+00 + Phase(deg.) of the estimated response function: 45.4, 58.0 + Weighted residual power: 0.00337296 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0459654 + Parameter c: 2.67584 + Sum of weights: 231.347 + Squared coherence: 0.814872 + Estimated response function: ( 1.0069e+00, 1.0782e+00), ( 8.7246e-01, 1.3195e+00) + Amplitude of the estimated response function: 1.4753e+00, 1.5818e+00 + Phase(deg.) of the estimated response function: 47.0, 56.5 + Weighted residual power: 0.00158587 +Iteration number = 1 + Scale factor: 0.0459654 + Parameter c: 2.67584 + Sum of weights: 231.639 + Squared coherence: 0.815162 + Estimated response function: ( 9.9871e-01, 1.0857e+00), ( 8.7903e-01, 1.3108e+00) + Amplitude of the estimated response function: 1.4752e+00, 1.5783e+00 + Phase(deg.) of the estimated response function: 47.4, 56.2 + Weighted residual power: 0.00158008 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 336 + Squared coherence: 0.81653 + Estimated response function: ( -1.7951e+00, -2.2401e+00), ( -4.1262e-01, -3.9622e-01) + Amplitude of the estimated response function: 2.8706e+00, 5.7205e-01 + Phase(deg.) of the estimated response function: -128.7, -136.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0455373 + Sum of weights: 335.227 + Squared coherence: 0.818577 + Estimated response function: ( -1.7943e+00, -2.2358e+00), ( -4.1218e-01, -3.9641e-01) + Amplitude of the estimated response function: 2.8668e+00, 5.7187e-01 + Phase(deg.) of the estimated response function: -128.7, -136.1 + Weighted residual power: 0.0034975 +Iteration number = 1 + Scale factor: 0.0453679 + Sum of weights: 335.203 + Squared coherence: 0.818638 + Estimated response function: ( -1.7943e+00, -2.2357e+00), ( -4.1220e-01, -3.9638e-01) + Amplitude of the estimated response function: 2.8667e+00, 5.7186e-01 + Phase(deg.) of the estimated response function: -128.7, -136.1 + Weighted residual power: 0.00349601 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0453679 + Parameter c: 2.67584 + Sum of weights: 224.586 + Squared coherence: 0.912459 + Estimated response function: ( -1.8245e+00, -2.2802e+00), ( -3.8474e-01, -4.1682e-01) + Amplitude of the estimated response function: 2.9203e+00, 5.6724e-01 + Phase(deg.) of the estimated response function: -128.7, -132.7 + Weighted residual power: 0.00160985 +Iteration number = 1 + Scale factor: 0.0453679 + Parameter c: 2.67584 + Sum of weights: 224.574 + Squared coherence: 0.913729 + Estimated response function: ( -1.8321e+00, -2.2944e+00), ( -3.7612e-01, -4.2190e-01) + Amplitude of the estimated response function: 2.9361e+00, 5.6521e-01 + Phase(deg.) of the estimated response function: -128.6, -131.7 + Weighted residual power: 0.00159654 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0117188, Period(s): 85.3333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.562555 + Estimated response function: ( 1.3891e+00, 1.2224e+00), ( 1.0533e+00, 1.8187e+00) + Amplitude of the estimated response function: 1.8504e+00, 2.1017e+00 + Phase(deg.) of the estimated response function: 41.3, 59.9 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0742573 + Sum of weights: 673.05 + Squared coherence: 0.565359 + Estimated response function: ( 1.3889e+00, 1.2208e+00), ( 1.0530e+00, 1.8221e+00) + Amplitude of the estimated response function: 1.8491e+00, 2.1045e+00 + Phase(deg.) of the estimated response function: 41.3, 60.0 + Weighted residual power: 0.00743701 +Iteration number = 1 + Scale factor: 0.0744731 + Sum of weights: 673.077 + Squared coherence: 0.565286 + Estimated response function: ( 1.3889e+00, 1.2207e+00), ( 1.0531e+00, 1.8221e+00) + Amplitude of the estimated response function: 1.8491e+00, 2.1045e+00 + Phase(deg.) of the estimated response function: 41.3, 60.0 + Weighted residual power: 0.00743906 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0744731 + Parameter c: 2.66852 + Sum of weights: 489.075 + Squared coherence: 0.742511 + Estimated response function: ( 1.3675e+00, 1.2292e+00), ( 1.0951e+00, 1.8011e+00) + Amplitude of the estimated response function: 1.8387e+00, 2.1079e+00 + Phase(deg.) of the estimated response function: 42.0, 58.7 + Weighted residual power: 0.00353595 +Iteration number = 1 + Scale factor: 0.0744731 + Parameter c: 2.66852 + Sum of weights: 489.254 + Squared coherence: 0.74254 + Estimated response function: ( 1.3622e+00, 1.2308e+00), ( 1.1061e+00, 1.7975e+00) + Amplitude of the estimated response function: 1.8358e+00, 2.1105e+00 + Phase(deg.) of the estimated response function: 42.1, 58.4 + Weighted residual power: 0.00353299 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.758964 + Estimated response function: ( -2.4524e+00, -2.9277e+00), ( -4.3863e-01, -5.8231e-01) + Amplitude of the estimated response function: 3.8192e+00, 7.2903e-01 + Phase(deg.) of the estimated response function: -130.0, -127.0 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0736573 + Sum of weights: 672.775 + Squared coherence: 0.761626 + Estimated response function: ( -2.4472e+00, -2.9333e+00), ( -4.4179e-01, -5.8236e-01) + Amplitude of the estimated response function: 3.8200e+00, 7.3097e-01 + Phase(deg.) of the estimated response function: -129.8, -127.2 + Weighted residual power: 0.00768526 +Iteration number = 1 + Scale factor: 0.0735713 + Sum of weights: 672.759 + Squared coherence: 0.761659 + Estimated response function: ( -2.4471e+00, -2.9334e+00), ( -4.4183e-01, -5.8239e-01) + Amplitude of the estimated response function: 3.8201e+00, 7.3102e-01 + Phase(deg.) of the estimated response function: -129.8, -127.2 + Weighted residual power: 0.00768386 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0735713 + Parameter c: 2.66852 + Sum of weights: 477.002 + Squared coherence: 0.869332 + Estimated response function: ( -2.4661e+00, -2.9406e+00), ( -4.6564e-01, -6.1156e-01) + Amplitude of the estimated response function: 3.8378e+00, 7.6865e-01 + Phase(deg.) of the estimated response function: -130.0, -127.3 + Weighted residual power: 0.003871 +Iteration number = 1 + Scale factor: 0.0735713 + Parameter c: 2.66852 + Sum of weights: 476.746 + Squared coherence: 0.86986 + Estimated response function: ( -2.4713e+00, -2.9427e+00), ( -4.7131e-01, -6.2091e-01) + Amplitude of the estimated response function: 3.8428e+00, 7.7953e-01 + Phase(deg.) of the estimated response function: -130.0, -127.2 + Weighted residual power: 0.00386602 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.015625, Period(s): 64 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.488236 + Estimated response function: ( 1.5185e+00, 1.3183e+00), ( 1.3435e+00, 2.1202e+00) + Amplitude of the estimated response function: 2.0109e+00, 2.5100e+00 + Phase(deg.) of the estimated response function: 41.0, 57.6 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0724904 + Sum of weights: 673.116 + Squared coherence: 0.491499 + Estimated response function: ( 1.5222e+00, 1.3148e+00), ( 1.3426e+00, 2.1181e+00) + Amplitude of the estimated response function: 2.0114e+00, 2.5078e+00 + Phase(deg.) of the estimated response function: 40.8, 57.6 + Weighted residual power: 0.00708811 +Iteration number = 1 + Scale factor: 0.0723684 + Sum of weights: 673.104 + Squared coherence: 0.491541 + Estimated response function: ( 1.5223e+00, 1.3148e+00), ( 1.3426e+00, 2.1181e+00) + Amplitude of the estimated response function: 2.0114e+00, 2.5077e+00 + Phase(deg.) of the estimated response function: 40.8, 57.6 + Weighted residual power: 0.00708714 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0723684 + Parameter c: 2.66852 + Sum of weights: 484.607 + Squared coherence: 0.673544 + Estimated response function: ( 1.5379e+00, 1.3279e+00), ( 1.3537e+00, 2.0805e+00) + Amplitude of the estimated response function: 2.0319e+00, 2.4821e+00 + Phase(deg.) of the estimated response function: 40.8, 57.0 + Weighted residual power: 0.00356131 +Iteration number = 1 + Scale factor: 0.0723684 + Parameter c: 2.66852 + Sum of weights: 484.737 + Squared coherence: 0.673597 + Estimated response function: ( 1.5427e+00, 1.3317e+00), ( 1.3569e+00, 2.0699e+00) + Amplitude of the estimated response function: 2.0379e+00, 2.4750e+00 + Phase(deg.) of the estimated response function: 40.8, 56.8 + Weighted residual power: 0.00356028 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 674 + Squared coherence: 0.671128 + Estimated response function: ( -2.9422e+00, -3.2299e+00), ( -5.5561e-01, -5.7310e-01) + Amplitude of the estimated response function: 4.3691e+00, 7.9821e-01 + Phase(deg.) of the estimated response function: -132.3, -134.1 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.0683443 + Sum of weights: 671.868 + Squared coherence: 0.676499 + Estimated response function: ( -2.9375e+00, -3.2372e+00), ( -5.6057e-01, -5.7689e-01) + Amplitude of the estimated response function: 4.3713e+00, 8.0439e-01 + Phase(deg.) of the estimated response function: -132.2, -134.2 + Weighted residual power: 0.00826111 +Iteration number = 1 + Scale factor: 0.0686162 + Sum of weights: 671.933 + Squared coherence: 0.676362 + Estimated response function: ( -2.9375e+00, -3.2371e+00), ( -5.6056e-01, -5.7699e-01) + Amplitude of the estimated response function: 4.3713e+00, 8.0445e-01 + Phase(deg.) of the estimated response function: -132.2, -134.2 + Weighted residual power: 0.00826535 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.0686162 + Parameter c: 2.66852 + Sum of weights: 453.048 + Squared coherence: 0.839968 + Estimated response function: ( -2.9356e+00, -3.2364e+00), ( -5.7037e-01, -6.1945e-01) + Amplitude of the estimated response function: 4.3695e+00, 8.4204e-01 + Phase(deg.) of the estimated response function: -132.2, -132.6 + Weighted residual power: 0.00349775 +Iteration number = 1 + Scale factor: 0.0686162 + Parameter c: 2.66852 + Sum of weights: 453.093 + Squared coherence: 0.840113 + Estimated response function: ( -2.9349e+00, -3.2365e+00), ( -5.7423e-01, -6.3253e-01) + Amplitude of the estimated response function: 4.3690e+00, 8.5430e-01 + Phase(deg.) of the estimated response function: -132.2, -132.2 + Weighted residual power: 0.00349658 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0234375, Period(s): 42.6667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.285299 + Estimated response function: ( 1.8094e+00, 1.5365e+00), ( 1.7851e+00, 2.7188e+00) + Amplitude of the estimated response function: 2.3738e+00, 3.2525e+00 + Phase(deg.) of the estimated response function: 40.3, 56.7 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.115513 + Sum of weights: 1347.73 + Squared coherence: 0.288686 + Estimated response function: ( 1.8099e+00, 1.5348e+00), ( 1.7857e+00, 2.7240e+00) + Amplitude of the estimated response function: 2.3730e+00, 3.2572e+00 + Phase(deg.) of the estimated response function: 40.3, 56.8 + Weighted residual power: 0.0161098 +Iteration number = 1 + Scale factor: 0.115815 + Sum of weights: 1347.76 + Squared coherence: 0.288633 + Estimated response function: ( 1.8098e+00, 1.5348e+00), ( 1.7857e+00, 2.7240e+00) + Amplitude of the estimated response function: 2.3730e+00, 3.2572e+00 + Phase(deg.) of the estimated response function: 40.3, 56.8 + Weighted residual power: 0.0161126 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.115815 + Parameter c: 2.66487 + Sum of weights: 1007.23 + Squared coherence: 0.522855 + Estimated response function: ( 1.9083e+00, 1.5870e+00), ( 1.8507e+00, 2.7172e+00) + Amplitude of the estimated response function: 2.4819e+00, 3.2876e+00 + Phase(deg.) of the estimated response function: 39.7, 55.7 + Weighted residual power: 0.0082682 +Iteration number = 1 + Scale factor: 0.115815 + Parameter c: 2.66487 + Sum of weights: 1005.03 + Squared coherence: 0.526725 + Estimated response function: ( 1.9289e+00, 1.5975e+00), ( 1.8642e+00, 2.7140e+00) + Amplitude of the estimated response function: 2.5045e+00, 3.2926e+00 + Phase(deg.) of the estimated response function: 39.6, 55.5 + Weighted residual power: 0.0082418 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.541271 + Estimated response function: ( -3.7694e+00, -3.9053e+00), ( -8.2834e-01, -9.5551e-01) + Amplitude of the estimated response function: 5.4277e+00, 1.2646e+00 + Phase(deg.) of the estimated response function: -134.0, -130.9 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.123226 + Sum of weights: 1347.51 + Squared coherence: 0.545925 + Estimated response function: ( -3.7673e+00, -3.9069e+00), ( -8.2413e-01, -9.6010e-01) + Amplitude of the estimated response function: 5.4274e+00, 1.2653e+00 + Phase(deg.) of the estimated response function: -134.0, -130.6 + Weighted residual power: 0.0190019 +Iteration number = 1 + Scale factor: 0.123251 + Sum of weights: 1347.51 + Squared coherence: 0.545922 + Estimated response function: ( -3.7673e+00, -3.9069e+00), ( -8.2410e-01, -9.6011e-01) + Amplitude of the estimated response function: 5.4274e+00, 1.2653e+00 + Phase(deg.) of the estimated response function: -134.0, -130.6 + Weighted residual power: 0.0190021 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.123251 + Parameter c: 2.66487 + Sum of weights: 1000.12 + Squared coherence: 0.747648 + Estimated response function: ( -3.7331e+00, -3.8562e+00), ( -8.1722e-01, -1.0234e+00) + Amplitude of the estimated response function: 5.3671e+00, 1.3097e+00 + Phase(deg.) of the estimated response function: -134.1, -128.6 + Weighted residual power: 0.00904234 +Iteration number = 1 + Scale factor: 0.123251 + Parameter c: 2.66487 + Sum of weights: 1001.08 + Squared coherence: 0.746773 + Estimated response function: ( -3.7264e+00, -3.8462e+00), ( -8.1508e-01, -1.0360e+00) + Amplitude of the estimated response function: 5.3553e+00, 1.3182e+00 + Phase(deg.) of the estimated response function: -134.1, -128.2 + Weighted residual power: 0.00905133 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.03125, Period(s): 32 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.182882 + Estimated response function: ( 2.4038e+00, 1.7105e+00), ( 2.2720e+00, 3.4053e+00) + Amplitude of the estimated response function: 2.9502e+00, 4.0937e+00 + Phase(deg.) of the estimated response function: 35.4, 56.3 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.117692 + Sum of weights: 1347.7 + Squared coherence: 0.18659 + Estimated response function: ( 2.3990e+00, 1.7126e+00), ( 2.2691e+00, 3.4123e+00) + Amplitude of the estimated response function: 2.9476e+00, 4.0978e+00 + Phase(deg.) of the estimated response function: 35.5, 56.4 + Weighted residual power: 0.0178857 +Iteration number = 1 + Scale factor: 0.117671 + Sum of weights: 1347.69 + Squared coherence: 0.186601 + Estimated response function: ( 2.3990e+00, 1.7126e+00), ( 2.2691e+00, 3.4123e+00) + Amplitude of the estimated response function: 2.9476e+00, 4.0978e+00 + Phase(deg.) of the estimated response function: 35.5, 56.4 + Weighted residual power: 0.0178853 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.117671 + Parameter c: 2.66487 + Sum of weights: 989.787 + Squared coherence: 0.467743 + Estimated response function: ( 2.3768e+00, 1.7658e+00), ( 2.3306e+00, 3.4004e+00) + Amplitude of the estimated response function: 2.9610e+00, 4.1224e+00 + Phase(deg.) of the estimated response function: 36.6, 55.6 + Weighted residual power: 0.00848306 +Iteration number = 1 + Scale factor: 0.117671 + Parameter c: 2.66487 + Sum of weights: 989.147 + Squared coherence: 0.468887 + Estimated response function: ( 2.3703e+00, 1.7797e+00), ( 2.3475e+00, 3.3996e+00) + Amplitude of the estimated response function: 2.9640e+00, 4.1313e+00 + Phase(deg.) of the estimated response function: 36.9, 55.4 + Weighted residual power: 0.00847388 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 1349 + Squared coherence: 0.416897 + Estimated response function: ( -4.5305e+00, -4.3722e+00), ( -1.0212e+00, -1.1243e+00) + Amplitude of the estimated response function: 6.2961e+00, 1.5189e+00 + Phase(deg.) of the estimated response function: -136.0, -132.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.131509 + Sum of weights: 1348.11 + Squared coherence: 0.419911 + Estimated response function: ( -4.5371e+00, -4.3670e+00), ( -1.0142e+00, -1.1239e+00) + Amplitude of the estimated response function: 6.2973e+00, 1.5139e+00 + Phase(deg.) of the estimated response function: -136.1, -132.1 + Weighted residual power: 0.0197379 +Iteration number = 1 + Scale factor: 0.131457 + Sum of weights: 1348.11 + Squared coherence: 0.41992 + Estimated response function: ( -4.5371e+00, -4.3670e+00), ( -1.0141e+00, -1.1239e+00) + Amplitude of the estimated response function: 6.2973e+00, 1.5138e+00 + Phase(deg.) of the estimated response function: -136.1, -132.1 + Weighted residual power: 0.0197375 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.131457 + Parameter c: 2.66487 + Sum of weights: 1019.39 + Squared coherence: 0.653343 + Estimated response function: ( -4.4342e+00, -4.3396e+00), ( -9.1178e-01, -1.0439e+00) + Amplitude of the estimated response function: 6.2044e+00, 1.3861e+00 + Phase(deg.) of the estimated response function: -135.6, -131.1 + Weighted residual power: 0.00995038 +Iteration number = 1 + Scale factor: 0.131457 + Parameter c: 2.66487 + Sum of weights: 1022.78 + Squared coherence: 0.651157 + Estimated response function: ( -4.4130e+00, -4.3338e+00), ( -8.9339e-01, -1.0216e+00) + Amplitude of the estimated response function: 6.1852e+00, 1.3571e+00 + Phase(deg.) of the estimated response function: -135.5, -131.2 + Weighted residual power: 0.00998484 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.046875, Period(s): 21.3333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0 + Estimated response function: ( 3.4951e+00, 2.1127e+00), ( 2.7520e+00, 4.2758e+00) + Amplitude of the estimated response function: 4.0841e+00, 5.0849e+00 + Phase(deg.) of the estimated response function: 31.2, 57.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.190613 + Sum of weights: 2696.85 + Squared coherence: 0 + Estimated response function: ( 3.4905e+00, 2.1061e+00), ( 2.7290e+00, 4.2591e+00) + Amplitude of the estimated response function: 4.0767e+00, 5.0584e+00 + Phase(deg.) of the estimated response function: 31.1, 57.4 + Weighted residual power: 0.0415517 +Iteration number = 1 + Scale factor: 0.190219 + Sum of weights: 2696.83 + Squared coherence: 0 + Estimated response function: ( 3.4905e+00, 2.1061e+00), ( 2.7287e+00, 4.2589e+00) + Amplitude of the estimated response function: 4.0767e+00, 5.0581e+00 + Phase(deg.) of the estimated response function: 31.1, 57.4 + Weighted residual power: 0.0415476 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.190219 + Parameter c: 2.66305 + Sum of weights: 2039.99 + Squared coherence: 0.25142 + Estimated response function: ( 3.4017e+00, 2.0860e+00), ( 2.6299e+00, 4.2306e+00) + Amplitude of the estimated response function: 3.9903e+00, 4.9814e+00 + Phase(deg.) of the estimated response function: 31.5, 58.1 + Weighted residual power: 0.0203781 +Iteration number = 1 + Scale factor: 0.190219 + Parameter c: 2.66305 + Sum of weights: 2046.23 + Squared coherence: 0.246995 + Estimated response function: ( 3.3798e+00, 2.0824e+00), ( 2.6063e+00, 4.2245e+00) + Amplitude of the estimated response function: 3.9698e+00, 4.9638e+00 + Phase(deg.) of the estimated response function: 31.6, 58.3 + Weighted residual power: 0.0204523 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0.137491 + Estimated response function: ( -5.7019e+00, -4.8532e+00), ( -1.0653e+00, -1.0137e+00) + Amplitude of the estimated response function: 7.4877e+00, 1.4705e+00 + Phase(deg.) of the estimated response function: -139.6, -136.4 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.208203 + Sum of weights: 2697.61 + Squared coherence: 0.141308 + Estimated response function: ( -5.6961e+00, -4.8610e+00), ( -1.0740e+00, -1.0233e+00) + Amplitude of the estimated response function: 7.4883e+00, 1.4834e+00 + Phase(deg.) of the estimated response function: -139.5, -136.4 + Weighted residual power: 0.0454558 +Iteration number = 1 + Scale factor: 0.208441 + Sum of weights: 2697.62 + Squared coherence: 0.141288 + Estimated response function: ( -5.6961e+00, -4.8610e+00), ( -1.0740e+00, -1.0233e+00) + Amplitude of the estimated response function: 7.4883e+00, 1.4834e+00 + Phase(deg.) of the estimated response function: -139.5, -136.4 + Weighted residual power: 0.0454571 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.208441 + Parameter c: 2.66305 + Sum of weights: 2082.6 + Squared coherence: 0.444755 + Estimated response function: ( -5.6530e+00, -4.9602e+00), ( -8.8944e-01, -1.1365e+00) + Amplitude of the estimated response function: 7.5206e+00, 1.4432e+00 + Phase(deg.) of the estimated response function: -138.7, -128.0 + Weighted residual power: 0.0238622 +Iteration number = 1 + Scale factor: 0.208441 + Parameter c: 2.66305 + Sum of weights: 2081.68 + Squared coherence: 0.44573 + Estimated response function: ( -5.6433e+00, -4.9820e+00), ( -8.4906e-01, -1.1529e+00) + Amplitude of the estimated response function: 7.5278e+00, 1.4318e+00 + Phase(deg.) of the estimated response function: -138.6, -126.4 + Weighted residual power: 0.0238195 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0625, Period(s): 16 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0 + Estimated response function: ( 3.8661e+00, 2.4595e+00), ( 3.7929e+00, 5.6612e+00) + Amplitude of the estimated response function: 4.5821e+00, 6.8144e+00 + Phase(deg.) of the estimated response function: 32.5, 56.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.214947 + Sum of weights: 2696.72 + Squared coherence: 0 + Estimated response function: ( 3.8557e+00, 2.4604e+00), ( 3.7434e+00, 5.6688e+00) + Amplitude of the estimated response function: 4.5738e+00, 6.7933e+00 + Phase(deg.) of the estimated response function: 32.5, 56.6 + Weighted residual power: 0.049531 +Iteration number = 1 + Scale factor: 0.21527 + Sum of weights: 2696.76 + Squared coherence: 0 + Estimated response function: ( 3.8559e+00, 2.4600e+00), ( 3.7437e+00, 5.6683e+00) + Amplitude of the estimated response function: 4.5738e+00, 6.7930e+00 + Phase(deg.) of the estimated response function: 32.5, 56.6 + Weighted residual power: 0.0495366 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.21527 + Parameter c: 2.66305 + Sum of weights: 2080.02 + Squared coherence: 0.0308249 + Estimated response function: ( 3.9277e+00, 2.4448e+00), ( 3.2823e+00, 5.5237e+00) + Amplitude of the estimated response function: 4.6264e+00, 6.4254e+00 + Phase(deg.) of the estimated response function: 31.9, 59.3 + Weighted residual power: 0.0247656 +Iteration number = 1 + Scale factor: 0.21527 + Parameter c: 2.66305 + Sum of weights: 2092.65 + Squared coherence: 0.0208152 + Estimated response function: ( 3.9482e+00, 2.4427e+00), ( 3.1831e+00, 5.4907e+00) + Amplitude of the estimated response function: 4.6427e+00, 6.3466e+00 + Phase(deg.) of the estimated response function: 31.7, 59.9 + Weighted residual power: 0.0249937 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 2699 + Squared coherence: 0 + Estimated response function: ( -5.7741e+00, -5.9493e+00), ( -1.3897e+00, -1.3007e+00) + Amplitude of the estimated response function: 8.2906e+00, 1.9034e+00 + Phase(deg.) of the estimated response function: -134.1, -136.9 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.219695 + Sum of weights: 2698.47 + Squared coherence: 0 + Estimated response function: ( -5.7752e+00, -5.9441e+00), ( -1.4083e+00, -1.3112e+00) + Amplitude of the estimated response function: 8.2876e+00, 1.9242e+00 + Phase(deg.) of the estimated response function: -134.2, -137.0 + Weighted residual power: 0.0498645 +Iteration number = 1 + Scale factor: 0.219928 + Sum of weights: 2698.48 + Squared coherence: 0 + Estimated response function: ( -5.7751e+00, -5.9442e+00), ( -1.4081e+00, -1.3112e+00) + Amplitude of the estimated response function: 8.2877e+00, 1.9241e+00 + Phase(deg.) of the estimated response function: -134.2, -137.0 + Weighted residual power: 0.0498661 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.219928 + Parameter c: 2.66305 + Sum of weights: 2091.2 + Squared coherence: 0.248979 + Estimated response function: ( -6.0605e+00, -5.8105e+00), ( -1.4275e+00, -1.3844e+00) + Amplitude of the estimated response function: 8.3959e+00, 1.9886e+00 + Phase(deg.) of the estimated response function: -136.2, -135.9 + Weighted residual power: 0.0263899 +Iteration number = 1 + Scale factor: 0.219928 + Parameter c: 2.66305 + Sum of weights: 2085.17 + Squared coherence: 0.254814 + Estimated response function: ( -6.1214e+00, -5.7715e+00), ( -1.4449e+00, -1.3872e+00) + Amplitude of the estimated response function: 8.4132e+00, 2.0030e+00 + Phase(deg.) of the estimated response function: -136.7, -136.2 + Weighted residual power: 0.0262236 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.09375, Period(s): 10.6667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( 3.9019e+00, 2.2656e+00), ( 4.4292e+00, 7.3770e+00) + Amplitude of the estimated response function: 4.5120e+00, 8.6045e+00 + Phase(deg.) of the estimated response function: 30.1, 59.0 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.3301 + Sum of weights: 5394.64 + Squared coherence: 0 + Estimated response function: ( 3.8949e+00, 2.2811e+00), ( 4.3922e+00, 7.3913e+00) + Amplitude of the estimated response function: 4.5137e+00, 8.5979e+00 + Phase(deg.) of the estimated response function: 30.4, 59.3 + Weighted residual power: 0.117904 +Iteration number = 1 + Scale factor: 0.32998 + Sum of weights: 5394.63 + Squared coherence: 0 + Estimated response function: ( 3.8950e+00, 2.2811e+00), ( 4.3922e+00, 7.3915e+00) + Amplitude of the estimated response function: 4.5138e+00, 8.5980e+00 + Phase(deg.) of the estimated response function: 30.4, 59.3 + Weighted residual power: 0.117905 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.32998 + Parameter c: 2.66214 + Sum of weights: 4164.24 + Squared coherence: 0 + Estimated response function: ( 3.8730e+00, 2.1104e+00), ( 4.5287e+00, 7.1763e+00) + Amplitude of the estimated response function: 4.4107e+00, 8.4858e+00 + Phase(deg.) of the estimated response function: 28.6, 57.7 + Weighted residual power: 0.0551405 +Iteration number = 1 + Scale factor: 0.32998 + Parameter c: 2.66214 + Sum of weights: 4179.34 + Squared coherence: 0 + Estimated response function: ( 3.8739e+00, 2.0798e+00), ( 4.5622e+00, 7.1418e+00) + Amplitude of the estimated response function: 4.3969e+00, 8.4746e+00 + Phase(deg.) of the estimated response function: 28.2, 57.4 + Weighted residual power: 0.0556177 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( -6.8066e+00, -7.2849e+00), ( -4.3713e-01, -2.5180e+00) + Amplitude of the estimated response function: 9.9699e+00, 2.5557e+00 + Phase(deg.) of the estimated response function: -133.1, -99.8 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.304303 + Sum of weights: 5391.17 + Squared coherence: 0 + Estimated response function: ( -6.7845e+00, -7.3230e+00), ( -4.5213e-01, -2.6111e+00) + Amplitude of the estimated response function: 9.9827e+00, 2.6500e+00 + Phase(deg.) of the estimated response function: -132.8, -99.8 + Weighted residual power: 0.121071 +Iteration number = 1 + Scale factor: 0.305432 + Sum of weights: 5391.25 + Squared coherence: 0 + Estimated response function: ( -6.7849e+00, -7.3232e+00), ( -4.5196e-01, -2.6117e+00) + Amplitude of the estimated response function: 9.9832e+00, 2.6505e+00 + Phase(deg.) of the estimated response function: -132.8, -99.8 + Weighted residual power: 0.121094 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.305432 + Parameter c: 2.66214 + Sum of weights: 3996.97 + Squared coherence: 0.0985905 + Estimated response function: ( -6.8657e+00, -6.9912e+00), ( -1.3267e+00, -2.5057e+00) + Amplitude of the estimated response function: 9.7987e+00, 2.8352e+00 + Phase(deg.) of the estimated response function: -134.5, -117.9 + Weighted residual power: 0.0485671 +Iteration number = 1 + Scale factor: 0.305432 + Parameter c: 2.66214 + Sum of weights: 4013.31 + Squared coherence: 0.0861207 + Estimated response function: ( -6.9019e+00, -6.9385e+00), ( -1.5094e+00, -2.4943e+00) + Amplitude of the estimated response function: 9.7866e+00, 2.9154e+00 + Phase(deg.) of the estimated response function: -134.8, -121.2 + Weighted residual power: 0.0492692 +Iteration number = 2 + Scale factor: 0.305432 + Parameter c: 2.66214 + Sum of weights: 4012.28 + Squared coherence: 0.0853595 + Estimated response function: ( -6.9144e+00, -6.9310e+00), ( -1.5498e+00, -2.4941e+00) + Amplitude of the estimated response function: 9.7902e+00, 2.9364e+00 + Phase(deg.) of the estimated response function: -134.9, -121.9 + Weighted residual power: 0.0493184 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.125, Period(s): 8 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( 5.2436e+00, 1.8981e+00), ( 5.8367e+00, 7.6169e+00) + Amplitude of the estimated response function: 5.5766e+00, 9.5961e+00 + Phase(deg.) of the estimated response function: 19.9, 52.5 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.361732 + Sum of weights: 5397.06 + Squared coherence: 0 + Estimated response function: ( 5.2345e+00, 1.8737e+00), ( 5.8302e+00, 7.6385e+00) + Amplitude of the estimated response function: 5.5598e+00, 9.6092e+00 + Phase(deg.) of the estimated response function: 19.7, 52.6 + Weighted residual power: 0.136418 +Iteration number = 1 + Scale factor: 0.362392 + Sum of weights: 5397.09 + Squared coherence: 0 + Estimated response function: ( 5.2343e+00, 1.8739e+00), ( 5.8296e+00, 7.6385e+00) + Amplitude of the estimated response function: 5.5596e+00, 9.6089e+00 + Phase(deg.) of the estimated response function: 19.7, 52.6 + Weighted residual power: 0.136419 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.362392 + Parameter c: 2.66214 + Sum of weights: 4190.59 + Squared coherence: 0 + Estimated response function: ( 4.7311e+00, 1.9972e+00), ( 5.8180e+00, 7.9060e+00) + Amplitude of the estimated response function: 5.1354e+00, 9.8160e+00 + Phase(deg.) of the estimated response function: 22.9, 53.7 + Weighted residual power: 0.0674299 +Iteration number = 1 + Scale factor: 0.362392 + Parameter c: 2.66214 + Sum of weights: 4193.77 + Squared coherence: 0 + Estimated response function: ( 4.6529e+00, 2.0178e+00), ( 5.7916e+00, 7.9785e+00) + Amplitude of the estimated response function: 5.0716e+00, 9.8589e+00 + Phase(deg.) of the estimated response function: 23.4, 54.0 + Weighted residual power: 0.0674119 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 5399 + Squared coherence: 0 + Estimated response function: ( -9.2962e+00, -8.5980e+00), ( 2.5354e-02, -1.6449e+00) + Amplitude of the estimated response function: 1.2663e+01, 1.6451e+00 + Phase(deg.) of the estimated response function: -137.2, -89.1 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.34741 + Sum of weights: 5390.19 + Squared coherence: 0 + Estimated response function: ( -9.2735e+00, -8.6384e+00), ( -3.3656e-02, -1.5436e+00) + Amplitude of the estimated response function: 1.2674e+01, 1.5440e+00 + Phase(deg.) of the estimated response function: -137.0, -91.2 + Weighted residual power: 0.156267 +Iteration number = 1 + Scale factor: 0.348718 + Sum of weights: 5390.42 + Squared coherence: 0 + Estimated response function: ( -9.2731e+00, -8.6408e+00), ( -3.3343e-02, -1.5414e+00) + Amplitude of the estimated response function: 1.2675e+01, 1.5418e+00 + Phase(deg.) of the estimated response function: -137.0, -91.2 + Weighted residual power: 0.156339 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.348718 + Parameter c: 2.66214 + Sum of weights: 4025.8 + Squared coherence: 0 + Estimated response function: ( -8.1755e+00, -8.0965e+00), ( -7.7671e-01, -2.2409e+00) + Amplitude of the estimated response function: 1.1506e+01, 2.3717e+00 + Phase(deg.) of the estimated response function: -135.3, -109.1 + Weighted residual power: 0.0570727 +Iteration number = 1 + Scale factor: 0.348718 + Parameter c: 2.66214 + Sum of weights: 4121.07 + Squared coherence: 0 + Estimated response function: ( -8.0524e+00, -7.9570e+00), ( -9.3388e-01, -2.3522e+00) + Amplitude of the estimated response function: 1.1321e+01, 2.5308e+00 + Phase(deg.) of the estimated response function: -135.3, -111.7 + Weighted residual power: 0.0604893 +Iteration number = 2 + Scale factor: 0.348718 + Parameter c: 2.66214 + Sum of weights: 4134.36 + Squared coherence: 0 + Estimated response function: ( -8.0428e+00, -7.9240e+00), ( -9.6379e-01, -2.3677e+00) + Amplitude of the estimated response function: 1.1291e+01, 2.5563e+00 + Phase(deg.) of the estimated response function: -135.4, -112.1 + Weighted residual power: 0.0610442 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.1875, Period(s): 5.33333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( 4.7388e+00, 3.6659e+00), ( 8.5635e+00, 9.6804e+00) + Amplitude of the estimated response function: 5.9912e+00, 1.2925e+01 + Phase(deg.) of the estimated response function: 37.7, 48.5 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.502386 + Sum of weights: 10757.9 + Squared coherence: 0 + Estimated response function: ( 4.6041e+00, 3.4384e+00), ( 8.5797e+00, 9.8077e+00) + Amplitude of the estimated response function: 5.7463e+00, 1.3031e+01 + Phase(deg.) of the estimated response function: 36.8, 48.8 + Weighted residual power: 0.372829 +Iteration number = 1 + Scale factor: 0.502108 + Sum of weights: 10757.4 + Squared coherence: 0 + Estimated response function: ( 4.6032e+00, 3.4316e+00), ( 8.5797e+00, 9.8081e+00) + Amplitude of the estimated response function: 5.7415e+00, 1.3031e+01 + Phase(deg.) of the estimated response function: 36.7, 48.8 + Weighted residual power: 0.372609 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.502108 + Parameter c: 2.66169 + Sum of weights: 7881.37 + Squared coherence: 0 + Estimated response function: ( 4.4361e+00, 2.6423e+00), ( 7.6949e+00, 1.0975e+01) + Amplitude of the estimated response function: 5.1634e+00, 1.3404e+01 + Phase(deg.) of the estimated response function: 30.8, 55.0 + Weighted residual power: 0.126534 +Iteration number = 1 + Scale factor: 0.502108 + Parameter c: 2.66169 + Sum of weights: 7871.52 + Squared coherence: 0 + Estimated response function: ( 4.4089e+00, 2.5843e+00), ( 7.4182e+00, 1.1148e+01) + Amplitude of the estimated response function: 5.1105e+00, 1.3391e+01 + Phase(deg.) of the estimated response function: 30.4, 56.4 + Weighted residual power: 0.124191 +Iteration number = 2 + Scale factor: 0.502108 + Parameter c: 2.66169 + Sum of weights: 7877.21 + Squared coherence: 0 + Estimated response function: ( 4.3979e+00, 2.5802e+00), ( 7.3493e+00, 1.1174e+01) + Amplitude of the estimated response function: 5.0989e+00, 1.3374e+01 + Phase(deg.) of the estimated response function: 30.4, 56.7 + Weighted residual power: 0.124257 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( -1.1045e+01, -1.1288e+01), ( -2.2411e-01, -5.9487e-01) + Amplitude of the estimated response function: 1.5793e+01, 6.3568e-01 + Phase(deg.) of the estimated response function: -134.4, -110.6 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.478591 + Sum of weights: 10711.5 + Squared coherence: 0 + Estimated response function: ( -1.0700e+01, -1.0857e+01), ( -2.9335e-01, -3.0862e-01) + Amplitude of the estimated response function: 1.5243e+01, 4.2580e-01 + Phase(deg.) of the estimated response function: -134.6, -133.5 + Weighted residual power: 0.386061 +Iteration number = 1 + Scale factor: 0.469278 + Sum of weights: 10715.1 + Squared coherence: 0 + Estimated response function: ( -1.0695e+01, -1.0861e+01), ( -2.9250e-01, -3.1651e-01) + Amplitude of the estimated response function: 1.5243e+01, 4.3097e-01 + Phase(deg.) of the estimated response function: -134.6, -132.7 + Weighted residual power: 0.386992 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.469278 + Parameter c: 2.66169 + Sum of weights: 7624.59 + Squared coherence: 0 + Estimated response function: ( -9.5926e+00, -1.0178e+01), ( -1.4037e-01, -9.6849e-01) + Amplitude of the estimated response function: 1.3986e+01, 9.7861e-01 + Phase(deg.) of the estimated response function: -133.3, -98.2 + Weighted residual power: 0.0962821 +Iteration number = 1 + Scale factor: 0.469278 + Parameter c: 2.66169 + Sum of weights: 7821.6 + Squared coherence: 0 + Estimated response function: ( -9.4018e+00, -1.0021e+01), ( 3.1420e-02, -8.2711e-01) + Amplitude of the estimated response function: 1.3741e+01, 8.2770e-01 + Phase(deg.) of the estimated response function: -133.2, -87.8 + Weighted residual power: 0.103991 +Iteration number = 2 + Scale factor: 0.469278 + Parameter c: 2.66169 + Sum of weights: 7862.78 + Squared coherence: 0 + Estimated response function: ( -9.3796e+00, -1.0002e+01), ( 8.9541e-02, -7.3514e-01) + Amplitude of the estimated response function: 1.3712e+01, 7.4057e-01 + Phase(deg.) of the estimated response function: -133.2, -83.1 + Weighted residual power: 0.105888 +Iteration number = 3 + Scale factor: 0.469278 + Parameter c: 2.66169 + Sum of weights: 7868.34 + Squared coherence: 0 + Estimated response function: ( -9.3809e+00, -1.0003e+01), ( 1.0283e-01, -7.0506e-01) + Amplitude of the estimated response function: 1.3714e+01, 7.1252e-01 + Phase(deg.) of the estimated response function: -133.2, -81.7 + Weighted residual power: 0.106198 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.25, Period(s): 4 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( 5.8663e+00, 4.0237e+00), ( 1.1449e+01, 8.7057e+00) + Amplitude of the estimated response function: 7.1136e+00, 1.4383e+01 + Phase(deg.) of the estimated response function: 34.4, 37.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.542211 + Sum of weights: 10757.9 + Squared coherence: 0 + Estimated response function: ( 6.1989e+00, 3.9568e+00), ( 1.1643e+01, 8.5442e+00) + Amplitude of the estimated response function: 7.3541e+00, 1.4442e+01 + Phase(deg.) of the estimated response function: 32.6, 36.3 + Weighted residual power: 0.445821 +Iteration number = 1 + Scale factor: 0.549359 + Sum of weights: 10759.4 + Squared coherence: 0 + Estimated response function: ( 6.2000e+00, 3.9423e+00), ( 1.1628e+01, 8.5284e+00) + Amplitude of the estimated response function: 7.3473e+00, 1.4420e+01 + Phase(deg.) of the estimated response function: 32.5, 36.3 + Weighted residual power: 0.445345 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.549359 + Parameter c: 2.66169 + Sum of weights: 7867.71 + Squared coherence: 0 + Estimated response function: ( 3.6134e+00, 5.8625e+00), ( 9.3774e+00, 1.2662e+01) + Amplitude of the estimated response function: 6.8866e+00, 1.5756e+01 + Phase(deg.) of the estimated response function: 58.4, 53.5 + Weighted residual power: 0.169381 +Iteration number = 1 + Scale factor: 0.549359 + Parameter c: 2.66169 + Sum of weights: 7723.02 + Squared coherence: 0 + Estimated response function: ( 3.0765e+00, 6.4204e+00), ( 8.6928e+00, 1.3783e+01) + Amplitude of the estimated response function: 7.1195e+00, 1.6295e+01 + Phase(deg.) of the estimated response function: 64.4, 57.8 + Weighted residual power: 0.162365 +Iteration number = 2 + Scale factor: 0.549359 + Parameter c: 2.66169 + Sum of weights: 7630.66 + Squared coherence: 0 + Estimated response function: ( 2.9543e+00, 6.5618e+00), ( 8.4242e+00, 1.4246e+01) + Amplitude of the estimated response function: 7.1962e+00, 1.6550e+01 + Phase(deg.) of the estimated response function: 65.8, 59.4 + Weighted residual power: 0.158462 +Iteration number = 3 + Scale factor: 0.549359 + Parameter c: 2.66169 + Sum of weights: 7590.53 + Squared coherence: 0 + Estimated response function: ( 2.9383e+00, 6.5768e+00), ( 8.3066e+00, 1.4406e+01) + Amplitude of the estimated response function: 7.2033e+00, 1.6629e+01 + Phase(deg.) of the estimated response function: 65.9, 60.0 + Weighted residual power: 0.156174 +Iteration number = 4 + Scale factor: 0.549359 + Parameter c: 2.66169 + Sum of weights: 7579.46 + Squared coherence: 0 + Estimated response function: ( 2.9426e+00, 6.5689e+00), ( 8.2604e+00, 1.4446e+01) + Amplitude of the estimated response function: 7.1979e+00, 1.6641e+01 + Phase(deg.) of the estimated response function: 65.9, 60.2 + Weighted residual power: 0.15535 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 10799 + Squared coherence: 0 + Estimated response function: ( -1.5791e+01, -8.7705e+00), ( -2.1661e+00, 6.6073e-01) + Amplitude of the estimated response function: 1.8063e+01, 2.2646e+00 + Phase(deg.) of the estimated response function: -151.0, 163.0 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.537948 + Sum of weights: 10714.4 + Squared coherence: 0 + Estimated response function: ( -1.4965e+01, -9.4064e+00), ( -1.6618e+00, -2.1359e-01) + Amplitude of the estimated response function: 1.7675e+01, 1.6754e+00 + Phase(deg.) of the estimated response function: -147.8, -172.7 + Weighted residual power: 0.490929 +Iteration number = 1 + Scale factor: 0.527053 + Sum of weights: 10714.2 + Squared coherence: 0 + Estimated response function: ( -1.4927e+01, -9.3861e+00), ( -1.5579e+00, -1.9915e-01) + Amplitude of the estimated response function: 1.7633e+01, 1.5705e+00 + Phase(deg.) of the estimated response function: -147.8, -172.7 + Weighted residual power: 0.488524 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.527053 + Parameter c: 2.66169 + Sum of weights: 7617.27 + Squared coherence: 0 + Estimated response function: ( -1.3752e+01, -1.0902e+01), ( -1.3903e+00, -4.5545e-01) + Amplitude of the estimated response function: 1.7549e+01, 1.4630e+00 + Phase(deg.) of the estimated response function: -141.6, -161.9 + Weighted residual power: 0.134292 +Iteration number = 1 + Scale factor: 0.527053 + Parameter c: 2.66169 + Sum of weights: 7639.36 + Squared coherence: 0 + Estimated response function: ( -1.3453e+01, -1.1256e+01), ( -1.2581e+00, -3.2005e-01) + Amplitude of the estimated response function: 1.7541e+01, 1.2982e+00 + Phase(deg.) of the estimated response function: -140.1, -165.7 + Weighted residual power: 0.134753 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.375, Period(s): 2.66667 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( -3.4466e+00, -5.2926e+00), ( 2.3350e+01, 8.4248e+00) + Amplitude of the estimated response function: 6.3159e+00, 2.4823e+01 + Phase(deg.) of the estimated response function: -123.1, 19.8 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.901226 + Sum of weights: 21306.4 + Squared coherence: 0 + Estimated response function: ( -3.2957e-01, -5.7979e+00), ( 2.4154e+01, 1.1911e+01) + Amplitude of the estimated response function: 5.8072e+00, 2.6931e+01 + Phase(deg.) of the estimated response function: -93.3, 26.2 + Weighted residual power: 1.98007 +Iteration number = 1 + Scale factor: 0.942643 + Sum of weights: 21285.8 + Squared coherence: 0 + Estimated response function: ( -3.0956e-02, -5.6683e+00), ( 2.3931e+01, 1.2061e+01) + Amplitude of the estimated response function: 5.6684e+00, 2.6799e+01 + Phase(deg.) of the estimated response function: -90.3, 26.7 + Weighted residual power: 1.94338 +Iteration number = 2 + Scale factor: 0.938307 + Sum of weights: 21286.5 + Squared coherence: 0 + Estimated response function: ( -1.7188e-02, -5.6557e+00), ( 2.3901e+01, 1.2075e+01) + Amplitude of the estimated response function: 5.6557e+00, 2.6777e+01 + Phase(deg.) of the estimated response function: -90.2, 26.8 + Weighted residual power: 1.94071 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.938307 + Parameter c: 2.66146 + Sum of weights: 14548.6 + Squared coherence: 0 + Estimated response function: ( 6.1592e+00, -5.2026e-01), ( 1.3440e+01, 1.8263e+01) + Amplitude of the estimated response function: 6.1811e+00, 2.2675e+01 + Phase(deg.) of the estimated response function: -4.8, 53.6 + Weighted residual power: 0.360629 +Iteration number = 1 + Scale factor: 0.938307 + Parameter c: 2.66146 + Sum of weights: 15382.8 + Squared coherence: 0 + Estimated response function: ( 5.7045e+00, 9.2482e-01), ( 1.3924e+01, 1.6274e+01) + Amplitude of the estimated response function: 5.7790e+00, 2.1418e+01 + Phase(deg.) of the estimated response function: 9.2, 49.4 + Weighted residual power: 0.378927 +Iteration number = 2 + Scale factor: 0.938307 + Parameter c: 2.66146 + Sum of weights: 15703.7 + Squared coherence: 0 + Estimated response function: ( 6.1688e+00, 1.4135e+00), ( 1.4146e+01, 1.6292e+01) + Amplitude of the estimated response function: 6.3286e+00, 2.1577e+01 + Phase(deg.) of the estimated response function: 12.9, 49.0 + Weighted residual power: 0.424679 +Iteration number = 3 + Scale factor: 0.938307 + Parameter c: 2.66146 + Sum of weights: 15617.3 + Squared coherence: 0 + Estimated response function: ( 6.3659e+00, 1.7619e+00), ( 1.4129e+01, 1.6405e+01) + Amplitude of the estimated response function: 6.6052e+00, 2.1651e+01 + Phase(deg.) of the estimated response function: 15.5, 49.3 + Weighted residual power: 0.420139 +Iteration number = 4 + Scale factor: 0.938307 + Parameter c: 2.66146 + Sum of weights: 15574.6 + Squared coherence: 0 + Estimated response function: ( 6.4454e+00, 1.9647e+00), ( 1.4078e+01, 1.6482e+01) + Amplitude of the estimated response function: 6.7381e+00, 2.1676e+01 + Phase(deg.) of the estimated response function: 17.0, 49.5 + Weighted residual power: 0.417482 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( -1.3650e+01, -3.9352e+00), ( -4.6476e-02, -1.1209e+01) + Amplitude of the estimated response function: 1.4206e+01, 1.1209e+01 + Phase(deg.) of the estimated response function: -163.9, -90.2 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.697875 + Sum of weights: 21353.1 + Squared coherence: 0 + Estimated response function: ( -1.3453e+01, -4.7179e+00), ( -9.4150e-01, -1.2448e+01) + Amplitude of the estimated response function: 1.4256e+01, 1.2484e+01 + Phase(deg.) of the estimated response function: -160.7, -94.3 + Weighted residual power: 1.07156 +Iteration number = 1 + Scale factor: 0.729792 + Sum of weights: 21357.2 + Squared coherence: 0 + Estimated response function: ( -1.3539e+01, -4.6822e+00), ( -8.1343e-01, -1.2587e+01) + Amplitude of the estimated response function: 1.4326e+01, 1.2613e+01 + Phase(deg.) of the estimated response function: -160.9, -93.7 + Weighted residual power: 1.08562 +Iteration number = 2 + Scale factor: 0.731445 + Sum of weights: 21353.4 + Squared coherence: 0 + Estimated response function: ( -1.3548e+01, -4.6895e+00), ( -7.9792e-01, -1.2619e+01) + Amplitude of the estimated response function: 1.4337e+01, 1.2644e+01 + Phase(deg.) of the estimated response function: -160.9, -93.6 + Weighted residual power: 1.08713 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 14750.6 + Squared coherence: 0 + Estimated response function: ( -1.4603e+01, -1.2206e+01), ( 2.1207e+00, -5.3262e+00) + Amplitude of the estimated response function: 1.9032e+01, 5.7328e+00 + Phase(deg.) of the estimated response function: -140.1, -68.3 + Weighted residual power: 0.329703 +Iteration number = 1 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 14740.9 + Squared coherence: 0 + Estimated response function: ( -1.1163e+01, -1.3313e+01), ( -6.8935e-01, -2.9053e+00) + Amplitude of the estimated response function: 1.7373e+01, 2.9860e+00 + Phase(deg.) of the estimated response function: -130.0, -103.3 + Weighted residual power: 0.220446 +Iteration number = 2 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 15448.6 + Squared coherence: 0 + Estimated response function: ( -1.0483e+01, -1.2945e+01), ( -2.2372e+00, -3.3493e+00) + Amplitude of the estimated response function: 1.6657e+01, 4.0278e+00 + Phase(deg.) of the estimated response function: -129.0, -123.7 + Weighted residual power: 0.248637 +Iteration number = 3 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 15555.1 + Squared coherence: 0 + Estimated response function: ( -1.0766e+01, -1.2790e+01), ( -2.3568e+00, -3.8572e+00) + Amplitude of the estimated response function: 1.6718e+01, 4.5202e+00 + Phase(deg.) of the estimated response function: -130.1, -121.4 + Weighted residual power: 0.26058 +Iteration number = 4 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 15486.1 + Squared coherence: 0 + Estimated response function: ( -1.0888e+01, -1.2874e+01), ( -2.1337e+00, -3.8963e+00) + Amplitude of the estimated response function: 1.6860e+01, 4.4422e+00 + Phase(deg.) of the estimated response function: -130.2, -118.7 + Weighted residual power: 0.257918 +Iteration number = 5 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 15455.4 + Squared coherence: 0 + Estimated response function: ( -1.0861e+01, -1.2923e+01), ( -2.0779e+00, -3.8331e+00) + Amplitude of the estimated response function: 1.6881e+01, 4.3601e+00 + Phase(deg.) of the estimated response function: -130.0, -118.5 + Weighted residual power: 0.25523 +Iteration number = 6 + Scale factor: 0.731445 + Parameter c: 2.66146 + Sum of weights: 15458.6 + Squared coherence: 0 + Estimated response function: ( -1.0833e+01, -1.2927e+01), ( -2.0986e+00, -3.8127e+00) + Amplitude of the estimated response function: 1.6866e+01, 4.3521e+00 + Phase(deg.) of the estimated response function: -130.0, -118.8 + Weighted residual power: 0.255003 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.5, Period(s): 2 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( 1.2138e+00, -1.2061e+00), ( 2.1695e+01, 6.6378e+00) + Amplitude of the estimated response function: 1.7112e+00, 2.2687e+01 + Phase(deg.) of the estimated response function: -44.8, 17.0 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.777726 + Sum of weights: 21266.4 + Squared coherence: 0 + Estimated response function: ( 6.1250e+00, -2.1352e+00), ( 2.5598e+01, 9.8701e+00) + Amplitude of the estimated response function: 6.4865e+00, 2.7435e+01 + Phase(deg.) of the estimated response function: -19.2, 21.1 + Weighted residual power: 1.99314 +Iteration number = 1 + Scale factor: 0.938241 + Sum of weights: 21267.9 + Squared coherence: 0 + Estimated response function: ( 6.4251e+00, -2.3332e+00), ( 2.6330e+01, 1.0466e+01) + Amplitude of the estimated response function: 6.8356e+00, 2.8333e+01 + Phase(deg.) of the estimated response function: -20.0, 21.7 + Weighted residual power: 2.11245 +Iteration number = 2 + Scale factor: 0.9598 + Sum of weights: 21258.9 + Squared coherence: 0 + Estimated response function: ( 6.5193e+00, -2.3577e+00), ( 2.6417e+01, 1.0673e+01) + Amplitude of the estimated response function: 6.9325e+00, 2.8492e+01 + Phase(deg.) of the estimated response function: -19.9, 22.0 + Weighted residual power: 2.13004 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.9598 + Parameter c: 2.66146 + Sum of weights: 14409.3 + Squared coherence: 0 + Estimated response function: ( 7.9981e+00, 1.2492e+00), ( 1.7627e+01, 1.8127e+01) + Amplitude of the estimated response function: 8.0951e+00, 2.5284e+01 + Phase(deg.) of the estimated response function: 8.9, 45.8 + Weighted residual power: 0.377248 +Iteration number = 1 + Scale factor: 0.9598 + Parameter c: 2.66146 + Sum of weights: 14938.6 + Squared coherence: 0 + Estimated response function: ( 8.0010e+00, 2.2643e+00), ( 1.7061e+01, 1.7211e+01) + Amplitude of the estimated response function: 8.3152e+00, 2.4234e+01 + Phase(deg.) of the estimated response function: 15.8, 45.2 + Weighted residual power: 0.406347 +Iteration number = 2 + Scale factor: 0.9598 + Parameter c: 2.66146 + Sum of weights: 15126.6 + Squared coherence: 0 + Estimated response function: ( 8.3339e+00, 2.6289e+00), ( 1.7571e+01, 1.6561e+01) + Amplitude of the estimated response function: 8.7387e+00, 2.4146e+01 + Phase(deg.) of the estimated response function: 17.5, 43.3 + Weighted residual power: 0.432913 +Iteration number = 3 + Scale factor: 0.9598 + Parameter c: 2.66146 + Sum of weights: 15106.5 + Squared coherence: 0 + Estimated response function: ( 8.5018e+00, 2.6752e+00), ( 1.8038e+01, 1.6063e+01) + Amplitude of the estimated response function: 8.9128e+00, 2.4154e+01 + Phase(deg.) of the estimated response function: 17.5, 41.7 + Weighted residual power: 0.432157 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 21599 + Squared coherence: 0 + Estimated response function: ( -5.3388e+00, -5.2437e+00), ( -6.0756e+00, 1.4369e+00) + Amplitude of the estimated response function: 7.4833e+00, 6.2432e+00 + Phase(deg.) of the estimated response function: -135.5, 166.7 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.499754 + Sum of weights: 21434 + Squared coherence: 0 + Estimated response function: ( -5.1478e+00, -4.8192e+00), ( -7.8560e+00, 1.9903e+00) + Amplitude of the estimated response function: 7.0516e+00, 8.1042e+00 + Phase(deg.) of the estimated response function: -136.9, 165.8 + Weighted residual power: 0.481852 +Iteration number = 1 + Scale factor: 0.522253 + Sum of weights: 21421.5 + Squared coherence: 0 + Estimated response function: ( -5.4162e+00, -4.4032e+00), ( -8.1627e+00, 1.7402e+00) + Amplitude of the estimated response function: 6.9802e+00, 8.3461e+00 + Phase(deg.) of the estimated response function: -140.9, 168.0 + Weighted residual power: 0.487055 +Iteration number = 2 + Scale factor: 0.523792 + Sum of weights: 21417 + Squared coherence: 0 + Estimated response function: ( -5.4480e+00, -4.3095e+00), ( -8.3763e+00, 1.7677e+00) + Amplitude of the estimated response function: 6.9464e+00, 8.5608e+00 + Phase(deg.) of the estimated response function: -141.7, 168.1 + Weighted residual power: 0.494324 +Iteration number = 3 + Scale factor: 0.527559 + Sum of weights: 21415.8 + Squared coherence: 0 + Estimated response function: ( -5.4748e+00, -4.2584e+00), ( -8.4422e+00, 1.7271e+00) + Amplitude of the estimated response function: 6.9360e+00, 8.6170e+00 + Phase(deg.) of the estimated response function: -142.1, 168.4 + Weighted residual power: 0.496214 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.527559 + Parameter c: 2.66146 + Sum of weights: 15218.2 + Squared coherence: 0 + Estimated response function: ( -8.8000e+00, -6.7967e+00), ( -1.1073e+01, -1.0097e+00) + Amplitude of the estimated response function: 1.1119e+01, 1.1119e+01 + Phase(deg.) of the estimated response function: -142.3, -174.8 + Weighted residual power: 0.235204 +Iteration number = 1 + Scale factor: 0.527559 + Parameter c: 2.66146 + Sum of weights: 13765.9 + Squared coherence: 0 + Estimated response function: ( -9.7411e+00, -1.0796e+01), ( -8.8000e+00, -2.6436e+00) + Amplitude of the estimated response function: 1.4541e+01, 9.1886e+00 + Phase(deg.) of the estimated response function: -132.1, -163.3 + Weighted residual power: 0.168926 +Iteration number = 2 + Scale factor: 0.527559 + Parameter c: 2.66146 + Sum of weights: 13408.6 + Squared coherence: 0 + Estimated response function: ( -1.0260e+01, -1.2521e+01), ( -7.6798e+00, -5.3105e+00) + Amplitude of the estimated response function: 1.6187e+01, 9.3371e+00 + Phase(deg.) of the estimated response function: -129.3, -145.3 + Weighted residual power: 0.156163 +Iteration number = 3 + Scale factor: 0.527559 + Parameter c: 2.66146 + Sum of weights: 13042 + Squared coherence: 0 + Estimated response function: ( -1.0032e+01, -1.3651e+01), ( -5.4167e+00, -5.9975e+00) + Amplitude of the estimated response function: 1.6941e+01, 8.0815e+00 + Phase(deg.) of the estimated response function: -126.3, -132.1 + Weighted residual power: 0.133816 +Iteration number = 4 + Scale factor: 0.527559 + Parameter c: 2.66146 + Sum of weights: 13027.9 + Squared coherence: 0 + Estimated response function: ( -1.0665e+01, -1.3885e+01), ( -3.8490e+00, -6.4626e+00) + Amplitude of the estimated response function: 1.7508e+01, 7.5219e+00 + Phase(deg.) of the estimated response function: -127.5, -120.8 + Weighted residual power: 0.134361 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.75, Period(s): 1.33333 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( -2.1007e+01, 2.5791e+00), ( 1.6554e+01, 1.0975e+01) + Amplitude of the estimated response function: 2.1164e+01, 1.9862e+01 + Phase(deg.) of the estimated response function: 173.0, 33.5 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 1.26013 + Sum of weights: 42352.1 + Squared coherence: 0 + Estimated response function: ( -2.1390e+01, 6.2375e+00), ( 2.1976e+01, 1.2097e+01) + Amplitude of the estimated response function: 2.2281e+01, 2.5085e+01 + Phase(deg.) of the estimated response function: 163.7, 28.8 + Weighted residual power: 5.25165 +Iteration number = 1 + Scale factor: 1.406 + Sum of weights: 42283 + Squared coherence: 0 + Estimated response function: ( -2.0743e+01, 6.1785e+00), ( 2.1674e+01, 1.1687e+01) + Amplitude of the estimated response function: 2.1644e+01, 2.4624e+01 + Phase(deg.) of the estimated response function: 163.4, 28.3 + Weighted residual power: 4.97399 +Iteration number = 2 + Scale factor: 1.38322 + Sum of weights: 42298.4 + Squared coherence: 0 + Estimated response function: ( -2.0761e+01, 6.1442e+00), ( 2.1642e+01, 1.1682e+01) + Amplitude of the estimated response function: 2.1651e+01, 2.4594e+01 + Phase(deg.) of the estimated response function: 163.5, 28.4 + Weighted residual power: 4.97881 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 28051.8 + Squared coherence: 0 + Estimated response function: ( -1.8390e+01, -6.3793e+00), ( 2.1348e+01, 2.1292e+01) + Amplitude of the estimated response function: 1.9465e+01, 3.0151e+01 + Phase(deg.) of the estimated response function: -160.9, 44.9 + Weighted residual power: 1.11169 +Iteration number = 1 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 27139.4 + Squared coherence: 0 + Estimated response function: ( -1.3550e+01, -1.1726e+01), ( 1.5351e+01, 2.3291e+01) + Amplitude of the estimated response function: 1.7919e+01, 2.7895e+01 + Phase(deg.) of the estimated response function: -139.1, 56.6 + Weighted residual power: 0.733976 +Iteration number = 2 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 27965.4 + Squared coherence: 0 + Estimated response function: ( -1.3161e+01, -1.1265e+01), ( 1.3629e+01, 2.2692e+01) + Amplitude of the estimated response function: 1.7324e+01, 2.6470e+01 + Phase(deg.) of the estimated response function: -139.4, 59.0 + Weighted residual power: 0.780166 +Iteration number = 3 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 28464.5 + Squared coherence: 0 + Estimated response function: ( -1.3633e+01, -1.0610e+01), ( 1.3431e+01, 2.2749e+01) + Amplitude of the estimated response function: 1.7275e+01, 2.6418e+01 + Phase(deg.) of the estimated response function: -142.1, 59.4 + Weighted residual power: 0.854842 +Iteration number = 4 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 28487 + Squared coherence: 0 + Estimated response function: ( -1.3833e+01, -1.0441e+01), ( 1.3673e+01, 2.2901e+01) + Amplitude of the estimated response function: 1.7332e+01, 2.6673e+01 + Phase(deg.) of the estimated response function: -143.0, 59.2 + Weighted residual power: 0.869199 +Iteration number = 5 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 28404.2 + Squared coherence: 0 + Estimated response function: ( -1.3804e+01, -1.0485e+01), ( 1.3776e+01, 2.2929e+01) + Amplitude of the estimated response function: 1.7334e+01, 2.6749e+01 + Phase(deg.) of the estimated response function: -142.8, 59.0 + Weighted residual power: 0.858698 +Iteration number = 6 + Scale factor: 1.38322 + Parameter c: 2.66135 + Sum of weights: 28382.5 + Squared coherence: 0 + Estimated response function: ( -1.3762e+01, -1.0515e+01), ( 1.3762e+01, 2.2909e+01) + Amplitude of the estimated response function: 1.7319e+01, 2.6725e+01 + Phase(deg.) of the estimated response function: -142.6, 59.0 + Weighted residual power: 0.853772 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( 4.6419e+00, -4.1036e+00), ( -1.1865e+01, -1.0362e+01) + Amplitude of the estimated response function: 6.1958e+00, 1.5753e+01 + Phase(deg.) of the estimated response function: -41.5, -138.9 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 0.887056 + Sum of weights: 42643.1 + Squared coherence: 0 + Estimated response function: ( 6.0624e+00, -5.0822e+00), ( -1.5007e+01, -1.1896e+01) + Amplitude of the estimated response function: 7.9108e+00, 1.9150e+01 + Phase(deg.) of the estimated response function: -40.0, -141.6 + Weighted residual power: 2.30498 +Iteration number = 1 + Scale factor: 1.00498 + Sum of weights: 42561.4 + Squared coherence: 0 + Estimated response function: ( 5.2540e+00, -5.4387e+00), ( -1.4979e+01, -1.0909e+01) + Amplitude of the estimated response function: 7.5620e+00, 1.8531e+01 + Phase(deg.) of the estimated response function: -46.0, -143.9 + Weighted residual power: 2.14692 +Iteration number = 2 + Scale factor: 0.983764 + Sum of weights: 42578.3 + Squared coherence: 0 + Estimated response function: ( 5.3811e+00, -5.4998e+00), ( -1.4975e+01, -1.0914e+01) + Amplitude of the estimated response function: 7.6944e+00, 1.8530e+01 + Phase(deg.) of the estimated response function: -45.6, -143.9 + Weighted residual power: 2.16148 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 0.983764 + Parameter c: 2.66135 + Sum of weights: 29005.5 + Squared coherence: 0 + Estimated response function: ( -5.7355e+00, -8.8745e-01), ( -9.5320e+00, -1.2645e+01) + Amplitude of the estimated response function: 5.8037e+00, 1.5835e+01 + Phase(deg.) of the estimated response function: -171.2, -127.0 + Weighted residual power: 0.554733 +Iteration number = 1 + Scale factor: 0.983764 + Parameter c: 2.66135 + Sum of weights: 30815.8 + Squared coherence: 0 + Estimated response function: ( -6.1502e+00, -6.0600e+00), ( -5.1246e+00, -1.1874e+01) + Amplitude of the estimated response function: 8.6342e+00, 1.2932e+01 + Phase(deg.) of the estimated response function: -135.4, -113.3 + Weighted residual power: 0.450484 +Iteration number = 2 + Scale factor: 0.983764 + Parameter c: 2.66135 + Sum of weights: 31610.2 + Squared coherence: 0 + Estimated response function: ( -4.8719e+00, -8.2765e+00), ( -3.7022e+00, -9.2094e+00) + Amplitude of the estimated response function: 9.6040e+00, 9.9257e+00 + Phase(deg.) of the estimated response function: -120.5, -111.9 + Weighted residual power: 0.399293 +Iteration number = 3 + Scale factor: 0.983764 + Parameter c: 2.66135 + Sum of weights: 32704 + Squared coherence: 0 + Estimated response function: ( -4.2901e+00, -8.9273e+00), ( -5.4396e+00, -8.1713e+00) + Amplitude of the estimated response function: 9.9046e+00, 9.8163e+00 + Phase(deg.) of the estimated response function: -115.7, -123.7 + Weighted residual power: 0.455879 +Iteration number = 4 + Scale factor: 0.983764 + Parameter c: 2.66135 + Sum of weights: 32621.4 + Squared coherence: 0 + Estimated response function: ( -4.4083e+00, -8.8343e+00), ( -6.6191e+00, -7.3481e+00) + Amplitude of the estimated response function: 9.8731e+00, 9.8898e+00 + Phase(deg.) of the estimated response function: -116.5, -132.0 + Weighted residual power: 0.447719 +Iteration number = 5 + Scale factor: 0.983764 + Parameter c: 2.66135 + Sum of weights: 32603.7 + Squared coherence: 0 + Estimated response function: ( -4.2917e+00, -8.5306e+00), ( -7.4222e+00, -6.9884e+00) + Amplitude of the estimated response function: 9.5493e+00, 1.0194e+01 + Phase(deg.) of the estimated response function: -116.7, -136.7 + Weighted residual power: 0.445879 +Iteration using Tukey's biweights weight converged +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 1, Period(s): 1 +================================================================================ +-------------------------------------------------------------------------------- +Calculate response functions for output variable 0 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( 1.1221e+01, 1.0270e+01), ( 2.1550e+01, -2.5333e+01) + Amplitude of the estimated response function: 1.5211e+01, 3.3259e+01 + Phase(deg.) of the estimated response function: 42.5, -49.6 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 1.49203 + Sum of weights: 42288.2 + Squared coherence: 0 + Estimated response function: ( 1.4983e+01, 7.4984e+00), ( 1.2376e+01, -2.6529e+01) + Amplitude of the estimated response function: 1.6755e+01, 2.9274e+01 + Phase(deg.) of the estimated response function: 26.6, -65.0 + Weighted residual power: 5.15193 +Iteration number = 1 + Scale factor: 1.41619 + Sum of weights: 42337.4 + Squared coherence: 0 + Estimated response function: ( 1.4879e+01, 6.6271e+00), ( 1.0962e+01, -2.6287e+01) + Amplitude of the estimated response function: 1.6288e+01, 2.8481e+01 + Phase(deg.) of the estimated response function: 24.0, -67.4 + Weighted residual power: 4.92398 +Iteration number = 2 + Scale factor: 1.38763 + Sum of weights: 42351.6 + Squared coherence: 0 + Estimated response function: ( 1.4863e+01, 6.6775e+00), ( 1.1056e+01, -2.6207e+01) + Amplitude of the estimated response function: 1.6294e+01, 2.8444e+01 + Phase(deg.) of the estimated response function: 24.2, -67.1 + Weighted residual power: 4.92551 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 28107.2 + Squared coherence: 0 + Estimated response function: ( 6.7594e+01, 3.6278e+00), ( -3.2167e+00, -1.2341e+02) + Amplitude of the estimated response function: 6.7692e+01, 1.2345e+02 + Phase(deg.) of the estimated response function: 3.1, -91.5 + Weighted residual power: 15.6297 +Iteration number = 1 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 16463.4 + Squared coherence: 0 + Estimated response function: ( -1.7109e+01, -1.4646e+01), ( 5.9694e+00, 9.2518e+01) + Amplitude of the estimated response function: 2.2522e+01, 9.2711e+01 + Phase(deg.) of the estimated response function: -139.4, 86.3 + Weighted residual power: 1.04341 +Iteration number = 2 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 19832.2 + Squared coherence: 0 + Estimated response function: ( 8.8412e+00, -1.1025e+00), ( -7.4878e+00, 4.2728e+01) + Amplitude of the estimated response function: 8.9097e+00, 4.3379e+01 + Phase(deg.) of the estimated response function: -7.1, 99.9 + Weighted residual power: 0.367189 +Iteration number = 3 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 25368.9 + Squared coherence: 0 + Estimated response function: ( 2.5536e+01, -2.6414e+01), ( -3.2464e+01, 1.3315e+02) + Amplitude of the estimated response function: 3.6740e+01, 1.3705e+02 + Phase(deg.) of the estimated response function: -46.0, 103.7 + Weighted residual power: 8.65379 +Iteration number = 4 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 16790.4 + Squared coherence: 0 + Estimated response function: ( 8.9621e+00, -9.8033e+00), ( 1.2525e+01, 6.3150e+01) + Amplitude of the estimated response function: 1.3283e+01, 6.4380e+01 + Phase(deg.) of the estimated response function: -47.6, 78.8 + Weighted residual power: 0.34843 +Iteration number = 5 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 22355.6 + Squared coherence: 0 + Estimated response function: ( 1.4553e+01, -1.2539e+01), ( 3.8589e+00, 6.4558e+01) + Amplitude of the estimated response function: 1.9210e+01, 6.4674e+01 + Phase(deg.) of the estimated response function: -40.7, 86.6 + Weighted residual power: 0.779038 +Iteration number = 6 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 22168.1 + Squared coherence: 0 + Estimated response function: ( 2.5982e+01, -7.3970e+00), ( -2.3741e+01, 9.8036e+01) + Amplitude of the estimated response function: 2.7014e+01, 1.0087e+02 + Phase(deg.) of the estimated response function: -15.9, 103.6 + Weighted residual power: 1.72513 +Iteration number = 7 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 19243.8 + Squared coherence: 0 + Estimated response function: ( 1.0013e+01, -7.7338e+00), ( 1.0924e+01, 6.1710e+01) + Amplitude of the estimated response function: 1.2652e+01, 6.2669e+01 + Phase(deg.) of the estimated response function: -37.7, 80.0 + Weighted residual power: 0.398859 +Iteration number = 8 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 22539.9 + Squared coherence: 0 + Estimated response function: ( 1.3997e+01, -1.1760e+01), ( 1.1347e+00, 6.2641e+01) + Amplitude of the estimated response function: 1.8281e+01, 6.2651e+01 + Phase(deg.) of the estimated response function: -40.0, 89.0 + Weighted residual power: 0.775522 +Iteration number = 9 + Scale factor: 1.38763 + Parameter c: 2.66135 + Sum of weights: 22387.6 + Squared coherence: 0 + Estimated response function: ( 2.6026e+01, -9.5294e+00), ( -2.3714e+01, 9.6517e+01) + Amplitude of the estimated response function: 2.7715e+01, 9.9387e+01 + Phase(deg.) of the estimated response function: -20.1, 103.8 + Weighted residual power: 1.77157 + Iteration using Tukey's biweights weight does not converge +-------------------------------------------------------------------------------- +Calculate response functions for output variable 1 +-------------------------------------------------------------------------------- +Calculate response functions by the ordinary least square method + Sum of weights: 43199 + Squared coherence: 0 + Estimated response function: ( -1.1946e+01, -5.6520e+00), ( -2.0656e+01, -1.9537e+01) + Amplitude of the estimated response function: 1.3216e+01, 2.8432e+01 + Phase(deg.) of the estimated response function: -154.7, -136.6 +Calculate response functions by iteratively reweighted remote reference using Huber weight +Iteration number = 0 + Scale factor: 1.30468 + Sum of weights: 42325.6 + Squared coherence: 0 + Estimated response function: ( -1.3853e+01, -5.1899e+00), ( -1.2184e+01, -6.4621e+00) + Amplitude of the estimated response function: 1.4793e+01, 1.3792e+01 + Phase(deg.) of the estimated response function: -159.5, -152.1 + Weighted residual power: 2.13191 +Iteration number = 1 + Scale factor: 0.976564 + Sum of weights: 42535.1 + Squared coherence: 0 + Estimated response function: ( -1.5634e+01, -8.1530e+00), ( -1.3950e+01, -6.8908e+00) + Amplitude of the estimated response function: 1.7632e+01, 1.5559e+01 + Phase(deg.) of the estimated response function: -152.5, -153.7 + Weighted residual power: 2.76019 +Iteration number = 2 + Scale factor: 1.07101 + Sum of weights: 42453.6 + Squared coherence: 0 + Estimated response function: ( -1.5975e+01, -7.7011e+00), ( -1.3058e+01, -6.8235e+00) + Amplitude of the estimated response function: 1.7734e+01, 1.4733e+01 + Phase(deg.) of the estimated response function: -154.3, -152.4 + Weighted residual power: 2.6312 +Iteration number = 3 + Scale factor: 1.05938 + Sum of weights: 42472.3 + Squared coherence: 0 + Estimated response function: ( -1.6052e+01, -7.9389e+00), ( -1.3311e+01, -6.8264e+00) + Amplitude of the estimated response function: 1.7908e+01, 1.4959e+01 + Phase(deg.) of the estimated response function: -153.7, -152.8 + Weighted residual power: 2.69327 +Iteration number = 4 + Scale factor: 1.06686 + Sum of weights: 42463.8 + Squared coherence: 0 + Estimated response function: ( -1.6083e+01, -7.8747e+00), ( -1.3233e+01, -6.8082e+00) + Amplitude of the estimated response function: 1.7907e+01, 1.4882e+01 + Phase(deg.) of the estimated response function: -153.9, -152.8 + Weighted residual power: 2.67971 +Iteration using Huber weight converged +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight +Iteration number = 0 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 28716.2 + Squared coherence: 0 + Estimated response function: ( -1.2142e+01, -7.5734e+00), ( -3.4025e+00, -6.5192e-01) + Amplitude of the estimated response function: 1.4310e+01, 3.4644e+00 + Phase(deg.) of the estimated response function: -148.0, -169.2 + Weighted residual power: 0.349296 +Iteration number = 1 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 33530.6 + Squared coherence: 0 + Estimated response function: ( -1.4746e+01, -6.4551e+00), ( -8.4020e-01, 2.0779e+00) + Amplitude of the estimated response function: 1.6097e+01, 2.2413e+00 + Phase(deg.) of the estimated response function: -156.4, 112.0 + Weighted residual power: 0.610527 +Iteration number = 2 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 32681.9 + Squared coherence: 0 + Estimated response function: ( -1.6438e+01, -5.8912e+00), ( 9.0023e-01, 6.4834e+00) + Amplitude of the estimated response function: 1.7462e+01, 6.5456e+00 + Phase(deg.) of the estimated response function: -160.3, 82.1 + Weighted residual power: 0.710637 +Iteration number = 3 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 31158.1 + Squared coherence: 0 + Estimated response function: ( -1.8141e+01, -4.8866e+00), ( 7.8586e+00, 1.1977e+01) + Amplitude of the estimated response function: 1.8788e+01, 1.4325e+01 + Phase(deg.) of the estimated response function: -164.9, 56.7 + Weighted residual power: 0.901353 +Iteration number = 4 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 28638 + Squared coherence: 0 + Estimated response function: ( -1.9969e+01, -1.7484e+00), ( 1.9546e+01, 4.5856e+00) + Amplitude of the estimated response function: 2.0045e+01, 2.0077e+01 + Phase(deg.) of the estimated response function: -175.0, 13.2 + Weighted residual power: 0.851249 +Iteration number = 5 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 26826.6 + Squared coherence: 0 + Estimated response function: ( -1.3861e+01, 1.0239e+00), ( 1.7565e+01, -1.6266e+01) + Amplitude of the estimated response function: 1.3899e+01, 2.3940e+01 + Phase(deg.) of the estimated response function: 175.8, -42.8 + Weighted residual power: 0.745024 +Iteration number = 6 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 27003.1 + Squared coherence: 0 + Estimated response function: ( -9.4145e+00, -7.9354e+00), ( -1.9777e+01, -2.9175e+00) + Amplitude of the estimated response function: 1.2313e+01, 1.9991e+01 + Phase(deg.) of the estimated response function: -139.9, -171.6 + Weighted residual power: 1.13915 +Iteration number = 7 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 28646.6 + Squared coherence: 0 + Estimated response function: ( -1.5411e+01, -4.9800e+00), ( 7.4761e+00, 1.6842e+01) + Amplitude of the estimated response function: 1.6195e+01, 1.8426e+01 + Phase(deg.) of the estimated response function: -162.1, 66.1 + Weighted residual power: 1.20402 +Iteration number = 8 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 28200.4 + Squared coherence: 0 + Estimated response function: ( -1.7984e+01, 5.4339e+00), ( 2.3078e+01, -7.9002e+00) + Amplitude of the estimated response function: 1.8787e+01, 2.4393e+01 + Phase(deg.) of the estimated response function: 163.2, -18.9 + Weighted residual power: 1.13709 +Iteration number = 9 + Scale factor: 1.06686 + Parameter c: 2.66135 + Sum of weights: 25998.5 + Squared coherence: 0 + Estimated response function: ( -4.2807e+00, -7.6892e+00), ( -1.0323e+01, -3.3470e+01) + Amplitude of the estimated response function: 8.8005e+00, 3.5026e+01 + Phase(deg.) of the estimated response function: -119.1, -107.1 + Weighted residual power: 1.86695 + Iteration using Tukey's biweights weight does not converge +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- diff --git a/Samples/OrdinaryRobustRemoteReference/TRACMT.log b/Samples/OrdinaryRobustRemoteReference/TRACMT.log new file mode 100644 index 0000000..e233147 --- /dev/null +++ b/Samples/OrdinaryRobustRemoteReference/TRACMT.log @@ -0,0 +1,484 @@ +Start TRACMT Version v2.0 +Read parameters. ( 0 sec ) +================================================================================ +Summary of control parameters +================================================================================ +Number of threads : 1 +Procedure type : ordinary remote reference +The first M-estimator : Hubur + Threshould value for downweighting : 3 + Maximum number of iteration : 10 + Convergence criteria : 0.01 +The second M-estimator : Tukey's biweights + Maximum number of iteration : 10 + Convergence criteria : 0.01 +Error estimation method : fixed-weights bootstrap +Number or repetitions in bootstrap : 1000 +Number of output variables : 2 +Number of input variables : 2 +Number of remote reference variables : 2 +Sampling frequency (Hz) : 32 +Number of time-series sections : 1 +Ratio of overlapping part to whole segment length : 0.5 +Output level : 0 +Output apparent resistivity and phase to a seperate csv file +Information about the segment lengths and frequencies : + Segment# Length Index Frequency(Hz) Period(sec) + 0 65536 3 1.464843750e-03 6.826666667e+02 + 0 65536 4 1.953125000e-03 5.120000000e+02 + 1 32768 3 2.929687500e-03 3.413333333e+02 + 1 32768 4 3.906250000e-03 2.560000000e+02 + 2 16384 3 5.859375000e-03 1.706666667e+02 + 2 16384 4 7.812500000e-03 1.280000000e+02 + 3 8192 3 1.171875000e-02 8.533333333e+01 + 3 8192 4 1.562500000e-02 6.400000000e+01 + 4 4096 3 2.343750000e-02 4.266666667e+01 + 4 4096 4 3.125000000e-02 3.200000000e+01 + 5 2048 3 4.687500000e-02 2.133333333e+01 + 5 2048 4 6.250000000e-02 1.600000000e+01 + 6 1024 3 9.375000000e-02 1.066666667e+01 + 6 1024 4 1.250000000e-01 8.000000000e+00 + 7 512 3 1.875000000e-01 5.333333333e+00 + 7 512 4 2.500000000e-01 4.000000000e+00 + 8 256 3 3.750000000e-01 2.666666667e+00 + 8 256 4 5.000000000e-01 2.000000000e+00 + 9 128 3 7.500000000e-01 1.333333333e+00 + 9 128 4 1.000000000e+00 1.000000000e+00 +Information about the time-series data : + Section# Channel# Type NSkip NData File + 0 0 Out0 0 2764800 ../ex.txt + 0 1 Out1 0 2764800 ../ey.txt + 0 2 Inp0 0 2764800 ../hx.txt + 0 3 Inp1 0 2764800 ../hy.txt + 0 4 RR0 0 2764800 ../hrx.txt + 0 5 RR1 0 2764800 ../hry.txt +Rotation angle (deg.) : 0 + Channel# Type Azimuth(deg.) + 0 Out0 0 + 1 Out1 90 + 2 Inp0 0 + 3 Inp1 90 + 4 RR0 0 + 5 RR1 90 +Parameters for robust prewhitening : + Least square estimator is used + Maximum degree of AR model: 10 +================================================================================ +Read data from ../ex.txt ( 0 sec ) +Read data from ../ey.txt ( 1 sec ) +Read data from ../hx.txt ( 1 sec ) +Read data from ../hy.txt ( 2 sec ) +Read data from ../hrx.txt ( 3 sec ) +Read data from ../hry.txt ( 4 sec ) +Perform preprocessing ( 5 sec ) +Secton 0, Channel 0 ( 5 sec ) +Subtract mean (-0.889991) ( 5 sec ) +Secton 0, Channel 1 ( 5 sec ) +Subtract mean (1.69968) ( 5 sec ) +Secton 0, Channel 2 ( 5 sec ) +Subtract mean (0.0092652) ( 5 sec ) +Secton 0, Channel 3 ( 5 sec ) +Subtract mean (1.30261) ( 5 sec ) +Secton 0, Channel 4 ( 5 sec ) +Subtract mean (0.0346805) ( 5 sec ) +Secton 0, Channel 5 ( 5 sec ) +Subtract mean (1.2857) ( 5 sec ) +Perform prewhitening for channel 0 ( 5 sec ) +Degree of AR model: 1, Sigma: 7.6076, AIC: 1.90665e+07 ( 5 sec ) +Degree of AR model: 2, Sigma: 7.60293, AIC: 1.90631e+07 ( 5 sec ) +Degree of AR model: 3, Sigma: 7.59862, AIC: 1.906e+07 ( 5 sec ) +Degree of AR model: 4, Sigma: 7.5946, AIC: 1.90571e+07 ( 5 sec ) +Degree of AR model: 5, Sigma: 7.59088, AIC: 1.90544e+07 ( 5 sec ) +Degree of AR model: 6, Sigma: 7.58783, AIC: 1.90521e+07 ( 5 sec ) +Degree of AR model: 7, Sigma: 7.58446, AIC: 1.90497e+07 ( 5 sec ) +Degree of AR model: 8, Sigma: 7.58162, AIC: 1.90476e+07 ( 5 sec ) +Degree of AR model: 9, Sigma: 7.57884, AIC: 1.90456e+07 ( 5 sec ) +Degree of AR model: 10, Sigma: 7.57665, AIC: 1.9044e+07 ( 5 sec ) +The AR model of 10 degress gives the minimum AIC (1.9044e+07) ( 5 sec ) +AR coefficients: 0.0320459 0.0276236 0.0274305 0.0273417 0.0271195 0.0250291 0.0274279 0.0257729 0.0263083 0.0240252 ( 5 sec ) +Perform prewhitening for channel 1 ( 5 sec ) +Degree of AR model: 1, Sigma: 7.54273, AIC: 1.90192e+07 ( 5 sec ) +Degree of AR model: 2, Sigma: 7.52209, AIC: 1.9004e+07 ( 5 sec ) +Degree of AR model: 3, Sigma: 7.50561, AIC: 1.89919e+07 ( 5 sec ) +Degree of AR model: 4, Sigma: 7.49133, AIC: 1.89814e+07 ( 5 sec ) +Degree of AR model: 5, Sigma: 7.47891, AIC: 1.89722e+07 ( 5 sec ) +Degree of AR model: 6, Sigma: 7.46782, AIC: 1.8964e+07 ( 5 sec ) +Degree of AR model: 7, Sigma: 7.45798, AIC: 1.89567e+07 ( 5 sec ) +Degree of AR model: 8, Sigma: 7.44899, AIC: 1.895e+07 ( 5 sec ) +Degree of AR model: 9, Sigma: 7.44151, AIC: 1.89444e+07 ( 5 sec ) +Degree of AR model: 10, Sigma: 7.43417, AIC: 1.8939e+07 ( 5 sec ) +The AR model of 10 degress gives the minimum AIC (1.8939e+07) ( 5 sec ) +AR coefficients: 0.0497931 0.0484711 0.0453945 0.0449254 0.0443603 0.0443792 0.0440958 0.0444201 0.0425092 0.0444076 ( 5 sec ) +Perform prewhitening for channel 2 ( 5 sec ) +Degree of AR model: 1, Sigma: 1.15041, AIC: 8.62097e+06 ( 5 sec ) +Degree of AR model: 2, Sigma: 0.999605, AIC: 7.84398e+06 ( 5 sec ) +Degree of AR model: 3, Sigma: 0.94325, AIC: 7.5231e+06 ( 5 sec ) +Degree of AR model: 4, Sigma: 0.913582, AIC: 7.34638e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.895124, AIC: 7.23352e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.882753, AIC: 7.15657e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.873879, AIC: 7.1007e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.867031, AIC: 7.0572e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.861586, AIC: 7.02236e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.857167, AIC: 6.99392e+06 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (6.99392e+06) ( 6 sec ) +AR coefficients: 0.100812 0.0994283 0.099345 0.0994338 0.100341 0.0991599 0.0983786 0.0996401 0.100555 0.101158 ( 6 sec ) +Perform prewhitening for channel 3 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.15933, AIC: 8.66365e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 1.01002, AIC: 7.90131e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.95364, AIC: 7.58368e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.923737, AIC: 7.40751e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.905428, AIC: 7.29681e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.892914, AIC: 7.21985e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.884029, AIC: 7.16455e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.877216, AIC: 7.12177e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.871841, AIC: 7.08779e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.867445, AIC: 7.05983e+06 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (7.05983e+06) ( 6 sec ) +AR coefficients: 0.0992426 0.0997661 0.0999695 0.100685 0.0994892 0.0998831 0.0983119 0.0990847 0.0994668 0.100303 ( 6 sec ) +Perform prewhitening for channel 4 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.16254, AIC: 8.67898e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 1.00903, AIC: 7.89586e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.952405, AIC: 7.57651e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.922235, AIC: 7.39851e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.90364, AIC: 7.28588e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.891244, AIC: 7.2095e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.882213, AIC: 7.15318e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.875262, AIC: 7.10944e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.869864, AIC: 7.07523e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.865547, AIC: 7.04772e+06 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (7.04772e+06) ( 6 sec ) +AR coefficients: 0.0989261 0.10121 0.0987917 0.100744 0.100552 0.0988028 0.0993482 0.100374 0.0999452 0.0995135 ( 6 sec ) +Perform prewhitening for channel 5 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.16036, AIC: 8.66857e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 1.01086, AIC: 7.90589e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.953982, AIC: 7.58566e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.924434, AIC: 7.41168e+06 ( 7 sec ) +Degree of AR model: 5, Sigma: 0.906107, AIC: 7.30095e+06 ( 7 sec ) +Degree of AR model: 6, Sigma: 0.893431, AIC: 7.22305e+06 ( 7 sec ) +Degree of AR model: 7, Sigma: 0.884431, AIC: 7.16707e+06 ( 7 sec ) +Degree of AR model: 8, Sigma: 0.877486, AIC: 7.12347e+06 ( 7 sec ) +Degree of AR model: 9, Sigma: 0.872098, AIC: 7.08941e+06 ( 7 sec ) +Degree of AR model: 10, Sigma: 0.867816, AIC: 7.0622e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.0622e+06) ( 7 sec ) +AR coefficients: 0.0995885 0.098903 0.101124 0.0988656 0.0991358 0.100713 0.0990429 0.100438 0.0997109 0.0989688 ( 7 sec ) +=============================================================================== +Perform analysis for segment length : 65536 ( 7 sec ) +Convert time-series data to frequency-domain ( 7 sec ) +Total number of segments : 83 ( 7 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00146484, Period(s): 682.667 ( 9 sec ) +Perform calibration correction ( 9 sec ) +Calculate rotated fields ( 9 sec ) +Calculate response functions by ordinary remote reference ( 9 sec ) +Calculate response functions for output variable 0 ( 9 sec ) +Calculate response functions by the ordinary least square method ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 9 sec ) +Calculate response functions for output variable 1 ( 9 sec ) +Calculate response functions by the ordinary least square method ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 9 sec ) +Estimate errors by fixed-weights bootstrap ( 9 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00195312, Period(s): 512 ( 9 sec ) +Perform calibration correction ( 9 sec ) +Calculate rotated fields ( 9 sec ) +Calculate response functions by ordinary remote reference ( 9 sec ) +Calculate response functions for output variable 0 ( 9 sec ) +Calculate response functions by the ordinary least square method ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 9 sec ) +Calculate response functions for output variable 1 ( 9 sec ) +Calculate response functions by the ordinary least square method ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 9 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 9 sec ) +Estimate errors by fixed-weights bootstrap ( 9 sec ) +=============================================================================== +Perform analysis for segment length : 32768 ( 9 sec ) +Convert time-series data to frequency-domain ( 9 sec ) +Total number of segments : 167 ( 9 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00292969, Period(s): 341.333 ( 11 sec ) +Perform calibration correction ( 11 sec ) +Calculate rotated fields ( 11 sec ) +Calculate response functions by ordinary remote reference ( 11 sec ) +Calculate response functions for output variable 0 ( 11 sec ) +Calculate response functions by the ordinary least square method ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 11 sec ) +Calculate response functions for output variable 1 ( 11 sec ) +Calculate response functions by the ordinary least square method ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 11 sec ) +Estimate errors by fixed-weights bootstrap ( 11 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00390625, Period(s): 256 ( 11 sec ) +Perform calibration correction ( 11 sec ) +Calculate rotated fields ( 11 sec ) +Calculate response functions by ordinary remote reference ( 11 sec ) +Calculate response functions for output variable 0 ( 11 sec ) +Calculate response functions by the ordinary least square method ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 11 sec ) +Calculate response functions for output variable 1 ( 11 sec ) +Calculate response functions by the ordinary least square method ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 11 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 11 sec ) +Estimate errors by fixed-weights bootstrap ( 11 sec ) +=============================================================================== +Perform analysis for segment length : 16384 ( 11 sec ) +Convert time-series data to frequency-domain ( 11 sec ) +Total number of segments : 336 ( 11 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00585938, Period(s): 170.667 ( 13 sec ) +Perform calibration correction ( 13 sec ) +Calculate rotated fields ( 13 sec ) +Calculate response functions by ordinary remote reference ( 13 sec ) +Calculate response functions for output variable 0 ( 13 sec ) +Calculate response functions by the ordinary least square method ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 13 sec ) +Calculate response functions for output variable 1 ( 13 sec ) +Calculate response functions by the ordinary least square method ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 13 sec ) +Estimate errors by fixed-weights bootstrap ( 13 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0078125, Period(s): 128 ( 13 sec ) +Perform calibration correction ( 13 sec ) +Calculate rotated fields ( 13 sec ) +Calculate response functions by ordinary remote reference ( 13 sec ) +Calculate response functions for output variable 0 ( 13 sec ) +Calculate response functions by the ordinary least square method ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 13 sec ) +Calculate response functions for output variable 1 ( 13 sec ) +Calculate response functions by the ordinary least square method ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 13 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 13 sec ) +Estimate errors by fixed-weights bootstrap ( 13 sec ) +=============================================================================== +Perform analysis for segment length : 8192 ( 13 sec ) +Convert time-series data to frequency-domain ( 13 sec ) +Total number of segments : 674 ( 13 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0117188, Period(s): 85.3333 ( 15 sec ) +Perform calibration correction ( 15 sec ) +Calculate rotated fields ( 15 sec ) +Calculate response functions by ordinary remote reference ( 15 sec ) +Calculate response functions for output variable 0 ( 15 sec ) +Calculate response functions by the ordinary least square method ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 15 sec ) +Calculate response functions for output variable 1 ( 15 sec ) +Calculate response functions by the ordinary least square method ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 15 sec ) +Estimate errors by fixed-weights bootstrap ( 15 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.015625, Period(s): 64 ( 15 sec ) +Perform calibration correction ( 15 sec ) +Calculate rotated fields ( 15 sec ) +Calculate response functions by ordinary remote reference ( 15 sec ) +Calculate response functions for output variable 0 ( 15 sec ) +Calculate response functions by the ordinary least square method ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 15 sec ) +Calculate response functions for output variable 1 ( 15 sec ) +Calculate response functions by the ordinary least square method ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 15 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 15 sec ) +Estimate errors by fixed-weights bootstrap ( 15 sec ) +=============================================================================== +Perform analysis for segment length : 4096 ( 15 sec ) +Convert time-series data to frequency-domain ( 15 sec ) +Total number of segments : 1349 ( 15 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0234375, Period(s): 42.6667 ( 17 sec ) +Perform calibration correction ( 17 sec ) +Calculate rotated fields ( 17 sec ) +Calculate response functions by ordinary remote reference ( 17 sec ) +Calculate response functions for output variable 0 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 17 sec ) +Calculate response functions for output variable 1 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 17 sec ) +Estimate errors by fixed-weights bootstrap ( 17 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.03125, Period(s): 32 ( 17 sec ) +Perform calibration correction ( 17 sec ) +Calculate rotated fields ( 17 sec ) +Calculate response functions by ordinary remote reference ( 17 sec ) +Calculate response functions for output variable 0 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 17 sec ) +Calculate response functions for output variable 1 ( 17 sec ) +Calculate response functions by the ordinary least square method ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 17 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 17 sec ) +Estimate errors by fixed-weights bootstrap ( 17 sec ) +=============================================================================== +Perform analysis for segment length : 2048 ( 17 sec ) +Convert time-series data to frequency-domain ( 17 sec ) +Total number of segments : 2699 ( 17 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.046875, Period(s): 21.3333 ( 18 sec ) +Perform calibration correction ( 18 sec ) +Calculate rotated fields ( 18 sec ) +Calculate response functions by ordinary remote reference ( 18 sec ) +Calculate response functions for output variable 0 ( 18 sec ) +Calculate response functions by the ordinary least square method ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 18 sec ) +Calculate response functions for output variable 1 ( 18 sec ) +Calculate response functions by the ordinary least square method ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 18 sec ) +Estimate errors by fixed-weights bootstrap ( 18 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0625, Period(s): 16 ( 18 sec ) +Perform calibration correction ( 18 sec ) +Calculate rotated fields ( 18 sec ) +Calculate response functions by ordinary remote reference ( 18 sec ) +Calculate response functions for output variable 0 ( 18 sec ) +Calculate response functions by the ordinary least square method ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 18 sec ) +Calculate response functions for output variable 1 ( 18 sec ) +Calculate response functions by the ordinary least square method ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 18 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 18 sec ) +Estimate errors by fixed-weights bootstrap ( 18 sec ) +=============================================================================== +Perform analysis for segment length : 1024 ( 19 sec ) +Convert time-series data to frequency-domain ( 19 sec ) +Total number of segments : 5399 ( 19 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.09375, Period(s): 10.6667 ( 20 sec ) +Perform calibration correction ( 20 sec ) +Calculate rotated fields ( 20 sec ) +Calculate response functions by ordinary remote reference ( 20 sec ) +Calculate response functions for output variable 0 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 20 sec ) +Calculate response functions for output variable 1 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 20 sec ) +Estimate errors by fixed-weights bootstrap ( 20 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.125, Period(s): 8 ( 20 sec ) +Perform calibration correction ( 20 sec ) +Calculate rotated fields ( 20 sec ) +Calculate response functions by ordinary remote reference ( 20 sec ) +Calculate response functions for output variable 0 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 20 sec ) +Calculate response functions for output variable 1 ( 20 sec ) +Calculate response functions by the ordinary least square method ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 20 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 20 sec ) +Estimate errors by fixed-weights bootstrap ( 20 sec ) +=============================================================================== +Perform analysis for segment length : 512 ( 20 sec ) +Convert time-series data to frequency-domain ( 20 sec ) +Total number of segments : 10799 ( 20 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.1875, Period(s): 5.33333 ( 22 sec ) +Perform calibration correction ( 22 sec ) +Calculate rotated fields ( 22 sec ) +Calculate response functions by ordinary remote reference ( 22 sec ) +Calculate response functions for output variable 0 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 22 sec ) +Calculate response functions for output variable 1 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 22 sec ) +Estimate errors by fixed-weights bootstrap ( 22 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.25, Period(s): 4 ( 22 sec ) +Perform calibration correction ( 22 sec ) +Calculate rotated fields ( 22 sec ) +Calculate response functions by ordinary remote reference ( 22 sec ) +Calculate response functions for output variable 0 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 22 sec ) +Calculate response functions for output variable 1 ( 22 sec ) +Calculate response functions by the ordinary least square method ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 22 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 22 sec ) +Estimate errors by fixed-weights bootstrap ( 22 sec ) +=============================================================================== +Perform analysis for segment length : 256 ( 23 sec ) +Convert time-series data to frequency-domain ( 23 sec ) +Total number of segments : 21599 ( 23 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.375, Period(s): 2.66667 ( 24 sec ) +Perform calibration correction ( 24 sec ) +Calculate rotated fields ( 24 sec ) +Calculate response functions by ordinary remote reference ( 24 sec ) +Calculate response functions for output variable 0 ( 24 sec ) +Calculate response functions by the ordinary least square method ( 24 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 24 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 24 sec ) +Calculate response functions for output variable 1 ( 24 sec ) +Calculate response functions by the ordinary least square method ( 24 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 24 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 24 sec ) +Estimate errors by fixed-weights bootstrap ( 24 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.5, Period(s): 2 ( 25 sec ) +Perform calibration correction ( 25 sec ) +Calculate rotated fields ( 25 sec ) +Calculate response functions by ordinary remote reference ( 25 sec ) +Calculate response functions for output variable 0 ( 25 sec ) +Calculate response functions by the ordinary least square method ( 25 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 25 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 25 sec ) +Calculate response functions for output variable 1 ( 25 sec ) +Calculate response functions by the ordinary least square method ( 25 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 25 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 25 sec ) +Estimate errors by fixed-weights bootstrap ( 25 sec ) +=============================================================================== +Perform analysis for segment length : 128 ( 26 sec ) +Convert time-series data to frequency-domain ( 26 sec ) +Total number of segments : 43199 ( 26 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.75, Period(s): 1.33333 ( 27 sec ) +Perform calibration correction ( 27 sec ) +Calculate rotated fields ( 27 sec ) +Calculate response functions by ordinary remote reference ( 27 sec ) +Calculate response functions for output variable 0 ( 27 sec ) +Calculate response functions by the ordinary least square method ( 27 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 27 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 27 sec ) +Calculate response functions for output variable 1 ( 27 sec ) +Calculate response functions by the ordinary least square method ( 27 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 27 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 27 sec ) +Estimate errors by fixed-weights bootstrap ( 28 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 1, Period(s): 1 ( 29 sec ) +Perform calibration correction ( 29 sec ) +Calculate rotated fields ( 29 sec ) +Calculate response functions by ordinary remote reference ( 29 sec ) +Calculate response functions for output variable 0 ( 29 sec ) +Calculate response functions by the ordinary least square method ( 29 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 29 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 29 sec ) +Calculate response functions for output variable 1 ( 29 sec ) +Calculate response functions by the ordinary least square method ( 29 sec ) +Calculate response functions by iteratively reweighted remote reference using Huber weight ( 29 sec ) +Calculate response functions by iteratively reweighted remote reference using Tukey's biweights weight ( 29 sec ) +Estimate errors by fixed-weights bootstrap ( 29 sec ) +End TRACMT ( 31 sec ) diff --git a/Samples/OrdinaryRobustRemoteReference/apparent_resistivity_and_phase.csv b/Samples/OrdinaryRobustRemoteReference/apparent_resistivity_and_phase.csv new file mode 100644 index 0000000..96fa45b --- /dev/null +++ b/Samples/OrdinaryRobustRemoteReference/apparent_resistivity_and_phase.csv @@ -0,0 +1,21 @@ +frequency,period,app_res_0_2,phase_0_2,app_res_0_3,phase_0_3,coherence_0_2+3,app_res_1_2,phase_1_2,app_res_1_3,phase_1_3,coherence_1_2+3,dapp_res_0_2,dphase_0_2,dapp_res_0_3,dphase_0_3,dapp_res_1_2,dphase_1_2,dapp_res_1_3,dphase_1_3 +1.4648437500e-03,6.8266666667e+02,4.3916578744e+01,5.0669393911e+01,3.9866612485e+01,5.4334231062e+01,9.3703783930e-01,1.5456339509e+02,-1.2900295429e+02,6.7884721742e+00,-1.3703647180e+02,9.6777102021e-01,2.4854563945e+00,1.6215422252e+00,2.3021754416e+00,1.6545583241e+00,4.4928675803e+00,8.3276966682e-01,1.0164047781e+00,4.2933252333e+00 +1.9531250000e-03,5.1200000000e+02,4.4602963314e+01,4.5868238738e+01,4.6150130862e+01,5.4009382035e+01,9.4713584089e-01,1.7149384900e+02,-1.2903509690e+02,7.3508615241e+00,-1.3422485420e+02,9.7812451678e-01,2.2780369087e+00,1.4633118644e+00,2.5641349832e+00,1.5919024849e+00,3.9269908759e+00,6.5601454740e-01,9.5544958395e-01,3.7262188383e+00 +2.9296875000e-03,3.4133333333e+02,4.1754396591e+01,5.0058719414e+01,5.3726794317e+01,5.5681889067e+01,8.9731712202e-01,1.7520883461e+02,-1.2568862112e+02,5.7317388697e+00,-1.2756902877e+02,9.5727358041e-01,1.9933856295e+00,1.3678012605e+00,2.6967321541e+00,1.4380868724e+00,3.8692138267e+00,6.3265681711e-01,8.9178474545e-01,4.4617507114e+00 +3.9062500000e-03,2.5600000000e+02,4.4488224389e+01,4.7185418176e+01,5.3161735598e+01,6.3901347854e+01,8.9070287796e-01,2.0099596093e+02,-1.2766359117e+02,7.6834484659e+00,-1.1971813064e+02,9.5726589115e-01,2.3522166693e+00,1.5148704265e+00,2.8846813478e+00,1.5546929428e+00,4.3757123205e+00,6.2368118823e-01,1.0391444974e+00,3.8774297740e+00 +5.8593750000e-03,1.7066666667e+02,5.1774203042e+01,4.7440771808e+01,5.7274837364e+01,5.9415047539e+01,8.3042293519e-01,2.0874810738e+02,-1.2927378961e+02,7.2436361994e+00,-1.2926015226e+02,9.3530975654e-01,2.1278502223e+00,1.1774726799e+00,2.8321419694e+00,1.4167331238e+00,4.1154772056e+00,5.6480342862e-01,9.8590342546e-01,3.9021698724e+00 +7.8125000000e-03,1.2800000000e+02,5.5708230210e+01,4.7388789482e+01,6.3769971191e+01,5.6154957202e+01,8.1516231821e-01,2.2069384348e+02,-1.2860895066e+02,8.1782369959e+00,-1.3171631924e+02,9.1372864287e-01,2.4787695806e+00,1.2748094265e+00,3.3817962657e+00,1.5194092278e+00,5.2323173096e+00,6.7921405477e-01,1.1557258299e+00,4.0518168610e+00 +1.1718750000e-02,8.5333333333e+01,5.7519638366e+01,4.2099297862e+01,7.6021780683e+01,5.8393300210e+01,7.4253979355e-01,2.5202113576e+02,-1.3002408914e+02,1.0370786127e+01,-1.2720068414e+02,8.6986047149e-01,2.2057474592e+00,1.0986488147e+00,3.3104603416e+00,1.2476055798e+00,5.0220784109e+00,5.7088199677e-01,1.2557059495e+00,3.4708397355e+00 +1.5625000000e-02,6.4000000000e+01,5.3160335157e+01,4.0800971837e+01,7.8407781210e+01,5.6752169437e+01,6.7359698857e-01,2.4433190941e+02,-1.3220276475e+02,9.3418269907e+00,-1.3223419171e+02,8.4011322251e-01,2.6379799873e+00,1.4217426524e+00,4.0306302763e+00,1.4728355757e+00,5.8978484044e+00,6.9153887278e-01,1.4171428922e+00,4.3500251295e+00 +2.3437500000e-02,4.2666666667e+01,5.3526011330e+01,3.9631077277e+01,9.2513383065e+01,5.5515373983e+01,5.2672472969e-01,2.4472877520e+02,-1.3409309138e+02,1.4828695660e+01,-1.2819306726e+02,7.4677283848e-01,2.3910983486e+00,1.2798565991e+00,4.4170162477e+00,1.3679125350e+00,5.7086443129e+00,6.6826763945e-01,1.8802928956e+00,3.6350180321e+00 +3.1250000000e-02,3.2000000000e+01,5.6226852546e+01,3.6900808411e+01,1.0923477535e+02,5.5374504809e+01,4.6888670969e-01,2.4484321789e+02,-1.3551876227e+02,1.1787860307e+01,-1.3116906830e+02,6.5115695393e-01,3.2526259988e+00,1.6574619476e+00,5.9337108895e+00,1.5563651908e+00,7.1377846836e+00,8.3518633732e-01,2.1092569673e+00,5.1329641925e+00 +4.6875000000e-02,2.1333333333e+01,6.7240460822e+01,3.1637647150e+01,1.0512648167e+02,5.8327222230e+01,2.4699526389e-01,2.4177992529e+02,-1.3856133764e+02,8.7472556149e+00,-1.2636959698e+02,4.4573046006e-01,4.0656329049e+00,1.7324323957e+00,6.4387704255e+00,1.7548958738e+00,8.2655879283e+00,9.7941623502e-01,1.9900071212e+00,6.5315535451e+00 +6.2500000000e-02,1.6000000000e+01,6.8975508029e+01,3.1744364808e+01,1.2889377981e+02,5.9897901848e+01,2.0815230286e-02,2.2650220665e+02,-1.3668558155e+02,1.2838265591e+01,-1.3616612124e+02,2.5481400477e-01,6.1779942597e+00,2.5667909928e+00,1.1322667525e+01,2.5173822753e+00,1.1757449660e+01,1.4872435644e+00,3.5154255507e+00,7.8691968575e+00 +9.3750000000e-02,1.0666666667e+01,4.1242878924e+01,2.8229573399e+01,1.5321293475e+02,5.7429532831e+01,0.0000000000e+00,2.0447526735e+02,-1.3493111906e+02,1.8394579599e+01,-1.2185553732e+02,8.5359546249e-02,5.7758846544e+00,4.0152974227e+00,1.4724714655e+01,2.7543008286e+00,1.1791546484e+01,1.6522768390e+00,5.0080100791e+00,7.8238130657e+00 +1.2500000000e-01,8.0000000000e+00,4.1154003574e+01,2.3444482821e+01,1.5551735286e+02,5.4024177622e+01,0.0000000000e+00,2.0396201683e+02,-1.3542646155e+02,1.0455630803e+01,-1.1214940902e+02,0.0000000000e+00,9.0346660991e+00,6.3018584616e+00,2.3427266406e+01,4.3196334146e+00,1.9082151459e+01,2.6811999052e+00,6.0039023899e+00,1.6685215222e+01 +1.8750000000e-01,5.3333333333e+00,2.7732078222e+01,3.0399714384e+01,1.9079198273e+02,5.6665962665e+01,0.0000000000e+00,2.0060698048e+02,-1.3316072972e+02,5.4153083214e-01,-8.1701954851e+01,0.0000000000e+00,9.6969453853e+00,1.0068919453e+01,3.2701304050e+01,4.9162122205e+00,2.4573022610e+01,3.5113738291e+00,1.5671365234e+00,3.6000000000e+02 +2.5000000000e-01,4.0000000000e+00,4.1447542662e+01,6.5869668461e+01,2.2152885208e+02,6.0238133196e+01,0.0000000000e+00,2.4614698806e+02,-1.4007961966e+02,1.3481589795e+00,-1.6572703095e+02,0.0000000000e+00,2.2817477713e+01,1.5977348392e+01,6.4292557409e+01,8.3437084287e+00,4.5673752551e+01,5.3234088635e+00,4.0015197356e+00,3.6000000000e+02 +3.7500000000e-01,2.6666666667e+00,2.4214693360e+01,1.6952132220e+01,2.5058694999e+02,4.9498566524e+01,0.0000000000e+00,1.5171275780e+02,-1.2996484645e+02,1.0101958322e+01,-1.1882962847e+02,0.0000000000e+00,2.2268619448e+01,2.7375251696e+01,1.1015695360e+02,1.2697160961e+01,7.7556221316e+01,1.4809269686e+01,3.2079816265e+01,3.6000000000e+02 +5.0000000000e-01,2.0000000000e+00,3.1774873271e+01,1.7466799702e+01,2.3335821884e+02,4.1684474445e+01,0.0000000000e+00,1.2261437653e+02,-1.2752779445e+02,2.2631887058e+01,-1.2077735089e+02,0.0000000000e+00,1.1320774225e+02,3.6000000000e+02,4.2753958524e+02,6.6356505890e+01,6.3232915320e+01,1.4942691670e+01,4.2322240537e+01,6.9230328501e+01 +7.5000000000e-01,1.3333333333e+00,7.9986506745e+01,-1.4261672608e+02,1.9045684514e+02,5.9005625149e+01,0.0000000000e+00,2.4317159411e+01,-1.1670695183e+02,2.7713923912e+01,-1.3672427061e+02,0.0000000000e+00,7.9383267970e+01,2.9750832711e+01,1.6885202180e+02,2.6313446952e+01,3.7409740250e+01,5.0282513485e+01,5.6969356722e+01,3.6000000000e+02 +1.0000000000e+00,1.0000000000e+00,1.5362764242e+02,-2.0110441186e+01,1.9755648893e+03,1.0380387118e+02,0.0000000000e+00,1.5489629805e+01,-1.1910561777e+02,2.4536022333e+02,-1.0714168640e+02,0.0000000000e+00,3.6085726080e+02,3.6000000000e+02,3.9174246578e+03,8.2510822215e+01,6.9969305568e+01,3.6000000000e+02,5.7738276480e+02,3.6000000000e+02 diff --git a/Samples/OrdinaryRobustRemoteReference/param.dat b/Samples/OrdinaryRobustRemoteReference/param.dat new file mode 100644 index 0000000..1cbdcfc --- /dev/null +++ b/Samples/OrdinaryRobustRemoteReference/param.dat @@ -0,0 +1,48 @@ +NUM_OUT +2 +SAMPLING_FREQ +32 +NUM_SECTION +1 +SEGMENT +10 +65536 2 3 4 +32768 2 3 4 +16384 2 3 4 +8192 2 3 4 +4096 2 3 4 +2048 2 3 4 +1024 2 3 4 +512 2 3 4 +256 2 3 4 +128 2 3 4 +ROTATION +0.0 +AZIMUTH +0.0 90.0 +0.0 90.0 +0.0 90.0 +OUTPUT_RHOA_PHS +PREWHITENING +0 +10 +5 +PROCEDURE +0 +ERROR_ESTIMATION +1 +DATA_FILES +2764800 +../ex.txt +0 +../ey.txt +0 +../hx.txt +0 +../hy.txt +0 +../hrx.txt +0 +../hry.txt +0 +END diff --git a/Samples/OrdinaryRobustRemoteReference/response_functions.csv b/Samples/OrdinaryRobustRemoteReference/response_functions.csv new file mode 100644 index 0000000..97eb494 --- /dev/null +++ b/Samples/OrdinaryRobustRemoteReference/response_functions.csv @@ -0,0 +1,21 @@ +frequency,period,resp_real_0_2,resp_imag_0_2,resp_real_0_3,resp_imag_0_3,coherence_0_2+3,resp_real_1_2,resp_imag_1_2,resp_real_1_3,resp_imag_1_3,coherence_1_2+3,dresp_0_2,dresp_0_3,dresp_1_2,dresp_1_3 +1.4648437500e-03,6.8266666667e+02,3.5945384161e-01,4.3868846033e-01,3.1506164709e-01,4.3900791473e-01,9.3703783930e-01,-6.6962773524e-01,-8.2683421105e-01,-1.6317430404e-01,-1.5196842331e-01,9.6777102021e-01,1.6048799672e-02,1.5602148500e-02,1.5463968345e-02,1.6692882431e-02 +1.9531250000e-03,5.1200000000e+02,4.5955235266e-01,4.7369552329e-01,3.9450932921e-01,5.4318252997e-01,9.4713584089e-01,-8.1503153615e-01,-1.0052204804e+00,-1.8687380382e-01,-1.9199983989e-01,9.7812451678e-01,1.6853842289e-02,1.8649811281e-02,1.4816841815e-02,1.7412401829e-02 +2.9296875000e-03,3.4133333333e+02,5.0209196256e-01,5.9961681927e-01,5.0015692469e-01,7.3270501521e-01,8.9731712202e-01,-9.3459860610e-01,-1.3011768169e+00,-1.7667171011e-01,-2.2966960061e-01,9.5727358041e-01,1.8668347339e-02,2.2264246654e-02,1.7689289359e-02,2.2541483611e-02 +3.9062500000e-03,2.5600000000e+02,6.3351781168e-01,6.8378784347e-01,4.4826658939e-01,9.1508044085e-01,8.9070287796e-01,-1.2106456513e+00,-1.5684512963e+00,-1.9203986422e-01,-3.3643430770e-01,9.5726589115e-01,2.4642786300e-02,2.7646063085e-02,2.1567018977e-02,2.6195872905e-02 +5.8593750000e-03,1.7066666667e+02,8.3299066116e-01,9.0716531745e-01,6.5910222764e-01,1.1151493193e+00,8.3042293519e-01,-1.5654673858e+00,-1.9144135061e+00,-2.9153092108e-01,-3.5668701453e-01,9.3530975654e-01,2.5308417907e-02,3.2026814245e-02,2.4377523326e-02,3.1349939981e-02 +7.8125000000e-03,1.2800000000e+02,9.9871410827e-01,1.0856670173e+00,8.7902926960e-01,1.3108478336e+00,8.1516231821e-01,-1.8321493941e+00,-2.2943587031e+00,-3.7611505425e-01,-4.2190028279e-01,9.1372864287e-01,3.2819087269e-02,4.1849411148e-02,3.4805588888e-02,3.9936959277e-02 +1.1718750000e-02,8.5333333333e+01,1.3621605359e+00,1.2307761718e+00,1.1061061528e+00,1.7974788985e+00,7.4253979355e-01,-2.4713208784e+00,-2.9426920566e+00,-4.7130909956e-01,-6.2091141260e-01,8.6986047149e-01,3.5200056890e-02,4.5953121953e-02,3.8287821641e-02,4.7193019380e-02 +1.5625000000e-02,6.4000000000e+01,1.5426789538e+00,1.3316504157e+00,1.3569454780e+00,2.0698567285e+00,6.7359698857e-01,-2.9349241417e+00,-3.2364565044e+00,-5.7422915306e-01,-6.3252755941e-01,8.4011322251e-01,5.0564144158e-02,6.3614834278e-02,5.2731306343e-02,6.4798171717e-02 +2.3437500000e-02,4.2666666667e+01,1.9288933315e+00,1.5974823844e+00,1.8642379645e+00,2.7140429049e+00,5.2672472969e-01,-3.7263525497e+00,-3.8462254250e+00,-8.1508089006e-01,-1.0360409815e+00,7.4677283848e-01,5.5940410337e-02,7.8602681934e-02,6.2459875621e-02,8.3576595896e-02 +3.1250000000e-02,3.2000000000e+01,2.3702604133e+00,1.7796941545e+00,2.3474660392e+00,3.3996083368e+00,4.6888670969e-01,-4.4130191821e+00,-4.3338221575e+00,-8.9338828261e-01,-1.0216215294e+00,6.5115695393e-01,8.5731862694e-02,1.1220854724e-01,9.0156993571e-02,1.2142050069e-01 +4.6875000000e-02,2.1333333333e+01,3.3798364092e+00,2.0823517600e+00,2.6063139374e+00,4.2244700024e+00,2.4699526389e-01,-5.6432955740e+00,-4.9820061275e+00,-8.4906348936e-01,-1.1529220380e+00,4.4573046006e-01,1.2001581231e-01,1.5201012724e-01,1.2867354840e-01,1.6287122712e-01 +6.2500000000e-02,1.6000000000e+01,3.9481872939e+00,2.4426754495e+00,3.1830881100e+00,5.4906517168e+00,2.0815230286e-02,-6.1214458031e+00,-5.7714678253e+00,-1.4448565495e+00,-1.3872085454e+00,2.5481400477e-01,2.0791942319e-01,2.7875828914e-01,2.1835941617e-01,2.7423301734e-01 +9.3750000000e-02,1.0666666667e+01,3.8739171543e+00,2.0797512777e+00,4.5621773383e+00,7.1417855680e+00,0.0000000000e+00,-6.9143808667e+00,-6.9310258117e+00,-1.5497725809e+00,-2.4941259259e+00,8.5359546249e-02,3.0788226281e-01,4.0723004891e-01,2.8228709193e-01,3.9972462673e-01 +1.2500000000e-01,8.0000000000e+00,4.6529305755e+00,2.0177931741e+00,5.7915627945e+00,7.9784801771e+00,0.0000000000e+00,-8.0428179884e+00,-7.9239724461e+00,-9.6379153156e-01,-2.3676729367e+00,0.0000000000e+00,5.5669340220e-01,7.4257821051e-01,5.2815658970e-01,7.3395344993e-01 +1.8750000000e-01,5.3333333333e+00,4.3978873728e+00,2.5801957269e+00,7.3493444861e+00,1.1173836380e+01,0.0000000000e+00,-9.3809063444e+00,-1.0003381446e+01,1.0283266572e-01,-7.0506070518e-01,0.0000000000e+00,8.9145491519e-01,1.1461478750e+00,8.3992634269e-01,1.0309815199e+00 +2.5000000000e-01,4.0000000000e+00,2.9425901845e+00,6.5689109701e+00,8.2603547580e+00,1.4445677706e+01,0.0000000000e+00,-1.3452776410e+01,-1.1256400043e+01,-1.2580808829e+00,-3.2004877214e-01,0.0000000000e+00,1.9812681234e+00,2.4147410420e+00,1.6274004904e+00,1.9265461623e+00 +3.7500000000e-01,2.6666666667e+00,6.4453603275e+00,1.9646578068e+00,1.4077871566e+01,1.6482234782e+01,0.0000000000e+00,-1.0833316527e+01,-1.2926742587e+01,-2.0986340598e+00,-3.8127295913e+00,0.0000000000e+00,3.0983069919e+00,4.7643464239e+00,4.3109822052e+00,6.9103449406e+00 +5.0000000000e-01,2.0000000000e+00,8.5017961095e+00,2.6751908510e+00,1.8038340161e+01,1.6062808950e+01,0.0000000000e+00,-1.0665034205e+01,-1.3884991420e+01,-3.8490059806e+00,-6.4625746113e+00,0.0000000000e+00,1.5877211289e+01,2.2126095860e+01,4.5145297237e+00,7.0331240290e+00 +7.5000000000e-01,1.3333333333e+00,-1.3761574635e+01,-1.0515154011e+01,1.3762023456e+01,2.2908947590e+01,0.0000000000e+00,-4.2917220900e+00,-8.5305609015e+00,-7.4222183768e+00,-6.9884110525e+00,0.0000000000e+00,8.5942156423e+00,1.1846596878e+01,7.3453739429e+00,1.0477989132e+01 +1.0000000000e+00,1.0000000000e+00,2.6025548855e+01,-9.5293766268e+00,-2.3713704362e+01,9.6516758504e+01,0.0000000000e+00,-4.2807304557e+00,-7.6891804367e+00,-1.0323328544e+01,-3.3469837233e+01,0.0000000000e+00,3.2550358169e+01,9.8539421788e+01,1.9876597846e+01,4.1211340682e+01 diff --git a/Samples/RRMS/TRACMT.cvg b/Samples/RRMS/TRACMT.cvg new file mode 100644 index 0000000..e35acf6 --- /dev/null +++ b/Samples/RRMS/TRACMT.cvg @@ -0,0 +1,520 @@ +================================================================================ +Now Frequency(Hz): 0.00146484, Period(s): 682.667 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.13035, Parameter c: 6.44795 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.00146484(Hz) +Response functions: +( 3.7058e-01, 4.1305e-01), ( 3.1084e-01, 3.6824e-01) +( -6.6764e-01, -8.5137e-01), ( -1.4337e-01, -1.1723e-01) +( 1.0083e+00, 1.1389e-02), ( -1.3077e-02, -7.4257e-03) +( -1.0731e-02, -9.1421e-03), ( 8.8798e-01, -4.7033e-02) +Scale: 0.00822998 +Covariance matrix without scale: + 7.0868e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 6.5392e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.1930e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.8088e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00195312, Period(s): 512 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.13035, Parameter c: 6.44795 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.00195312(Hz) +Response functions: +( 4.4820e-01, 4.7670e-01), ( 3.6621e-01, 4.4235e-01) +( -8.0252e-01, -1.0317e+00), ( -1.6708e-01, -1.5485e-01) +( 1.0140e+00, 1.5732e-02), ( -1.0886e-02, -9.5520e-03) +( -1.1840e-02, -7.4501e-03), ( 8.7759e-01, -5.4934e-02) +Scale: 0.0075017 +Covariance matrix without scale: + 8.2958e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 5.8926e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.4899e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.3730e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00292969, Period(s): 341.333 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.0742, Parameter c: 6.22496 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.00292969(Hz) +Response functions: +( 4.9932e-01, 6.0005e-01), ( 4.4578e-01, 5.8760e-01) +( -9.1835e-01, -1.3259e+00), ( -1.6362e-01, -1.6386e-01) +( 1.0029e+00, 1.7745e-02), ( -2.2270e-02, -1.7374e-02) +( -1.6547e-02, -1.5790e-02), ( 8.5921e-01, -4.4379e-02) +Scale: 0.0106855 +Covariance matrix without scale: + 6.3646e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 7.0234e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.5520e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.4414e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00390625, Period(s): 256 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.0742, Parameter c: 6.22496 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.00390625(Hz) +Response functions: +( 6.2870e-01, 7.0256e-01), ( 4.4481e-01, 7.1476e-01) +( -1.1810e+00, -1.5725e+00), ( -1.6914e-01, -2.1374e-01) +( 1.0088e+00, 2.5192e-02), ( -1.5339e-02, -1.6230e-02) +( -1.7235e-02, -1.7612e-02), ( 8.4992e-01, -4.3911e-02) +Scale: 0.0105011 +Covariance matrix without scale: + 7.1573e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 7.0459e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.7118e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.1584e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.00585938, Period(s): 170.667 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.04576, Parameter c: 6.11911 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.00585938(Hz) +Response functions: +( 8.2966e-01, 9.2566e-01), ( 5.7677e-01, 8.9138e-01) +( -1.5316e+00, -1.9854e+00), ( -2.5108e-01, -2.2433e-01) +( 1.0146e+00, 2.6705e-02), ( -1.4792e-02, -1.3108e-02) +( -2.1491e-02, -2.8939e-02), ( 8.2930e-01, -3.5456e-02) +Scale: 0.0154722 +Covariance matrix without scale: + 6.7019e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 6.5431e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.6974e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.3434e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0078125, Period(s): 128 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.04576, Parameter c: 6.11911 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.0078125(Hz) +Response functions: +( 9.7762e-01, 1.0646e+00), ( 6.9014e-01, 1.0247e+00) +( -1.7969e+00, -2.3468e+00), ( -2.9436e-01, -2.3041e-01) +( 1.0194e+00, 3.1520e-02), ( -2.5522e-02, -1.2464e-02) +( -2.9621e-02, -3.5519e-02), ( 8.1093e-01, -2.6489e-02) +Scale: 0.0149237 +Covariance matrix without scale: + 6.9002e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 6.3757e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.6616e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.3680e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0117188, Period(s): 85.3333 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.03151, Parameter c: 6.06788 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.0117188(Hz) +Response functions: +( 1.3680e+00, 1.2284e+00), ( 8.8052e-01, 1.3322e+00) +( -2.3571e+00, -2.9889e+00), ( -3.3867e-01, -3.1967e-01) +( 1.0184e+00, 3.6961e-02), ( -3.6054e-02, -1.9506e-02) +( -4.0394e-02, -3.5835e-02), ( 7.9770e-01, -1.9685e-02) +Scale: 0.0213775 +Covariance matrix without scale: + 6.7231e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 7.6178e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.5493e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.2603e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.015625, Period(s): 64 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.03151, Parameter c: 6.06788 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.015625(Hz) +Response functions: +( 1.5420e+00, 1.3539e+00), ( 1.0247e+00, 1.5430e+00) +( -2.7998e+00, -3.3080e+00), ( -4.2295e-01, -2.5968e-01) +( 9.9824e-01, 3.7950e-02), ( -4.1825e-02, -1.4152e-02) +( -3.4571e-02, -3.3532e-02), ( 7.7444e-01, -5.8188e-03) +Scale: 0.0211478 +Covariance matrix without scale: + 6.9401e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 7.9500e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.5330e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.1823e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0234375, Period(s): 42.6667 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.02439, Parameter c: 6.04266 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.0234375(Hz) +Response functions: +( 1.7683e+00, 1.3758e+00), ( 1.1824e+00, 1.7909e+00) +( -3.4362e+00, -3.7891e+00), ( -4.0657e-01, -4.5945e-01) +( 9.6281e-01, 3.2739e-02), ( -3.7156e-02, -1.9639e-02) +( -5.3358e-02, -3.8313e-02), ( 7.0137e-01, 8.0755e-03) +Scale: 0.030262 +Covariance matrix without scale: + 6.7592e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 8.6270e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.3999e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.2251e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.03125, Period(s): 32 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.02439, Parameter c: 6.04266 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.03125(Hz) +Response functions: +( 2.1049e+00, 1.4229e+00), ( 1.2594e+00, 2.0384e+00) +( -3.8258e+00, -4.0601e+00), ( -4.0857e-01, -3.9035e-01) +( 8.9655e-01, 4.5184e-02), ( -4.5584e-02, -2.1391e-02) +( -4.7594e-02, -3.7817e-02), ( 6.3689e-01, 2.2577e-02) +Scale: 0.0300554 +Covariance matrix without scale: + 7.1503e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 8.5113e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.3940e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.1787e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.046875, Period(s): 21.3333 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.02083, Parameter c: 6.03006 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.046875(Hz) +Response functions: +( 2.1337e+00, 1.1790e+00), ( 1.2440e+00, 2.2960e+00) +( -3.9003e+00, -3.6418e+00), ( -4.6242e-01, -4.4726e-01) +( 7.2944e-01, 1.7028e-02), ( -1.2928e-02, -1.5650e-02) +( -7.8386e-02, -8.8658e-03), ( 5.3995e-01, 2.4729e-02) +Scale: 0.0417988 +Covariance matrix without scale: + 7.3536e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 9.1494e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.3253e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.1214e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.0625, Period(s): 16 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.02083, Parameter c: 6.03006 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.0625(Hz) +Response functions: +( 1.8966e+00, 8.7189e-01), ( 1.2398e+00, 2.1257e+00) +( -3.3450e+00, -3.1552e+00), ( -3.5709e-01, -1.9636e-01) +( 5.6775e-01, -6.0974e-03), ( -3.7855e-02, -2.0796e-02) +( -7.1993e-02, -2.5304e-03), ( 4.2134e-01, 1.4262e-02) +Scale: 0.0404616 +Covariance matrix without scale: + 7.8033e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 9.7290e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.2780e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.0307e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.09375, Period(s): 10.6667 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.01906, Parameter c: 6.02377 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.09375(Hz) +Response functions: +( 1.1128e+00, 4.3977e-01), ( 1.0145e+00, 1.8175e+00) +( -2.4990e+00, -2.3000e+00), ( -2.4585e-01, -3.0278e-01) +( 3.6971e-01, -1.5093e-02), ( -3.0602e-02, -1.4935e-02) +( -5.0005e-02, 9.7930e-03), ( 2.6507e-01, 1.2915e-02) +Scale: 0.054374 +Covariance matrix without scale: + 8.0507e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.0058e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.2053e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.0245e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.125, Period(s): 8 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.01906, Parameter c: 6.02377 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.125(Hz) +Response functions: +( 9.4278e-01, 2.7535e-01), ( 8.8142e-01, 1.4381e+00) +( -1.9821e+00, -1.6299e+00), ( -4.2897e-02, -2.6497e-01) +( 2.3808e-01, -8.4785e-03), ( -1.3353e-02, 1.0955e-02) +( -1.6764e-02, 7.4497e-03), ( 1.7746e-01, -1.8394e-03) +Scale: 0.0525039 +Covariance matrix without scale: + 8.4938e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.0004e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.1078e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 1.0623e-01 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.1875, Period(s): 5.33333 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.01817, Parameter c: 6.02062 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.1875(Hz) +Response functions: +( 4.3333e-01, 6.8758e-02), ( 5.4982e-01, 9.6089e-01) +( -1.1808e+00, -1.0910e+00), ( -3.1559e-02, -2.2284e-01) +( 1.2338e-01, -8.7698e-03), ( 1.4252e-03, 1.2247e-02) +( -1.1720e-02, -1.0667e-03), ( 9.3049e-02, 5.2977e-04) +Scale: 0.0670486 +Covariance matrix without scale: + 9.0341e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.0842e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.0415e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 9.8028e-02 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.25, Period(s): 4 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.01817, Parameter c: 6.02062 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.25(Hz) +Response functions: +( 2.9440e-01, 5.2417e-02), ( 3.5283e-01, 8.1291e-01) +( -8.9501e-01, -8.5269e-01), ( -4.3739e-02, -1.2720e-01) +( 8.3164e-02, 2.4325e-03), ( -4.4410e-05, 3.7468e-03) +( -2.1733e-02, -6.1390e-03), ( 5.5416e-02, 3.8864e-03) +Scale: 0.0647303 +Covariance matrix without scale: + 9.3697e+00 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.0611e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 1.0222e-01 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 9.8399e-02 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.375, Period(s): 2.66667 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.01772, Parameter c: 6.01905 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.375(Hz) +Response functions: +( 1.6094e-01, 2.8796e-02), ( 3.0870e-01, 5.2132e-01) +( -4.5150e-01, -5.4099e-01), ( -7.6817e-02, -6.0189e-02) +( 4.0335e-02, 6.1953e-04), ( 2.4940e-03, -6.8454e-03) +( -2.5296e-05, 4.9876e-03), ( 2.5261e-02, 9.7822e-03) +Scale: 0.0834926 +Covariance matrix without scale: + 1.0375e+01 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.1508e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 9.2212e-02 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 9.0830e-02 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.5, Period(s): 2 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.01772, Parameter c: 6.01905 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.5(Hz) +Response functions: +( 1.6565e-01, 7.2379e-02), ( 2.1090e-01, 3.5859e-01) +( -2.6607e-01, -3.7411e-01), ( -9.6821e-02, -7.4930e-02) +( 2.4204e-02, -7.0460e-04), ( -2.4448e-03, -5.5413e-03) +( -5.1778e-04, 3.3146e-03), ( 1.4180e-02, 1.0598e-02) +Scale: 0.0813483 +Covariance matrix without scale: + 1.0669e+01 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.1458e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 9.1509e-02 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 8.9388e-02 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 0.75, Period(s): 1.33333 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.0175, Parameter c: 6.01826 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 0.75(Hz) +Response functions: +( 4.8550e-02, 3.2119e-02), ( 1.6104e-01, 2.4290e-01) +( -1.9514e-01, -2.1037e-01), ( -1.1007e-02, -1.3957e-02) +( 1.4124e-02, 1.4807e-03), ( -4.9226e-03, -2.0914e-03) +( 7.1309e-03, -7.3635e-04), ( 8.8656e-03, 2.7065e-03) +Scale: 0.107675 +Covariance matrix without scale: + 1.1363e+01 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.1904e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 8.6804e-02 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 8.5168e-02 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- +================================================================================ +Now Frequency(Hz): 1, Period(s): 1 +================================================================================ +Number of initial candidates: 100 +Number of candidates: 100 +-------------------------------------------------------------------------------- +Improve all candidates +Parameter b: 3.0175, Parameter c: 6.01826 +-------------------------------------------------------------------------------- +Perform further improvements to the best 10 candidates +-------------------------------------------------------------------------------- +Best estimator of frequency 1(Hz) +Response functions: +( -4.0422e-04, 1.7861e-02), ( 9.1192e-02, 1.5144e-01) +( -1.2143e-01, -1.2261e-01), ( 4.5062e-03, 3.0887e-02) +( 9.4648e-03, 2.4087e-03), ( -6.8454e-03, 3.2356e-03) +( 3.0071e-03, -2.6903e-03), ( -2.1803e-03, 1.3900e-03) +Scale: 0.105384 +Covariance matrix without scale: + 1.1353e+01 0.0000e+00 0.0000e+00 0.0000e+00 + 0.0000e+00 1.1880e+01 0.0000e+00 0.0000e+00 + 0.0000e+00 0.0000e+00 8.6785e-02 0.0000e+00 + 0.0000e+00 0.0000e+00 0.0000e+00 8.5431e-02 +-------------------------------------------------------------------------------- +Estimate errors by fixed-weights bootstrap +-------------------------------------------------------------------------------- diff --git a/Samples/RRMS/TRACMT.log b/Samples/RRMS/TRACMT.log new file mode 100644 index 0000000..1f5ad74 --- /dev/null +++ b/Samples/RRMS/TRACMT.log @@ -0,0 +1,465 @@ +Start TRACMT Version v2.0 +Read parameters. ( 0 sec ) +================================================================================ +Summary of control parameters +================================================================================ +Number of threads : 1 +Procedure type : multivariate regression (RRMS) +At each frequency, initial candidates are selected by random sampling +Maximum number of initial candidates: 100 +Maximum number of iteration of the first imporvements: 3 +Convegence criteria of the first imporvements: 0.05 +Maximum number of the candidates of the second imporvements: 10 +Maximum number of iteration of the second imporvements: 16 +Convegence criteria of the second imporvements: 0.01 +Time range for selecting intial candidates: 00:00:00 - 24:00:00 +Error estimation method : fixed-weights bootstrap +Number or repetitions in bootstrap : 1000 +Number of output variables : 2 +Number of input variables : 2 +Number of remote reference variables : 2 +Sampling frequency (Hz) : 32 +Number of time-series sections : 1 +Ratio of overlapping part to whole segment length : 0.5 +Output level : 0 +Output apparent resistivity and phase to a seperate csv file +Information about the segment lengths and frequencies : + Segment# Length Index Frequency(Hz) Period(sec) + 0 65536 3 1.464843750e-03 6.826666667e+02 + 0 65536 4 1.953125000e-03 5.120000000e+02 + 1 32768 3 2.929687500e-03 3.413333333e+02 + 1 32768 4 3.906250000e-03 2.560000000e+02 + 2 16384 3 5.859375000e-03 1.706666667e+02 + 2 16384 4 7.812500000e-03 1.280000000e+02 + 3 8192 3 1.171875000e-02 8.533333333e+01 + 3 8192 4 1.562500000e-02 6.400000000e+01 + 4 4096 3 2.343750000e-02 4.266666667e+01 + 4 4096 4 3.125000000e-02 3.200000000e+01 + 5 2048 3 4.687500000e-02 2.133333333e+01 + 5 2048 4 6.250000000e-02 1.600000000e+01 + 6 1024 3 9.375000000e-02 1.066666667e+01 + 6 1024 4 1.250000000e-01 8.000000000e+00 + 7 512 3 1.875000000e-01 5.333333333e+00 + 7 512 4 2.500000000e-01 4.000000000e+00 + 8 256 3 3.750000000e-01 2.666666667e+00 + 8 256 4 5.000000000e-01 2.000000000e+00 + 9 128 3 7.500000000e-01 1.333333333e+00 + 9 128 4 1.000000000e+00 1.000000000e+00 +Information about the time-series data : + Section# Channel# Type NSkip NData File + 0 0 Out0 0 2764800 ../ex.txt + 0 1 Out1 0 2764800 ../ey.txt + 0 2 Inp0 0 2764800 ../hx.txt + 0 3 Inp1 0 2764800 ../hy.txt + 0 4 RR0 0 2764800 ../hrx.txt + 0 5 RR1 0 2764800 ../hry.txt +Rotation angle (deg.) : 0 + Channel# Type Azimuth(deg.) + 0 Out0 0 + 1 Out1 90 + 2 Inp0 0 + 3 Inp1 90 + 4 RR0 0 + 5 RR1 90 +Parameters for robust prewhitening : + Least square estimator is used + Maximum degree of AR model: 10 +================================================================================ +Read data from ../ex.txt ( 0 sec ) +Read data from ../ey.txt ( 1 sec ) +Read data from ../hx.txt ( 2 sec ) +Read data from ../hy.txt ( 3 sec ) +Read data from ../hrx.txt ( 3 sec ) +Read data from ../hry.txt ( 4 sec ) +Perform preprocessing ( 5 sec ) +Secton 0, Channel 0 ( 5 sec ) +Subtract mean (-0.889991) ( 5 sec ) +Secton 0, Channel 1 ( 5 sec ) +Subtract mean (1.69968) ( 5 sec ) +Secton 0, Channel 2 ( 5 sec ) +Subtract mean (0.0092652) ( 5 sec ) +Secton 0, Channel 3 ( 5 sec ) +Subtract mean (1.30261) ( 5 sec ) +Secton 0, Channel 4 ( 5 sec ) +Subtract mean (0.0346805) ( 5 sec ) +Secton 0, Channel 5 ( 5 sec ) +Subtract mean (1.2857) ( 5 sec ) +Perform prewhitening for channel 0 ( 5 sec ) +Degree of AR model: 1, Sigma: 7.6076, AIC: 1.90665e+07 ( 5 sec ) +Degree of AR model: 2, Sigma: 7.60293, AIC: 1.90631e+07 ( 5 sec ) +Degree of AR model: 3, Sigma: 7.59862, AIC: 1.906e+07 ( 5 sec ) +Degree of AR model: 4, Sigma: 7.5946, AIC: 1.90571e+07 ( 5 sec ) +Degree of AR model: 5, Sigma: 7.59088, AIC: 1.90544e+07 ( 5 sec ) +Degree of AR model: 6, Sigma: 7.58783, AIC: 1.90521e+07 ( 5 sec ) +Degree of AR model: 7, Sigma: 7.58446, AIC: 1.90497e+07 ( 5 sec ) +Degree of AR model: 8, Sigma: 7.58162, AIC: 1.90476e+07 ( 5 sec ) +Degree of AR model: 9, Sigma: 7.57884, AIC: 1.90456e+07 ( 5 sec ) +Degree of AR model: 10, Sigma: 7.57665, AIC: 1.9044e+07 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (1.9044e+07) ( 6 sec ) +AR coefficients: 0.0320459 0.0276236 0.0274305 0.0273417 0.0271195 0.0250291 0.0274279 0.0257729 0.0263083 0.0240252 ( 6 sec ) +Perform prewhitening for channel 1 ( 6 sec ) +Degree of AR model: 1, Sigma: 7.54273, AIC: 1.90192e+07 ( 6 sec ) +Degree of AR model: 2, Sigma: 7.52209, AIC: 1.9004e+07 ( 6 sec ) +Degree of AR model: 3, Sigma: 7.50561, AIC: 1.89919e+07 ( 6 sec ) +Degree of AR model: 4, Sigma: 7.49133, AIC: 1.89814e+07 ( 6 sec ) +Degree of AR model: 5, Sigma: 7.47891, AIC: 1.89722e+07 ( 6 sec ) +Degree of AR model: 6, Sigma: 7.46782, AIC: 1.8964e+07 ( 6 sec ) +Degree of AR model: 7, Sigma: 7.45798, AIC: 1.89567e+07 ( 6 sec ) +Degree of AR model: 8, Sigma: 7.44899, AIC: 1.895e+07 ( 6 sec ) +Degree of AR model: 9, Sigma: 7.44151, AIC: 1.89444e+07 ( 6 sec ) +Degree of AR model: 10, Sigma: 7.43417, AIC: 1.8939e+07 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (1.8939e+07) ( 6 sec ) +AR coefficients: 0.0497931 0.0484711 0.0453945 0.0449254 0.0443603 0.0443792 0.0440958 0.0444201 0.0425092 0.0444076 ( 6 sec ) +Perform prewhitening for channel 2 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.15041, AIC: 8.62097e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 0.999605, AIC: 7.84398e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.94325, AIC: 7.5231e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.913582, AIC: 7.34638e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.895124, AIC: 7.23352e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.882753, AIC: 7.15657e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.873879, AIC: 7.1007e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.867031, AIC: 7.0572e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.861586, AIC: 7.02236e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.857167, AIC: 6.99392e+06 ( 6 sec ) +The AR model of 10 degress gives the minimum AIC (6.99392e+06) ( 6 sec ) +AR coefficients: 0.100812 0.0994283 0.099345 0.0994338 0.100341 0.0991599 0.0983786 0.0996401 0.100555 0.101158 ( 6 sec ) +Perform prewhitening for channel 3 ( 6 sec ) +Degree of AR model: 1, Sigma: 1.15933, AIC: 8.66365e+06 ( 6 sec ) +Degree of AR model: 2, Sigma: 1.01002, AIC: 7.90131e+06 ( 6 sec ) +Degree of AR model: 3, Sigma: 0.95364, AIC: 7.58368e+06 ( 6 sec ) +Degree of AR model: 4, Sigma: 0.923737, AIC: 7.40751e+06 ( 6 sec ) +Degree of AR model: 5, Sigma: 0.905428, AIC: 7.29681e+06 ( 6 sec ) +Degree of AR model: 6, Sigma: 0.892914, AIC: 7.21985e+06 ( 6 sec ) +Degree of AR model: 7, Sigma: 0.884029, AIC: 7.16455e+06 ( 6 sec ) +Degree of AR model: 8, Sigma: 0.877216, AIC: 7.12177e+06 ( 6 sec ) +Degree of AR model: 9, Sigma: 0.871841, AIC: 7.08779e+06 ( 6 sec ) +Degree of AR model: 10, Sigma: 0.867445, AIC: 7.05983e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.05983e+06) ( 7 sec ) +AR coefficients: 0.0992426 0.0997661 0.0999695 0.100685 0.0994892 0.0998831 0.0983119 0.0990847 0.0994668 0.100303 ( 7 sec ) +Perform prewhitening for channel 4 ( 7 sec ) +Degree of AR model: 1, Sigma: 1.16254, AIC: 8.67898e+06 ( 7 sec ) +Degree of AR model: 2, Sigma: 1.00903, AIC: 7.89586e+06 ( 7 sec ) +Degree of AR model: 3, Sigma: 0.952405, AIC: 7.57651e+06 ( 7 sec ) +Degree of AR model: 4, Sigma: 0.922235, AIC: 7.39851e+06 ( 7 sec ) +Degree of AR model: 5, Sigma: 0.90364, AIC: 7.28588e+06 ( 7 sec ) +Degree of AR model: 6, Sigma: 0.891244, AIC: 7.2095e+06 ( 7 sec ) +Degree of AR model: 7, Sigma: 0.882213, AIC: 7.15318e+06 ( 7 sec ) +Degree of AR model: 8, Sigma: 0.875262, AIC: 7.10944e+06 ( 7 sec ) +Degree of AR model: 9, Sigma: 0.869864, AIC: 7.07523e+06 ( 7 sec ) +Degree of AR model: 10, Sigma: 0.865547, AIC: 7.04772e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.04772e+06) ( 7 sec ) +AR coefficients: 0.0989261 0.10121 0.0987917 0.100744 0.100552 0.0988028 0.0993482 0.100374 0.0999452 0.0995135 ( 7 sec ) +Perform prewhitening for channel 5 ( 7 sec ) +Degree of AR model: 1, Sigma: 1.16036, AIC: 8.66857e+06 ( 7 sec ) +Degree of AR model: 2, Sigma: 1.01086, AIC: 7.90589e+06 ( 7 sec ) +Degree of AR model: 3, Sigma: 0.953982, AIC: 7.58566e+06 ( 7 sec ) +Degree of AR model: 4, Sigma: 0.924434, AIC: 7.41168e+06 ( 7 sec ) +Degree of AR model: 5, Sigma: 0.906107, AIC: 7.30095e+06 ( 7 sec ) +Degree of AR model: 6, Sigma: 0.893431, AIC: 7.22305e+06 ( 7 sec ) +Degree of AR model: 7, Sigma: 0.884431, AIC: 7.16707e+06 ( 7 sec ) +Degree of AR model: 8, Sigma: 0.877486, AIC: 7.12347e+06 ( 7 sec ) +Degree of AR model: 9, Sigma: 0.872098, AIC: 7.08941e+06 ( 7 sec ) +Degree of AR model: 10, Sigma: 0.867816, AIC: 7.0622e+06 ( 7 sec ) +The AR model of 10 degress gives the minimum AIC (7.0622e+06) ( 7 sec ) +AR coefficients: 0.0995885 0.098903 0.101124 0.0988656 0.0991358 0.100713 0.0990429 0.100438 0.0997109 0.0989688 ( 7 sec ) +=============================================================================== +Perform analysis for segment length : 65536 ( 7 sec ) +Convert time-series data to frequency-domain ( 7 sec ) +Total number of segments : 83 ( 7 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00146484, Period(s): 682.667 ( 9 sec ) +Perform calibration correction ( 9 sec ) +Calculate rotated fields ( 9 sec ) +Calculate response functions by multivariate regression ( 9 sec ) +Determine candicates ( 9 sec ) +Number of initial candidates: 100 ( 9 sec ) +Number of candidates: 100 ( 9 sec ) +Improve all candidates ( 9 sec ) +Detetermine the best improved candidates ( 10 sec ) +Perform further improvements to the best 10 candidates ( 10 sec ) +Select the response with the smallest scale ( 10 sec ) +Estimate errors by fixed-weights bootstrap ( 10 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00195312, Period(s): 512 ( 10 sec ) +Perform calibration correction ( 10 sec ) +Calculate rotated fields ( 10 sec ) +Calculate response functions by multivariate regression ( 10 sec ) +Determine candicates ( 10 sec ) +Number of initial candidates: 100 ( 10 sec ) +Number of candidates: 100 ( 10 sec ) +Improve all candidates ( 10 sec ) +Detetermine the best improved candidates ( 10 sec ) +Perform further improvements to the best 10 candidates ( 10 sec ) +Select the response with the smallest scale ( 10 sec ) +Estimate errors by fixed-weights bootstrap ( 10 sec ) +=============================================================================== +Perform analysis for segment length : 32768 ( 10 sec ) +Convert time-series data to frequency-domain ( 10 sec ) +Total number of segments : 167 ( 10 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00292969, Period(s): 341.333 ( 12 sec ) +Perform calibration correction ( 12 sec ) +Calculate rotated fields ( 12 sec ) +Calculate response functions by multivariate regression ( 12 sec ) +Determine candicates ( 12 sec ) +Number of initial candidates: 100 ( 12 sec ) +Number of candidates: 100 ( 12 sec ) +Improve all candidates ( 12 sec ) +Detetermine the best improved candidates ( 12 sec ) +Perform further improvements to the best 10 candidates ( 12 sec ) +Select the response with the smallest scale ( 12 sec ) +Estimate errors by fixed-weights bootstrap ( 12 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00390625, Period(s): 256 ( 12 sec ) +Perform calibration correction ( 12 sec ) +Calculate rotated fields ( 12 sec ) +Calculate response functions by multivariate regression ( 12 sec ) +Determine candicates ( 12 sec ) +Number of initial candidates: 100 ( 12 sec ) +Number of candidates: 100 ( 12 sec ) +Improve all candidates ( 12 sec ) +Detetermine the best improved candidates ( 12 sec ) +Perform further improvements to the best 10 candidates ( 12 sec ) +Select the response with the smallest scale ( 12 sec ) +Estimate errors by fixed-weights bootstrap ( 12 sec ) +=============================================================================== +Perform analysis for segment length : 16384 ( 12 sec ) +Convert time-series data to frequency-domain ( 12 sec ) +Total number of segments : 336 ( 12 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.00585938, Period(s): 170.667 ( 14 sec ) +Perform calibration correction ( 14 sec ) +Calculate rotated fields ( 14 sec ) +Calculate response functions by multivariate regression ( 14 sec ) +Determine candicates ( 14 sec ) +Number of initial candidates: 100 ( 14 sec ) +Number of candidates: 100 ( 14 sec ) +Improve all candidates ( 14 sec ) +Detetermine the best improved candidates ( 14 sec ) +Perform further improvements to the best 10 candidates ( 14 sec ) +Select the response with the smallest scale ( 14 sec ) +Estimate errors by fixed-weights bootstrap ( 14 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0078125, Period(s): 128 ( 14 sec ) +Perform calibration correction ( 14 sec ) +Calculate rotated fields ( 14 sec ) +Calculate response functions by multivariate regression ( 14 sec ) +Determine candicates ( 14 sec ) +Number of initial candidates: 100 ( 14 sec ) +Number of candidates: 100 ( 14 sec ) +Improve all candidates ( 14 sec ) +Detetermine the best improved candidates ( 14 sec ) +Perform further improvements to the best 10 candidates ( 14 sec ) +Select the response with the smallest scale ( 14 sec ) +Estimate errors by fixed-weights bootstrap ( 14 sec ) +=============================================================================== +Perform analysis for segment length : 8192 ( 14 sec ) +Convert time-series data to frequency-domain ( 14 sec ) +Total number of segments : 674 ( 14 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0117188, Period(s): 85.3333 ( 16 sec ) +Perform calibration correction ( 16 sec ) +Calculate rotated fields ( 16 sec ) +Calculate response functions by multivariate regression ( 16 sec ) +Determine candicates ( 16 sec ) +Number of initial candidates: 100 ( 16 sec ) +Number of candidates: 100 ( 16 sec ) +Improve all candidates ( 16 sec ) +Detetermine the best improved candidates ( 16 sec ) +Perform further improvements to the best 10 candidates ( 16 sec ) +Select the response with the smallest scale ( 16 sec ) +Estimate errors by fixed-weights bootstrap ( 16 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.015625, Period(s): 64 ( 16 sec ) +Perform calibration correction ( 16 sec ) +Calculate rotated fields ( 16 sec ) +Calculate response functions by multivariate regression ( 16 sec ) +Determine candicates ( 16 sec ) +Number of initial candidates: 100 ( 16 sec ) +Number of candidates: 100 ( 16 sec ) +Improve all candidates ( 16 sec ) +Detetermine the best improved candidates ( 16 sec ) +Perform further improvements to the best 10 candidates ( 16 sec ) +Select the response with the smallest scale ( 16 sec ) +Estimate errors by fixed-weights bootstrap ( 16 sec ) +=============================================================================== +Perform analysis for segment length : 4096 ( 16 sec ) +Convert time-series data to frequency-domain ( 16 sec ) +Total number of segments : 1349 ( 16 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0234375, Period(s): 42.6667 ( 18 sec ) +Perform calibration correction ( 18 sec ) +Calculate rotated fields ( 18 sec ) +Calculate response functions by multivariate regression ( 18 sec ) +Determine candicates ( 18 sec ) +Number of initial candidates: 100 ( 18 sec ) +Number of candidates: 100 ( 18 sec ) +Improve all candidates ( 18 sec ) +Detetermine the best improved candidates ( 18 sec ) +Perform further improvements to the best 10 candidates ( 18 sec ) +Select the response with the smallest scale ( 19 sec ) +Estimate errors by fixed-weights bootstrap ( 19 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.03125, Period(s): 32 ( 19 sec ) +Perform calibration correction ( 19 sec ) +Calculate rotated fields ( 19 sec ) +Calculate response functions by multivariate regression ( 19 sec ) +Determine candicates ( 19 sec ) +Number of initial candidates: 100 ( 19 sec ) +Number of candidates: 100 ( 19 sec ) +Improve all candidates ( 19 sec ) +Detetermine the best improved candidates ( 19 sec ) +Perform further improvements to the best 10 candidates ( 19 sec ) +Select the response with the smallest scale ( 19 sec ) +Estimate errors by fixed-weights bootstrap ( 19 sec ) +=============================================================================== +Perform analysis for segment length : 2048 ( 19 sec ) +Convert time-series data to frequency-domain ( 19 sec ) +Total number of segments : 2699 ( 19 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.046875, Period(s): 21.3333 ( 21 sec ) +Perform calibration correction ( 21 sec ) +Calculate rotated fields ( 21 sec ) +Calculate response functions by multivariate regression ( 21 sec ) +Determine candicates ( 21 sec ) +Number of initial candidates: 100 ( 21 sec ) +Number of candidates: 100 ( 21 sec ) +Improve all candidates ( 21 sec ) +Detetermine the best improved candidates ( 21 sec ) +Perform further improvements to the best 10 candidates ( 21 sec ) +Select the response with the smallest scale ( 21 sec ) +Estimate errors by fixed-weights bootstrap ( 21 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.0625, Period(s): 16 ( 22 sec ) +Perform calibration correction ( 22 sec ) +Calculate rotated fields ( 22 sec ) +Calculate response functions by multivariate regression ( 22 sec ) +Determine candicates ( 22 sec ) +Number of initial candidates: 100 ( 22 sec ) +Number of candidates: 100 ( 22 sec ) +Improve all candidates ( 22 sec ) +Detetermine the best improved candidates ( 22 sec ) +Perform further improvements to the best 10 candidates ( 22 sec ) +Select the response with the smallest scale ( 22 sec ) +Estimate errors by fixed-weights bootstrap ( 22 sec ) +=============================================================================== +Perform analysis for segment length : 1024 ( 23 sec ) +Convert time-series data to frequency-domain ( 23 sec ) +Total number of segments : 5399 ( 23 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.09375, Period(s): 10.6667 ( 24 sec ) +Perform calibration correction ( 24 sec ) +Calculate rotated fields ( 24 sec ) +Calculate response functions by multivariate regression ( 24 sec ) +Determine candicates ( 24 sec ) +Number of initial candidates: 100 ( 24 sec ) +Number of candidates: 100 ( 24 sec ) +Improve all candidates ( 24 sec ) +Detetermine the best improved candidates ( 26 sec ) +Perform further improvements to the best 10 candidates ( 26 sec ) +Select the response with the smallest scale ( 26 sec ) +Estimate errors by fixed-weights bootstrap ( 26 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.125, Period(s): 8 ( 26 sec ) +Perform calibration correction ( 26 sec ) +Calculate rotated fields ( 26 sec ) +Calculate response functions by multivariate regression ( 26 sec ) +Determine candicates ( 26 sec ) +Number of initial candidates: 100 ( 26 sec ) +Number of candidates: 100 ( 26 sec ) +Improve all candidates ( 26 sec ) +Detetermine the best improved candidates ( 28 sec ) +Perform further improvements to the best 10 candidates ( 28 sec ) +Select the response with the smallest scale ( 28 sec ) +Estimate errors by fixed-weights bootstrap ( 28 sec ) +=============================================================================== +Perform analysis for segment length : 512 ( 28 sec ) +Convert time-series data to frequency-domain ( 28 sec ) +Total number of segments : 10799 ( 28 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.1875, Period(s): 5.33333 ( 30 sec ) +Perform calibration correction ( 30 sec ) +Calculate rotated fields ( 30 sec ) +Calculate response functions by multivariate regression ( 30 sec ) +Determine candicates ( 30 sec ) +Number of initial candidates: 100 ( 30 sec ) +Number of candidates: 100 ( 30 sec ) +Improve all candidates ( 30 sec ) +Detetermine the best improved candidates ( 33 sec ) +Perform further improvements to the best 10 candidates ( 33 sec ) +Select the response with the smallest scale ( 34 sec ) +Estimate errors by fixed-weights bootstrap ( 34 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.25, Period(s): 4 ( 34 sec ) +Perform calibration correction ( 34 sec ) +Calculate rotated fields ( 34 sec ) +Calculate response functions by multivariate regression ( 34 sec ) +Determine candicates ( 34 sec ) +Number of initial candidates: 100 ( 34 sec ) +Number of candidates: 100 ( 34 sec ) +Improve all candidates ( 34 sec ) +Detetermine the best improved candidates ( 37 sec ) +Perform further improvements to the best 10 candidates ( 38 sec ) +Select the response with the smallest scale ( 38 sec ) +Estimate errors by fixed-weights bootstrap ( 38 sec ) +=============================================================================== +Perform analysis for segment length : 256 ( 38 sec ) +Convert time-series data to frequency-domain ( 38 sec ) +Total number of segments : 21599 ( 38 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.375, Period(s): 2.66667 ( 40 sec ) +Perform calibration correction ( 40 sec ) +Calculate rotated fields ( 40 sec ) +Calculate response functions by multivariate regression ( 40 sec ) +Determine candicates ( 40 sec ) +Number of initial candidates: 100 ( 40 sec ) +Number of candidates: 100 ( 40 sec ) +Improve all candidates ( 40 sec ) +Detetermine the best improved candidates ( 47 sec ) +Perform further improvements to the best 10 candidates ( 47 sec ) +Select the response with the smallest scale ( 48 sec ) +Estimate errors by fixed-weights bootstrap ( 48 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.5, Period(s): 2 ( 49 sec ) +Perform calibration correction ( 49 sec ) +Calculate rotated fields ( 49 sec ) +Calculate response functions by multivariate regression ( 49 sec ) +Determine candicates ( 49 sec ) +Number of initial candidates: 100 ( 49 sec ) +Number of candidates: 100 ( 49 sec ) +Improve all candidates ( 49 sec ) +Detetermine the best improved candidates ( 56 sec ) +Perform further improvements to the best 10 candidates ( 56 sec ) +Select the response with the smallest scale ( 57 sec ) +Estimate errors by fixed-weights bootstrap ( 57 sec ) +=============================================================================== +Perform analysis for segment length : 128 ( 59 sec ) +Convert time-series data to frequency-domain ( 59 sec ) +Total number of segments : 43199 ( 59 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 0.75, Period(s): 1.33333 ( 60 sec ) +Perform calibration correction ( 60 sec ) +Calculate rotated fields ( 60 sec ) +Calculate response functions by multivariate regression ( 60 sec ) +Determine candicates ( 60 sec ) +Number of initial candidates: 100 ( 60 sec ) +Number of candidates: 100 ( 60 sec ) +Improve all candidates ( 60 sec ) +Detetermine the best improved candidates ( 74 sec ) +Perform further improvements to the best 10 candidates ( 75 sec ) +Select the response with the smallest scale ( 77 sec ) +Estimate errors by fixed-weights bootstrap ( 77 sec ) +------------------------------------------------------------------------------- +Now Frequency(Hz): 1, Period(s): 1 ( 80 sec ) +Perform calibration correction ( 80 sec ) +Calculate rotated fields ( 80 sec ) +Calculate response functions by multivariate regression ( 80 sec ) +Determine candicates ( 80 sec ) +Number of initial candidates: 100 ( 80 sec ) +Number of candidates: 100 ( 80 sec ) +Improve all candidates ( 80 sec ) +Detetermine the best improved candidates ( 93 sec ) +Perform further improvements to the best 10 candidates ( 95 sec ) +Select the response with the smallest scale ( 97 sec ) +Estimate errors by fixed-weights bootstrap ( 97 sec ) +End TRACMT ( 99 sec ) diff --git a/Samples/RRMS/apparent_resistivity_and_phase.csv b/Samples/RRMS/apparent_resistivity_and_phase.csv new file mode 100644 index 0000000..8d818a8 --- /dev/null +++ b/Samples/RRMS/apparent_resistivity_and_phase.csv @@ -0,0 +1,21 @@ +frequency,period,app_res_0_2,phase_0_2,app_res_0_3,phase_0_3,coherence_0_2+3,app_res_1_2,phase_1_2,app_res_1_3,phase_1_3,coherence_1_2+3,dapp_res_0_2,dphase_0_2,dapp_res_0_3,dphase_0_3,dapp_res_1_2,dphase_1_2,dapp_res_1_3,dphase_1_3 +1.4648437500e-03,6.8266666667e+02,4.2168886420e+01,4.8022056661e+01,4.1340512817e+01,5.3319419010e+01,8.9973917276e-01,1.5794724150e+02,-1.2865818972e+02,6.7403069362e+00,-1.3457562207e+02,9.5233260437e-01,3.1073627735e+00,2.1114984689e+00,3.0281598128e+00,2.0989046392e+00,5.6655525723e+00,1.0276521864e+00,1.1674152903e+00,4.9680123869e+00 +1.9531250000e-03,5.1200000000e+02,4.3564597655e+01,4.6390553781e+01,4.4830923973e+01,5.4525018856e+01,9.0762085300e-01,1.7097600483e+02,-1.2868474783e+02,7.6490661368e+00,-1.3018648634e+02,9.6762206017e-01,2.9479943515e+00,1.9389583213e+00,3.3836954645e+00,2.1627651164e+00,4.5403323711e+00,7.6077788522e-01,1.2675251362e+00,4.7526841939e+00 +2.9296875000e-03,3.4133333333e+02,4.2733401792e+01,5.0335908713e+01,5.2692186912e+01,5.6754047095e+01,8.7725934040e-01,1.7760075640e+02,-1.2554997667e+02,6.4548704970e+00,-1.2472151967e+02,9.4176032684e-01,2.4448036538e+00,1.6391866265e+00,3.1308984849e+00,1.7024693740e+00,4.4291696053e+00,7.1446571271e-01,1.1663941392e+00,5.1837383710e+00 +3.9062500000e-03,2.5600000000e+02,4.5922557831e+01,4.8027962255e+01,5.2154354090e+01,6.1902804894e+01,8.5732632366e-01,1.9550851034e+02,-1.2813428751e+02,6.5365207374e+00,-1.1938995875e+02,9.3463939198e-01,2.9148856176e+00,1.8186997932e+00,3.5792471021e+00,1.9664323534e+00,5.3454839210e+00,7.8329891687e-01,1.1908118666e+00,5.2262665539e+00 +5.8593750000e-03,1.7066666667e+02,5.2880914162e+01,4.8563234411e+01,5.8043409512e+01,6.0252520232e+01,7.8685932594e-01,2.1004200837e+02,-1.2887160208e+02,6.7669962064e+00,-1.2986454583e+02,9.0661227178e-01,2.6455403173e+00,1.4333536856e+00,3.3869925812e+00,1.6719204213e+00,4.9908997363e+00,6.8073101359e-01,1.1762289054e+00,4.9858222570e+00 +7.8125000000e-03,1.2800000000e+02,5.4031076641e+01,4.8131918926e+01,6.3188640137e+01,5.8486935159e+01,7.6301287094e-01,2.1762526110e+02,-1.2887235377e+02,7.5692482270e+00,-1.3327791478e+02,8.9042963299e-01,2.9555564319e+00,1.5672649881e+00,4.0009495261e+00,1.8142171754e+00,6.0655335313e+00,7.9848432966e-01,1.2721803920e+00,4.8205998718e+00 +1.1718750000e-02,8.5333333333e+01,5.9358145327e+01,4.2743685642e+01,7.4840212945e+01,5.8611890978e+01,7.0568344865e-01,2.4183856944e+02,-1.2992422141e+02,9.6020683702e+00,-1.2670477300e+02,8.3234334691e-01,2.6382117200e+00,1.2733790843e+00,3.9528469430e+00,1.5132758942e+00,5.9927750718e+00,7.0991468737e-01,1.5025599390e+00,4.4874926656e+00 +1.5625000000e-02,6.4000000000e+01,5.7394006151e+01,4.1943056890e+01,8.0773573381e+01,5.7045642999e+01,6.3151710006e-01,2.4463749503e+02,-1.3210244199e+02,9.3997023175e+00,-1.3840676112e+02,7.7865956962e-01,3.2202482370e+00,1.6075793941e+00,4.8426116123e+00,1.7177819817e+00,7.2980438250e+00,8.5465765751e-01,1.7871987618e+00,5.4551631057e+00 +2.3437500000e-02,4.2666666667e+01,5.1633535806e+01,4.0069471518e+01,8.7611476461e+01,5.6425674438e+01,5.1676899773e-01,2.4596402093e+02,-1.3357402405e+02,1.1734941367e+01,-1.2531057719e+02,6.9813188573e-01,2.5965177182e+00,1.4407805346e+00,4.5851243259e+00,1.4994511738e+00,6.2573253002e+00,7.2882204079e-01,1.8441505613e+00,4.5066724729e+00 +3.1250000000e-02,3.2000000000e+01,5.6513262228e+01,3.5732461211e+01,1.0211148188e+02,5.6413030019e+01,4.4535065602e-01,2.5257613567e+02,-1.3561840051e+02,1.1679347670e+01,-1.2912532506e+02,6.2510658343e-01,3.5031029310e+00,1.7760889521e+00,6.3088942012e+00,1.7702736415e+00,8.0248801145e+00,9.1024257302e-01,2.3310671358e+00,5.7273316112e+00 +4.6875000000e-02,2.1333333333e+01,6.1065446320e+01,3.2488891062e+01,1.0512598799e+02,5.9524981611e+01,3.1049538562e-01,2.3744477188e+02,-1.3803063881e+02,8.2696066296e+00,-1.2992682674e+02,4.2061086650e-01,3.7918963404e+00,1.7791942094e+00,6.3681228233e+00,1.7356429997e+00,8.1443452845e+00,9.8266953975e-01,1.9557788832e+00,6.7911748646e+00 +6.2500000000e-02,1.6000000000e+01,6.0621323721e+01,3.1358260770e+01,1.2632810857e+02,5.7835967317e+01,2.1119255836e-01,2.2105819282e+02,-1.3590011340e+02,9.0950131491e+00,-1.3256296162e+02,2.6854473703e-01,5.3921814093e+00,2.5490302527e+00,1.0350422678e+01,2.3478604428e+00,1.1233845315e+01,1.4559994279e+00,2.9754839773e+00,9.4146243233e+00 +9.3750000000e-02,1.0666666667e+01,3.9603097417e+01,3.0438422556e+01,1.5034144676e+02,5.7752536033e+01,1.0806514363e-01,1.9429047294e+02,-1.3489892412e+02,1.5013595513e+01,-1.2269722451e+02,1.1000148190e-01,4.7489007736e+00,3.4372974651e+00,1.2649972609e+01,2.4111914410e+00,1.1416348883e+01,1.6835687701e+00,4.4177549858e+00,8.4603613564e+00 +1.2500000000e-01,8.0000000000e+00,3.7463475544e+01,2.0756375865e+01,1.4808960043e+02,5.6355234280e+01,4.7239197846e-02,1.9087428843e+02,-1.3871629002e+02,6.4597303390e+00,-1.2987559360e+02,4.7239197846e-02,7.2376619930e+00,5.5432004023e+00,1.9519439536e+01,3.7787686491e+00,1.6134676445e+01,2.4223386087e+00,4.1668647292e+00,1.8815768544e+01 +1.8750000000e-01,5.3333333333e+00,1.9584904684e+01,2.5028522642e+01,1.4172201875e+02,5.7792497193e+01,1.7617568989e-02,1.8499160388e+02,-1.3322297563e+02,3.4867331457e+00,-1.4440260121e+02,1.7617568989e-02,6.1507909811e+00,9.0344831802e+00,2.2587377678e+01,4.5706908467e+00,2.0524084328e+01,3.1800020527e+00,3.7257066954e+00,3.2294348747e+01 +2.5000000000e-01,4.0000000000e+00,3.4804617614e+01,4.5085997151e+01,1.9970647211e+02,6.1017427630e+01,7.5452420080e-03,1.9030275297e+02,-1.3754893906e+02,3.6704792101e+00,-1.3840778697e+02,7.5452420080e-03,1.5359698070e+01,1.2747568188e+01,5.1161851510e+01,7.3593861399e+00,3.2935235911e+01,4.9642294331e+00,6.2912088835e+00,5.8981507398e+01 +3.7500000000e-01,2.6666666667e+00,1.9811145761e+01,-1.5192713621e+01,3.0006978275e+02,4.0496483285e+01,2.0282928584e-03,1.6939822452e+02,-1.3203074227e+02,9.9913471627e+00,-8.9358360316e+01,2.0282928584e-03,1.6756584952e+01,2.5018319717e+01,9.6805854108e+01,9.2826842340e+00,3.8993666523e+01,6.6090856717e+00,1.4065510381e+01,4.4739501173e+01 +5.0000000000e-01,2.0000000000e+00,3.1078209375e+01,9.7750421526e-01,2.8072073624e+02,2.3630845293e+01,9.4692383969e-04,1.4226306311e+02,-1.2803054508e+02,4.1720991574e+01,-1.4050409799e+02,9.4692383969e-04,3.5150092832e+01,3.4437732519e+01,1.5068632777e+02,1.5568596247e+01,5.9895366204e+01,1.2152194119e+01,4.4339110949e+01,3.2098508259e+01 +7.5000000000e-01,1.3333333333e+00,2.2202358119e+01,-1.5105060212e+02,1.8297081679e+02,4.0381278587e+01,4.8556897195e-04,5.9609382797e+01,-1.3661518416e+02,2.9360847370e+01,-1.3322492493e+02,4.8556897195e-04,2.6756826605e+01,3.7053983647e+01,1.0306264369e+02,1.6357920486e+01,2.9732060571e+01,1.4441464439e+01,2.6328428830e+01,2.6638478853e+01 +1.0000000000e+00,1.0000000000e+00,2.0141313837e+02,-3.9642468829e+01,1.2450119453e+03,-1.6642143834e+02,8.3444887217e-05,4.1321240276e+01,1.2388481787e+02,5.7793087565e+02,-5.2634102076e+01,8.3444887217e-05,4.2392885822e+02,3.6000000000e+02,2.2428379410e+03,6.4254121306e+01,1.5342552971e+02,3.6000000000e+02,1.1618730174e+03,3.6000000000e+02 diff --git a/Samples/RRMS/param.dat b/Samples/RRMS/param.dat new file mode 100644 index 0000000..51a5faa --- /dev/null +++ b/Samples/RRMS/param.dat @@ -0,0 +1,48 @@ +NUM_OUT +2 +SAMPLING_FREQ +32 +NUM_SECTION +1 +SEGMENT +10 +65536 2 3 4 +32768 2 3 4 +16384 2 3 4 +8192 2 3 4 +4096 2 3 4 +2048 2 3 4 +1024 2 3 4 +512 2 3 4 +256 2 3 4 +128 2 3 4 +ROTATION +0.0 +AZIMUTH +0.0 90.0 +0.0 90.0 +0.0 90.0 +OUTPUT_RHOA_PHS +PREWHITENING +0 +10 +5 +PROCEDURE +1 +ERROR_ESTIMATION +1 +DATA_FILES +2764800 +../ex.txt +0 +../ey.txt +0 +../hx.txt +0 +../hy.txt +0 +../hrx.txt +0 +../hry.txt +0 +END diff --git a/Samples/RRMS/response_functions.csv b/Samples/RRMS/response_functions.csv new file mode 100644 index 0000000..3f5b253 --- /dev/null +++ b/Samples/RRMS/response_functions.csv @@ -0,0 +1,21 @@ +frequency,period,resp_real_0_2,resp_imag_0_2,resp_real_0_3,resp_imag_0_3,coherence_0_2+3,resp_real_1_2,resp_imag_1_2,resp_real_1_3,resp_imag_1_3,coherence_1_2+3,dresp_0_2,dresp_0_3,dresp_1_2,dresp_1_3 +1.4648437500e-03,6.8266666667e+02,3.7170796163e-01,4.1314324373e-01,3.2870014945e-01,4.4129714577e-01,8.9973917276e-01,-6.7187642587e-01,-8.3989416958e-01,-1.5594261737e-01,-1.5826996724e-01,9.5233260437e-01,2.0476067380e-02,2.0153084204e-02,1.9290207924e-02,1.9241379181e-02 +1.9531250000e-03,5.1200000000e+02,4.4988510272e-01,4.7226996340e-01,3.8399619001e-01,5.3884034554e-01,9.0762085300e-01,-8.0764751289e-01,-1.0086590317e+00,-1.7636027481e-01,-2.0879407310e-01,9.6762206017e-01,2.2068855922e-02,2.4970224693e-02,1.7156950165e-02,2.2645003835e-02 +2.9296875000e-03,3.4133333333e+02,5.0500346283e-01,6.0905588236e-01,4.8165364720e-01,7.3475708289e-01,8.7725934040e-01,-9.3778371126e-01,-1.3123015244e+00,-1.7514609390e-01,-2.5274020819e-01,9.4176032684e-01,2.2632154980e-02,2.6101263448e-02,2.0112477022e-02,2.7782237369e-02 +3.9062500000e-03,2.5600000000e+02,6.3336409438e-01,7.0411283299e-01,4.7533779502e-01,8.9033348187e-01,8.5732632366e-01,-1.2066727908e+00,-1.5370316746e+00,-1.7534750487e-01,-3.1131924641e-01,9.3463939198e-01,3.0056852933e-02,3.4632306809e-02,2.6714018234e-02,3.2546542262e-02 +5.8593750000e-03,1.7066666667e+02,8.2372516745e-01,9.3312506160e-01,6.4703069797e-01,1.1321845207e+00,7.8685932594e-01,-1.5567931963e+00,-1.9313128716e+00,-2.8539710697e-01,-3.4176063746e-01,9.0661227178e-01,3.1134762749e-02,3.8046826777e-02,2.9471783455e-02,3.8696753830e-02 +7.8125000000e-03,1.2800000000e+02,9.6961564692e-01,1.0818661787e+00,8.2119478794e-01,1.3393824605e+00,7.6301287094e-01,-1.8298223717e+00,-2.2699640636e+00,-3.7276727742e-01,-3.9587664209e-01,8.9042963299e-01,3.9734473874e-02,4.9738603749e-02,4.0631642345e-02,4.5695385483e-02 +1.1718750000e-02,8.5333333333e+01,1.3696099030e+00,1.2657744828e+00,1.0906645861e+00,1.7876295724e+00,7.0568344865e-01,-2.4158528204e+00,-2.8868466929e+00,-4.4831724068e-01,-6.0135916495e-01,8.3234334691e-01,4.1444331150e-02,5.5301656768e-02,4.6640247476e-02,5.8687425702e-02 +1.5625000000e-02,6.4000000000e+01,1.5750342011e+00,1.4153352946e+00,1.3664861022e+00,2.1078783535e+00,6.3151710006e-01,-2.9310839653e+00,-3.2436169762e+00,-6.4088766373e-01,-5.6887146705e-01,7.7865956962e-01,5.9404740172e-02,7.5302606759e-02,6.5209365722e-02,8.1466831280e-02 +2.3437500000e-02,4.2666666667e+01,1.8824269968e+00,1.5834372672e+00,1.7719873403e+00,2.6696499328e+00,5.1676899773e-01,-3.7006596458e+00,-3.8896049785e+00,-6.7782122777e-01,-9.5694661536e-01,6.9813188573e-01,6.1849473428e-02,8.3845790860e-02,6.8291018558e-02,9.2143894119e-02 +3.1250000000e-02,3.2000000000e+01,2.4121759935e+00,1.7353974183e+00,2.2096888999e+00,3.3274906477e+00,4.4535065602e-01,-4.4898138524e+00,-4.3939268051e+00,-8.5243560071e-01,-1.0479750093e+00,6.2510658343e-01,9.2099596351e-02,1.2339454824e-01,9.9798132210e-02,1.3481105444e-01 +4.6875000000e-02,2.1333333333e+01,3.1910692923e+00,2.0320656370e+00,2.5174330933e+00,4.2780175380e+00,3.1049538562e-01,-5.5465049161e+00,-4.9887274554e+00,-8.9351882813e-01,-1.0676203246e+00,4.2061086650e-01,1.1745846893e-01,1.5034259177e-01,1.2793828320e-01,1.6462772392e-01 +6.2500000000e-02,1.6000000000e+01,3.7167217626e+00,2.2649818988e+00,3.3447846899e+00,5.3188296932e+00,2.1119255836e-01,-5.9687031811e+00,-5.7840528689e+00,-1.1403292528e+00,-1.2417088242e+00,2.6854473703e-01,1.9357390099e-01,2.5739677645e-01,2.1118844238e-01,2.7577250591e-01 +9.3750000000e-02,1.0666666667e+01,3.7147552433e+00,2.1827838639e+00,4.4792692664e+00,7.0999084505e+00,1.0806514363e-01,-6.7361833599e+00,-6.7599920806e+00,-1.4330693869e+00,-2.2324728506e+00,1.1000148190e-01,2.5832662080e-01,3.5317574278e-01,2.8037683201e-01,3.9030122539e-01 +1.2500000000e-01,8.0000000000e+00,4.5248078117e+00,1.7148721474e+00,5.3302195115e+00,8.0090424041e+00,4.7239197846e-02,-8.2075743408e+00,-7.2063967218e+00,-1.2882151817e+00,-1.5420224083e+00,4.7239197846e-02,4.6741675676e-01,6.3403769126e-01,4.6163269310e-01,6.4805552956e-01 +1.8750000000e-01,5.3333333333e+00,3.8825870402e+00,1.8128336980e+00,6.1435724504e+00,9.7529949310e+00,1.7617568989e-02,-9.0188334027e+00,-9.5963676820e+00,-1.4701223363e+00,-1.0524032689e+00,1.7617568989e-02,6.7286181123e-01,9.1854997818e-01,7.3053903070e-01,9.6595067357e-01 +2.5000000000e-01,4.0000000000e+00,4.6569933261e+00,4.6709940246e+00,7.6556823753e+00,1.3821129386e+01,7.5452420080e-03,-1.1380151653e+01,-1.0410119575e+01,-1.6019654290e+00,-1.4219021686e+00,7.5452420080e-03,1.4554230752e+00,2.0238354267e+00,1.3346372869e+00,1.8356831929e+00 +3.7500000000e-01,2.6666666667e+00,5.8817311740e+00,-1.5972278172e+00,1.8037653855e+01,1.5403697156e+01,2.0282928584e-03,-1.1932312433e+01,-1.3237884687e+01,4.8469904838e-02,-4.3279818159e+00,2.0282928584e-03,2.5775159198e+00,3.8261424007e+00,2.0512107625e+00,3.0465906946e+00 +5.0000000000e-01,2.0000000000e+00,8.8132236485e+00,1.5037406383e-01,2.4270149278e+01,1.0618930956e+01,9.4692383969e-04,-1.1618611763e+01,-1.4854814657e+01,-7.8809573017e+00,-6.4956132077e+00,9.4692383969e-04,4.9846938608e+00,7.1101147657e+00,3.9699693656e+00,5.4268732534e+00 +7.5000000000e-01,1.3333333333e+00,-7.9844835846e+00,-4.4166576540e+00,1.9953497599e+01,1.6970518452e+01,4.8556897195e-04,-1.0865807590e+01,-1.0269830131e+01,-7.1862838138e+00,-7.6459468076e+00,4.8556897195e-04,5.4982019907e+00,7.3772755176e+00,3.7286647286e+00,4.7046388276e+00 +1.0000000000e+00,1.0000000000e+00,2.4436696847e+01,-2.0246321618e+01,-7.6693733746e+01,-1.8523793629e+01,8.3444887217e-05,-8.0137565169e+00,1.1932556636e+01,3.2624372311e+01,-4.2723584934e+01,8.3444887217e-05,3.3396741085e+01,7.1066698734e+01,2.6684923591e+01,5.4035070700e+01 diff --git a/Samples/ex.txt.gz b/Samples/ex.txt.gz new file mode 100644 index 0000000..4030e2d Binary files /dev/null and b/Samples/ex.txt.gz differ diff --git a/Samples/ey.txt.gz b/Samples/ey.txt.gz new file mode 100644 index 0000000..d12e10f Binary files /dev/null and b/Samples/ey.txt.gz differ diff --git a/Samples/hrx.txt.gz b/Samples/hrx.txt.gz new file mode 100644 index 0000000..a58ee18 Binary files /dev/null and b/Samples/hrx.txt.gz differ diff --git a/Samples/hry.txt.gz b/Samples/hry.txt.gz new file mode 100644 index 0000000..8626e53 Binary files /dev/null and b/Samples/hry.txt.gz differ diff --git a/Samples/hx.txt.gz b/Samples/hx.txt.gz new file mode 100644 index 0000000..a4e58e8 Binary files /dev/null and b/Samples/hx.txt.gz differ diff --git a/Samples/hy.txt.gz b/Samples/hy.txt.gz new file mode 100644 index 0000000..d438815 Binary files /dev/null and b/Samples/hy.txt.gz differ diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES new file mode 100644 index 0000000..fbae47e --- /dev/null +++ b/THIRD_PARTY_NOTICES @@ -0,0 +1,103 @@ +The source codes of TRACMT use the following third parties. + 1. CLAPACK + 2. MT19937-64 (2004/9/29 version). + +The license terms of those third parties are desribed below. + +-------------------------------------------------------------------------------- +CLAPACK +https://www.netlib.org/clapack/ + +Copyright (c) 1992-2008 The University of Tennessee. All rights reserved. + +$COPYRIGHT$ + +Additional copyrights may follow + +$HEADER$ + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer listed + in this license in the documentation and/or other materials + provided with the distribution. + +- Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- + MT19937-64 (2004/9/29 version). + http://math.sci.hiroshima-u.ac.jp/m-mat/MT/mt64.html + + A C-program for MT19937-64 (2004/9/29 version). + Coded by Takuji Nishimura and Makoto Matsumoto. + + This is a 64-bit version of Mersenne Twister pseudorandom number + generator. + + Before using, initialize the state by using init_genrand64(seed) + or init_by_array64(init_key, key_length). + + Copyright (C) 2004, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + References: + T. Nishimura, ``Tables of 64-bit Mersenne Twisters'' + ACM Transactions on Modeling and + Computer Simulation 10. (2000) 348--357. + M. Matsumoto and T. Nishimura, + ``Mersenne Twister: a 623-dimensionally equidistributed + uniform pseudorandom number generator'' + ACM Transactions on Modeling and + Computer Simulation 8. (Jan. 1998) 3--30. + + Any feedback is very welcome. + http://www.math.hiroshima-u.ac.jp/~m-mat/MT/emt.html + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove spaces) +-------------------------------------------------------------------------------- diff --git a/docs/Manual_Of_TRACMT.pdf b/docs/Manual_Of_TRACMT.pdf new file mode 100644 index 0000000..dc419cb Binary files /dev/null and b/docs/Manual_Of_TRACMT.pdf differ diff --git a/src/Analysis.cpp b/src/Analysis.cpp new file mode 100644 index 0000000..d673d23 --- /dev/null +++ b/src/Analysis.cpp @@ -0,0 +1,3820 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "Analysis.h" +#include "Control.h" +#include "OutputFiles.h" +#include "Util.h" +#include "UtilRobust.h" +#include "TableOfTukeysBiweightParameters.h" +#include "Ats.h" +#ifdef _MTH5 +#include "MTH5.h" +#endif +#include "ElogDual.h" +#include "ElogMT.h" +#include "RobustWeightTukeysBiweights.h" +#include "RobustWeightHuber.h" +#include "RobustWeightThomson.h" +#include "RobustPrewhitening.h" + +#include +#include +#include +#include +#include +#include +#include +#ifdef _MERSENNE_TWISTER_ORIGINAL +#else +#include +#endif + +#ifdef _MERSENNE_TWISTER_ORIGINAL +#include "mt64.h" +#endif + +#ifdef _USE_OMP +#include +#endif + +// Default constructer +Analysis::Analysis(): + m_calibrationFunctions(NULL), + m_coefficientsOfARModel(NULL) +{ + for( int i = 0; i < 2; ++i ){ + m_robustWeight[i] = NULL; + } +} + +// Destructer +Analysis::~Analysis() +{ + if( m_calibrationFunctions != NULL ){ + delete [] m_calibrationFunctions; + } + + if( m_coefficientsOfARModel != NULL ){ + delete [] m_coefficientsOfARModel; + } + + for( int i = 0; i < 2; ++i ){ + if( m_robustWeight[i] != NULL ){ + delete m_robustWeight[i]; + } + } +} + +// Run analysis +void Analysis::run( std::vector& dataFileSets ){ + + const Control* const ptrControl = Control::getInstance(); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::vector freqAll = ptrControl->getFrequenciesAllWithoutDuplications(); + readTimeSeriesData(dataFileSets); + + // Merge sections + mergeSections(dataFileSets); + + if (ptrControl->doesPeformEOFBasedDenoising() && ptrControl->getTimingEOFBasedDenoising() == Control::BEFORE_DECIMATION) { + // Modify time-series data based on the EOF analysis + modifyTimeSeriesBasedOnEOFAnalysis(dataFileSets); + } + + // Apply decimation + decimation(dataFileSets); + + // Read calibration files for main analysis + readCalibrationFiles(freqAll); + + // Prior evaluation before preprocessing + if( ptrControl->doesOutputTimeSeriesToCsv() ){ + outputTimeSeriesData( dataFileSets, false ); + } + + if (ptrControl->doesOutputCalibratedTimeSeriesToCsv() ) { + outputCalibratedTimeSeriesData(dataFileSets); + } + + // Prior evaluation before preprocessing + if( ptrControl->getParamsForTimeDomainEvaluation().doEvaluation ){ + const Control::ParamsForTimeDomainEvaluation params = ptrControl->getParamsForTimeDomainEvaluation(); + priorEvaluationOfTimeSeriesData( params.timeSeriesInterval, dataFileSets, false ); + } + if( ptrControl->getParamsForFreqDomainEvaluation().doEvaluation ){ + priorEvaluationOfFrequencyDataFromAllData( dataFileSets, false ); + } + + // Pre-processings + preprocessing(dataFileSets); + + // Prior evaluation after preprocessing + if (ptrControl->doesOutputTimeSeriesToCsv()) { + outputTimeSeriesData(dataFileSets, true); + } + + // Prior evaluation after preprocessing + if( ptrControl->getParamsForTimeDomainEvaluation().doEvaluation ){ + const Control::ParamsForTimeDomainEvaluation params = ptrControl->getParamsForTimeDomainEvaluation(); + priorEvaluationOfTimeSeriesData( params.timeSeriesInterval, dataFileSets, true ); + } + if( ptrControl->getParamsForFreqDomainEvaluation().doEvaluation ){ + priorEvaluationOfFrequencyDataFromAllData( dataFileSets, true ); + } + + std::ofstream ofsResp; + const std::string fileNameResp = "response_functions.csv"; + ofsResp.open( fileNameResp.c_str(), std::ios::out ); + if( ofsResp.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileNameResp ); + } + writeHeaderToOutputFileForResponseFunctions(ofsResp); + + std::ofstream ofsRhoaPhs; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + const std::string fileNameRhoaPhs = "apparent_resistivity_and_phase.csv"; + ofsRhoaPhs.open( fileNameRhoaPhs.c_str(), std::ios::out ); + if( ofsRhoaPhs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileNameRhoaPhs ); + } + writeHeaderToOutputFileForApparentResistivityAndPhase(ofsRhoaPhs); + } + + const int numChannels = ptrControl->getNumberOfChannels(); + const double samplingFreq = ptrControl->getSamplingFrequency(); + const int numSegmentLengths = ptrControl->getNumSegmentLengths(); + for( int iSegLen = 0; iSegLen < numSegmentLengths; ++iSegLen ){ + const int segmentLength = ptrControl->getSegmentLength(iSegLen); + ptrOutputFiles->writeLogMessage("===============================================================================",false); + ptrOutputFiles->writeLogMessage("Perform analysis for segment length : " + Util::toString(segmentLength)); + + // Fourier transform of data + std::complex*** cdata = new std::complex**[numChannels]; + int numSegmentsTotal(0); + std::vector< std::pair > timesOrg; + std::vector* meanSquares = new std::vector[numChannels]; + convertToFrequencyData(segmentLength, dataFileSets, numSegmentsTotal, cdata, timesOrg, meanSquares); + + // Select segments to be excluded + std::vector remainingSegments; + remainingSegments.reserve(numSegmentsTotal); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + // Initially all segments are to be used + remainingSegments.push_back(true); + } + + std::ostringstream fileName; + selectSegmentsToBeExcludedByMeanSquareCriteria(numSegmentsTotal, meanSquares, timesOrg, remainingSegments); + + // Loop of frequency at which response function is estimated + const int numTargetFreqsInSegment = ptrControl->getNumTargetFrequencyInSegment(iSegLen); + for( int iFreq = 0; iFreq < numTargetFreqsInSegment; ++iFreq ){ + ptrOutputFiles->writeLogMessage("-------------------------------------------------------------------------------",false); + const int freqDegree = ptrControl->getTargetFrequencyDegreesInSegment(iSegLen, iFreq); + const double freq = samplingFreq * static_cast(freqDegree) / static_cast(segmentLength); + ptrOutputFiles->writeLogMessage("Now Frequency(Hz): " + Util::toString(freq) + ", Period(s): " + Util::toString(1.0/freq)); + const double timeLength = static_cast(segmentLength) / samplingFreq; + + // Copy the array because it will be overwrited in the selection using square coherence criteria + std::vector remainingSegmentsForThisFrequency = remainingSegments; + + // Copy Fourier transformed values + std::complex** ftvalOrg = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ftvalOrg[iChan] = new std::complex[numSegmentsTotal]; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + assert(freqDegree > 0); + ftvalOrg[iChan][iSeg] = cdata[iChan][iSeg][freqDegree]; + } + } + + calibrationCorrectionAllChannels(numChannels, numSegmentsTotal, freq, ftvalOrg ); + calculateRotatedFields(numSegmentsTotal, ftvalOrg); + + // Prior evaluation of data segments + if( ptrControl->getParamsForDataSegmentEvaluation().doEvaluation ){ + std::ostringstream fileName; + fileName << "segm" << iSegLen << "_index" << freqDegree << ".csv"; + priorEvaluationOfDataSegments( numSegmentsTotal, ftvalOrg, timesOrg, timeLength, fileName.str() ); + } + + // Select segments to be excluded by square coherence criteria + if( ptrControl->getParamsForSquareCoherenceCriteria().applySquareCoherenceCriteria ){ + selectSegmentsToBeExcludedBySquareCoherenceCriteria( numSegmentsTotal, ftvalOrg, remainingSegmentsForThisFrequency ); + } + + // Select segments to be excluded by square coherence criteria with random sampling + if( ptrControl->getParamsForSquareCoherenceCriteriaWithRandomSampling().applySquareCoherenceCriteria ){ + selectSegmentsToBeExcludedBySquareCoherenceCriteriaWithRandomSampling( numSegmentsTotal, ftvalOrg, remainingSegmentsForThisFrequency ); + } + + // Select segments to be excluded by magnetic polarization diretion criteria + if( ptrControl->getParamsForMagneticPolarizatitonDirectionCriteria().applyMagneticPolarizatitonDirectionCriteria ){ + selectSegmentsToBeExcludedByMagneticPolarizatitonDirectionCriteria( numSegmentsTotal, ftvalOrg, remainingSegmentsForThisFrequency ); + } + + // Select segments to be excluded by degree of magnetic polarization criteria + if( ptrControl->getParamsForDegreeOfMagneticPolarizationCriteria().applyDegreeOfMagneticPolarizationCriteria ){ + selectSegmentsToBeExcludedByDegreeOfMagneticPolarizationCriteria( numSegmentsTotal, ftvalOrg, remainingSegmentsForThisFrequency ); + } + + int numOfRemainingSegments(0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegmentsForThisFrequency[iSeg]){ + ++numOfRemainingSegments; + } + } + if( numOfRemainingSegments <= 0 ){ + ptrOutputFiles->writeErrorMessage("Number of remaining segments is too small: " + Util::toString(numOfRemainingSegments)); + } + +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + for( int iChan = 0; iChan < ptrControl->getNumberOfChannels(); ++iChan ){ + std::cout << ftvalOrg[iChan][iSeg] << " "; + } + std::cout << std::endl; + } +#endif + // Make data excluding some segments + std::complex** ftval = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ftval[iChan] = new std::complex[numOfRemainingSegments]; + int icount(0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegmentsForThisFrequency[iSeg]){ + ftval[iChan][icount] = ftvalOrg[iChan][iSeg]; + ++icount; + } + } + assert( icount == numOfRemainingSegments ); + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numOfRemainingSegments; ++iSeg ){ + for( int iChan = 0; iChan < ptrControl->getNumberOfChannels(); ++iChan ){ + std::cout << ftval[iChan][iSeg] << " "; + } + std::cout << std::endl; + } + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << timesOrg[iSeg].first << " " << timesOrg[iSeg].second << " " << std::endl; + } +#endif + + std::vector< std::pair > times; + times.reserve(numOfRemainingSegments); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegmentsForThisFrequency[iSeg]){ + times.push_back(timesOrg[iSeg]); + } + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numOfRemainingSegments; ++iSeg ){ + std::cout << times[iSeg].first << " " << times[iSeg].second << " " << std::endl; + } +#endif + assert( times.size() == numOfRemainingSegments ); + + if( ptrControl->doesOutputFreqDomainDataToCsv() ){ + outputFrequencyDomainData( iSegLen, freqDegree, numOfRemainingSegments, ftval ); + } + // Calculate response functions + calculateResponseFunctions( iSegLen, freqDegree, timeLength, freq, numOfRemainingSegments, ftval, times, ofsResp, ofsRhoaPhs ); + + // Delete arrays + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] ftvalOrg[iChan]; + } + delete [] ftvalOrg; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] ftval[iChan]; + } + delete [] ftval; + } + + // Delete arrays + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + delete [] cdata[iChan][iSeg]; + } + delete [] cdata[iChan]; + } + delete [] cdata; + delete [] meanSquares; + } + +} + +// Set object of M-estimator with Huber weight +void Analysis::setRobustWeightHuber( const int index, const RobustWeightHuber* const ptrRobustWeight ){ + + if( m_robustWeight[index] != NULL ){ + delete m_robustWeight[index]; + } + + m_robustWeight[index] = new RobustWeightHuber(*ptrRobustWeight); + +} + +// Set object of M-estimator with Thomson weight +void Analysis::setRobustWeightThomson( const int index, const RobustWeightThomson* const ptrRobustWeight ){ + + if( m_robustWeight[index] != NULL ){ + delete m_robustWeight[index]; + } + + m_robustWeight[index] = new RobustWeightThomson(*ptrRobustWeight); + +} + +// Set object of M-estimator with Tukey's biweights +void Analysis::setRobustWeightTukeysBiweights( const int index, const RobustWeightTukeysBiweights* const ptrRobustWeight ){ + + if( m_robustWeight[index] != NULL ){ + delete m_robustWeight[index]; + } + + m_robustWeight[index] = new RobustWeightTukeysBiweights(*ptrRobustWeight); + +} + +// Test function +void Analysis::test() const{ + + const std::string fileName = "KrafftPoint.txt"; + std::ifstream ifs(fileName.c_str(), std::ios::in); + int numOfData(0); + ifs >> numOfData; + double* x = new double[numOfData]; + double* y = new double[numOfData]; + for (int iData = 0; iData < numOfData; ++iData) { + ifs >> y[iData] >> x[iData]; + } + ifs.close(); + std::vector< std::pair > candidatesOfPairsInit; + const int numOfCandidatesOfPairsAll = (numOfData * numOfData - numOfData) / 2; + for (int i1 = 0; i1 < numOfData; ++i1) { + for (int i2 = i1 + 1; i2 < numOfData; ++i2) { + candidatesOfPairsInit.push_back(std::make_pair(i1, i2)); + } + } + double slope(0.0); + double intercept(0.0); + double* weights = new double[numOfData]; + for (int iData = 0; iData < numOfData; ++iData) { + weights[iData] = 1.0; + } + const int numOfCandidates = candidatesOfPairsInit.size() + 1; + double* slopeCandidates = new double[numOfCandidates]; + double* interceptCandidates = new double[numOfCandidates]; + int icount(0); + // Least square solution + Util::calculateRegressionCoefficientsByWLSWithIntercept(numOfData, y, x, weights, slope, intercept); + slopeCandidates[icount] = slope; + interceptCandidates[icount] = intercept; + ++icount; + std::cout << "OLS " << slope << " " << intercept << std::endl; + for (std::vector< std::pair >::const_iterator itr = candidatesOfPairsInit.begin(); itr != candidatesOfPairsInit.end(); ++itr, ++icount) { + const int i1 = itr->first; + const int i2 = itr->second; + slope = (y[i2] - y[i1]) / (x[i2] - x[i1]); + intercept = y[i1] - slope * x[i1]; + slopeCandidates[icount] = slope; + interceptCandidates[icount] = intercept; + std::cout << icount << " " << i1 << " " << i2 << " " << slope << " " << intercept << std::endl; + } + double scale(0.0); + UtilRobust::computeSEstimatorForUnivariateLinearRegressionWithIntercept(numOfData, numOfCandidates, + y, x, slopeCandidates, interceptCandidates, scale, slope, intercept); + std::cout << "S-estimate " << slope << " " << intercept << " " <& dataFileSets ){ + + //const Control* const ptrControl = Control::getInstance(); + + //for( int i = 1; i < 10000; ++i ){ + // const double dsec = static_cast(i) * 0.5; + // std::cout << std::setw(10) << dsec << " " << ptrControl->getTimeFromStartTimeOfEachSection(0, dsec) << std::endl; + //} + //for( int i = 1; i < 10000; ++i ){ + // const double dsec = static_cast(i) * 0.5; + // std::cout << std::setw(10) << dsec << " " << ptrControl->getTimeFromStartTimeOfEachSection(1, dsec) << std::endl; + //} + + readTimeSeriesData(dataFileSets); + + //const int numChannels = m_numOutputVariables + 2 + 2 * m_numRemoteReferenceStations; + const int numChannels = 5; + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr ){ + const int numData = itr->numDataPoints; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + std::cout << "Var = " << iChan << std::endl; + std::ostringstream fileName; + fileName << "var_" << iChan <<".csv"; + std::ofstream ofs; + ofs.open( fileName.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + std::cerr << "File open error !! : " << fileName.str() << std::endl; + exit(1); + } + std::complex* cdata = new std::complex[numData]; + for( int i = 0; i < numData; ++i ){ + cdata[i] = std::complex(itr->dataFile[iChan].data[i], 0.0); + } + Util::fourierTransform(numData, cdata); + const double samplingFrequency = Control::getInstance()->getSamplingFrequency(); + const double dt = 1.0 / samplingFrequency; + const double T = static_cast(numData) * dt; + ofs << "i" << "," << "freq" + << "," << "amp" << "," << "amp*T/2" + << "," << "phs" + << "," << "power" << "," << "power*T" + << std::endl; + for( int i = 0; i < numData / 2 + 1; ++i ){ + const double freq = static_cast(i) / static_cast(numData) * samplingFrequency; + const double A = 2.0 * cdata[i].real(); + const double B = - 2.0 * cdata[i].imag(); + const double amp = hypot(A, B); + const double phs = atan2(-B, A) * CommonParameters::RAD2DEG; + double power = 2.0 * std::norm(cdata[i]); + if( i == 0 || i == 8 ){ + power *= 0.5; + } + ofs << i << "," << freq + << "," << amp << "," << amp * 0.5 * T + << "," << phs + << "," << power << "," << power * T + << std::endl; + } + ofs.close(); + delete [] cdata; + } + } + +} + +// Test function 3 +void Analysis::test3() const{ + + std::ostringstream fileName; + fileName << "temp.csv"; + std::ofstream ofs; + ofs.open( fileName.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + std::cerr << "File open error !! : " << fileName.str() << std::endl; + exit(1); + } + + const int numData = 4096; + double data[4096]; + for( int iTime = 0; iTime < numData; ++iTime ){ + data[iTime] = 0.0; + } + const double samplingFreq = 32; + const double dt = 1.0 / samplingFreq; + for( int iFreq = 0; iFreq < 1000; ++iFreq ){ + const double freq = static_cast(iFreq+1) / static_cast(1000) * samplingFreq; + double omega = 2.0 * CommonParameters::PI * freq; + const double phase = static_cast(iFreq*rand()) / static_cast(RAND_MAX) * CommonParameters::DEG2RAD; + for( int iTime = 0; iTime < numData; ++iTime ){ + const double t = static_cast(iTime) * dt; + data[iTime] += 2.0 * cos(omega*t + phase); + } + } + std::complex cdata[numData]; + for( int i = 0; i < numData; ++i ){ + cdata[i] = std::complex(data[i], 0.0); + } + for( int i = 0; i < numData; ++i ){ + const double t = static_cast(i) * dt; + ofs << std::setw(15) << t << "," << std::setw(15) << cdata[i].real() << "," << std::setw(15) << cdata[i].imag() << std::endl; + } + ofs << std::endl; + + Util::fourierTransform(numData, cdata); + ofs << "i" << "," << "freq" + << "," << "amp" << "," << "amp*T/2" + << "," << "phs" + << "," << "power" << "," << "power*T" + << std::endl; + const double T = numData * dt; + for( int i = 0; i < numData / 2 + 1; ++i ){ + const double freq = static_cast(i) / static_cast(numData) * samplingFreq; + const double A = 2.0 * cdata[i].real(); + const double B = - 2.0 * cdata[i].imag(); + const double amp = hypot(A, B); + const double phs = atan2(-B, A) * CommonParameters::RAD2DEG; + double power = 2.0 * std::norm(cdata[i]); + if( i == 0 || i == 8 ){ + power *= 0.5; + } + ofs << i << "," << freq + << "," << amp << "," << amp * 0.5 * T + << "," << phs + << "," << power << "," << power * T + << std::endl; + }; + ofs << std::endl; + + const int numh = 200; + double h[201]; + Util::calculateFIRFilterCoeffsByLeastSquare( numh, true, samplingFreq, 0.4, 0.5, 100.0, 1.0, h ); + + for( int i = numh; i < numData; ++i ){ + cdata[i] = 0.0; + for( int k = 0; k <= numh; ++k ){ + cdata[i] += h[k] * std::complex(data[i-k], 0.0); + } + } + for( int i = 0; i < numData; ++i ){ + ofs << i << "," << std::setw(15) << cdata[i].real() << "," << std::setw(15) << cdata[i].imag() << std::endl; + } + ofs << std::endl; + + Util::fourierTransform(numData, cdata); + ofs << "i" << "," << "freq" + << "," << "amp" << "," << "amp*T/2" + << "," << "phs" + << "," << "power" << "," << "power*T" + << std::endl; + for( int i = 0; i < numData / 2 + 1; ++i ){ + const double freq = static_cast(i) / static_cast(numData) * samplingFreq; + const double A = 2.0 * cdata[i].real(); + const double B = - 2.0 * cdata[i].imag(); + const double amp = hypot(A, B); + const double phs = atan2(-B, A) * CommonParameters::RAD2DEG; + double power = 2.0 * std::norm(cdata[i]); + if( i == 0 || i == 8 ){ + power *= 0.5; + } + ofs << i << "," << freq + << "," << amp << "," << amp * 0.5 * T + << "," << phs + << "," << power << "," << power * T + << std::endl; + }; + ofs << std::endl; + + ofs.close(); + + return; +} + +// Decimation +void Analysis::decimation( std::vector& dataFileSets ) const{ + + Control* ptrControl = Control::getInstance(); + const Control::ParamsForDecimation params = ptrControl->getParamsForDecimation(); + if(!params.applyDecimation){ + return; + } + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Decimation"); + + double* coeff = new double[params.filterLength + 1]; + const double samplingFreq = ptrControl->getSamplingFrequency(); + const double freqStop = 0.5 * samplingFreq / static_cast(params.decimationInterval); + const double freqPass = freqStop / pow(10.0, params.transitionBandWidthInLogarithmicScale); + Util::calculateFIRFilterCoeffsByLeastSquare( params.filterLength, true, samplingFreq, freqPass, freqStop, 1.0, 1.0, coeff ); + + std::string fileName = "lpf_for_decimation.csv"; + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName ); + } + const double freqNyquist = 0.5 * samplingFreq; + const int numFreq = 100000; + for( int i = 0; i < numFreq; ++i ){ + const double freq = freqNyquist * static_cast(i+1) / static_cast(numFreq); + const std::complex Hfreq = Util::calculateFrequencyCharacteristicsOfFIRFilter( + params.filterLength, samplingFreq, freq, coeff ); + const double angle = atan2( Hfreq.imag(), Hfreq.real() ) * CommonParameters::RAD2DEG; + ofs << std::setw(20) << std::setprecision(12) << freq << "," + << std::setw(20) << std::setprecision(12) << std::abs(Hfreq) << "," + << std::setw(20) << std::setprecision(12) << angle << std::endl; + } + ofs.close(); + + const int numChannels = ptrControl->getNumberOfChannels(); + for( std::vector::iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr ){ + const int numDataOrg = itr->numDataPoints; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + double* dataOrg = new double[numDataOrg]; + for( int i = 0; i < numDataOrg; ++i ){ + dataOrg[i] = itr->dataFile[iChan].data[i]; + } + const int numDataMod = numDataOrg - params.filterLength; + double* dataMod = new double[numDataMod]; + for( int i = params.filterLength; i < numDataOrg; ++i ){ + double dbuf(0.0); + for( int k = 0; k <= params.filterLength; ++k ){ + dbuf += coeff[k] * dataOrg[i-k]; + } + dataMod[i - params.filterLength] = dbuf; + } + delete [] dataOrg; + int numDataAfterDecimation(0); + for( int i = 0; i < numDataMod; i += params.decimationInterval, ++numDataAfterDecimation ){ + itr->dataFile[iChan].data[numDataAfterDecimation] = dataMod[i]; + } + for( int i = numDataAfterDecimation; i < numDataOrg; ++i ){ + itr->dataFile[iChan].data[i] = 0.0; + } + itr->numDataPoints = numDataAfterDecimation; + delete [] dataMod; + } + } + + delete [] coeff; + + ptrControl->setSamplingFrequency(samplingFreq / static_cast(params.decimationInterval)); + +} + +// Read time-series data +void Analysis::readTimeSeriesData( std::vector& dataFileSets ){ + + const Control* const ptrControl = Control::getInstance(); + const int numTimeSeriesSections = ptrControl->getNumTimeSeriesSections(); + const int numChannels = ptrControl->getNumberOfChannels(); + + for( int iSect = 0; iSect < numTimeSeriesSections; ++iSect ){ + const int numDataPoints = dataFileSets[iSect].numDataPoints; + std::vector& dataFileList = dataFileSets[iSect].dataFile; + int iChan = 0; + if (ptrControl->doesReadElogDualBinary()) { + // Read ELOG binary data as channel 0 and 1 + ElogDual* ptrElogDual = ElogDual::getInstance(); + const std::string fileName = dataFileList[0].fileName; + const int numSkipData = dataFileList[0].numSkipData; + iChan = 2; + for (int ch = 0; ch < iChan; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogDual->readElogBinaryFilesUnderADirectory(directoryName, numSkipData, numDataPoints, dataFileList[0].data, dataFileList[1].data); + } + else{ + int counter(0); + ptrElogDual->readElogBinaryFile(fileName, numSkipData, numDataPoints, counter, dataFileList[0].data, dataFileList[1].data); + } + } + + if( ptrControl->doesReadElogMTBinary() ){ + // Read ELOG binary data as channel 0 and 1 + ElogMT* ptrElogMT = ElogMT::getInstance(); + const std::string fileName = dataFileList[0].fileName; + const int numSkipData = dataFileList[0].numSkipData; + const int elogMTReadingOption = ptrControl->getElogMTReadingOption(); + if (elogMTReadingOption == Control::READ_EX_EY_HX_HY_HZ_FROM_ELOGMT_DATA || + elogMTReadingOption == Control::READ_EX_EY_HX_HY_HZ_HRX_HRY_FROM_ELOGMT_DATA) { + { + iChan = 5; + for (int ch = 0; ch < iChan; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectory(directoryName, numSkipData, numDataPoints, dataFileList[0].data, dataFileList[1].data, dataFileList[2].data, dataFileList[3].data, dataFileList[4].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFile(fileName, numSkipData, numDataPoints, counter, dataFileList[0].data, dataFileList[1].data, dataFileList[2].data, dataFileList[3].data, dataFileList[4].data); + } + } + if (elogMTReadingOption == Control::READ_EX_EY_HX_HY_HZ_HRX_HRY_FROM_ELOGMT_DATA) { + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipDataR= dataFileList[iChan].numSkipData; + for (int ch = iChan; ch < iChan + 2; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[iChan].data, dataFileList[iChan+1].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[iChan].data, dataFileList[iChan+1].data); + } + iChan += 2; + } + } + else if (elogMTReadingOption == Control::READ_EX_EY_HX_HY_FROM_ELOGMT_DATA || + elogMTReadingOption == Control::READ_EX_EY_HX_HY_HRX_HRY_FROM_ELOGMT_DATA) { + { + iChan = 4; + for (int ch = 0; ch < iChan; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryExEyHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[0].data, dataFileList[1].data, dataFileList[2].data, dataFileList[3].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileExEyHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[0].data, dataFileList[1].data, dataFileList[2].data, dataFileList[3].data); + } + } + if (elogMTReadingOption == Control::READ_EX_EY_HX_HY_HRX_HRY_FROM_ELOGMT_DATA) { + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + for (int ch = iChan; ch < iChan + 2; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + iChan += 2; + } + } + else if (elogMTReadingOption == Control::READ_HZ_HX_HY_FROM_ELOGMT_DATA || + elogMTReadingOption == Control::READ_HZ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA) { + { + iChan = 3; + for (int ch = 0; ch < iChan; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryHzHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[0].data, dataFileList[1].data, dataFileList[2].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileHzHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[0].data, dataFileList[1].data, dataFileList[2].data); + } + } + if (elogMTReadingOption == Control::READ_HZ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA) { + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + for (int ch = iChan; ch < iChan + 2; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + iChan += 2; + } + } + else if (elogMTReadingOption == Control::READ_EX_EY_FROM_ELOGMT_DATA) { + iChan = 2; + for (int ch = 0; ch < iChan; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryExEyOnly(directoryName, numSkipData, numDataPoints, dataFileList[0].data, dataFileList[1].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileExEyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[0].data, dataFileList[1].data); + } + } + else if (elogMTReadingOption == Control::READ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA || + elogMTReadingOption == Control::READ_HX_HY_FROM_ELOGMT_DATA) { + {// Hx, Hy + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + for (int ch = iChan; ch < iChan + 2; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + iChan += 2; + } + if(elogMTReadingOption == Control::READ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA){ + // Hrx, Hry + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + for (int ch = iChan; ch < iChan + 2; ++ch) { + dataFileList[ch].data = new double[numDataPoints]; + } + if (fileName.find("*.dat") != std::string::npos) { + const int directoryNameLength = fileName.find_last_of("\\") + 1; + const std::string directoryName = fileName.substr(0, directoryNameLength); + ptrElogMT->readElogBinaryFilesUnderADirectoryHxHyOnly(directoryName, numSkipData, numDataPoints, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + else { + int counter(0); + ptrElogMT->readElogBinaryFileHxHyOnly(fileName, numSkipData, numDataPoints, counter, dataFileList[iChan].data, dataFileList[iChan + 1].data); + } + iChan += 2; + } + } + else{ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Unsupported type of ELOG-MT reading option: " + Util::toString(ptrControl->getElogMTReadingOption())); + } + } + for( ; iChan < numChannels; ++iChan ){ + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + dataFileList[iChan].data = new double[numDataPoints]; + if (ptrControl->doesReadAtsBinary() && Util::extractExtensionOfFileName(fileName).find("ats") != std::string::npos) { + Ats* ptrAts = Ats::getInstance(); + ptrAts->readAtsFile(fileName, numSkipData, numDataPoints, dataFileList[iChan].data); + } +#ifdef _MTH5 + else if (ptrControl->doesReadMTH5() && Util::extractExtensionOfFileName(fileName).find("mth5") != std::string::npos) { + MTH5* ptrMTH5 = MTH5::getInstance(); + ptrMTH5->readMTH5File(fileName, dataFileList[iChan].mth5GroupName, numSkipData, numDataPoints, dataFileList[iChan].data); + } +#endif + else{ + readOneTimeSeriesData( fileName, numSkipData, numDataPoints, dataFileList[iChan].data ); + } + } + } + +} + +// Read calibration files +void Analysis::readCalibrationFiles( const std::vector& freq ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + + if (ptrControl->doesMakeCalibrationFileForMFS()) { + const int numFile = ptrControl->getNumCalibrationFilesForMFS(); + if (numFile > 0) { + assert(numFile == ptrControl->getNumberOfChannels()); + } + for (int iFile = 0; iFile < numFile; ++iFile) { + const std::string fileName = ptrControl->getCalibrationFileNameForMFS(iFile); + const Ats* ptrAts = Ats::getInstance(); + ptrAts->makeCalibrationFile(fileName, iFile, freq); + } + } + + if( ptrControl->doesMakeCalibrationFileForElogDual() ){ + const Control::ParamsForElogCalibration params = ptrControl->getParamsForElogDualCalibration(); + ElogDual* ptrElogDual = ElogDual::getInstance(); + if (ptrControl->doesMakeCalibrationFileForMFS()) { + double dbuf(0.0); + std::istringstream issX(ptrControl->getCalibrationFileNameForMFS(0)); + issX >> dbuf; + const double dipoleLengthX = dbuf; + std::istringstream issY(ptrControl->getCalibrationFileNameForMFS(1)); + issY >> dbuf; + const double dipoleLengthY = dbuf; + ptrElogDual->makeCalibrationFile(params.fileName, params.unitGroupDelay, 0, 1, dipoleLengthX, dipoleLengthY, freq); + } + } + + if (ptrControl->doesMakeCalibrationFileForElogMT()) { + const Control::ParamsForElogCalibration params = ptrControl->getParamsForElogMTCalibration(); + ElogMT* ptrElogMT = ElogMT::getInstance(); + if (ptrControl->doesMakeCalibrationFileForMFS()) { + double dbuf(0.0); + std::istringstream issX(ptrControl->getCalibrationFileNameForMFS(0)); + issX >> dbuf; + const double dipoleLengthX = dbuf; + std::istringstream issY(ptrControl->getCalibrationFileNameForMFS(1)); + issY >> dbuf; + const double dipoleLengthY = dbuf; + std::vector channelIndexes; + channelIndexes.push_back(0); + channelIndexes.push_back(1); + ptrElogMT->makeCalibrationFile(params.fileName, params.unitGroupDelay, channelIndexes, dipoleLengthX, dipoleLengthY, freq); + } + } + + const int numCalFile = ptrControl->getNumCalibrationFiles(); + if( numCalFile > 0 ){ + assert( numCalFile == ptrControl->getNumberOfChannels() ); + } + if( m_calibrationFunctions != NULL ){ + delete [] m_calibrationFunctions; + } + m_calibrationFunctions = new CalibrationFunction[numCalFile]; + for( int iFile = 0; iFile < numCalFile; ++iFile ){ + m_calibrationFunctions[iFile].readCalibrationFunction(ptrControl->getCalibrationFileName(iFile)); + } + +} + +// Read one time-series data +void Analysis::readOneTimeSeriesData( const std::string& fileName, const int numSkipData, const int numDataPoints, double* data ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read data from "+fileName); + + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + for( int i = 0; i < numSkipData; ++i ){ + double dbuf(0.0); + ifs >> dbuf; + } + + for( int i = 0; i < numDataPoints; ++i ){ + if( ifs.eof() ){ + ptrOutputFiles->writeErrorMessage("End of file appears before reading all data points"); + } + ifs >> data[i]; + } + + ifs.close(); + +} + +// Perform preprocessing +void Analysis::preprocessing( std::vector& dataFileSets ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Perform preprocessing"); + + const Control* const ptrControl = Control::getInstance(); + const double samplingFrequency = ptrControl->getSamplingFrequency(); + + const int numChannels = ptrControl->getNumberOfChannels(); + int iSection(0); + for( std::vector::iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSection ){ + const int numData = itr->numDataPoints; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ptrOutputFiles->writeLogMessage("Secton " + Util::toString(iSection) + ", Channel " + Util::toString(iChan) ); + // Hampel filter + const Control::ParamsForHampelFilter paramsHampelFilter = ptrControl->getParamsForHampelFilter(); + if( paramsHampelFilter.applyHampelFilter ){ + const int numModifiedPoints = Util::hampelFilter( numData, paramsHampelFilter.numNeighborsOnEitherSide, paramsHampelFilter.nsigma, itr->dataFile[iChan].data ); + ptrOutputFiles->writeLogMessage("Number of the points modified by Hampel filter: " + Util::toString(numModifiedPoints) ); + } + + // Make new data records by subtracting mean + const double mean = Util::calculateMeanValue(numData, itr->dataFile[iChan].data); + ptrOutputFiles->writeLogMessage("Subtract mean (" + Util::toString(mean) + ")"); + for (int i = 0; i < numData; ++i) { + itr->dataFile[iChan].data[i] -= mean; + } +#ifdef _DEBUG_WRITE + std::ostringstream oss; + oss << "ts_sect_" << iSection << "_chan_" << iChan << "_mean.csv"; + std::ofstream ofs; + ofs.open(oss.str().c_str(), std::ios::out); + if (ofs.fail()) { + ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); + } + for (int i = 0; i < numData; ++i) { + const double elapsedTime = static_cast(i) / samplingFrequency; + ofs << ptrControl->getTimeFromStartTimeOfEachSection(iSection, elapsedTime) << "," + << std::setprecision(12) << std::scientific << itr->dataFile[iChan].data[i] << std::endl; + } + ofs.close(); +#endif + + // Apply high-pass filter + if( ptrControl->doesApplyIIRHighPassFilter() ){ + ptrOutputFiles->writeLogMessage("Apply high-pass filter"); + Util::applyIIRHighPassFilter(samplingFrequency, ptrControl->getCutoffFrequencyForIIRHighPassFilter(), + numData, itr->dataFile[iChan].data); + std::string fileName = "highpass.csv"; + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName ); + } + const double freqNyquist = 0.5 * samplingFrequency; + const int numFreq = 100000; + for( int i = 0; i < numFreq; ++i ){ + const double freq = freqNyquist * static_cast(i+1) / static_cast(numFreq); + const std::complex Hfreq = Util::calculateFrequencyCharacteristicsOfIIRHighPassFilter( freq, + samplingFrequency, ptrControl->getCutoffFrequencyForIIRHighPassFilter() ); + const double angle = atan2( Hfreq.imag(), Hfreq.real() ) * CommonParameters::RAD2DEG; + ofs << std::setw(20) << std::setprecision(12) << freq << "," + << std::setw(20) << std::setprecision(12) << std::abs(Hfreq) << "," + << std::setw(20) << std::setprecision(12) << angle << std::endl; + } + ofs.close(); + } + + // Apply low-pass filter + if( ptrControl->doesApplyIIRLowPassFilter() ){ + ptrOutputFiles->writeLogMessage("Apply low-pass filter"); + Util::applyIIRLowPassFilter( samplingFrequency, ptrControl->getCutoffFrequencyForIIRLowPassFilter(), + numData, itr->dataFile[iChan].data ); + std::string fileName = "lowpass.csv"; + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName ); + } + const double freqNyquist = 0.5 * samplingFrequency; + const int numFreq = 100000; + for( int i = 0; i < numFreq; ++i ){ + const double freq = freqNyquist * static_cast(i+1) / static_cast(numFreq); + const std::complex Hfreq = Util::calculateFrequencyCharacteristicsOfIIRLowPassFilter( freq, + samplingFrequency, ptrControl->getCutoffFrequencyForIIRLowPassFilter() ); + const double angle = atan2( Hfreq.imag(), Hfreq.real() ) * CommonParameters::RAD2DEG; + ofs << std::setw(20) << std::setprecision(12) << freq << "," + << std::setw(20) << std::setprecision(12) << std::abs(Hfreq) << "," + << std::setw(20) << std::setprecision(12) << angle << std::endl; + } + ofs.close(); + } + + // Apply notch filter + if( ptrControl->getNumberOfCutoffFrequenciesForNotchFilter() > 0 ){ + ptrOutputFiles->writeLogMessage("Apply notch filter"); + const std::vector cutoffFreqsForNotchFilter = ptrControl->getCutoffFrequenciesForNotchFilter(); + for( std::vector::const_iterator itrCutoffFreq = cutoffFreqsForNotchFilter.begin(); + itrCutoffFreq != cutoffFreqsForNotchFilter.end(); ++itrCutoffFreq ){ + Util::applyNotchFilter(ptrControl->getParameterQForNotchFilter(), samplingFrequency, *itrCutoffFreq, + numData, itr->dataFile[iChan].data); + } + std::string fileName = "notch.csv"; + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName ); + } + const double freqNyquist = 0.5 * samplingFrequency; + const int numFreq = 100000; + for( int i = 0; i < numFreq; ++i ){ + const double freq = freqNyquist * static_cast(i+1) / static_cast(numFreq); + std::complex Hfreq = 1.0; + for( std::vector::const_iterator itrCutoffFreq = cutoffFreqsForNotchFilter.begin(); + itrCutoffFreq != cutoffFreqsForNotchFilter.end(); ++itrCutoffFreq ){ + Hfreq *= Util::calculateFrequencyCharacteristicsOfNotchFilter( freq, ptrControl->getParameterQForNotchFilter(), + samplingFrequency, *itrCutoffFreq ); + } + const double angle = atan2( Hfreq.imag(), Hfreq.real() ) * CommonParameters::RAD2DEG; + ofs << std::setw(20) << std::setprecision(12) << freq << "," + << std::setw(20) << std::setprecision(12) << std::abs(Hfreq) << "," + << std::setw(20) << std::setprecision(12) << angle << std::endl; + } + ofs.close(); + } + } + } + + if (ptrControl->doesPeformEOFBasedDenoising() && ptrControl->getTimingEOFBasedDenoising() == Control::AFTER_DEGITAL_FILTERS) { + // Modify time-series data based on the EOF analysis + modifyTimeSeriesBasedOnEOFAnalysis(dataFileSets); + } + + if( (ptrControl->getParamsForPrewhitening()).applyPrewhitening ){ + m_coefficientsOfARModel = new std::vector[numChannels]; + const Control::ParamsForPrewhitening params = ptrControl->getParamsForPrewhitening(); + if( params.typeOfEstimator == Control::MANUAL_INPUTS_AR_COEFFICIENTS_FOR_PREWHITENING ){ + ( RobustPrewhitening::getInstance() )->prewhiteningUsingUserDefinedARCoeffs(dataFileSets, m_coefficientsOfARModel); + }else{ + ( RobustPrewhitening::getInstance() )->robustPrewhitening(dataFileSets, m_coefficientsOfARModel); + } + } + +} + +// Convert time-series data to frequency-domain data +void Analysis::convertToFrequencyData( const int segmentLength, const std::vector& dataFileSets, + int& numSegmentsTotal, std::complex*** cdata, std::vector< std::pair >& times, std::vector* meanSquares ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Convert time-series data to frequency-domain"); + + const Control* const ptrControl = Control::getInstance(); + + const int numChannels = ptrControl->getNumberOfChannels(); + const double overlappingRatio = ptrControl->getOverlappingRatio(); + const int shiftLength = static_cast( (1.0 - overlappingRatio) * segmentLength ); + + // Count total number of segments + numSegmentsTotal = 0; + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr ){ + if( itr->numDataPoints < segmentLength ){ + numSegmentsTotal += 1; + }else{ + numSegmentsTotal += ( itr->numDataPoints - segmentLength ) / shiftLength + 1; + } + } + if( numSegmentsTotal < 1 ){ + ptrOutputFiles->writeErrorMessage("Total number of segments is less than 1"); + } + ptrOutputFiles->writeLogMessage("Total number of segments : " + Util::toString(numSegmentsTotal)); + + times.reserve(numSegmentsTotal); + + // Make array of data segmetns + const double samplingFrequency = ptrControl->getSamplingFrequency(); + double*** dataSegments = new double**[numChannels]; + for( int i = 0; i < numChannels; ++i ){ + dataSegments[i] = new double*[numSegmentsTotal]; + } + int section(0); + int counterSegment(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++section ){ + const int numSegments = itr->numDataPoints < segmentLength ? 1 : ( itr->numDataPoints - segmentLength ) / shiftLength + 1; + for( int iSeg = 0; iSeg < numSegments; ++iSeg, ++counterSegment ){ + for( int iChan = 0; iChan < numChannels; ++iChan ){ + dataSegments[iChan][counterSegment] = new double[segmentLength]; + const int index = iSeg * shiftLength; + if( itr->numDataPoints < segmentLength ){ + memcpy(dataSegments[iChan][counterSegment], &(itr->dataFile[iChan].data[index]), sizeof(double)*itr->numDataPoints); + for( int i = itr->numDataPoints; i < segmentLength; ++i ){ + dataSegments[iChan][counterSegment][i] = 0.0; + } + }else{ + memcpy(dataSegments[iChan][counterSegment], &(itr->dataFile[iChan].data[index]), sizeof(double)*segmentLength); + } +//#ifdef _DEBUG_WRITE +// std::ostringstream oss; +// oss << "sect_" << section << "_seg_" << counterSegment << "_chan_" << iChan << ".csv"; +// std::ofstream ofs; +// ofs.open( oss.str().c_str(), std::ios::out ); +// if( ofs.fail() ){ +// ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); +// } +// for( int i = 0; i < segmentLength; ++i ){ +// ofs << std::setprecision(12) << std::scientific << dataSegments[iChan][counterSegment][i] << std::endl; +// } +// ofs.close(); +//#endif + } + // Start time + const int index1 = iSeg * shiftLength; + const double elapsedTime1 = static_cast(index1) / samplingFrequency; + std::string time1 = ptrControl->getTimeFromStartTimeOfEachSection(section, elapsedTime1); + // End time + const int index2 = index1 + segmentLength; + const double elapsedTime2 = static_cast(index2) / samplingFrequency; + std::string time2 = ptrControl->getTimeFromStartTimeOfEachSection(section, elapsedTime2); + // Insert + times.push_back( std::make_pair(time1, time2) ); + } + } + assert( times.size() == numSegmentsTotal ); + + // Calculate mean squares + for( int iChan = 0; iChan < numChannels; ++iChan ){ + meanSquares[iChan].reserve(numSegmentsTotal); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double meanSquare = Util::calculateMeanSquareValue(segmentLength, dataSegments[iChan][iSeg]); + meanSquares[iChan].push_back(meanSquare); + } + } + + // Apply hanning window + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + Util::hanningWindow(segmentLength, dataSegments[iChan][iSeg]); +//#ifdef _DEBUG_WRITE +// std::ostringstream oss; +// oss << "seg_" << iSeg << "_chan_" << iChan << "_hanning.csv"; +// std::ofstream ofs; +// ofs.open( oss.str().c_str(), std::ios::out ); +// if( ofs.fail() ){ +// ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); +// } +// for( int i = 0; i < segmentLength; ++i ){ +// ofs << std::setprecision(12) << std::scientific << dataSegments[iChan][iSeg][i] << std::endl; +// } +// ofs.close(); +//#endif + } + } + + // Fourier transform + for( int iChan = 0; iChan < numChannels; ++iChan ){ + cdata[iChan] = new std::complex*[numSegmentsTotal]; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + cdata[iChan][iSeg] = new std::complex[segmentLength]; + for( int i = 0; i < segmentLength; ++i ){ + cdata[iChan][iSeg][i] = std::complex(dataSegments[iChan][iSeg][i], 0.0); + } + Util::fourierTransform(segmentLength, cdata[iChan][iSeg]); + } + } + + // Delete arrays + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + delete [] dataSegments[iChan][iSeg]; + } + delete [] dataSegments[iChan]; + } + delete [] dataSegments; + +} + +// Perform calibration correction for all channels +void Analysis::calibrationCorrectionAllChannels( const int numChannels, const int numSegmentsTotal, + const double freq, std::complex** ftval ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Perform calibration correction"); + + // Calibration correction + for( int iChan = 0; iChan < numChannels; ++iChan ){ + calibrationCorrection(iChan, numSegmentsTotal, freq, ftval[iChan], true, true); + } + +} + +// Perform calibration correction +void Analysis::calibrationCorrection(const int iChan, const int numSegmentsTotal, const double freq, std::complex* ftval, const bool afterPreprocessing, const bool afterTapering) const { + + const Control* const ptrControl = Control::getInstance(); + + // Interpolate calibration function + std::complex calCorrFunc(1.0, 0.0); + if( ptrControl->getNumCalibrationFiles() == 0 ){ + // Calibration function is not used + }else{ + calCorrFunc *= m_calibrationFunctions[iChan].calculateCalibrationFunction(freq); + } + + if(ptrControl->getParamsForDecimation().applyDecimation){ + const Control::ParamsForDecimation params = ptrControl->getParamsForDecimation(); + double* coeff = new double[params.filterLength + 1]; + const double samplingFreqAfterDecimation = ptrControl->getSamplingFrequency(); + const double samplingFreqBeforeDecimation = ptrControl->getSamplingFrequencyOrg(); + const double freqStop = 0.5 * samplingFreqBeforeDecimation; + const double freqPass = freqStop / pow(10.0, params.transitionBandWidthInLogarithmicScale); + Util::calculateFIRFilterCoeffsByLeastSquare( params.filterLength, true, samplingFreqBeforeDecimation, freqPass, freqStop, 1.0, 1.0, coeff ); + const std::complex Hfreq = Util::calculateFrequencyCharacteristicsOfFIRFilter( params.filterLength, samplingFreqBeforeDecimation, freq, coeff ); + calCorrFunc /= Hfreq; + delete [] coeff; + } + + if (afterTapering) { + // Adjust the scaling factor for the loss due to the Hanning tapering + calCorrFunc *= sqrt(8.0 / 3.0); + } + + if(afterPreprocessing){ + // Adjust the influences of preprocessing + const double samplingFrequency = ptrControl->getSamplingFrequency(); + + // Adjust the effect of high-pass filter + if( ptrControl->doesApplyIIRHighPassFilter() ){ + std::complex Hfreq = Util::calculateFrequencyCharacteristicsOfIIRHighPassFilter( freq, samplingFrequency, + ptrControl->getCutoffFrequencyForIIRHighPassFilter() ); + calCorrFunc /= Hfreq; + } + + // Adjust the effect of low-pass filter + if( ptrControl->doesApplyIIRLowPassFilter() ){ + const double Q = 1.0/sqrt(2.0); + std::complex Hfreq = Util::calculateFrequencyCharacteristicsOfIIRLowPassFilter( freq, samplingFrequency, + ptrControl->getCutoffFrequencyForIIRLowPassFilter() ); + calCorrFunc /= Hfreq; + } + + // Adjust the effect of notch filter + if( ptrControl->getNumberOfCutoffFrequenciesForNotchFilter() > 0 ){ + const std::vector cutoffFreqsForNotchFilter = ptrControl->getCutoffFrequenciesForNotchFilter(); + std::complex Hfreq = std::complex(1.0, 0.0); + for( std::vector::const_iterator itrCutoffFreq = cutoffFreqsForNotchFilter.begin(); + itrCutoffFreq != cutoffFreqsForNotchFilter.end(); ++itrCutoffFreq ){ + Hfreq *= Util::calculateFrequencyCharacteristicsOfNotchFilter( freq, ptrControl->getParameterQForNotchFilter(), + samplingFrequency, *itrCutoffFreq ); + } + if( std::abs(Hfreq) > CommonParameters::EPS ){ + calCorrFunc /= Hfreq; + } + } + + // Adjust prewhitening + if( ptrControl->getParamsForPrewhitening().applyPrewhitening && m_coefficientsOfARModel != NULL ){ + const std::vector& coeffs = m_coefficientsOfARModel[iChan]; + const double omega = 2.0 * CommonParameters::PI * freq / samplingFrequency; + std::complex H = std::complex(1.0, 0.0);// Initialize 1 + int iAR = 1;// From 1 + for( std::vector::const_iterator itr = coeffs.begin(); itr != coeffs.end(); ++itr, ++iAR ){ + const double coeff = *itr; + const double arg = - static_cast(iAR) * omega; + // 1.0 - c1 * exp(-i*omega*1) - c2 * exp(-i*omega*2) - ... - ck * exp(-i*omega*k) - ... + H -= std::complex( cos(arg), sin(arg) ) * coeff; + } + calCorrFunc /= H; + } + } + + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + ftval[iSeg] *= calCorrFunc; + } + +} + +// Calculate apparent resistivity +double Analysis::calcApparentResistivity( const double freq, const std::complex& Z ) const{ + + return 0.2 * std::norm(Z) / freq; + +} + +// Calculate error of apparent resistivity +double Analysis::calcApparentResistivityError( const double freq, const std::complex& Z, const double dZ ) const{ + + return 0.4 * std::abs(Z) * dZ / freq; + +} + +// Calculate diagonal components of hat matrix +double Analysis::calculateDiagonalComponentsOfHatMatrix( const int numSegments, const int channelX, const int channelY, + std::complex** data, const double* const weights, double* hatDiagonals ) const{ + + double GxxMean(0.0); + double GyyMean(0.0); + std::complex GxyMean(0.0, 0.0); + double sumWeights(0.0); + for( int i = 0; i < numSegments; ++i ){ + GxxMean += std::norm(data[channelX][i]) * weights[i]; + GyyMean += std::norm(data[channelY][i]) * weights[i]; + GxyMean += data[channelX][i] * std::conj(data[channelY][i]) * weights[i]; + sumWeights += weights[i]; + } + GxxMean /= sumWeights; + GyyMean /= sumWeights; + GxyMean /= sumWeights; + const double coh = std::norm(GxyMean)/GxxMean/GyyMean; + const double coh2 = coh * coh; + + double maxHatDiagonal(0.0); + for( int i = 0; i < numSegments; ++i ){ + const double Gxx = std::norm(data[channelX][i]) * weights[i]; + const double Gyy = std::norm(data[channelY][i]) * weights[i]; + const std::complex Gxy = data[channelX][i] * std::conj(data[channelY][i]) * weights[i]; + const double term0 = Gxx / GxxMean + Gyy / GyyMean; + const double term1 = 2.0 * coh2 * (Gxy/GxyMean).real(); + hatDiagonals[i] = ( term0 - term1 ) / sumWeights / (1.0 - coh2); + if( hatDiagonals[i] > maxHatDiagonal ){ + maxHatDiagonal = hatDiagonals[i]; + } +#ifdef _DEBUG_WRITE + std::cout << "Gxx Gyy Gxy term0 term1 hatDiagonals maxHatDiagonal: " << + Gxx << " " << Gyy << " " << Gxy << " " << term0 << " " << term1 << " " << hatDiagonals[i] << " " << maxHatDiagonal << std::endl; +#endif + } + + return maxHatDiagonal; + +} + +// Calculate phase +double Analysis::calcPhase( const std::complex& Z ) const{ + + return std::arg(Z) * CommonParameters::RAD2DEG; + +} + +// Calculate error of phase +double Analysis::calcPhaseError( const std::complex& Z, const double dZ ) const{ + + const double ratio = dZ / std::abs(Z); + if( ratio < 1.0 ){ + return asin(ratio) * CommonParameters::RAD2DEG; + }else{ + return 360.0; + } + +} + +// Calculate response functions by iteratively reweighted least squares +void Analysis::calculateResponseFunctionsByIRWLS( const int iRobustWeight, const std::complex* const out, const std::complex* const in0, + const std::complex* const in1, const int numSegments, const bool fixScale, double& scale, const double* const weightsPrior, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence, + std::vector& titles, std::vector* outputValues, const bool priorityOnFirst ) const{ + + RobustWeight* const robustWeightCur = getPointerToRobustWeight(iRobustWeight); + if (robustWeightCur == NULL) { + return; + } + const std::string nameOfRobustWeight = robustWeightCur->getNameOfRobustWeight(); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions by iteratively reweighted least squares using " + nameOfRobustWeight + " weight"); + + const int numIterationMax = robustWeightCur->getNumIterationMax(); + const double convergenceCriteria = robustWeightCur->getConvergenceCriteria(); + double GresPre(0.0); + bool converge(false); + for( int iter = 0; iter < numIterationMax; ++iter ){ + ptrOutputFiles->writeCvgMessage("Iteration number = " + Util::toString(iter)); + if (!fixScale) { + // Calcuate scale + scale = robustWeightCur->calculateScale(numSegments, residuals, scale); + } + // Calcuate weights + const double sumOfWeights = robustWeightCur->calculateWeights(numSegments, residuals, scale, weightsPrior, weights); + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeCvgMessage(" Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + ptrOutputFiles->writeWarningMessage("Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + break; + } + if( outputValues != NULL ){ + titles.push_back(nameOfRobustWeight + "_" + Util::toString(iter)); + for( int iSeg = 0 ; iSeg < numSegments; ++iSeg){ + outputValues[iSeg].push_back(residuals[iSeg].real()); + outputValues[iSeg].push_back(residuals[iSeg].imag()); + outputValues[iSeg].push_back(weights[iSeg]); + } + } + const double Gres = calculateResponseFunctionByWLS( out, in0, in1, numSegments, weights, residuals, resp0, resp1, coherence, priorityOnFirst ); + ptrOutputFiles->writeCvgMessage(" Weighted residual power: " + Util::toString(Gres)); + if( Gres < CommonParameters::EPS ){ + ptrOutputFiles->writeCvgMessage(" Weighted residual power is too small (" + Util::toString(Gres) + ")"); + ptrOutputFiles->writeWarningMessage("Weighted residual power is too small (" + Util::toString(Gres) + ")"); + break; + } + if( fabs(Gres-GresPre) / fabs(GresPre) < convergenceCriteria ){ + // Converged + ptrOutputFiles->writeCvgMessage("Iteration using " + nameOfRobustWeight + " weight converged"); + converge = true; + break; + } + GresPre = Gres; + } + + if(!converge){ + ptrOutputFiles->writeCvgMessage(" Iteration using " + nameOfRobustWeight + " weight does not converge"); + } + +} + +// Calculate response functions by iteratively reweighted remote reference +void Analysis::calculateResponseFunctionsByIRWLSRemoteReference(const int iRobustWeight, const std::complex* const out, + const std::complex* const in0, const std::complex* const in1, + const std::complex* const rr0, const std::complex* const rr1, + const int numSegments, const bool fixScale, double& scale, const double* const weightsPrior, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence, + std::vector& titles, std::vector* outputValues) const { + + RobustWeight* const robustWeightCur = getPointerToRobustWeight(iRobustWeight); + if (robustWeightCur == NULL) { + return; + } + const std::string nameOfRobustWeight = robustWeightCur->getNameOfRobustWeight(); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions by iteratively reweighted remote reference using " + nameOfRobustWeight + " weight"); + + const int numIterationMax = robustWeightCur->getNumIterationMax(); + const double convergenceCriteria = robustWeightCur->getConvergenceCriteria(); + double GresPre(0.0); + bool converge(false); + for (int iter = 0; iter < numIterationMax; ++iter) { + ptrOutputFiles->writeCvgMessage("Iteration number = " + Util::toString(iter)); + if (!fixScale) { + // Calcuate scale + scale = robustWeightCur->calculateScale(numSegments, residuals, scale); + } + // Calcuate weights + const double sumOfWeights = robustWeightCur->calculateWeights(numSegments, residuals, scale, weightsPrior, weights); + if (sumOfWeights < CommonParameters::EPS) { + ptrOutputFiles->writeCvgMessage(" Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + ptrOutputFiles->writeWarningMessage("Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + break; + } + if (outputValues != NULL) { + titles.push_back(nameOfRobustWeight + "_" + Util::toString(iter)); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + outputValues[iSeg].push_back(residuals[iSeg].real()); + outputValues[iSeg].push_back(residuals[iSeg].imag()); + outputValues[iSeg].push_back(weights[iSeg]); + } + } + const double Gres = calculateResponseFunctionByWLSRemoteReference(out, in0, in1, rr0, rr1, numSegments, weights, residuals, resp0, resp1, coherence); + ptrOutputFiles->writeCvgMessage(" Weighted residual power: " + Util::toString(Gres)); + if (Gres < CommonParameters::EPS) { + ptrOutputFiles->writeCvgMessage(" Weighted residual power is too small (" + Util::toString(Gres) + ")"); + ptrOutputFiles->writeWarningMessage("Weighted residual power is too small (" + Util::toString(Gres) + ")"); + break; + } + if (fabs(Gres - GresPre) / fabs(GresPre) < convergenceCriteria) { + // Converged + ptrOutputFiles->writeCvgMessage("Iteration using " + nameOfRobustWeight + " weight converged"); + converge = true; + break; + } + GresPre = Gres; + } + + if (!converge) { + ptrOutputFiles->writeCvgMessage(" Iteration using " + nameOfRobustWeight + " weight does not converge"); + } +} + +// Calculate response function by the ordinary remote reference method +double Analysis::calculateResponseFunctionByOrdinaryRemoteReference( const int numSegments, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + std::complex& resp1, std::complex& resp2 ) const{ + + double* weights = new double[numSegments]; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + weights[iSeg] = 1.0; + } + calculateResponseFunctionByWLSRemoteReferenceAux(numSegments, out, in1, in2, rr1, rr2, weights, resp1, resp2); + delete[] weights; + + double Gvar(0.0); + double Gsyn(0.0); + double Gres(0.0); + for( int i = 0; i < numSegments; ++i ){ + Gvar += std::norm(out[i]); + const std::complex outSyn = resp1 * in1[i] + resp2 * in2[i]; + Gsyn += std::norm(outSyn); + const std::complex residual = out[i] - outSyn; + Gres += std::norm(residual); + } + + double coherence = 1.0 - Gres / Gvar; + if( coherence > 1.0 ){ + coherence = 1.0; + }else if( coherence < 0.0 ){ + coherence = 0.0; + } + return coherence; + +} + +// Calculate response function by the ordinary weighted square method +double Analysis::calculateResponseFunctionByWLS( const std::complex* const out, const std::complex* const in0, + const std::complex* const in1, const int numSegments, const double* const weights, std::complex* residuals, + std::complex& resp0, std::complex& resp1, double& coherence, const bool priorityOnFirst ) const{ + + const Control* const ptrControl = Control::getInstance(); + calculateResponseFunctionByWLSAux( numSegments, out, in0, in1, weights, resp0, resp1, priorityOnFirst ); + double Gvar(0.0); + double Gsyn(0.0); + double Gres(0.0); + double sumWeights(0.0); + +#ifdef _USE_OMP + int numThreads(1); + #pragma omp parallel + { + numThreads = omp_get_num_threads(); + } + double* GvarThread = new double[numThreads]; + double* GsynThread = new double[numThreads]; + double* GresThread = new double[numThreads]; + double* sumWeightsThread = new double[numThreads]; + for( int iThread = 0; iThread < numThreads; ++iThread ){ + // Zero clear + GvarThread[iThread] = 0.0; + GsynThread[iThread] = 0.0; + GresThread[iThread] = 0.0; + sumWeightsThread[iThread] = 0.0; + } + int i(0); + int iThread(0); + std::complex outSyn(0.0, 0.0); + #pragma omp parallel default(shared) private(i, iThread, outSyn) + { + iThread = omp_get_thread_num(); + #pragma omp for + for( i = 0; i < numSegments; ++i ){ + GvarThread[iThread] += std::norm(out[i]) * weights[i]; + outSyn = resp0 * in0[i] + resp1 * in1[i]; + GsynThread[iThread] += std::norm(outSyn) * weights[i]; + residuals[i] = out[i] - outSyn; + GresThread[iThread] += std::norm(residuals[i]) * weights[i]; + sumWeightsThread[iThread] += weights[i]; + } + } + for( int iThread = 0; iThread < numThreads; ++iThread ){ + Gvar += GvarThread[iThread]; + Gsyn += GsynThread[iThread]; + Gres += GresThread[iThread]; + sumWeights += sumWeightsThread[iThread]; + } + delete [] GvarThread; + delete [] GsynThread; + delete [] GresThread; + delete [] sumWeightsThread; +#ifdef _DEBUG_WRITE + for( int i = 0; i < numSegments; ++i ){ + std::cout << "iSeg weights residuals: " + << i << " " << weights[i] << " " << residuals[i] << std::endl; + } +#endif +#else + for( int i = 0; i < numSegments; ++i ){ + Gvar += std::norm(out[i]) * weights[i]; + const std::complex outSyn = resp0 * in0[i] + resp1 * in1[i]; + Gsyn += std::norm(outSyn) * weights[i]; + residuals[i] = out[i] - outSyn; + Gres += std::norm(residuals[i]) * weights[i]; +#ifdef _DEBUG_WRITE + std::cout << "iSeg outSyn weights Gvar residuals Gres: " + << i << " " << outSyn << " " << weights[i] << " " < 1.0) { + coherence = 1.0; + } + else if (coherence < 0.0) { + coherence = 0.0; + } + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage(" Sum of weights: " + Util::toString(sumWeights) ); + ptrOutputFiles->writeCvgMessage(" Squared coherence: " + Util::toString(coherence) ); + std::ostringstream msg1; + msg1 << " Estimated response function: "; + msg1 << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp0.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp0.imag() << ")"; + msg1 << ", (" << std::setw(12) << std::setprecision(4) << std::scientific << resp1.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1.imag() << ")"; + ptrOutputFiles->writeCvgMessage(msg1.str()); + std::ostringstream msg2; + msg2 << " Amplitude of the estimated response function:"; + msg2 << std::setw(12) << std::setprecision(4) << std::scientific << std::abs(resp0) << "," + << std::setw(12) << std::setprecision(4) << std::scientific << std::abs(resp1); + ptrOutputFiles->writeCvgMessage(msg2.str()); + std::ostringstream msg3; + msg3 << " Phase(deg.) of the estimated response function:"; + msg3 << std::setw(7) << std::setprecision(1) << std::fixed << std::arg(resp0)*CommonParameters::RAD2DEG << "," + << std::setw(7) << std::setprecision(1) << std::fixed << std::arg(resp1)*CommonParameters::RAD2DEG; + ptrOutputFiles->writeCvgMessage(msg3.str()); + + return Gres; + +} + +// Auxiliary function for calculating response function by the weighted leaset square method +void Analysis::calculateResponseFunctionByWLSAux( const int numSegments, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, const double* const weights, + std::complex& resp1, std::complex& resp2, const bool priorityOnFirst ) const{ + + std::complex out_in1(0.0, 0.0); + std::complex out_in2(0.0, 0.0); + std::complex in2_in1(0.0, 0.0); + std::complex in1_in1(0.0, 0.0); + std::complex in2_in2(0.0, 0.0); +#ifdef _USE_OMP + int numThreads(1); + #pragma omp parallel + { + numThreads = omp_get_num_threads(); + } + std::complex* out_in1Thread = new std::complex[numThreads]; + std::complex* out_in2Thread = new std::complex[numThreads]; + std::complex* in2_in1Thread = new std::complex[numThreads]; + std::complex* in1_in1Thread = new std::complex[numThreads]; + std::complex* in2_in2Thread = new std::complex[numThreads]; + const std::complex czero = std::complex(0.0,0.0); + for( int iThread = 0; iThread < numThreads; ++iThread ){ + // Zero clear + out_in1Thread[iThread] = czero; + out_in2Thread[iThread] = czero; + in2_in1Thread[iThread] = czero; + in1_in1Thread[iThread] = czero; + in2_in2Thread[iThread] = czero; + } + int i(0); + int iThread(0); + #pragma omp parallel default(shared) private(i, iThread) + { + iThread = omp_get_thread_num(); + #pragma omp for + for( i = 0; i < numSegments; ++i ){ + out_in1Thread[iThread] += out[i] * std::conj(in1[i]) * weights[i]; + out_in2Thread[iThread] += out[i] * std::conj(in2[i]) * weights[i]; + in2_in1Thread[iThread] += in2[i] * std::conj(in1[i]) * weights[i]; + in1_in1Thread[iThread] += in1[i] * std::conj(in1[i]) * weights[i]; + in2_in2Thread[iThread] += in2[i] * std::conj(in2[i]) * weights[i]; + } + } + for( int iThread = 0; iThread < numThreads; ++iThread ){ + out_in1 += out_in1Thread[iThread]; + out_in2 += out_in2Thread[iThread]; + in2_in1 += in2_in1Thread[iThread]; + in1_in1 += in1_in1Thread[iThread]; + in2_in2 += in2_in2Thread[iThread]; + } + delete [] out_in1Thread; + delete [] out_in2Thread; + delete [] in2_in1Thread; + delete [] in1_in1Thread; + delete [] in2_in2Thread; +#else + for( int i = 0; i < numSegments; ++i ){ + out_in1 += out[i] * std::conj(in1[i]) * weights[i]; + out_in2 += out[i] * std::conj(in2[i]) * weights[i]; + in2_in1 += in2[i] * std::conj(in1[i]) * weights[i]; + in1_in1 += in1[i] * std::conj(in1[i]) * weights[i]; + in2_in2 += in2[i] * std::conj(in2[i]) * weights[i]; + } +#endif + + const double coherence12 = std::norm(in2_in1)/Util::calculateAbsoluteValue(in1_in1)/Util::calculateAbsoluteValue(in2_in2); + if( coherence12 > 1.0 - CommonParameters::EPS ){ + if( priorityOnFirst ){ + resp1 = out_in1 / in1_in1; + resp2 = std::complex(0.0,0.0); + }else{ + resp1 = std::complex(0.0,0.0); + resp2 = out_in2 / in2_in2; + } + return; + } + + const std::complex in1_in2 = std::conj(in2_in1); + const std::complex det = in1_in1 * in2_in2 - in1_in2 * in2_in1; + + resp1 = ( out_in1 * in2_in2 - out_in2 * in2_in1 ) / det; + resp2 = ( out_in2 * in1_in1 - out_in1 * in1_in2 ) / det; + +} + +// Calculate response function by the weighted leaset square method for bootstrap +void Analysis::calculateResponseFunctionByWLSForBootstrap( const int numSegments, const int* const segmentIndexes, + const std::complex* const out, const std::complex* const in1, const std::complex* const in2, + const double* const weights, std::complex& resp1, std::complex& resp2, const bool priorityOnFirst ) const{ + + std::complex out_in1(0.0, 0.0); + std::complex out_in2(0.0, 0.0); + std::complex in2_in1(0.0, 0.0); + std::complex in1_in1(0.0, 0.0); + std::complex in2_in2(0.0, 0.0); + +#ifdef _USE_OMP + int numThreads(1); + #pragma omp parallel + { + numThreads = omp_get_num_threads(); + } + std::complex* out_in1Thread = new std::complex[numThreads]; + std::complex* out_in2Thread = new std::complex[numThreads]; + std::complex* in2_in1Thread = new std::complex[numThreads]; + std::complex* in1_in1Thread = new std::complex[numThreads]; + std::complex* in2_in2Thread = new std::complex[numThreads]; + const std::complex czero = std::complex(0.0,0.0); + for( int iThread = 0; iThread < numThreads; ++iThread ){ + // Zero clear + out_in1Thread[iThread] = czero; + out_in2Thread[iThread] = czero; + in2_in1Thread[iThread] = czero; + in1_in1Thread[iThread] = czero; + in2_in2Thread[iThread] = czero; + } + int icount(0); + int iThread(0); + int iSeg(0); + #pragma omp parallel default(shared) private(icount, iThread, iSeg) + { + iThread = omp_get_thread_num(); + #pragma omp for + for( icount = 0; icount < numSegments; ++icount ){ + iSeg = segmentIndexes[icount]; + out_in1Thread[iThread] += out[iSeg] * std::conj(in1[iSeg]) * weights[iSeg]; + out_in2Thread[iThread] += out[iSeg] * std::conj(in2[iSeg]) * weights[iSeg]; + in2_in1Thread[iThread] += in2[iSeg] * std::conj(in1[iSeg]) * weights[iSeg]; + in1_in1Thread[iThread] += in1[iSeg] * std::conj(in1[iSeg]) * weights[iSeg]; + in2_in2Thread[iThread] += in2[iSeg] * std::conj(in2[iSeg]) * weights[iSeg]; + } + } + for( int iThread = 0; iThread < numThreads; ++iThread ){ + out_in1 += out_in1Thread[iThread]; + out_in2 += out_in2Thread[iThread]; + in2_in1 += in2_in1Thread[iThread]; + in1_in1 += in1_in1Thread[iThread]; + in2_in2 += in2_in2Thread[iThread]; + } + delete [] out_in1Thread; + delete [] out_in2Thread; + delete [] in2_in1Thread; + delete [] in1_in1Thread; + delete [] in2_in2Thread; +#else + for( int icount = 0; icount < numSegments; ++icount ){ + const int iSeg = segmentIndexes[icount]; + out_in1 += out[iSeg] * std::conj(in1[iSeg]) * weights[iSeg]; + out_in2 += out[iSeg] * std::conj(in2[iSeg]) * weights[iSeg]; + in2_in1 += in2[iSeg] * std::conj(in1[iSeg]) * weights[iSeg]; + in1_in1 += in1[iSeg] * std::conj(in1[iSeg]) * weights[iSeg]; + in2_in2 += in2[iSeg] * std::conj(in2[iSeg]) * weights[iSeg]; + } +#endif + + const double coherence12 = std::norm(in2_in1)/Util::calculateAbsoluteValue(in1_in1)/Util::calculateAbsoluteValue(in2_in2); + if( coherence12 > 1.0 - CommonParameters::EPS ){ + if( priorityOnFirst ){ + resp1 = out_in1 / in1_in1; + resp2 = std::complex(0.0,0.0); + }else{ + resp1 = std::complex(0.0,0.0); + resp2 = out_in2 / in2_in2; + } + return; + } + + const std::complex in1_in2 = std::conj(in2_in1); + const std::complex det = in1_in1 * in2_in2 - in1_in2 * in2_in1; + + resp1 = ( out_in1 * in2_in2 - out_in2 * in2_in1 ) / det; + resp2 = ( out_in2 * in1_in1 - out_in1 * in1_in2 ) / det; + +} + +// Calculate response function by the weighted remote reference method +double Analysis::calculateResponseFunctionByWLSRemoteReference(const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + const int numSegments, const double* const weights, std::complex* residuals, + std::complex& resp1, std::complex& resp2, double& coherence) const { + + const Control* const ptrControl = Control::getInstance(); + calculateResponseFunctionByWLSRemoteReferenceAux(numSegments, out, in1, in2, rr1, rr2, weights, resp1, resp2); + double Gvar(0.0); + double Gsyn(0.0); + double Gres(0.0); + double sumWeights(0.0); + +#ifdef _USE_OMP + int numThreads(1); +#pragma omp parallel + { + numThreads = omp_get_num_threads(); + } + double* GvarThread = new double[numThreads]; + double* GsynThread = new double[numThreads]; + double* GresThread = new double[numThreads]; + double* sumWeightsThread = new double[numThreads]; + for (int iThread = 0; iThread < numThreads; ++iThread) { + // Zero clear + GvarThread[iThread] = 0.0; + GsynThread[iThread] = 0.0; + GresThread[iThread] = 0.0; + sumWeightsThread[iThread] = 0.0; + } + int i(0); + int iThread(0); + std::complex outSyn(0.0, 0.0); +#pragma omp parallel default(shared) private(i, iThread, outSyn) + { + iThread = omp_get_thread_num(); +#pragma omp for + for (i = 0; i < numSegments; ++i) { + GvarThread[iThread] += std::norm(out[i]) * weights[i]; + outSyn = resp1 * in1[i] + resp2 * in2[i]; + GsynThread[iThread] += std::norm(outSyn) * weights[i]; + residuals[i] = out[i] - outSyn; + GresThread[iThread] += std::norm(residuals[i]) * weights[i]; + sumWeightsThread[iThread] += weights[i]; + } + } + for (int iThread = 0; iThread < numThreads; ++iThread) { + Gvar += GvarThread[iThread]; + Gsyn += GsynThread[iThread]; + Gres += GresThread[iThread]; + sumWeights += sumWeightsThread[iThread]; + } + delete[] GvarThread; + delete[] GsynThread; + delete[] GresThread; + delete[] sumWeightsThread; +#ifdef _DEBUG_WRITE + for (int i = 0; i < numSegments; ++i) { + std::cout << "iSeg weights residuals: " + << i << " " << weights[i] << " " << residuals[i] << std::endl; + } +#endif +#else + for (int i = 0; i < numSegments; ++i) { + Gvar += std::norm(out[i]) * weights[i]; + const std::complex outSyn = resp1 * in1[i] + resp2 * in2[i]; + Gsyn += std::norm(outSyn) * weights[i]; + residuals[i] = out[i] - outSyn; + Gres += std::norm(residuals[i]) * weights[i]; +#ifdef _DEBUG_WRITE + std::cout << "iSeg outSyn weights Gvar residuals Gres: " + << i << " " << outSyn << " " << weights[i] << " " << Gvar << " " << residuals[i] << " " << Gres << std::endl; +#endif + sumWeights += weights[i]; + } +#endif + + if (sumWeights < CommonParameters::EPS) { + Gvar = 0.0; + Gsyn = 0.0; + Gres = 0.0; + coherence = 0.0; + } + else { + Gvar /= sumWeights; + Gsyn /= sumWeights; + Gres /= sumWeights; + coherence = 1.0 - Gres / Gvar; +#ifdef _DEBUG_WRITE + std::cout << "coherence : " << coherence << " " << 1.0 - Gres / Gvar << std::endl; +#endif + } + + if (coherence > 1.0) { + coherence = 1.0; + } + else if (coherence < 0.0) { + coherence = 0.0; + } + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage(" Sum of weights: " + Util::toString(sumWeights)); + ptrOutputFiles->writeCvgMessage(" Squared coherence: " + Util::toString(coherence)); + std::ostringstream msg1; + msg1 << " Estimated response function: "; + msg1 << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp1.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1.imag() << ")"; + msg1 << ", (" << std::setw(12) << std::setprecision(4) << std::scientific << resp2.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp2.imag() << ")"; + ptrOutputFiles->writeCvgMessage(msg1.str()); + std::ostringstream msg2; + msg2 << " Amplitude of the estimated response function:"; + msg2 << std::setw(12) << std::setprecision(4) << std::scientific << std::abs(resp1) << "," + << std::setw(12) << std::setprecision(4) << std::scientific << std::abs(resp2); + ptrOutputFiles->writeCvgMessage(msg2.str()); + std::ostringstream msg3; + msg3 << " Phase(deg.) of the estimated response function:"; + msg3 << std::setw(7) << std::setprecision(1) << std::fixed << std::arg(resp1) * CommonParameters::RAD2DEG << "," + << std::setw(7) << std::setprecision(1) << std::fixed << std::arg(resp2) * CommonParameters::RAD2DEG; + ptrOutputFiles->writeCvgMessage(msg3.str()); + + return Gres; +} + +// Auxiliary function for calculating response function by the weighted remote reference method +void Analysis::calculateResponseFunctionByWLSRemoteReferenceAux(const int numSegments, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + const double* const weights, std::complex& resp1, std::complex& resp2) const { + + std::complex out_rr1(0.0, 0.0); + std::complex out_rr2(0.0, 0.0); + std::complex in2_rr1(0.0, 0.0); + std::complex in1_rr1(0.0, 0.0); + std::complex in2_rr2(0.0, 0.0); + std::complex in1_rr2(0.0, 0.0); + +#ifdef _USE_OMP + int numThreads(1); +#pragma omp parallel + { + numThreads = omp_get_num_threads(); + } + std::complex* out_rr1Thread = new std::complex[numThreads]; + std::complex* out_rr2Thread = new std::complex[numThreads]; + std::complex* in2_rr1Thread = new std::complex[numThreads]; + std::complex* in1_rr1Thread = new std::complex[numThreads]; + std::complex* in2_rr2Thread = new std::complex[numThreads]; + std::complex* in1_rr2Thread = new std::complex[numThreads]; + + const std::complex czero = std::complex(0.0, 0.0); + for (int iThread = 0; iThread < numThreads; ++iThread) { + // Zero clear + out_rr1Thread[iThread] = czero; + out_rr2Thread[iThread] = czero; + in2_rr1Thread[iThread] = czero; + in1_rr1Thread[iThread] = czero; + in2_rr2Thread[iThread] = czero; + in1_rr2Thread[iThread] = czero; + } + int i(0); + int iThread(0); +#pragma omp parallel default(shared) private(i, iThread) + { + iThread = omp_get_thread_num(); +#pragma omp for + for (i = 0; i < numSegments; ++i) { + out_rr1Thread[iThread] += out[i] * std::conj(rr1[i]) * weights[i]; + out_rr2Thread[iThread] += out[i] * std::conj(rr2[i]) * weights[i]; + in2_rr1Thread[iThread] += in2[i] * std::conj(rr1[i]) * weights[i]; + in1_rr1Thread[iThread] += in1[i] * std::conj(rr1[i]) * weights[i]; + in2_rr2Thread[iThread] += in2[i] * std::conj(rr2[i]) * weights[i]; + in1_rr2Thread[iThread] += in1[i] * std::conj(rr2[i]) * weights[i]; + } + } + for (int iThread = 0; iThread < numThreads; ++iThread) { + out_rr1 += out_rr1Thread[iThread]; + out_rr2 += out_rr2Thread[iThread]; + in2_rr1 += in2_rr1Thread[iThread]; + in1_rr1 += in1_rr1Thread[iThread]; + in2_rr2 += in2_rr2Thread[iThread]; + in1_rr2 += in1_rr2Thread[iThread]; + } + delete[] out_rr1Thread; + delete[] out_rr2Thread; + delete[] in2_rr1Thread; + delete[] in1_rr1Thread; + delete[] in2_rr2Thread; + delete[] in1_rr2Thread; +#else + for (int i = 0; i < numSegments; ++i) { + out_rr1 += out[i] * std::conj(rr1[i]) * weights[i]; + out_rr2 += out[i] * std::conj(rr2[i]) * weights[i]; + in2_rr1 += in2[i] * std::conj(rr1[i]) * weights[i]; + in1_rr1 += in1[i] * std::conj(rr1[i]) * weights[i]; + in2_rr2 += in2[i] * std::conj(rr2[i]) * weights[i]; + in1_rr2 += in1[i] * std::conj(rr2[i]) * weights[i]; + } +#endif + + const std::complex det = in1_rr1 * in2_rr2 - in1_rr2 * in2_rr1; + + resp1 = (out_rr1 * in2_rr2 - out_rr2 * in2_rr1) / det; + resp2 = (out_rr2 * in1_rr1 - out_rr1 * in1_rr2) / det; + + //double Gvar(0.0); + //double Gsyn(0.0); + //for (int i = 0; i < numSegments; ++i) { + // Gvar += std::norm(out[i]) * weights[i]; + // const std::complex outSyn = resp1 * in1[i] + resp2 * in2[i]; + // Gsyn += std::norm(outSyn) * weights[i]; + //} + + //double coherence = Gsyn / Gvar; + //if (coherence > 1.0) { + // coherence = 1.0; + //} + //else if (coherence < 0.0) { + // coherence = 0.0; + //} + //return coherence; + +} + +// Calculate response function by the weighted remote reference method for bootstrap +void Analysis::calculateResponseFunctionByWLSRemoteReferenceForBootstrap(const int numSegments, const int* const segmentIndexes, + const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + const double* const weights, std::complex& resp1, std::complex& resp2) const { + + + std::complex out_rr1(0.0, 0.0); + std::complex out_rr2(0.0, 0.0); + std::complex in2_rr1(0.0, 0.0); + std::complex in1_rr1(0.0, 0.0); + std::complex in2_rr2(0.0, 0.0); + std::complex in1_rr2(0.0, 0.0); + +#ifdef _USE_OMP + int numThreads(1); +#pragma omp parallel + { + numThreads = omp_get_num_threads(); + } + std::complex* out_rr1Thread = new std::complex[numThreads]; + std::complex* out_rr2Thread = new std::complex[numThreads]; + std::complex* in2_rr1Thread = new std::complex[numThreads]; + std::complex* in1_rr1Thread = new std::complex[numThreads]; + std::complex* in2_rr2Thread = new std::complex[numThreads]; + std::complex* in1_rr2Thread = new std::complex[numThreads]; + + const std::complex czero = std::complex(0.0, 0.0); + for (int iThread = 0; iThread < numThreads; ++iThread) { + // Zero clear + out_rr1Thread[iThread] = czero; + out_rr2Thread[iThread] = czero; + in2_rr1Thread[iThread] = czero; + in1_rr1Thread[iThread] = czero; + in2_rr2Thread[iThread] = czero; + in1_rr2Thread[iThread] = czero; + } + int icount(0); + int iThread(0); + int iSeg(0); +#pragma omp parallel default(shared) private(icount, iThread, iSeg) + { + iThread = omp_get_thread_num(); +#pragma omp for + for (icount = 0; icount < numSegments; ++icount) { + iSeg = segmentIndexes[icount]; + out_rr1Thread[iThread] += out[iSeg] * std::conj(rr1[iSeg]) * weights[iSeg]; + out_rr2Thread[iThread] += out[iSeg] * std::conj(rr2[iSeg]) * weights[iSeg]; + in2_rr1Thread[iThread] += in2[iSeg] * std::conj(rr1[iSeg]) * weights[iSeg]; + in1_rr1Thread[iThread] += in1[iSeg] * std::conj(rr1[iSeg]) * weights[iSeg]; + in2_rr2Thread[iThread] += in2[iSeg] * std::conj(rr2[iSeg]) * weights[iSeg]; + in1_rr2Thread[iThread] += in1[iSeg] * std::conj(rr2[iSeg]) * weights[iSeg]; + } + } + for (int iThread = 0; iThread < numThreads; ++iThread) { + out_rr1 += out_rr1Thread[iThread]; + out_rr2 += out_rr2Thread[iThread]; + in2_rr1 += in2_rr1Thread[iThread]; + in1_rr1 += in1_rr1Thread[iThread]; + in2_rr2 += in2_rr2Thread[iThread]; + in1_rr2 += in1_rr2Thread[iThread]; + } + delete[] out_rr1Thread; + delete[] out_rr2Thread; + delete[] in2_rr1Thread; + delete[] in1_rr1Thread; + delete[] in2_rr2Thread; + delete[] in1_rr2Thread; +#else + for (int icount = 0; icount < numSegments; ++icount) { + const int iSeg = segmentIndexes[icount]; + out_rr1 += out[iSeg] * std::conj(rr1[iSeg]) * weights[iSeg]; + out_rr2 += out[iSeg] * std::conj(rr2[iSeg]) * weights[iSeg]; + in2_rr1 += in2[iSeg] * std::conj(rr1[iSeg]) * weights[iSeg]; + in1_rr1 += in1[iSeg] * std::conj(rr1[iSeg]) * weights[iSeg]; + in2_rr2 += in2[iSeg] * std::conj(rr2[iSeg]) * weights[iSeg]; + in1_rr2 += in1[iSeg] * std::conj(rr2[iSeg]) * weights[iSeg]; + } +#endif + + const std::complex det = in1_rr1 * in2_rr2 - in1_rr2 * in2_rr1; + + resp1 = (out_rr1 * in2_rr2 - out_rr2 * in2_rr1) / det; + resp2 = (out_rr2 * in1_rr1 - out_rr1 * in1_rr2) / det; + +} + +// Get pointer to M-estimators +RobustWeight* Analysis::getPointerToRobustWeight(const int iRobustWeight) const { + return m_robustWeight[iRobustWeight]; +} + +// Output spectral density functions to cvg file +void Analysis::outputSpectralDensityFunctionsToCvgFile( const int numSegments, const double timeLength, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, const double* const weights ) const{ + + std::complex out_in1(0.0, 0.0); + std::complex out_in2(0.0, 0.0); + std::complex in2_in1(0.0, 0.0); + std::complex in1_in1(0.0, 0.0); + std::complex in2_in2(0.0, 0.0); + std::complex out_out(0.0, 0.0); + double sumOfWeights(0.0); + for( int i = 0; i < numSegments; ++i ){ + out_in1 += out[i] * std::conj(in1[i]) * weights[i]; + out_in2 += out[i] * std::conj(in2[i]) * weights[i]; + in2_in1 += in2[i] * std::conj(in1[i]) * weights[i]; + in1_in1 += in1[i] * std::conj(in1[i]) * weights[i]; + in2_in2 += in2[i] * std::conj(in2[i]) * weights[i]; + out_out += out[i] * std::conj(out[i]) * weights[i]; + sumOfWeights += weights[i]; + } + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeCvgMessage(" Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + ptrOutputFiles->writeWarningMessage("Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + } + + const double factor = 2.0 / timeLength / sumOfWeights; + out_in1 *= factor; + out_in2 *= factor; + in2_in1 *= factor; + in1_in1 *= factor; + in2_in2 *= factor; + out_out *= factor; + + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(out_in1)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(out_in2)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in2_in1)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in1_in1)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in2_in2)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(out_out)); + +} + +// Output spectral density functions to cvg file +void Analysis::outputSpectralDensityFunctionsToCvgFile( const int numSegments, const double timeLength, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2 ) const{ + + std::complex out_rr1(0.0, 0.0); + std::complex out_rr2(0.0, 0.0); + std::complex in1_rr1(0.0, 0.0); + std::complex in1_rr2(0.0, 0.0); + std::complex in2_rr1(0.0, 0.0); + std::complex in2_rr2(0.0, 0.0); + double sumOfWeights(0.0); + for( int i = 0; i < numSegments; ++i ){ + out_rr1 += out[i] * std::conj(rr1[i]); + out_rr2 += out[i] * std::conj(rr2[i]); + in1_rr1 += in1[i] * std::conj(rr1[i]); + in1_rr2 += in1[i] * std::conj(rr2[i]); + in2_rr1 += in2[i] * std::conj(rr1[i]); + in2_rr2 += in2[i] * std::conj(rr2[i]); + sumOfWeights += 1.0; + } + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeCvgMessage(" Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + ptrOutputFiles->writeWarningMessage("Sum of weights (" + Util::toString(sumOfWeights) + ") is too small"); + } + + const double factor = 2.0 / timeLength / sumOfWeights; + out_rr1 *= factor; + out_rr2 *= factor; + in1_rr1 *= factor; + in1_rr2 *= factor; + in2_rr1 *= factor; + in2_rr2 *= factor; + + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(out_rr1)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(out_rr2)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in1_rr1)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in1_rr2)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in2_rr1)); + ptrOutputFiles->writeCvgMessage("Spectral density function : " + Util::toString(in2_rr2)); +} + +// Merge sections +void Analysis::mergeSections( std::vector& dataFileSets ) const{ + + const Control* const ptrControl = Control::getInstance(); + std::vector dataFileSetsAfterMerge; + const int numSectionsAfterMerge = ptrControl->getNumRangeOfSectionsForMerge(); + if( numSectionsAfterMerge < 1 ){ + return; + } + dataFileSetsAfterMerge.reserve(numSectionsAfterMerge); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Merge sections"); + + for( int iSectionAfterMerge = 0; iSectionAfterMerge < numSectionsAfterMerge; ++iSectionAfterMerge ){ + const std::pair rangeOfSections = ptrControl->getRangeOfSectionsForMerge(iSectionAfterMerge); + int numDataAfterMerge(0); + int iSection(0); + for( std::vector::const_iterator itrOrg = dataFileSets.begin(); itrOrg != dataFileSets.end(); ++itrOrg, ++iSection ){ + if( iSection >= rangeOfSections.first && iSection <= rangeOfSections.second ){ + const int numDataOrg = itrOrg->numDataPoints; + numDataAfterMerge += numDataOrg; + } + } + std::ostringstream oss; + oss << "Merged section " << iSectionAfterMerge << " : number of data after merging is " << numDataAfterMerge; + ptrOutputFiles->writeLogMessage(oss.str()); + CommonParameters::DataFileSet dataFileSetNew; + dataFileSetNew.numDataPoints = numDataAfterMerge; + const int numChannels = ptrControl->getNumberOfChannels(); + dataFileSetNew.dataFile.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + CommonParameters::DataFile dataFileNew; + dataFileNew.fileName = "merged_section_" + Util::toString(iSectionAfterMerge) + "_channel_" + Util::toString(iChan); + dataFileNew.numSkipData = 0; + dataFileNew.data = new double [numDataAfterMerge]; + const std::pair rangeOfSections = ptrControl->getRangeOfSectionsForMerge(iSectionAfterMerge); + int iSection(0); + int dataCounter(0); + for( std::vector::const_iterator itrOrg = dataFileSets.begin(); itrOrg != dataFileSets.end(); ++itrOrg, ++iSection ){ + if( iSection >= rangeOfSections.first && iSection <= rangeOfSections.second ){ + const int numDataOrg = itrOrg->numDataPoints; + for( int i = 0; i < numDataOrg; ++i, ++dataCounter ){ + dataFileNew.data[dataCounter] = itrOrg->dataFile[iChan].data[i]; + } + } + } + assert( dataCounter == numDataAfterMerge ); + dataFileSetNew.dataFile.push_back(dataFileNew); + } + dataFileSetsAfterMerge.push_back(dataFileSetNew); + } + + // Delete allocated memory for time-series data + for( std::vector::const_iterator itrDataFileSet = dataFileSets.begin(); itrDataFileSet != dataFileSets.end(); ++itrDataFileSet ){ + for( std::vector::const_iterator itrDataFile = itrDataFileSet->dataFile.begin(); itrDataFile != itrDataFileSet->dataFile.end(); ++itrDataFile ){ + delete [] itrDataFile->data; + } + } + + dataFileSets.swap(dataFileSetsAfterMerge); + +} +// Calculate rotated fields +void Analysis::calculateRotatedFields( const int numSegmentsTotal, std::complex** ftval ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Calculate rotated fields"); + + const Control* const ptrControl = Control::getInstance(); + const double rotationAngle = ptrControl->getRotationAngle(); + + // Output variables + const int numOutputVariables = ptrControl->getNumOutputVariables(); + for( int i = 0; i < numOutputVariables / 2; ++i ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::OUTPUT, i); + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::OUTPUT, i+1); + const double azimuth0 = ptrControl->getAzimuth(iChan0); + const double azimuth1 = ptrControl->getAzimuth(iChan1); + if( fabs(azimuth0 - azimuth1) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Measured directions of channels " + Util::toString(iChan0) + + " and " + Util::toString(iChan1) + " are the same (" + Util::toString(azimuth0) + ")"); + } + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const std::complex v0 = ftval[iChan0][iSeg]; + const std::complex v1 = ftval[iChan1][iSeg]; + ftval[iChan0][iSeg] = Util::calculateRotatedField( azimuth0, azimuth1, rotationAngle, v0, v1 ); + ftval[iChan1][iSeg] = Util::calculateRotatedField( azimuth0, azimuth1, rotationAngle + 90, v0, v1 ); + } + } + // Input variables + const int numInputVariables = ptrControl->getNumInputVariables(); + for( int i = 0; i < numInputVariables / 2; ++i ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::INPUT, i); + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::INPUT, i+1); + const double azimuth0 = ptrControl->getAzimuth(iChan0); + const double azimuth1 = ptrControl->getAzimuth(iChan1); + if( fabs(azimuth0 - azimuth1) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Measured directions of channels " + Util::toString(iChan0) + + " and " + Util::toString(iChan1) + " are the same (" + Util::toString(azimuth0) + ")"); + } + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const std::complex v0 = ftval[iChan0][iSeg]; + const std::complex v1 = ftval[iChan1][iSeg]; + ftval[iChan0][iSeg] = Util::calculateRotatedField( azimuth0, azimuth1, rotationAngle, v0, v1 ); + ftval[iChan1][iSeg] = Util::calculateRotatedField( azimuth0, azimuth1, rotationAngle + 90, v0, v1 ); + } + } + // Remote reference variables + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + for( int i = 0; i < numRemoteReferenceVariables / 2; ++i ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, i); + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, i+1); + const double azimuth0 = ptrControl->getAzimuth(iChan0); + const double azimuth1 = ptrControl->getAzimuth(iChan1); + if( fabs(azimuth0 - azimuth1) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Measured directions of channels " + Util::toString(iChan0) + + " and " + Util::toString(iChan1) + " are the same (" + Util::toString(azimuth0) + ")"); + } + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const std::complex v0 = ftval[iChan0][iSeg]; + const std::complex v1 = ftval[iChan1][iSeg]; + ftval[iChan0][iSeg] = Util::calculateRotatedField( azimuth0, azimuth1, rotationAngle, v0, v1 ); + ftval[iChan1][iSeg] = Util::calculateRotatedField( azimuth0, azimuth1, rotationAngle + 90, v0, v1 ); + } + } + +} + +// Output average spectrum +void Analysis::modifyTimeSeriesBasedOnEOFAnalysis(std::vector& dataFileSets) { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Modify time-series data based on the EOF analysis"); + + const Control* const ptrControl = Control::getInstance(); + const double samplingFrequency = ptrControl->getSamplingFrequency(); + + int iSection(0); + int icount(0); + double matrix[3] = { 0.0, 0.0, 0.0 }; + for (std::vector::iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSection) { + const int numData = itr->numDataPoints; + for (int iChan = 0; iChan < 2; ++iChan) { + ptrOutputFiles->writeLogMessage("Secton " + Util::toString(iSection) + ", Channel " + Util::toString(iChan)); + // Make new data records by subtracting mean + const double mean = Util::calculateMeanValue(numData, itr->dataFile[iChan].data); + ptrOutputFiles->writeLogMessage("Subtract mean (" + Util::toString(mean) + ")"); + for (int i = 0; i < numData; ++i) { + itr->dataFile[iChan].data[i] -= mean; + } + } + for (int i = 0; i < numData; ++i) { + matrix[0] += pow(itr->dataFile[0].data[i], 2); + matrix[2] += pow(itr->dataFile[1].data[i], 2); + matrix[1] += itr->dataFile[0].data[i] * itr->dataFile[1].data[i]; + ++icount; + } +#ifdef _DEBUG_WRITE + const int numChannels = ptrControl->getNumberOfChannels(); + for (int iChan = 0; iChan < numChannels; ++iChan) { + std::ostringstream oss; + oss << "ts_sect_" << iSection << "_chan_" << iChan << "_before_EOF.txt"; + std::ofstream ofs; + ofs.open(oss.str().c_str(), std::ios::out); + if (ofs.fail()) { + ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); + } + for (int i = 0; i < numData; ++i) { + const double elapsedTime = static_cast(i) / samplingFrequency; + ofs << std::setprecision(8) << std::scientific << itr->dataFile[iChan].data[i] << std::endl; + } + ofs.close(); + } +#endif + } + matrix[0] /= static_cast(icount); + matrix[1] /= static_cast(icount); + matrix[2] /= static_cast(icount); + // Calcualte all eigenvalues and eigenvectors of a real symmetric + double eigenVectors[4] = { 0.0, 0.0, 0.0, 0.0 }; + double eigenValues[2] = { 0.0, 0.0 }; + Util::calculateEigenValuesAndVectorsOfRealSymmetricMatrix(2, matrix, eigenValues, eigenVectors); + ptrOutputFiles->writeLogMessage("The first mode: eigen value = " + Util::toString(eigenValues[0]) + + ", eigen vector = (" + Util::toString(eigenVectors[0]) + ", " + Util::toString(eigenVectors[1]) + ")"); + ptrOutputFiles->writeLogMessage("The second mode: eigen value = " + Util::toString(eigenValues[1]) + + ", eigen vector = (" + Util::toString(eigenVectors[2]) + ", " + Util::toString(eigenVectors[3]) + ")"); + iSection = 0; + for (std::vector::iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSection) { + const int numData = itr->numDataPoints; + for (int i = 0; i < numData; ++i) { + const double val0 = itr->dataFile[0].data[i]; + const double val1 = itr->dataFile[1].data[i]; + itr->dataFile[0].data[i] = val0 * eigenVectors[0] + val1 * eigenVectors[1]; + itr->dataFile[1].data[i] = val0 * eigenVectors[2] + val1 * eigenVectors[3]; + } +#ifdef _DEBUG_WRITE + const int numChannels = ptrControl->getNumberOfChannels(); + for (int iChan = 0; iChan < numChannels; ++iChan) { + std::ostringstream oss; + oss << "ts_sect_" << iSection << "_chan_" << iChan << "_after_EOF.txt"; + std::ofstream ofs; + ofs.open(oss.str().c_str(), std::ios::out); + if (ofs.fail()) { + ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); + } + for (int i = 0; i < numData; ++i) { + const double elapsedTime = static_cast(i) / samplingFrequency; + ofs << std::setprecision(8) << std::scientific << itr->dataFile[iChan].data[i] << std::endl; + } + ofs.close(); + } +#endif + } + +} + +// Output average spectrum +void Analysis::outputAverageSpectrum( std::complex** cdata, const int numData, const int section, + const bool afterPreprocessing, const bool afterCalibration ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ostringstream fileNameForAverage; + if(afterPreprocessing){ + if(afterCalibration){ + fileNameForAverage << "stat_freq_average_after_preprocessing_sect" << section <<".csv"; + }else{ + fileNameForAverage << "stat_freq_average_after_preprocessing_before_calibration_sect" << section <<".csv"; + } + }else{ + if(afterCalibration){ + fileNameForAverage << "stat_freq_average_sect" << section <<".csv"; + }else{ + fileNameForAverage << "stat_freq_average_before_calibration_sect" << section <<".csv"; + } + } + std::ofstream ofsAvg; + ofsAvg.open( fileNameForAverage.str().c_str(), std::ios::out ); + if( ofsAvg.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileNameForAverage.str() ); + } + // Write header + ofsAvg << "frequency"; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ofsAvg << ",auto_power_" << iChan; + } + ofsAvg << std::endl; + + const double samplingFrequency = ptrControl->getSamplingFrequency(); + const double T = static_cast(numData) / samplingFrequency; + const Control::ParamsForFreqDomainEvaluation params = ptrControl->getParamsForFreqDomainEvaluation(); + const int numSegmentLengths = ptrControl->getNumSegmentLengths(); + + const double logFreqStartAvg = log10(params.startOutputFrequency); + const double logFreqEndAvg = log10(params.endOutputFrequency); + const double logFreqIncAvg = ( logFreqEndAvg - logFreqStartAvg ) / static_cast(params.numOfOutputFrequencyForAverage); + int outputFreqIndexPre = -1; + int counterOfFreqs(0); + double logFreqAverage = 0.0;// Zero clear + std::vector logPowerAverage; + logPowerAverage.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + logPowerAverage.push_back(0.0);// Zero clear + } + for( int i = 1; i < numData / 2 + 1; ++i ){ + const double freq = static_cast(i) / static_cast(numData) * samplingFrequency; + if( freq < params.startOutputFrequency || freq > params.endOutputFrequency ){ + continue; + } + const double logFreq = log10(freq); + logFreqAverage += logFreq; + const double factor = ( i == 0 || i == numData / 2 ) ? 1.0 : 2.0; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + const double power = factor * std::norm(cdata[iChan][i]) * T; + logPowerAverage[iChan] += log10(power); + } + ++counterOfFreqs; + const int outputFreqIndexCur = static_cast( std::floor( ( logFreq - logFreqStartAvg ) / logFreqIncAvg ) ); + if( outputFreqIndexCur <= outputFreqIndexPre ){ + continue; + } + logFreqAverage /= static_cast(counterOfFreqs); + ofsAvg << std::setw(10) << std::scientific << pow(10,logFreqAverage); + logFreqAverage = 0.0; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + logPowerAverage[iChan] /= static_cast(counterOfFreqs); + ofsAvg << ", "; + ofsAvg << std::setw(10) << std::scientific << pow(10,logPowerAverage[iChan]); + logPowerAverage[iChan] = 0.0; + } + ofsAvg << std::endl; + counterOfFreqs = 0; + outputFreqIndexPre = outputFreqIndexCur; + } + ofsAvg.close(); + +} + +// Output average spectrum for the frequencies where response functions are estimated +// @note This function has not yet been debugged +void Analysis::outputAverageSpectrum2( std::complex** cdata, const int numData, const int section, + const bool afterPreprocessing, const bool afterCalibration ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ostringstream fileNameForAverage; + if(afterPreprocessing){ + if(afterCalibration){ + fileNameForAverage << "stat_freq_average_after_preprocessing_sect" << section <<".csv"; + }else{ + fileNameForAverage << "stat_freq_average_after_preprocessing_before_calibration_sect" << section <<".csv"; + } + }else{ + if(afterCalibration){ + fileNameForAverage << "stat_freq_average_sect" << section <<".csv"; + }else{ + fileNameForAverage << "stat_freq_average_before_calibration_sect" << section <<".csv"; + } + } + std::ofstream ofsAvg; + ofsAvg.open( fileNameForAverage.str().c_str(), std::ios::out ); + if( ofsAvg.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileNameForAverage.str() ); + } + // Write header + ofsAvg << "frequency"; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ofsAvg << ",auto_power_" << iChan; + } + ofsAvg << std::endl; + + const double samplingFrequency = ptrControl->getSamplingFrequency(); + const double T = static_cast(numData) / samplingFrequency; + const Control::ParamsForFreqDomainEvaluation params = ptrControl->getParamsForFreqDomainEvaluation(); + const int numSegmentLengths = ptrControl->getNumSegmentLengths(); + std::vector targetFreqs; + for( int iSegLen = 0; iSegLen < numSegmentLengths; ++iSegLen ){ + const int segmentLength = ptrControl->getSegmentLength(iSegLen); + const int numTargetFreqsInSegment = ptrControl->getNumTargetFrequencyInSegment(iSegLen); + for( int iFreq = 0; iFreq < numTargetFreqsInSegment; ++iFreq ){ + ptrOutputFiles->writeLogMessage("-------------------------------------------------------------------------------",false); + const int freqDegree = ptrControl->getTargetFrequencyDegreesInSegment(iSegLen, iFreq); + const double freqTarget = samplingFrequency * static_cast(freqDegree) / static_cast(segmentLength); + targetFreqs.push_back(freqTarget); + } + } + + const int numOfTargetFreqs = static_cast(targetFreqs.size()); + int* ids = new int[numData / 2]; + double* diffFreqs = new double[numData / 2]; + for( int iTargetFreqs = 0; iTargetFreqs < numOfTargetFreqs; ++iTargetFreqs ){ + int counter(0); + for( int i = 1; i < numData / 2 + 1; ++i ){ + const double freq = static_cast(i) / static_cast(numData) * samplingFrequency; + //if( iTargetFreqs + 1 < numOfTargetFreqs && freq >= targetFreqs[iTargetFreqs + 1] ){ + // // Exclude the frequencies larger than or equal to the next target frequency + // break; + //} + //if( iTargetFreqs > 0 && freq <= targetFreqs[iTargetFreqs - 1] ){ + // // Exclude the frequencies lest than or equal to the previous target frequency + // break; + //} + ids[i] = i; + diffFreqs[i] = fabs(freq - targetFreqs[iTargetFreqs]); + ++counter; + } + Util::quickSort(counter, ids, diffFreqs); + int numForAverage = params.numOfOutputFrequencyForAverage; + if( counter < numForAverage ){ + numForAverage = counter; + } + std::vector logPowerAverage; + logPowerAverage.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + logPowerAverage.push_back(0.0);// Zero clear + } + for( int iSample = 0; iSample < numForAverage; ++iSample ){ + for( int iChan = 0; iChan < numChannels; ++iChan ){ + const int index = ids[iSample]; + const double power = 2.0 * std::norm(cdata[iChan][index]) * T; + logPowerAverage[iChan] += log10(power); + } + } + if( numForAverage > 1 ){ + ofsAvg << targetFreqs[iTargetFreqs] << std::endl; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + logPowerAverage[iChan] /= static_cast(numForAverage); + ofsAvg << ", "; + ofsAvg << std::setw(10) << std::scientific << pow(10,logPowerAverage[iChan]); + } + ofsAvg << std::endl; + } + } + delete [] ids; + delete [] diffFreqs; + +} + +// Output spectrum +void Analysis::outputSpectrum( std::complex** cdata, const int numData, const int section, + const bool afterPreprocessing, const bool afterCalibration ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumInputVariables(); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + const double samplingFrequency = ptrControl->getSamplingFrequency(); + const double T = static_cast(numData) / samplingFrequency; + const Control::ParamsForFreqDomainEvaluation params = ptrControl->getParamsForFreqDomainEvaluation(); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ostringstream fileName; + if(afterPreprocessing){ + if(afterCalibration){ + fileName << "stat_freq_after_preprocessing_sect" << section <<".csv"; + }else{ + fileName << "stat_freq_after_preprocessing_before_calibration_sect" << section <<".csv"; + } + }else{ + if(afterCalibration){ + fileName << "stat_freq_sect" << section <<".csv"; + }else{ + fileName << "stat_freq_before_calibration_sect" << section <<".csv"; + } + } + std::ofstream ofs; + ofs.open( fileName.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileName.str() ); + } + // Write header + ofs << "index,frequency"; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ofs << ",amplitude_" << iChan; + ofs << ",phase_" << iChan; + ofs << ",power_" << iChan; + } + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + for( int iRR = 0; iRR < numRemoteReferenceVariables; ++iRR ){ + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, iRR); + ofs << ",cross_power_gain_" << iChan0 << "_" << iChan1; + ofs << ",cross_power_phase_" << iChan0 << "_" << iChan1; + } + } + for( int iInp = 0; iInp < numInputVariables; ++iInp ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + for( int iRR = 0; iRR < numRemoteReferenceVariables; ++iRR ){ + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, iRR); + ofs << ",cross_power_gain_" << iChan0 << "_" << iChan1; + ofs << ",cross_power_phase_" << iChan0 << "_" << iChan1; + } + } + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + for( int iInp = 0; iInp < numInputVariables; ++iInp ){ + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + ofs << ",cross_power_gain_" << iChan0 << "_" << iChan1; + ofs << ",cross_power_phase_" << iChan0 << "_" << iChan1; + } + } + ofs << std::endl; + + const double logFreqStart = log10(params.startOutputFrequency); + const double logFreqEnd = log10(params.endOutputFrequency); + const double logFreqInc = ( logFreqEnd - logFreqStart ) / static_cast(params.numOfOutputFrequency); + int outputFreqIndexPre = -1; + for( int i = 1; i < numData / 2 + 1; ++i ){ + const double freq = static_cast(i) / static_cast(numData) * samplingFrequency; + if( freq < params.startOutputFrequency || freq > params.endOutputFrequency ){ + continue; + } + const double logFreq = log10(freq); + const int outputFreqIndexCur = static_cast( std::floor( ( logFreq - logFreqStart ) / logFreqInc ) ); + if( outputFreqIndexCur <= outputFreqIndexPre ){ + continue; + } + outputFreqIndexPre = outputFreqIndexCur; + const double factor = ( i == 0 || i == numData / 2 ) ? 1.0 : 2.0; + ofs << i << "," << freq; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + const double amp = std::abs(cdata[iChan][i]) * 0.5 * T; + const double phs = std::arg(cdata[iChan][i]) * CommonParameters::RAD2DEG; + const double power = factor * std::norm(cdata[iChan][i]) * T; + ofs << "," << std::setprecision(10) << std::scientific << amp; + ofs << "," << std::setprecision(10) << std::scientific << phs; + ofs << "," << std::setprecision(10) << std::scientific << power; + } + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + for( int iRR = 0; iRR < numRemoteReferenceVariables; ++iRR ){ + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, iRR); + std::complex cross = factor / T * cdata[iChan0][i] * std::conj(cdata[iChan1][i]); + ofs << "," << std::setprecision(10) << std::scientific << std::abs(cross); + ofs << "," << std::setprecision(10) << std::scientific << std::arg(cross) * CommonParameters::RAD2DEG; + } + } + for( int iInp = 0; iInp < numInputVariables; ++iInp ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + for( int iRR = 0; iRR < numRemoteReferenceVariables; ++iRR ){ + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, iRR); + std::complex cross = factor / T * cdata[iChan0][i] * std::conj(cdata[iChan1][i]); + ofs << "," << std::setprecision(10) << std::scientific << std::abs(cross); + ofs << "," << std::setprecision(10) << std::scientific << std::arg(cross) * CommonParameters::RAD2DEG; + } + } + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + const int iChan0 = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + for( int iInp = 0; iInp < numInputVariables; ++iInp ){ + const int iChan1 = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + std::complex cross = factor / T * cdata[iChan0][i] * std::conj(cdata[iChan1][i]); + ofs << "," << std::setprecision(10) << std::scientific << std::abs(cross); + ofs << "," << std::setprecision(10) << std::scientific << std::arg(cross) * CommonParameters::RAD2DEG; + } + } + ofs << std::endl; + } + ofs.close(); + +} + +// Output frequency-domain data +void Analysis::outputFrequencyDomainData( const int iSegLen, const int freqDegree, const int numSegmentsTotal, std::complex** ftval ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Output frequency-domain data"); + + const Control* const ptrControl = Control::getInstance(); + for( int iChan = 0; iChan < ptrControl->getNumberOfChannels(); ++iChan ){ + std::ostringstream fileName; + fileName << "freq_domain_data_segm_" << iSegLen << "_index_" << freqDegree << "_chan_" << iChan << ".csv"; + std::ofstream ofs; + ofs.open( fileName.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeLogMessage("File open error !! : " + fileName.str()); + } + ofs << "real,imaginary" << std::endl; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + ofs << std::setprecision(12) << std::scientific << ftval[iChan][iSeg].real() << ","; + ofs << std::setprecision(12) << std::scientific << ftval[iChan][iSeg].imag() << std::endl; + } + ofs.close(); + } + +} + +// Output time-series data +void Analysis::outputTimeSeriesData( const std::vector& dataFileSets, const bool afterPreprocessing ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if(afterPreprocessing){ + ptrOutputFiles->writeLogMessage("Output time-series data after preprocessing"); + }else{ + ptrOutputFiles->writeLogMessage("Output time-series data"); + } + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + int iSection(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSection ){ + const int numData = itr->numDataPoints; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + // Output time serieas + if( ptrControl->doesOutputTimeSeriesToCsv() ){ + std::ostringstream oss; + if(afterPreprocessing){ + oss << "time_series_after_preprocessing_sect_" << iSection << "_chan_" << iChan << ".csv"; + }else{ + oss << "time_series_sect_" << iSection << "_chan_" << iChan << ".csv"; + } + std::ofstream ofs; + ofs.open( oss.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); + } + for( int i = 0; i < numData; ++i ){ + ofs << std::setprecision(12) << std::scientific << itr->dataFile[iChan].data[i] << std::endl; + } + ofs.close(); + } + } + } + +} + +// Evaluate characteristics of time-series data prior to the estimation of the response functions +void Analysis::outputCalibratedTimeSeriesData(const std::vector& dataFileSets) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Output calibrated time-series data"); + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + const double samplingFrequency = ptrControl->getSamplingFrequency(); + + int section(0); + for (std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++section) { + const int numData = itr->numDataPoints; + int numDataForFFT(-1); + for (int i = 1; i < 1000; ++i) { + const int vpow2 = static_cast(pow(2, i)); + if (vpow2 >= numData) { + numDataForFFT = vpow2; + break; + } + } + std::complex** cdata = new std::complex*[numChannels]; + for (int iChan = 0; iChan < numChannels; ++iChan) { + // FFT + cdata[iChan] = new std::complex[numDataForFFT]; + for (int i = 0; i < numData; ++i) { + cdata[iChan][i] = std::complex(itr->dataFile[iChan].data[i], 0.0); + } + for (int i = numData; i < numDataForFFT; ++i) { + cdata[iChan][i] = std::complex(0.0, 0.0); + } + Util::fourierTransform(numDataForFFT, cdata[iChan]); + // Stop to write warning otherwise huge number of warnings can be outputed because the frequency + // ranges of calibration files are usually too narrow to cover the whole frequency range. + ptrOutputFiles->stopToWriteWarningMessage(); + // Calibration + cdata[iChan][0] *= m_calibrationFunctions[iChan].getFactor();// Frequency = 0 (Hz) + for (int i = 1; i < numDataForFFT / 2 + 1; ++i) { + // Exclude frequency = 0 (Hz) because log(frequency) is caculated for calibration correcton + const double freq = static_cast(i) / static_cast(numDataForFFT) * samplingFrequency; + calibrationCorrection(iChan, 1, freq, &cdata[iChan][i], false, false); + } + ptrOutputFiles->restartToWriteWarningMessage(); + } + // Rotate + calculateRotatedFields(numDataForFFT, cdata); + for (int iChan = 0; iChan < numChannels; ++iChan) { + // Inverse FFT + Util::inverseFourierTransform(numDataForFFT, cdata[iChan]); + // Output calibrated time series + std::ostringstream oss; + oss << "time_series_calibrated_sect_" << section << "_chan_" << iChan << ".csv"; + std::ofstream ofs; + ofs.open(oss.str().c_str(), std::ios::out); + if (ofs.fail()) { + ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); + } + for (int i = 0; i < numData; ++i) { + ofs << std::setprecision(12) << std::scientific << cdata[iChan][i].real() << std::endl; + } + ofs.close(); + // Release memory + delete[] cdata[iChan]; + } + // Release memory + delete[] cdata; + } + +} + +// Evaluate characteristics of time-series data prior to the estimation of the response functions +void Analysis::priorEvaluationOfTimeSeriesData( const int interval, const std::vector& dataFileSets, + const bool afterPreprocessing ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if(afterPreprocessing){ + ptrOutputFiles->writeLogMessage("Perform prior evaluation of time-domain characteristics after preprocessing"); + }else{ + ptrOutputFiles->writeLogMessage("Perform prior evaluation of time-domain characteristics"); + } + + const Control* const ptrControl = Control::getInstance(); + const double samplingFrequency = ptrControl->getSamplingFrequency(); + + const int numChannels = ptrControl->getNumberOfChannels(); + std::vector* means = new std::vector[numChannels]; + std::vector* meanSquares = new std::vector[numChannels]; + std::vector* variances = new std::vector[numChannels]; + std::vector sections; + std::vector times; + + int section(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++section ){ + const int numData = itr->numDataPoints; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + int icount(0); + while(icount + interval < numData){ + const double mean = Util::calculateMeanValue( interval, &(itr->dataFile[iChan].data[icount]) ); + const double mean2 = Util::calculateMeanSquareValue( interval, &(itr->dataFile[iChan].data[icount]) ); + const double var = Util::calculateVariance( interval, mean , &(itr->dataFile[iChan].data[icount]) ); + means[iChan].push_back(mean); + meanSquares[iChan].push_back(mean2); + variances[iChan].push_back(var); + icount += interval; + } + } + int icount(0); + while(icount + interval < numData){ + sections.push_back(section); + const double elapsedTime = static_cast(icount) / samplingFrequency; + times.push_back( ptrControl->getTimeFromStartTimeOfEachSection(section, elapsedTime) ); + icount += interval; + } + } + + const std::string fileName = afterPreprocessing ? "stat_time_after_preprocessing.csv" : "stat_time.csv"; + static std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileName ); + } + + ofs << "index,section#"; + ofs << ",time"; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ofs << ",mean_channel" << iChan; + ofs << ",meanSquare_channel" << iChan; + ofs << ",variance_channel" << iChan; + } + ofs << std::endl; + + const int numSegment = static_cast( means[0].size() ); + for( int iSeg = 0; iSeg < numSegment; ++iSeg ){ + ofs << iSeg << "," << sections[iSeg]; + ofs << "," << times[iSeg]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ofs << "," << std::setprecision(10) << std::scientific << means[iChan][iSeg]; + ofs << "," << std::setprecision(10) << std::scientific << meanSquares[iChan][iSeg]; + ofs << "," << std::setprecision(10) << std::scientific << variances[iChan][iSeg]; + } + ofs << std::endl; + } + + ofs.close(); + +} + +// Evaluate characteristics of frequency data from all data prior to the estimation of the response functions +void Analysis::priorEvaluationOfFrequencyDataFromAllData( const std::vector& dataFileSets, + const bool afterPreprocessing ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if(afterPreprocessing){ + ptrOutputFiles->writeLogMessage("Perform prior evaluation of frequency-domain characteristics from all data after preprocessing"); + }else{ + ptrOutputFiles->writeLogMessage("Perform prior evaluation of frequency-domain characteristics from all data"); + } + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumInputVariables(); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + const double samplingFrequency = ptrControl->getSamplingFrequency(); + const Control::ParamsForFreqDomainEvaluation params = ptrControl->getParamsForFreqDomainEvaluation(); + + int section(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++section ){ + const int numData = itr->numDataPoints; + int numDataForFFT(-1); + for( int i = 1; i < 1000; ++i ){ + const int vpow2 = static_cast( pow(2,i) ); + if( vpow2 >= numData ){ + numDataForFFT = vpow2; + break; + } + } + + // FFT + std::complex** cdata = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + cdata[iChan] = new std::complex[numDataForFFT]; + for( int i = 0; i < numData; ++i ){ + cdata[iChan][i] = std::complex(itr->dataFile[iChan].data[i], 0.0); + } + for( int i = numData; i < numDataForFFT; ++i ){ + cdata[iChan][i] = std::complex(0.0, 0.0); + } + Util::fourierTransform(numDataForFFT, cdata[iChan]); + } + outputSpectrum( cdata, numDataForFFT, section, afterPreprocessing, false ); + outputAverageSpectrum( cdata, numDataForFFT, section, afterPreprocessing, false ); + + // Calibration + for( int iChan = 0; iChan < numChannels; ++iChan ){ + // Stop to write warning otherwise huge number of warnings can be outputed because the frequency + // ranges of calibration files are usually too narrow to cover the whole frequency range. + ptrOutputFiles->stopToWriteWarningMessage(); + for( int i = 1; i < numDataForFFT / 2 + 1; ++i ){ + // Exclude frequency = 0 (Hz) because log(frequency) is caculated for calibration correcton + const double freq = static_cast(i) / static_cast(numDataForFFT) * samplingFrequency; + if( freq < params.startOutputFrequency || freq > params.endOutputFrequency ){ + continue; + } + calibrationCorrection(iChan, 1, freq, &cdata[iChan][i], afterPreprocessing, false); + } + ptrOutputFiles->restartToWriteWarningMessage(); + } + outputSpectrum( cdata, numDataForFFT, section, afterPreprocessing, true ); + outputAverageSpectrum( cdata, numDataForFFT, section, afterPreprocessing, true ); + + // Release memory + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] cdata[iChan]; + } + delete [] cdata; + } + +} + +// Evaluate characteristics of data segments +void Analysis::priorEvaluationOfDataSegments( const int numSegmentsTotal, std::complex** ftval, + const std::vector< std::pair >& times, const double timeLength, const std::string& fileName ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Prior evaluation of data segments"); + + const Control* const ptrControl = Control::getInstance(); + const Control::ParamsForDataSegmentEvaluation params = ptrControl->getParamsForDataSegmentEvaluation(); + const int numSegments = params.numDataSegments; + const int numChannels = ptrControl->getNumberOfChannels(); + + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileName ); + } + ofs << "start_index,end_index,start_time,end_time"; + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumInputVariables(); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + if( numSegments >= 2 ){ + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int var = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + ofs << ",coherence_" << var; + } + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + ofs << ",resp_real_" << out << "_" << in0; + ofs << ",resp_imag_" << out << "_" << in0; + ofs << ",resp_real_" << out << "_" << in1; + ofs << ",resp_imag_" << out << "_" << in1; + } + } + for( int iVar = 0; iVar < numOutputVariables / 2; ++iVar ){ + const int var0 = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int var1 = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar+1 ); + ofs << ",degree_of_polarization_" << var0 << "_" << var1; + ofs << ",polarization_direction_" << var0 << "_" << var1; + ofs << ",ellipticity_" << var0 << "_" << var1; + } + for( int iVar = 0; iVar < numInputVariables / 2; ++iVar ){ + const int var0 = ptrControl->getChannelIndex( CommonParameters::INPUT, iVar ); + const int var1 = ptrControl->getChannelIndex( CommonParameters::INPUT, iVar+1 ); + ofs << ",degree_of_polarization_" << var0 << "_" << var1; + ofs << ",polarization_direction_" << var0 << "_" << var1; + ofs << ",ellipticity_" << var0 << "_" << var1; + } + for( int iVar = 0; iVar < numRemoteReferenceVariables / 2; ++iVar ){ + const int var0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, iVar ); + const int var1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, iVar+1 ); + ofs << ",degree_of_polarization_" << var0 << "_" << var1; + ofs << ",polarization_direction_" << var0 << "_" << var1; + ofs << ",ellipticity_" << var0 << "_" << var1; + } + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int var = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + ofs << ",auto_power_" << var; + } + for( int iVar = 0; iVar < numInputVariables; ++iVar ){ + const int var = ptrControl->getChannelIndex( CommonParameters::INPUT, iVar ); + ofs << ",auto_power_" << var; + } + for( int iVar = 0; iVar < numRemoteReferenceVariables; ++iVar ){ + const int var = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, iVar ); + ofs << ",auto_power_" << var; + } + if(numOutputVariables == 3){ + ofs << ",Poynting_vector_x,Poynting_vector_y,Poynting_vector_z"; + } + ofs << std::endl; + + std::vector segmentIndexes; + segmentIndexes.reserve(numSegments); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + segmentIndexes.push_back(iSeg); + if( static_cast(segmentIndexes.size()) == numSegments ){ + priorEvaluationOfDataSegmentsAux( segmentIndexes, ftval, times, timeLength, numSegments, ofs ); + segmentIndexes.clear(); + } + } + + ofs.close(); + +} + +// Auxiliary function for evaluating characteristics of data segments +void Analysis::priorEvaluationOfDataSegmentsAux( const std::vector& segmentIndexes, std::complex** ftval, + const std::vector< std::pair >& times, const double timeLength, const int numSegments, + std::ofstream& ofs ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + + // Copy data + std::complex** data = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + data[iChan] = new std::complex[numSegments]; + int index(0); + for( std::vector::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr, ++index ){ + data[iChan][index] = ftval[iChan][*itr]; + } + } + // Main calculation + const int index0 = segmentIndexes.front(); + const int index1 = segmentIndexes.back(); + const std::string timeStart = times[index0].first; + const std::string timeEnd = times[index1].second; + ofs << index0 << "," << index1 << "," << timeStart << "," << timeEnd; + + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumInputVariables(); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + std::complex* resp0 = NULL; + std::complex* resp1 = NULL; + if( numSegments >= 2 ){ + resp0 = new std::complex[numOutputVariables]; + resp1 = new std::complex[numOutputVariables]; + // Squared coherence + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int var = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + assert( numRemoteReferenceVariables >= 2 ); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + const double coherence = calculateResponseFunctionByOrdinaryRemoteReference( numSegments, + data[var], data[in0], data[in1], data[rr0], data[rr1], resp0[iVar], resp1[iVar] ); + ofs << "," << std::setprecision(10) << std::scientific << coherence; + } + // Response functions + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + ofs << "," << std::setprecision(10) << std::scientific << resp0[iVar].real(); + ofs << "," << std::setprecision(10) << std::scientific << resp0[iVar].imag(); + ofs << "," << std::setprecision(10) << std::scientific << resp1[iVar].real(); + ofs << "," << std::setprecision(10) << std::scientific << resp1[iVar].imag(); + } + } + + // Polarization direction, ellipticity, and degree of polarization + for( int iVar = 0; iVar < numOutputVariables / 2; ++iVar ){ + const int var0 = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int var1 = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar+1 ); + double Gvar0(0.0); + double Gvar1(0.0); + std::complex Gvar01(0.0, 0.0); + for( int i = 0; i < numSegments; ++i ){ + Gvar0 += std::norm(data[var0][i]); + Gvar1 += std::norm(data[var1][i]); + Gvar01 += data[var0][i] * std::conj(data[var1][i]); + } +#if 0 + const double polarizationDirection = 0.5 * atan(2.0 * Gvar01.real() / (Gvar0 - Gvar1)) * CommonParameters::RAD2DEG; + ofs << "," << std::setprecision(10) << std::scientific << polarizationDirection; + const double chi = 0.5 * asin(2.0 * Gvar01.imag() / (Gvar0 + Gvar1)); + const double ellipticity = fabs(tan(chi)); + ofs << "," << std::setprecision(10) << std::scientific << ellipticity; +#endif + const double det = Gvar0 * Gvar1 - std::norm(Gvar01); + const double tr = Gvar0 + Gvar1; + const double degreeOfPolarization = sqrt(1.0 - 4.0 * det / (tr * tr)); + ofs << "," << std::setprecision(10) << std::scientific << degreeOfPolarization; + const double D = 0.5 * tr - 0.5 * sqrt(tr * tr - 4.0 * det); + const double P0 = Gvar0 - D; + const double P1 = Gvar1 - D; + const std::complex P01 = Gvar01; + const double polarizationDirection2 = 0.5 * atan(2.0 * P01.real() / (P0 - P1)) * CommonParameters::RAD2DEG; + ofs << "," << std::setprecision(10) << std::scientific << polarizationDirection2; + const double chi2 = 0.5 * asin(2.0 * P01.imag() / (P0 + P1)); + const double ellipticity2 = fabs(tan(chi2)); + ofs << "," << std::setprecision(10) << std::scientific << ellipticity2; + } + for( int iVar = 0; iVar < numInputVariables / 2; ++iVar ){ + const int var0 = ptrControl->getChannelIndex( CommonParameters::INPUT, iVar ); + const int var1 = ptrControl->getChannelIndex( CommonParameters::INPUT, iVar+1 ); + double Gvar0(0.0); + double Gvar1(0.0); + std::complex Gvar01(0.0, 0.0); + for( int i = 0; i < numSegments; ++i ){ + Gvar0 += std::norm(data[var0][i]); + Gvar1 += std::norm(data[var1][i]); + Gvar01 += data[var0][i] * std::conj(data[var1][i]); + } +#if 0 + const double polarizationDirection = 0.5 * atan(2.0 * Gvar01.real() / (Gvar0 - Gvar1)) * CommonParameters::RAD2DEG; + ofs << "," << std::setprecision(10) << std::scientific << polarizationDirection; + const double chi = 0.5 * asin(2.0 * Gvar01.imag() / (Gvar0 + Gvar1)); + const double ellipticity = fabs(tan(chi)); + ofs << "," << std::setprecision(10) << std::scientific << ellipticity; +#endif + const double det = Gvar0 * Gvar1 - std::norm(Gvar01); + const double tr = Gvar0 + Gvar1; + const double degreeOfPolarization = sqrt(1.0 - 4.0 * det / (tr * tr)); + ofs << "," << std::setprecision(10) << std::scientific << degreeOfPolarization; + const double D = 0.5 * tr - 0.5 * sqrt(tr * tr - 4.0 * det); + const double P0 = Gvar0 - D; + const double P1 = Gvar1 - D; + const std::complex P01 = Gvar01; + const double polarizationDirection2 = 0.5 * atan(2.0 * P01.real() / (P0 - P1)) * CommonParameters::RAD2DEG; + ofs << "," << std::setprecision(10) << std::scientific << polarizationDirection2; + const double chi2 = 0.5 * asin(2.0 * P01.imag() / (P0 + P1)); + const double ellipticity2 = fabs(tan(chi2)); + ofs << "," << std::setprecision(10) << std::scientific << ellipticity2; + } + for( int iVar = 0; iVar < numRemoteReferenceVariables / 2; ++iVar ){ + const int var0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, iVar ); + const int var1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, iVar+1 ); + double Gvar0(0.0); + double Gvar1(0.0); + std::complex Gvar01(0.0, 0.0); + for( int i = 0; i < numSegments; ++i ){ + Gvar0 += std::norm(data[var0][i]); + Gvar1 += std::norm(data[var1][i]); + Gvar01 += data[var0][i] * std::conj(data[var1][i]); + } +#if 0 + const double polarizationDirection = 0.5 * atan(2.0 * Gvar01.real() / (Gvar0 - Gvar1)) * CommonParameters::RAD2DEG; + ofs << "," << std::setprecision(10) << std::scientific << polarizationDirection; + const double chi = 0.5 * asin(2.0 * Gvar01.imag() / (Gvar0 + Gvar1)); + const double ellipticity = fabs(tan(chi)); + ofs << "," << std::setprecision(10) << std::scientific << ellipticity; +#endif + const double det = Gvar0 * Gvar1 - std::norm(Gvar01); + const double tr = Gvar0 + Gvar1; + const double degreeOfPolarization = sqrt(1.0 - 4.0 * det / (tr * tr)); + ofs << "," << std::setprecision(10) << std::scientific << degreeOfPolarization; + const double D = 0.5 * tr - 0.5 * sqrt(tr * tr - 4.0 * det); + const double P0 = Gvar0 - D; + const double P1 = Gvar1 - D; + const std::complex P01 = Gvar01; + const double polarizationDirection2 = 0.5 * atan(2.0 * P01.real() / (P0 - P1)) * CommonParameters::RAD2DEG; + ofs << "," << std::setprecision(10) << std::scientific << polarizationDirection2; + const double chi2 = 0.5 * asin(2.0 * P01.imag() / (P0 + P1)); + const double ellipticity2 = fabs(tan(chi2)); + ofs << "," << std::setprecision(10) << std::scientific << ellipticity2; + } + + // Auto power + const double factor = 2.0 / timeLength / static_cast(numSegments); + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + double Gvar(0.0); + const int var = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + for( int i = 0; i < numSegments; ++i ){ + Gvar += std::norm(data[var][i]); + } + ofs << "," << std::setprecision(10) << std::scientific << Gvar * factor; + } + for( int iVar = 0; iVar < numInputVariables; ++iVar ){ + double Gvar(0.0); + const int var = ptrControl->getChannelIndex( CommonParameters::INPUT, iVar ); + for( int i = 0; i < numSegments; ++i ){ + Gvar += std::norm(data[var][i]); + } + ofs << "," << std::setprecision(10) << std::scientific << Gvar * factor; + } + for( int iVar = 0; iVar < numRemoteReferenceVariables; ++iVar ){ + double Gvar(0.0); + const int var = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, iVar ); + for( int i = 0; i < numSegments; ++i ){ + Gvar += std::norm(data[var][i]); + } + ofs << "," << std::setprecision(10) << std::scientific << Gvar * factor; + } + + // Poynting vector + if( numOutputVariables == 3 ){ + const int varEx = ptrControl->getChannelIndex( CommonParameters::OUTPUT, 0 ); + const int varEy = ptrControl->getChannelIndex( CommonParameters::OUTPUT, 1 ); + const int varBz = ptrControl->getChannelIndex( CommonParameters::OUTPUT, 2 ); + const int varBx = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int varBy = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + std::complex compX(0.0, 0.0); + std::complex compY(0.0, 0.0); + std::complex compZ(0.0, 0.0); + for( int i = 0; i < numSegments; ++i ){ + compX += data[varEy][i] * std::conj(data[varBz][i]);// assuming Ez = 0 + compY -= data[varEx][i] * std::conj(data[varBz][i]);// assuming Ez = 0 + compZ += data[varEx][i] * std::conj(data[varBy][i]) - data[varEy][i] * std::conj(data[varBx][i]); + } + compX /= static_cast(numSegments); + compY /= static_cast(numSegments); + compZ /= static_cast(numSegments); + ofs << "," << std::setprecision(10) << std::scientific << 0.5 * compX.real(); + ofs << "," << std::setprecision(10) << std::scientific << 0.5 * compY.real(); + ofs << "," << std::setprecision(10) << std::scientific << 0.5 * compZ.real(); + } + + ofs << std::endl; + + if( resp0 != NULL ){ + delete [] resp0; + } + if( resp1 != NULL ){ + delete [] resp1; + } + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] data[iChan]; + } + delete [] data; + +} + +// Select segments to be excluded by degree of magnetic polarization criteria +void Analysis::selectSegmentsToBeExcludedByDegreeOfMagneticPolarizationCriteria( const int numSegmentsTotal, std::complex** ftval, std::vector& remainingSegments ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Select segments to be excluded by degree of magnetic polarization criteria"); + + const Control* const ptrControl = Control::getInstance(); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + + // Make copy + std::vector remainingSegmentsOrg = remainingSegments; + + const Control::ParamsForDegreeOfMagneticPolarizationCriteria params = ptrControl->getParamsForDegreeOfMagneticPolarizationCriteria(); + const int numSegments = params.numSegments; + const double threshold = params.threshold; + std::vector segmentIndexes; + segmentIndexes.reserve(numSegments); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + segmentIndexes.push_back(iSeg); + if( static_cast(segmentIndexes.size()) == numSegments ){ + double Jxx(0.0); + double Jyy(0.0); + std::complex Jxy(0.0, 0.0); + for( std::vector::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr ){ + Jxx += std::norm(ftval[in0][*itr]); + Jyy += std::norm(ftval[in1][*itr]); + Jxy += ftval[in0][*itr] * std::conj(ftval[in1][*itr]); + } + const double det = Jxx * Jyy - std::norm(Jxy); + const double tr = Jxx + Jyy; + const double degreeOfPolarization = sqrt(1.0 - 4.0 * det / (tr * tr)); + if( degreeOfPolarization > threshold ){ + for( std::vector::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr ){ + remainingSegments[*itr] = false; + } + } + segmentIndexes.clear(); + } + } + + int numOfRemainingSegments(0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegments[iSeg]){ + ++numOfRemainingSegments; + } + } + const double percent = static_cast(numOfRemainingSegments) / static_cast(numSegmentsTotal) * 100.0; + ptrOutputFiles->writeLogMessage("Number of remaining segments: " + Util::toString(numOfRemainingSegments) + " (" + Util::toString(percent) + " %)"); + +} + +// Select segments to be excluded by mean square criteria +void Analysis::selectSegmentsToBeExcludedByMeanSquareCriteria( const int numSegmentsTotal, const std::vector* const meanSquares, + const std::vector< std::pair >& times, std::vector& remainingSegments ) const{ + + const Control* const ptrControl = Control::getInstance(); + const Control::ParamsForMeanSquareCriteria params = ptrControl->getParamsForMeanSquareCriteria(); + if( !params.applyMeanSquareCriteria ){ + return; + } + const double nsigma = params.nsigma; + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Select segments to be excluded by mean square criteria"); + + const int numChannels = ptrControl->getNumberOfChannels(); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + const double median = Util::calculateMedian(meanSquares[iChan]); + const double MADN = Util::calculateMADN(meanSquares[iChan]); + int numRemoved(0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + if( fabs( meanSquares[iChan][iSeg] - median ) > nsigma * MADN ){ +#ifdef _DEBUG_WRITE + const std::string timeStart = times[iSeg].first; + const std::string timeEnd = times[iSeg].second; + const double absDif = fabs( meanSquares[iChan][iSeg] - median ); + const double ratio = absDif / MADN; +#endif + remainingSegments[iSeg] = false; + ++numRemoved; + } + } + ptrOutputFiles->writeLogMessage( "At channel " + Util::toString(iChan) + + ", mean squares of " + Util::toString(numRemoved) + " segments are greater than the criteria."); + } + + int numOfRemainingSegments(0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegments[iSeg]){ + ++numOfRemainingSegments; + } + } + const double percent = static_cast(numOfRemainingSegments) / static_cast(numSegmentsTotal) * 100.0; + ptrOutputFiles->writeLogMessage("Number of remaining segments: " + Util::toString(numOfRemainingSegments) + " (" + Util::toString(percent) + " %)"); + +} + +// Select segments to be excluded by polarizatiton direction criteria +void Analysis::selectSegmentsToBeExcludedByMagneticPolarizatitonDirectionCriteria( const int numSegmentsTotal, std::complex** ftval, std::vector& remainingSegments ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Select segments to be excluded by magnetic polarizatiton direction criteria"); + + const Control* const ptrControl = Control::getInstance(); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + + double* numMPDs = new double[90]; + for( int iDeg = 0; iDeg < 90; ++iDeg ){ + numMPDs[iDeg] = 0.0; + } + std::vector* segmentIndexes = new std::vector[90]; + + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double Jxx = std::norm(ftval[in0][iSeg]); + const double Jyy = std::norm(ftval[in1][iSeg]); + const std::complex Jxy = ftval[in0][iSeg] * std::conj(ftval[in1][iSeg]); + //const double polarizationDirection = 0.5 * atan(2.0 * Jxy.real() / (Jxx - Jyy)) * CommonParameters::RAD2DEG; + const double det = Jxx * Jyy - std::norm(Jxy); + const double tr = Jxx + Jyy; + const double D = 0.5 * tr - 0.5 * sqrt(tr * tr - 4.0 * det); + const double Pxx = Jxx - D; + const double Pyy = Jyy - D; + const std::complex Pxy = Jxy; + const double polarizationDirection = 0.5 * atan(2.0 * Pxy.real() / (Pxx - Pyy)) * CommonParameters::RAD2DEG; + int iDeg = static_cast(polarizationDirection + 45.0); + if( iDeg < 0 ){ + iDeg = 0; + }else if( iDeg > 89 ){ + iDeg = 89; + } + ++numMPDs[iDeg]; + segmentIndexes[iDeg].push_back(iSeg); + } + + const double threshold = ptrControl->getParamsForMagneticPolarizatitonDirectionCriteria().threshold; + const double expectedValue = static_cast(numSegmentsTotal) / 90.0;// assuming uniform distribution + for( int iDeg = 0; iDeg < 90; ++iDeg ){ +#ifdef _DEBUG_WRITE + std::cout << numMPDs[iDeg] << std::endl; +#endif + if( numMPDs[iDeg] > threshold * expectedValue ){ + for( std::vector::const_iterator itr = segmentIndexes[iDeg].begin(); itr != segmentIndexes[iDeg].end(); ++itr ){ + remainingSegments[*itr] = false; + } + } + } + delete [] numMPDs; + delete [] segmentIndexes; + + int numOfRemainingSegments(0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegments[iSeg]){ + ++numOfRemainingSegments; + } + } + const double percent = static_cast(numOfRemainingSegments) / static_cast(numSegmentsTotal) * 100.0; + ptrOutputFiles->writeLogMessage("Number of remaining segments: " + Util::toString(numOfRemainingSegments) + " (" + Util::toString(percent) + " %)"); + +} + +// Select segments to be excluded by square coherence criteria +void Analysis::selectSegmentsToBeExcludedBySquareCoherenceCriteria( int numSegmentsTotal, std::complex** ftval, + std::vector& remainingSegments ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Select segments to be excluded by square coherence criteria"); + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + const Control::ParamsForSquareCoherenceCriteria params = ptrControl->getParamsForSquareCoherenceCriteria(); + + std::vector segmentIndexes; + segmentIndexes.reserve(params.numSegments); + std::complex** data = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + data[iChan] = new std::complex[params.numSegments]; + } + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + segmentIndexes.push_back(iSeg); + if( static_cast(segmentIndexes.size()) == params.numSegments ){ + for( int iChan = 0; iChan < numChannels; ++iChan ){ + int index(0); + for( std::vector::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr, ++index ){ + data[iChan][index] = ftval[iChan][*itr]; + } + } + const double coherence = selectSegmentsToBeExcludedBySquareCoherenceCriteriaAux(params.numSegments, data); + if( coherence < params.threshold ){ + for( std::vector::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr ){ + remainingSegments[*itr] = false; + } + } + segmentIndexes.clear(); + } + } + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] data[iChan]; + } + delete [] data; + + int numOfRemainingSegments(0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegments[iSeg]){ + ++numOfRemainingSegments; + } + } + const double percent = static_cast(numOfRemainingSegments) / static_cast(numSegmentsTotal) * 100.0; + ptrOutputFiles->writeLogMessage("Number of remaining segments: " + Util::toString(numOfRemainingSegments) + " (" + Util::toString(percent) + " %)"); + +} + +// Auxiliary function for selecting segments to be excluded by square coherence criteria +double Analysis::selectSegmentsToBeExcludedBySquareCoherenceCriteriaAux( const int numSegments, std::complex** data ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + + double coherence(0.0); + + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + std::complex* resp0 = new std::complex[numOutputVariables]; + std::complex* resp1 = new std::complex[numOutputVariables]; + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int var = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + assert( numRemoteReferenceVariables >= 2 ); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + coherence = calculateResponseFunctionByOrdinaryRemoteReference( numSegments, + data[var], data[in0], data[in1], data[rr0], data[rr1], resp0[iVar], resp1[iVar] ); + } + + delete [] resp0; + delete [] resp1; + + return coherence; + +} + +// Select segments to be excluded by square coherence criteria with random sampling +void Analysis::selectSegmentsToBeExcludedBySquareCoherenceCriteriaWithRandomSampling( const int numSegmentsTotal, + std::complex** ftval, std::vector& remainingSegments ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Select segments to be excluded by square coherence criteria with random sampling"); + + const Control* const ptrControl = Control::getInstance(); + const int numChannels = ptrControl->getNumberOfChannels(); + const Control::ParamsForSquareCoherenceCriteriaWithRandomSampling params = ptrControl->getParamsForSquareCoherenceCriteriaWithRandomSampling (); + + if( numSegmentsTotal < params.numSegments ){ + ptrOutputFiles->writeWarningMessage("Number of segments is less that number of segments used square coherence criteria"); + return; + } + + std::set segmentIndexes; + +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + const int maxInterationNum = 10000; + + std::complex** data = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + data[iChan] = new std::complex[params.numSegments]; + } + std::vector* squareCoherenceVectors = new std::vector[numSegmentsTotal]; + for( int iSamples = 0; iSamples < params.numRandomSamples; ++iSamples ){ + // Make random samples + for( int iter = 0; iter < maxInterationNum; ++iter ){ +#ifdef _RAND + const int iSeg = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + const int iSeg = static_cast(genrand64_real1() * numSegmentsTotal); +#else + const int iSeg = uniformDistibution(gen); +#endif +#endif + segmentIndexes.insert(iSeg); + if( segmentIndexes.size() == params.numSegments ){ + break; + } + } + if( segmentIndexes.size() < params.numSegments ){ + ptrOutputFiles->writeWarningMessage("Intertion number reachs the upper limit in determing segments square coherence criteria"); + break; + } + for( int iChan = 0; iChan < numChannels; ++iChan ){ + int index(0); + for( std::set::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr, ++index ){ + data[iChan][index] = ftval[iChan][*itr]; + } + } + const double coherence = selectSegmentsToBeExcludedBySquareCoherenceCriteriaAux(params.numSegments, data); + for( std::set::const_iterator itr = segmentIndexes.begin(); itr != segmentIndexes.end(); ++itr ){ + squareCoherenceVectors[*itr].push_back(coherence); + } + segmentIndexes.clear(); + assert(segmentIndexes.empty()); + } + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] data[iChan]; + } + delete [] data; + + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + if( squareCoherenceVectors[iSeg].empty() ){ + continue; + } + const double medianCoherence = Util::calculateMedian(squareCoherenceVectors[iSeg]); + if( medianCoherence < params.threshold ){ + remainingSegments[iSeg] = false; + } + } + delete [] squareCoherenceVectors; + + int numOfRemainingSegmentsMod(0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg ){ + if(remainingSegments[iSeg]){ + ++numOfRemainingSegmentsMod; + } + } + const double percent = static_cast(numOfRemainingSegmentsMod) / static_cast(numSegmentsTotal) * 100.0; + ptrOutputFiles->writeLogMessage("Number of remaining segments: " + Util::toString(numOfRemainingSegmentsMod) + " (" + Util::toString(percent) + " %)"); + +} + +// Write header to the output file for apparent resistivity and phase +void Analysis::writeHeaderToOutputFileForApparentResistivityAndPhase( std::ofstream& ofs ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumRemoteReferenceVariables(); + + ofs << "frequency,period"; + assert( numInputVariables == 2 ); + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + ofs << ",app_res_" << out << "_" << in0; + ofs << ",phase_" << out << "_" << in0; + ofs << ",app_res_" << out << "_" << in1; + ofs << ",phase_" << out << "_" << in1; + ofs << ",coherence_" << out << "_" << in0 << "+" << in1; + } + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + ofs << ",dapp_res_" << out << "_" << in0; + ofs << ",dphase_" << out << "_" << in0; + ofs << ",dapp_res_" << out << "_" << in1; + ofs << ",dphase_" << out << "_" << in1; + } + ofs << std::endl; + +} + +// Write header to the output file of response function +void Analysis::writeHeaderToOutputFileForResponseFunctions( std::ofstream& ofs ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumRemoteReferenceVariables(); + + ofs << "frequency,period"; + assert( numInputVariables == 2 ); + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + ofs << ",resp_real_" << out << "_" << in0; + ofs << ",resp_imag_" << out << "_" << in0; + ofs << ",resp_real_" << out << "_" << in1; + ofs << ",resp_imag_" << out << "_" << in1; + ofs << ",coherence_" << out << "_" << in0 << "+" << in1; + } + for( int iVar = 0; iVar < numOutputVariables; ++iVar ){ + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iVar ); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + ofs << ",dresp_" << out << "_" << in0; + ofs << ",dresp_" << out << "_" << in1; + } + ofs << std::endl; + +} \ No newline at end of file diff --git a/src/Analysis.h b/src/Analysis.h new file mode 100644 index 0000000..b6940ee --- /dev/null +++ b/src/Analysis.h @@ -0,0 +1,281 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ANALYSIS +#define DBLDEF_ANALYSIS + +#include "CommonParameters.h" +#include "CalibrationFunction.h" +#include "RobustWeightHuber.h" +#include "RobustWeightThomson.h" +#include "RobustWeightTukeysBiweights.h" +#include + +// Class of analysis +class Analysis{ + +public: + + // Default constructer + Analysis(); + + // Destructer + virtual ~Analysis(); + + // Exexute analysis + void run( std::vector& dataFileSets ); + + // Set object of M-estimator with Huber weight + void setRobustWeightHuber( const int index, const RobustWeightHuber* const ptrRobustWeight ); + + // Set object of M-estimator with Thomson weight + void setRobustWeightThomson( const int index, const RobustWeightThomson* const ptrRobustWeight ); + + // Set object of M-estimator with Tukey's biweights + void setRobustWeightTukeysBiweights( const int index, const RobustWeightTukeysBiweights* const ptrRobustWeight ); + + // Test function + void test() const; + + // Test function 2 + void test2( std::vector& dataFileSets ); + + // Test function 3 + void test3() const; + +protected: + + // Calculate apparent resistivity + double calcApparentResistivity( const double freq, const std::complex& Z ) const; + + // Calculate error of apparent resistivity + double calcApparentResistivityError( const double freq, const std::complex& Z, const double dZ ) const; + + // Calculate diagonal components of hat matrix + double calculateDiagonalComponentsOfHatMatrix( const int numSegments, const int channelX, const int channelY, + std::complex** data, const double* const weights, double* hatDiagonals ) const; + + // Calculate phase + double calcPhase( const std::complex& Z ) const; + + // Calculate error of phase + double calcPhaseError( const std::complex& Z, const double dZ ) const; + + // Calculate response functions by iteratively reweighted least squares + void calculateResponseFunctionsByIRWLS( const int iRobustWeight, const std::complex* const out, const std::complex* const in0, + const std::complex* const in1, const int numSegments, const bool fixScale, double& scale, const double* const weightsPrior, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence, + std::vector& titles, std::vector* outputValues, const bool priorityOnFirst = true ) const; + + // Calculate response functions by iteratively reweighted remote reference + void calculateResponseFunctionsByIRWLSRemoteReference(const int iRobustWeight, const std::complex* const out, + const std::complex* const in0, const std::complex* const in1, + const std::complex* const rr1, const std::complex* const rr2, + const int numSegments, const bool fixScale, double& scale, const double* const weightsPrior, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence, + std::vector& titles, std::vector* outputValues) const; + + // Calculate response function by the orinary remote reference method + double calculateResponseFunctionByOrdinaryRemoteReference( const int numSegments, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + std::complex& resp1, std::complex& resp2 ) const; + + // Calculate response function by the ordinary weighted square method + double calculateResponseFunctionByWLS( const std::complex* const out, const std::complex* const in0, + const std::complex* const in1, const int numSegments, const double* const weights, std::complex* residuals, + std::complex& resp0, std::complex& resp1, double& coherence, const bool priorityOnFirst = true ) const; + + // Auxiliary function for calculating response function by the weighted leaset square method + void calculateResponseFunctionByWLSAux( const int numSegments, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, const double* const weights, + std::complex& resp1, std::complex& resp2, const bool priorityOnFirst = true ) const; + + // Calculate response function by the weighted leaset square method for bootstrap + void calculateResponseFunctionByWLSForBootstrap( const int numSegments, const int* const segmentIndexes, + const std::complex* const out, const std::complex* const in1, const std::complex* const in2, + const double* const weights, std::complex& resp1, std::complex& resp2, const bool priorityOnFirst = true ) const; + + // Calculate response function by the weighted remote reference method + double calculateResponseFunctionByWLSRemoteReference(const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + const int numSegments, const double* const weights, std::complex* residuals, + std::complex& resp1, std::complex& resp2, double& coherence ) const; + + // Auxiliary function for calculating response function by the weighted remote reference method + void calculateResponseFunctionByWLSRemoteReferenceAux(const int numSegments, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + const double* const weights, std::complex& resp1, std::complex& resp2) const; + + // Calculate response function by the weighted remote reference method for bootstrap + void calculateResponseFunctionByWLSRemoteReferenceForBootstrap(const int numSegments, const int* const segmentIndexes, + const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, + const std::complex* const rr1, const std::complex* const rr2, + const double* const weights, std::complex& resp1, std::complex& resp2) const; + + // Get pointer to M-estimators + RobustWeight* getPointerToRobustWeight(const int iRobustWeight) const; + + // Output spectral density functions to cvg file + void outputSpectralDensityFunctionsToCvgFile( const int numSegments, const double timeLength, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, const double* const weights ) const; + + // Output spectral density functions to cvg file + void outputSpectralDensityFunctionsToCvgFile( const int numSegments, const double timeLength, const std::complex* const out, + const std::complex* const in1, const std::complex* const in2, const std::complex* const rr1, const std::complex* const rr2 ) const; + + // Merge sections + void mergeSections( std::vector& dataFileSets ) const; + +private: + + // Copy constructer + Analysis(const Analysis& rhs); + + // Assignment operator + Analysis& operator=(const Analysis& rhs); + + // Decimation + void decimation( std::vector& dataFileSets ) const; + + // Read time-series data + void readTimeSeriesData( std::vector& dataFileSets ); + + // Read calibration files + void readCalibrationFiles( const std::vector& freq ); + + // Read one time-series data + void readOneTimeSeriesData( const std::string& fileName, const int numSkipData, const int numDataPoints, double* data ); + + // Perform preprocessing + void preprocessing( std::vector& dataFileSets ); + + // Convert time-series data to frequency-domain data + void convertToFrequencyData( const int segmentLength, const std::vector& dataFileSets, + int& numSegmentsTotal, std::complex*** cdata, std::vector< std::pair >& times, std::vector* meanSquares ); + + // Perform calibration correction for all channels + void calibrationCorrectionAllChannels( const int numChannels, const int numSegmentsTotal, const double freq, std::complex** ftval ) const; + + // Perform calibration correction for main analyss + void calibrationCorrection(const int iChan, const int numSegmentsTotal, const double freq, std::complex* ftval, const bool afterPreprocessing, const bool afterTapering ) const; + + // Calculate rotated fields + void calculateRotatedFields( const int numSegmentsTotal, std::complex** ftval ) const; + + virtual void calculateResponseFunctions( const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ) = 0; + + // Modify time-series data based on the EOF analysis + void modifyTimeSeriesBasedOnEOFAnalysis(std::vector& dataFileSets); + + // Output average spectrum + void outputAverageSpectrum( std::complex** cdata, const int numData, const int section, + const bool afterPreprocessing, const bool afterCalibration ) const; + + // Output average spectrum for the frequencies where response functions are estimated + void outputAverageSpectrum2( std::complex** cdata, const int numData, const int section, + const bool afterPreprocessing, const bool afterCalibration ) const; + + // Output spectrum + void outputSpectrum( std::complex** cdata, const int numData, const int section, + const bool afterPreprocessing, const bool afterCalibration ) const; + + // Output frequency-domain data + void outputFrequencyDomainData( const int iSegLen, const int freqDegree, const int numSegmentsTotal, std::complex** ftval ) const; + + // Output time-series data + void outputTimeSeriesData( const std::vector& dataFileSets, const bool afterPreprocessing ) const; + + // Output calibrated time-series data + void outputCalibratedTimeSeriesData(const std::vector& dataFileSets) const; + + // Evaluate characteristics of time-series data prior to the estimation of the response functions + void priorEvaluationOfTimeSeriesData( const int interval, const std::vector& dataFileSets, + const bool afterPreprocessing ) const; + + // Evaluate characteristics of frequency data from all data prior to the estimation of the response functions + void priorEvaluationOfFrequencyDataFromAllData( const std::vector& dataFileSets, + const bool afterPreprocessing ) const; + + // Evaluate characteristics of data segments + void priorEvaluationOfDataSegments( const int numSegmentsTotal, std::complex** ftval, + const std::vector< std::pair >& times, const double timeLength, const std::string& fileName ) const; + + // Auxiliary function for evaluating characteristics of data segments + void priorEvaluationOfDataSegmentsAux( const std::vector& segmentIndexes, std::complex** ftval, + const std::vector< std::pair >& times, const double timeLength, const int numSegments, + std::ofstream& ofs ) const; + + // Select segments to be excluded by degree of magnetic polarization criteria + void selectSegmentsToBeExcludedByDegreeOfMagneticPolarizationCriteria( const int numSegmentsTotal, std::complex** ftval, std::vector& remainingSegments ) const; + + // Select segments to be excluded by mean square criteria + void selectSegmentsToBeExcludedByMeanSquareCriteria( const int numSegmentsTotal, const std::vector* const meanSquares, + const std::vector< std::pair >& times, std::vector& remainingSegments ) const; + + // Select segments to be excluded by magnetic polarizatiton direction criteria + void selectSegmentsToBeExcludedByMagneticPolarizatitonDirectionCriteria( const int numSegmentsTotal, std::complex** ftval, std::vector& remainingSegments ) const; + + // Select segments to be excluded by square coherence criteria + void selectSegmentsToBeExcludedBySquareCoherenceCriteria( const int numSegmentsTotal, std::complex** ftval, + std::vector& remainingSegments ) const; + + // Auxiliary function for selecting segments to be excluded by square coherence criteria + double selectSegmentsToBeExcludedBySquareCoherenceCriteriaAux( const int numSegments, std::complex** data ) const; + + // Select segments to be excluded by square coherence criteria with random sampling + void selectSegmentsToBeExcludedBySquareCoherenceCriteriaWithRandomSampling( const int numSegmentsTotal, std::complex** ftval, + std::vector& remainingSegments ) const; + + // Auxiliary function for selecting segments to be excluded by square coherence criteria with random sampling + bool selectSegmentsToBeExcludedBySquareCoherenceCriteriaWithRandomSamplingAux( const std::vector& segmentIndexes, std::complex** ftval, + const std::vector< std::pair >& times, const double timeLength ) const; + + // Write header to the output file for apparent resistivity and phase + void writeHeaderToOutputFileForApparentResistivityAndPhase( std::ofstream& ofs ) const; + + // Write header to the output file of response function + void writeHeaderToOutputFileForResponseFunctions( std::ofstream& ofs ) const; + + // Arrays of calibration function + CalibrationFunction* m_calibrationFunctions; + + // Coefficients of AR model + std::vector* m_coefficientsOfARModel; + + // M-estimators + RobustWeight* m_robustWeight[2]; + +}; + +#endif diff --git a/src/AnalysisMultivariateRegression.cpp b/src/AnalysisMultivariateRegression.cpp new file mode 100644 index 0000000..6a49960 --- /dev/null +++ b/src/AnalysisMultivariateRegression.cpp @@ -0,0 +1,5972 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "AnalysisMultivariateRegression.h" +#include "Control.h" +#include "OutputFiles.h" +#include "DoubleDenseSquareMatrix.h" +#include "DoubleDenseSquareSymmetricMatrix.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef _MERSENNE_TWISTER_ORIGINAL +#else +#include +#endif + +#include "Util.h" + +#ifdef _MERSENNE_TWISTER_ORIGINAL +#include "mt64.h" +#endif + +#ifdef _USE_OMP +#include +#endif + +// Default constructer +AnalysisMultivariateRegression::AnalysisMultivariateRegression(): + m_numOfOutputAndInputVariables(0), + m_responseFunctions(NULL) +{ +} + +// Destructer +AnalysisMultivariateRegression::~AnalysisMultivariateRegression() +{ + for( int i = 0; i < m_numOfOutputAndInputVariables; ++i ){ + delete [] m_responseFunctions[i]; + } + delete m_responseFunctions; +} + +// Calculate complex residuals +void AnalysisMultivariateRegression::calculateComplexResiduals( const int numSegmentsTotal, std::complex** ftval, + std::complex** resp, std::complex** complexResiduals ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + complexResiduals[iVar][iSeg] = ftval[index][iSeg] + - resp[iVar][0] * ftval[rr0][iSeg] - resp[iVar][1] * ftval[rr1][iSeg]; + } + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + complexResiduals[iVar][iSeg] = ftval[index][iSeg] + - resp[iVar][0] * ftval[rr0][iSeg] - resp[iVar][1] * ftval[rr1][iSeg]; + } + ++iVar; + } + assert( iVar == numOfOutputVariables + numOfInputVariables ); + +} + +// Calculate partial derivatives of responses for robust bootstrap +void AnalysisMultivariateRegression::calculatePartialDerivativesOfResponses( const int numSegments, const double paramC, + std::complex** ftval, std::complex** resp, const double* const variancesWithoutScale, const double scale, + std::complex** complexResiduals, const double* const MD, const double* const weights, + double** derivativesRegardingResps, double** derivativesRegardingVariancesWithoutScale, double* derivativesRegardingScale ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + + const std::complex czero = std::complex( 0.0, 0.0 ); + + std::complex PMatrix[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrix[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weights[iSeg]; + PMatrix[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weights[iSeg]; + PMatrix[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weights[iSeg]; + PMatrix[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weights[iSeg]; + } + const std::complex det = PMatrix[0][0] * PMatrix[1][1] - PMatrix[1][0] * PMatrix[0][1]; + const std::complex PInvMatrix[2][2] = { PMatrix[1][1]/det, -PMatrix[0][1]/det, -PMatrix[1][0]/det, PMatrix[0][0]/det }; + const std::complex PInvTMatrix[2][2] = { PInvMatrix[0][0], PInvMatrix[1][0], PInvMatrix[0][1], PInvMatrix[1][1] }; + std::complex** PInvTIMatrix = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + PInvTIMatrix[irow] = new std::complex[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int icol = 0; icol < numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + PInvTIMatrix[irow][icol] = czero; + } + } + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + const std::complex value = PInvTMatrix[irow][icol]; + for( int iq = 0; iq < numOfOutputAndInputVariables; ++iq ){ + const int irowOut = iq + irow * numOfOutputAndInputVariables; + const int icolOut = iq + icol * numOfOutputAndInputVariables; + PInvTIMatrix[irowOut][icolOut] = value; + } + } + } +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ +// std::cout << MD[iSeg] <<" "; +// if( iSeg+1 < numSegments ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// std::cout << variancesWithoutScale[row] <<" "; +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// std::cout << PInvTIMatrix[row][col].real() << "+" << PInvTIMatrix[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif +// + std::complex** PInvTPInvMatrix = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + PInvTPInvMatrix[irow] = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables * numOfReferenceVariables; ++icol ){ + PInvTPInvMatrix[irow][icol] = czero; + } + } + for( int irow = 0; irow factor = PInvTMatrix[irow][icol]; + for( int irow2 = 0; irow2 < numOfReferenceVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + const int irowOut = irow2 + irow * numOfReferenceVariables; + const int icolOut = icol2 + icol * numOfReferenceVariables; + PInvTPInvMatrix[irowOut][icolOut] = factor * PInvMatrix[irow2][icol2]; + } + } + } + } +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ +// for( int col = 0; col < numOfReferenceVariables * numOfReferenceVariables; ++col ){ +// std::cout << PInvTPInvMatrix[row][col].real() << "+" << PInvTPInvMatrix[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + std::complex** QMatrix = new std::complex*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + QMatrix[irow] = new std::complex[numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + QMatrix[irow][icol] = czero; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrix[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weights[iSeg]; + } + assert(index == iVar); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrix[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weights[iSeg]; + } + assert(index == iVar); + ++iVar; + } + } + +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfReferenceVariables; ++col ){ +// std::cout << QMatrix[row][col].real() << "+" << QMatrix[row][col].imag() <<"im "; +// } +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfReferenceVariables; ++col ){ +// std::cout << resp[row][col].real() << "+" << resp[row][col].imag() <<"im "; +// } +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif +// + std::complex** IQMatrix = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + IQMatrix[irow] = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables * numOfReferenceVariables; ++icol ){ + IQMatrix[irow][icol] = czero; + } + } + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + const double factor = irow == icol ? 1.0 : 0.0; + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){\ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + const int irowOut = irow2 + irow * numOfOutputAndInputVariables; + const int icolOut = icol2 + icol * numOfReferenceVariables; + IQMatrix[irowOut][icolOut] = factor * QMatrix[irow2][icol2]; + } + } + } + } + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + delete [] QMatrix[irow]; + } + delete [] QMatrix; + +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfReferenceVariables * numOfReferenceVariables; ++col ){ +// std::cout << IQMatrix[row][col].real() << "+" << IQMatrix[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + std::complex** IQPInvTPInvMatrix = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + IQPInvTPInvMatrix[irow] = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables * numOfReferenceVariables; ++icol ){ + IQPInvTPInvMatrix[irow][icol] = czero; + } + } + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables * numOfReferenceVariables; ++icol ){ + std::complex value = czero; + for( int i = 0; i < numOfReferenceVariables * numOfReferenceVariables; ++i ){ + value += IQMatrix[irow][i] * PInvTPInvMatrix[i][icol]; + } + IQPInvTPInvMatrix[irow][icol] = value; + } + } +#ifdef _DEBUG_WRITE +#else + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + delete [] PInvTPInvMatrix[irow]; + } + delete [] PInvTPInvMatrix; +#endif + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] IQMatrix[irow]; + } + delete [] IQMatrix; + +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfReferenceVariables * numOfReferenceVariables; ++col ){ +// std::cout << IQPInvTPInvMatrix[row][col].real() << "+" << IQPInvTPInvMatrix[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + std::complex** matrixVeceh1 = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + matrixVeceh1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + matrixVeceh1[irow][icol] = czero;// Zero clear + } + } + std::complex** matrixVechh1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + matrixVechh1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + matrixVechh1[irow][icol] = czero;// Zero clear + } + } + std::complex** matrixVeceh2 = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + matrixVeceh2[irow] = new std::complex[numOfOutputAndInputVariables]; + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + matrixVeceh2[irow][icol] = czero;// Zero clear + } + } + std::complex** matrixVechh2 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + matrixVechh2[irow] = new std::complex[numOfOutputAndInputVariables]; + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + matrixVechh2[irow][icol] = czero;// Zero clear + } + } + std::complex* veceh = new std::complex[numOfReferenceVariables * numOfOutputAndInputVariables]; + std::complex* vechh = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + std::complex** hSigmaMatrix = new std::complex*[numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + hSigmaMatrix[irow] = new std::complex[numOfOutputAndInputVariables]; + } + double* vecSigma = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + std::complex* sumVeceh3 = new std::complex[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + sumVeceh3[irow] = czero;// Zero clear + } + std::complex* sumVechh3 = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + sumVechh3[irow] = czero;// Zero clear + } +#ifdef _DEBUG_WRITE +// std::cout << "["; +#endif + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MD[iSeg] / scale; + const double diff = RobustWeightTukeysBiweights::calculateSecondDerivativeOfLossFunction(val, paramC) - RobustWeightTukeysBiweights::calculateWeights(val, paramC); + double factor1(0.0); + if( fabs(MD[iSeg]) < CommonParameters::EPS ){ + const double sc = scale * paramC; + factor1 = 4.0 * ( pow(MD[iSeg],2) / pow(sc,4) - 1.0 / pow(sc,2) ); + }else{ + factor1 = diff / pow(MD[iSeg], 2); + } + const double factor2 = diff / scale; + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int offset = numOfOutputAndInputVariables * irr; + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + veceh[iVar + offset] = ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor1; + sumVeceh3[iVar + offset] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor2; + assert(iVar == index); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + veceh[iVar + offset] = ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor1; + sumVeceh3[iVar + offset] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor2; + assert(iVar == index); + ++iVar; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int offset = numOfReferenceVariables * irr; + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + for( int irr2 = 0; irr2 < numOfReferenceVariables; ++irr2 ){ + const int index = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr2 ); + vechh[irr2 + offset] = ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor1; + sumVechh3[irr2 + offset] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor2; + } + } +#ifdef _DEBUG_WRITE + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + // std::cout << veceh[row].real() << "+" << veceh[row].imag() <<"im "; + // if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ + // std::cout << ","; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // std::cout << vechh[row].real() << "+" << vechh[row].imag() <<"im "; + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ","; + // } + //} + //std::cout << "]" << std::endl; +#endif + calculateVectorForPartialDerivatives( iSeg, ftval, variancesWithoutScale, complexResiduals, hSigmaMatrix, vecSigma ); +//#ifdef _DEBUG_WRITE +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// const int iq = col / ( 2 * numOfReferenceVariables ); +// const int isign = ( col / numOfReferenceVariables ) % 2; +// const int index = 2 * ( col % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// const double deriv = - 1.0 / MD[iSeg] * vecSigma[index]; +// std::cout << deriv <<" "; +// } +// if( iSeg+1 < numSegments ){ +// std::cout << ";"; +// } +//#endif + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + matrixVeceh1[irow][icol] += veceh[irow] * vecSigma[icol]; + } + } + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + matrixVechh1[irow][icol] += vechh[irow] * vecSigma[icol]; + } + } +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// std::cout << matrixVeceh1[row][col].real() << "+" << matrixVeceh1[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// std::cout << matrixVechh1[row][col].real() << "+" << matrixVechh1[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + matrixVeceh2[irow][icol] += veceh[irow] * 0.5 * std::norm(complexResiduals[icol][iSeg]) / pow(variancesWithoutScale[icol], 2); + } + } + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + matrixVechh2[irow][icol] += vechh[irow] * 0.5 * std::norm(complexResiduals[icol][iSeg]) / pow(variancesWithoutScale[icol], 2); + } + } +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// std::cout << complexResiduals[row][iSeg].real() << "+" << complexResiduals[row][iSeg].imag() <<"im "; +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ +// std::cout << matrixVeceh2[row][col].real() << "+" << matrixVeceh2[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ +// for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ +// std::cout << matrixVechh2[row][col].real() << "+" << matrixVechh2[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + } +//#ifdef _DEBUG_WRITE +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// std::cout << sumVeceh3[row].real() << "+" << sumVeceh3[row].imag() <<"im "; +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ +// std::cout << sumVechh3[row].real() << "+" << sumVechh3[row].imag() <<"im "; +// if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// const int iq = col / ( 2 * numOfReferenceVariables ); +// const int isign = ( col / numOfReferenceVariables ) % 2; +// const int index = 2 * ( col % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// std::cout << -matrixVeceh1[row][index].real() << "+" << -matrixVeceh1[row][index].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// const int iq = col / ( 2 * numOfReferenceVariables ); +// const int isign = ( col / numOfReferenceVariables ) % 2; +// const int index = 2 * ( col % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// std::cout << -matrixVechh1[row][index].real() << "+" << -matrixVechh1[row][index].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ +// for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ +// std::complex value = czero; +// const int iq = icol / ( 2 * numOfReferenceVariables ); +// const int isign = ( icol / numOfReferenceVariables ) % 2; +// const int index = 2 * ( icol % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// for( int i = 0; i < numOfReferenceVariables * numOfReferenceVariables; ++i ){ +// value += PInvTPInvMatrix[irow][i] * matrixVechh1[i][index]; +// } +// std::cout << value.real() << "+" << value.imag() <<"im "; +// } +// if( irow+1 < numOfReferenceVariables * numOfReferenceVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ +// delete [] PInvTPInvMatrix[irow]; +// } +// delete [] PInvTPInvMatrix; +//#endif + delete [] veceh; + delete [] vechh; + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + delete [] hSigmaMatrix[irow]; + } + delete [] hSigmaMatrix; + delete [] vecSigma; + + // Partial derivatives regarding responses + std::complex** complexDerivatives = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + complexDerivatives[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + std::complex value = czero; + // The 1st term + for( int i = 0; i < numOfReferenceVariables * numOfOutputAndInputVariables; ++i ){ + value -= PInvTIMatrix[irow][i] * matrixVeceh1[i][icol]; + } + // The 2nd term + for( int i = 0; i < numOfReferenceVariables * numOfReferenceVariables; ++i ){ + value += IQPInvTPInvMatrix[irow][i] * matrixVechh1[i][icol]; + } + complexDerivatives[irow][icol] = value; + } + } + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] matrixVeceh1[irow]; + } + delete [] matrixVeceh1; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + delete [] matrixVechh1[irow]; + } + delete [] matrixVechh1; +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// std::cout << complexDerivatives[row][col].real() << "+" << complexDerivatives[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12),Re(Z21),Im(Z21),Re(Z22),Im(Z22),...,Re(Zq1),Im(Zq1),Re(Zq2),Im(Zq2) + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + const int ir = irow / numOfOutputAndInputVariables; + const int iq = irow % numOfOutputAndInputVariables; + const int index = 2 * ir + iq * 2 * numOfReferenceVariables; + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + const int iq2 = icol / ( 2 * numOfReferenceVariables ); + const int offset = iq2 * 2 * numOfReferenceVariables; + const int amari = icol % ( 2 * numOfReferenceVariables ); + if( amari < numOfReferenceVariables ){ + // Real part + const int ir2 = amari; + const int index2 = 2 * ir2 + offset; + derivativesRegardingResps[index ][index2] = complexDerivatives[irow][icol].real(); + derivativesRegardingResps[index+1][index2] = complexDerivatives[irow][icol].imag(); + }else{ + // Imaginary part + const int ir2 = amari - numOfReferenceVariables; + const int index2 = 2 * ir2 + 1 + offset; + derivativesRegardingResps[index ][index2] = complexDerivatives[irow][icol].real(); + derivativesRegardingResps[index+1][index2] = complexDerivatives[irow][icol].imag(); + } + } + } +#ifdef _DEBUG_WRITE + std::cout << "drr1" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << derivativesRegardingResps[row][col] <<" "; + } + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif +#ifdef _DEBUG_20230128 + std::cout << "derivatives" << std::endl; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << derivativesRegardingResps[row][col] << ","; + } + std::cout << std::endl; + } +#endif +#ifdef _DEBUG_WRITE + double** derivMD1 = new double*[numSegments]; + for( int irow = 0; irow < numSegments; ++irow ){ + derivMD1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + std::complex** derivP1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + derivP1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + std::complex** derivInvP1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + derivInvP1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + std::complex** derivQ1 = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + derivQ1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + double** derivResp1 = new double*[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + derivResp1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + for( int isign = 0; isign < 2; ++isign ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + std::complex** respOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respOrg[i] = new std::complex[numOfReferenceVariables]; + } + std::complex** complexResidualsMod = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsMod[iVar] = new std::complex[numSegments]; + } + double* MDMod = new double[numSegments]; + double* weightsMod = new double[numSegments]; + std::complex** respMod = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respMod[i] = new std::complex[numOfReferenceVariables]; + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + respOrg[irow2][icol2] = resp[irow2][icol2]; + respMod[irow2][icol2] = resp[irow2][icol2]; + } + } + double dresp(0.0); + if( isign == 0 ){ + dresp = resp[irow][icol].real() * 0.001; + respMod[irow][icol] += std::complex( dresp, 0.0 ); + }else{ + dresp = resp[irow][icol].imag() * 0.001; + respMod[irow][icol] += std::complex( 0.0, dresp ); + } + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, respOrg, complexResidualsOrg ); + calculateComplexResiduals( numSegments, ftval, respMod, complexResidualsMod ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScale, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsMod, + variancesWithoutScale, MDMod ); + const int index = 2 * icol + isign + irow * 2 * numOfReferenceVariables; + for( int irow2 = 0; irow2 < numSegments; ++irow2 ){ + const double deriv = ( MDMod[irow2] - MDOrg[irow2] ) / dresp; + derivMD1[irow2][index] = deriv; + } + + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixOrg[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + } + std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixMod[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + } + derivP1[0][index] = ( PMatrixMod[0][0] - PMatrixOrg[0][0] ) / dresp; + derivP1[1][index] = ( PMatrixMod[1][0] - PMatrixOrg[1][0] ) / dresp; + derivP1[2][index] = ( PMatrixMod[0][1] - PMatrixOrg[0][1] ) / dresp; + derivP1[3][index] = ( PMatrixMod[1][1] - PMatrixOrg[1][1] ) / dresp; + + const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1]/detOrg, -PMatrixOrg[0][1]/detOrg, -PMatrixOrg[1][0]/detOrg, PMatrixOrg[0][0]/detOrg }; + const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1]/detMod, -PMatrixMod[0][1]/detMod, -PMatrixMod[1][0]/detMod, PMatrixMod[0][0]/detMod }; + derivInvP1[0][index] = ( PInvMatrixMod[0][0] - PInvMatrixOrg[0][0] ) / dresp; + derivInvP1[1][index] = ( PInvMatrixMod[1][0] - PInvMatrixOrg[1][0] ) / dresp; + derivInvP1[2][index] = ( PInvMatrixMod[0][1] - PInvMatrixOrg[0][1] ) / dresp; + derivInvP1[3][index] = ( PInvMatrixMod[1][1] - PInvMatrixOrg[1][1] ) / dresp; + + std::complex** QMatrixOrg = new std::complex*[numOfOutputAndInputVariables]; + std::complex** QMatrixMod = new std::complex*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + QMatrixOrg[irow] = new std::complex[numOfReferenceVariables]; + QMatrixMod[irow] = new std::complex[numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + QMatrixOrg[irow][icol] = czero; + QMatrixMod[irow][icol] = czero; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + const int irow = iVar + numOfOutputAndInputVariables * irr; + derivQ1[irow][index] = ( QMatrixMod[iVar][irr] - QMatrixOrg[iVar][irr] ) / dresp; + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + std::complex valueOrg = czero; + std::complex valueMod = czero; + for( int i = 0; i < numOfReferenceVariables; ++i ){ + valueOrg += QMatrixOrg[irow2][i] * PInvMatrixOrg[i][icol2]; + valueMod += QMatrixMod[irow2][i] * PInvMatrixMod[i][icol2]; + } + const int index2 = 2 * icol2 + irow2 * 2 * numOfReferenceVariables; + derivResp1[index2 ][index] = ( valueMod.real() - valueOrg.real() ) / dresp; + derivResp1[index2+1][index] = ( valueMod.imag() - valueOrg.imag() )/ dresp; + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixOrg[irow2]; + } + delete [] QMatrixOrg; + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixMod[irow2]; + } + delete [] QMatrixMod; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respOrg[i]; + } + delete [] respOrg; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsMod[iVar]; + } + delete [] complexResidualsMod; + delete [] MDMod; + delete [] weightsMod; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respMod[i]; + } + delete [] respMod; + } + } + } + //std::cout << "["; + //for( int row = 0; row < numSegments; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivMD[row][col] <<" "; + // } + // if( row+1 < numSegments ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivP[row][col].real() << "+" << derivP[row][col].imag() <<"im "; + // } + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivInvP[row][col].real() << "+" << derivInvP[row][col].imag() <<"im "; + // } + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivQ[row][col].real() << "+" << derivQ[row][col].imag() <<"im "; + // } + // if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + std::cout << "drr2" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << derivResp1[row][col] <<" "; + } + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + for( int irow = 0; irow < numSegments; ++irow ){ + delete [] derivMD1[irow]; + } + delete [] derivMD1; + for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + delete [] derivP1[irow]; + } + delete [] derivP1; + for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + delete [] derivInvP1[irow]; + } + delete [] derivInvP1; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] derivQ1[irow]; + } + delete [] derivQ1; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] derivResp1[irow]; + } + delete [] derivResp1; +#endif +#ifdef _DEBUG_20230128 + ////double** derivMD1 = new double*[numSegments]; + ////for( int irow = 0; irow < numSegments; ++irow ){ + //// derivMD1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + ////} + ////std::complex** derivP1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + ////for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + //// derivP1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + ////} + ////std::complex** derivInvP1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + ////for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + //// derivInvP1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + ////} + ////std::complex** derivQ1 = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + ////for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + //// derivQ1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + ////} + ////double** derivResp1 = new double*[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + ////for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + //// derivResp1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + ////} + //const double dresps[11] = { -0.010, -0.008, -0.006, -0.004, -0.002, 0.0, 0.002, 0.004, 0.006, 0.008, 0.010 }; + //for( int idresp = 0; idresp < 11; ++idresp ){ + // std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + // for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // complexResidualsOrg[iVar] = new std::complex[numSegments]; + // } + // double* MDOrg = new double[numSegments]; + // double* weightsOrg = new double[numSegments]; + // std::complex** respOrg = new std::complex*[numOfOutputAndInputVariables]; + // for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + // respOrg[i] = new std::complex[numOfReferenceVariables]; + // } + // std::complex** complexResidualsMod = new std::complex*[numOfOutputAndInputVariables]; + // for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // complexResidualsMod[iVar] = new std::complex[numSegments]; + // } + // double* MDMod = new double[numSegments]; + // double* weightsMod = new double[numSegments]; + // std::complex** respMod = new std::complex*[numOfOutputAndInputVariables]; + // for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + // respMod[i] = new std::complex[numOfReferenceVariables]; + // } + // for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + // for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + // respOrg[irow2][icol2] = resp[irow2][icol2]; + // respMod[irow2][icol2] = resp[irow2][icol2]; + // } + // } + // const double dresp = dresps[idresp]; + // respMod[3][0] += std::complex( 0.0, dresp ); + // // Calculate complex residuals + // calculateComplexResiduals( numSegments, ftval, respOrg, complexResidualsOrg ); + // calculateComplexResiduals( numSegments, ftval, respMod, complexResidualsMod ); + // // Calculate Mahalanobis distance + // calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + // variancesWithoutScale, MDOrg ); + // calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsMod, + // variancesWithoutScale, MDMod ); + // //const int index = 2 * icol + isign + irow * 2 * numOfReferenceVariables; + // //for( int irow2 = 0; irow2 < numSegments; ++irow2 ){ + // // const double deriv = ( MDMod[irow2] - MDOrg[irow2] ) / dresp; + // // derivMD1[irow2][index] = deriv; + // //} + + // // Calculate original weights + // for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + // const double val = MDOrg[iSeg] / scale; + // weightsOrg[iSeg] = UtilRobust::calculateTukeysBiweights(val, paramC); + // } + // for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + // const double val = MDMod[iSeg] / scale; + // weightsMod[iSeg] = UtilRobust::calculateTukeysBiweights(val, paramC); + // } + // std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + // for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + // PMatrixOrg[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + // PMatrixOrg[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + // PMatrixOrg[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + // PMatrixOrg[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + // } + // std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + // for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + // PMatrixMod[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + // PMatrixMod[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + // PMatrixMod[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + // PMatrixMod[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + // } + // //derivP1[0][index] = ( PMatrixMod[0][0] - PMatrixOrg[0][0] ) / dresp; + // //derivP1[1][index] = ( PMatrixMod[1][0] - PMatrixOrg[1][0] ) / dresp; + // //derivP1[2][index] = ( PMatrixMod[0][1] - PMatrixOrg[0][1] ) / dresp; + // //derivP1[3][index] = ( PMatrixMod[1][1] - PMatrixOrg[1][1] ) / dresp; + + // const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + // const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1]/detOrg, -PMatrixOrg[0][1]/detOrg, -PMatrixOrg[1][0]/detOrg, PMatrixOrg[0][0]/detOrg }; + // const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + // const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1]/detMod, -PMatrixMod[0][1]/detMod, -PMatrixMod[1][0]/detMod, PMatrixMod[0][0]/detMod }; + // //derivInvP1[0][index] = ( PInvMatrixMod[0][0] - PInvMatrixOrg[0][0] ) / dresp; + // //derivInvP1[1][index] = ( PInvMatrixMod[1][0] - PInvMatrixOrg[1][0] ) / dresp; + // //derivInvP1[2][index] = ( PInvMatrixMod[0][1] - PInvMatrixOrg[0][1] ) / dresp; + // //derivInvP1[3][index] = ( PInvMatrixMod[1][1] - PInvMatrixOrg[1][1] ) / dresp; + + // std::complex** QMatrixOrg = new std::complex*[numOfOutputAndInputVariables]; + // std::complex** QMatrixMod = new std::complex*[numOfOutputAndInputVariables]; + // for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + // QMatrixOrg[irow] = new std::complex[numOfReferenceVariables]; + // QMatrixMod[irow] = new std::complex[numOfReferenceVariables]; + // for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + // QMatrixOrg[irow][icol] = czero; + // QMatrixMod[irow][icol] = czero; + // } + // } + // for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + // const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + // int iVar(0); + // for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + // const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + // for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + // QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + // QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + // } + // assert(index == iVar); + // ++iVar; + // } + // for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + // const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + // for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + // QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + // QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + // } + // assert(index == iVar); + // ++iVar; + // } + // } + // //for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + // // for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // // const int irow = iVar + numOfOutputAndInputVariables * irr; + // // derivQ1[irow][index] = ( QMatrixMod[iVar][irr] - QMatrixOrg[iVar][irr] ) / dresp; + // // } + // //} + // std::cout << dresp; + // for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + // for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + // std::complex valueOrg = czero; + // std::complex valueMod = czero; + // for( int i = 0; i < numOfReferenceVariables; ++i ){ + // valueOrg += QMatrixOrg[irow2][i] * PInvMatrixOrg[i][icol2]; + // valueMod += QMatrixMod[irow2][i] * PInvMatrixMod[i][icol2]; + // } + // std::cout << ", " << valueMod.real() << ", " << valueMod.imag(); + // } + // } + // std::cout << std::endl; + // for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + // delete [] QMatrixOrg[irow2]; + // } + // delete [] QMatrixOrg; + // for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + // delete [] QMatrixMod[irow2]; + // } + // delete [] QMatrixMod; + // for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // delete [] complexResidualsOrg[iVar]; + // } + // delete [] complexResidualsOrg; + // delete [] MDOrg; + // delete [] weightsOrg; + // for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + // delete [] respOrg[i]; + // } + // delete [] respOrg; + // for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // delete [] complexResidualsMod[iVar]; + // } + // delete [] complexResidualsMod; + // delete [] MDMod; + // delete [] weightsMod; + // for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + // delete [] respMod[i]; + // } + // delete [] respMod; + //} + ////for( int irow = 0; irow < numSegments; ++irow ){ + //// delete [] derivMD1[irow]; + ////} + ////delete [] derivMD1; + ////for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + //// delete [] derivP1[irow]; + ////} + ////delete [] derivP1; + ////for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + //// delete [] derivInvP1[irow]; + ////} + ////delete [] derivInvP1; + ////for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + //// delete [] derivQ1[irow]; + ////} + ////delete [] derivQ1; + ////for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + //// delete [] derivResp1[irow]; + ////} + ////delete [] derivResp1; + //double** derivMD1 = new double*[numSegments]; + //for( int irow = 0; irow < numSegments; ++irow ){ + // derivMD1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + //} + //std::complex** derivP1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + //for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + // derivP1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + //} + //std::complex** derivInvP1 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + //for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + // derivInvP1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + //} + //std::complex** derivQ1 = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + //for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + // derivQ1[irow] = new std::complex[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + //} + //double** derivResp1 = new double*[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + //for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + // derivResp1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + //} + double** predictors = new double*[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + predictors[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + double** actuals = new double*[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + actuals[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + const double epsilons[4] = { 0.001, 0.01, 0.1, 1.0 }; + for( int idresp = 0; idresp < 4; ++idresp ){ + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + for( int isign = 0; isign < 2; ++isign ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + std::complex** respOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respOrg[i] = new std::complex[numOfReferenceVariables]; + } + std::complex** complexResidualsMod = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsMod[iVar] = new std::complex[numSegments]; + } + double* MDMod = new double[numSegments]; + double* weightsMod = new double[numSegments]; + std::complex** respMod = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respMod[i] = new std::complex[numOfReferenceVariables]; + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + respOrg[irow2][icol2] = resp[irow2][icol2]; + respMod[irow2][icol2] = resp[irow2][icol2]; + } + } + //double dresp(0.0); + const double dresp = std::abs(resp[irow][icol]) * epsilons[idresp]; + if( isign == 0 ){ + //dresp = resp[irow][icol].real() * epsilons[idresp]; + respMod[irow][icol] += std::complex( dresp, 0.0 ); + }else{ + //dresp = resp[irow][icol].imag() * epsilons[idresp]; + respMod[irow][icol] += std::complex( 0.0, dresp ); + } + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, respOrg, complexResidualsOrg ); + calculateComplexResiduals( numSegments, ftval, respMod, complexResidualsMod ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScale, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsMod, + variancesWithoutScale, MDMod ); + const int index = 2 * icol + isign + irow * 2 * numOfReferenceVariables; + //for( int irow2 = 0; irow2 < numSegments; ++irow2 ){ + // const double deriv = ( MDMod[irow2] - MDOrg[irow2] ) / dresp; + // derivMD1[irow2][index] = deriv; + //} + + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + weightsOrg[iSeg] = UtilRobust::calculateTukeysBiweights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + weightsMod[iSeg] = UtilRobust::calculateTukeysBiweights(val, paramC); + } + std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixOrg[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + } + std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixMod[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + } + //derivP1[0][index] = ( PMatrixMod[0][0] - PMatrixOrg[0][0] ) / dresp; + //derivP1[1][index] = ( PMatrixMod[1][0] - PMatrixOrg[1][0] ) / dresp; + //derivP1[2][index] = ( PMatrixMod[0][1] - PMatrixOrg[0][1] ) / dresp; + //derivP1[3][index] = ( PMatrixMod[1][1] - PMatrixOrg[1][1] ) / dresp; + + const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1]/detOrg, -PMatrixOrg[0][1]/detOrg, -PMatrixOrg[1][0]/detOrg, PMatrixOrg[0][0]/detOrg }; + const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1]/detMod, -PMatrixMod[0][1]/detMod, -PMatrixMod[1][0]/detMod, PMatrixMod[0][0]/detMod }; + //derivInvP1[0][index] = ( PInvMatrixMod[0][0] - PInvMatrixOrg[0][0] ) / dresp; + //derivInvP1[1][index] = ( PInvMatrixMod[1][0] - PInvMatrixOrg[1][0] ) / dresp; + //derivInvP1[2][index] = ( PInvMatrixMod[0][1] - PInvMatrixOrg[0][1] ) / dresp; + //derivInvP1[3][index] = ( PInvMatrixMod[1][1] - PInvMatrixOrg[1][1] ) / dresp; + + std::complex** QMatrixOrg = new std::complex*[numOfOutputAndInputVariables]; + std::complex** QMatrixMod = new std::complex*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + QMatrixOrg[irow] = new std::complex[numOfReferenceVariables]; + QMatrixMod[irow] = new std::complex[numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + QMatrixOrg[irow][icol] = czero; + QMatrixMod[irow][icol] = czero; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + } + //for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + // for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // const int irow = iVar + numOfOutputAndInputVariables * irr; + // derivQ1[irow][index] = ( QMatrixMod[iVar][irr] - QMatrixOrg[iVar][irr] ) / dresp; + // } + //} + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + std::complex valueOrg = czero; + std::complex valueMod = czero; + for( int i = 0; i < numOfReferenceVariables; ++i ){ + valueOrg += QMatrixOrg[irow2][i] * PInvMatrixOrg[i][icol2]; + valueMod += QMatrixMod[irow2][i] * PInvMatrixMod[i][icol2]; + } + const int index2 = 2 * icol2 + irow2 * 2 * numOfReferenceVariables; + //derivResp1[index2 ][index] = ( valueMod.real() - valueOrg.real() ) / dresp; + //derivResp1[index2+1][index] = ( valueMod.imag() - valueOrg.imag() ) / dresp; + predictors[index2 ][index] = valueOrg.real() + derivativesRegardingResps[index2 ][index] * dresp; + predictors[index2+1][index] = valueOrg.imag() + derivativesRegardingResps[index2+1][index] * dresp; + actuals[index2 ][index] = valueMod.real(); + actuals[index2+1][index] = valueMod.imag(); + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixOrg[irow2]; + } + delete [] QMatrixOrg; + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixMod[irow2]; + } + delete [] QMatrixMod; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respOrg[i]; + } + delete [] respOrg; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsMod[iVar]; + } + delete [] complexResidualsMod; + delete [] MDMod; + delete [] weightsMod; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respMod[i]; + } + delete [] respMod; + } + } + } + std::cout << "epsilon " << epsilons[idresp] << std::endl; + std::cout << "predictors" << std::endl; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << predictors[row][col] <<","; + } + std::cout << std::endl; + } + std::cout << "actuals" << std::endl; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << actuals[row][col] <<","; + } + std::cout << std::endl; + } + } + //for( int irow = 0; irow < numSegments; ++irow ){ + // delete [] derivMD1[irow]; + //} + //delete [] derivMD1; + //for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + // delete [] derivP1[irow]; + //} + //delete [] derivP1; + //for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + // delete [] derivInvP1[irow]; + //} + //delete [] derivInvP1; + //for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + // delete [] derivQ1[irow]; + //} + //delete [] derivQ1; + //for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + // delete [] derivResp1[irow]; + //} + //delete [] derivResp1; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] predictors[irow]; + } + delete [] predictors; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] actuals[irow]; + } + delete [] actuals; +#endif + + // Partial derivatives regarding variances without scale + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + complexDerivatives[irow][icol] = czero;// Zero clear + } + } + for( int irowL = 0; irowL < numOfReferenceVariables * numOfOutputAndInputVariables; ++irowL ){ + for( int icolR = 0; icolR < numOfOutputAndInputVariables; ++icolR ){ + std::complex value = czero; + // The 1st term + for( int i = 0; i < numOfReferenceVariables * numOfOutputAndInputVariables; ++i ){ + value -= PInvTIMatrix[irowL][i] * matrixVeceh2[i][icolR]; + } + // The 2nd term + for( int i = 0; i < numOfReferenceVariables * numOfReferenceVariables; ++i ){ + value += IQPInvTPInvMatrix[irowL][i] * matrixVechh2[i][icolR]; + } + complexDerivatives[irowL][icolR] = value; + } + } + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] matrixVeceh2[irow]; + } + delete [] matrixVeceh2; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + delete [] matrixVechh2[irow]; + } + delete [] matrixVechh2; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + const int ir = irow / numOfOutputAndInputVariables; + const int iq = irow % numOfOutputAndInputVariables; + const int index = 2 * ir + iq * 2 * numOfReferenceVariables; + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + derivativesRegardingVariancesWithoutScale[index ][icol] = complexDerivatives[irow][icol].real(); + derivativesRegardingVariancesWithoutScale[index+1][icol] = complexDerivatives[irow][icol].imag(); + } + } +#ifdef _DEBUG_WRITE + std::cout << "drv1" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ + std::cout << derivativesRegardingVariancesWithoutScale[row][col] <<" "; + } + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif +#ifdef _DEBUG_WRITE + double** derivMD2 = new double*[numSegments]; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + derivMD2[iSeg] = new double[numOfOutputAndInputVariables]; + } + std::complex** derivP2 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + derivP2[irow] = new std::complex[numOfOutputAndInputVariables]; + } + std::complex** derivInvP2 = new std::complex*[numOfReferenceVariables * numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfReferenceVariables; ++irow ){ + derivInvP2[irow] = new std::complex[numOfOutputAndInputVariables]; + } + std::complex** derivQ2 = new std::complex*[numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + derivQ2[irow] = new std::complex[numOfOutputAndInputVariables]; + } + double** derivResp2 = new double*[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + derivResp2[irow] = new double[numOfOutputAndInputVariables]; + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar2 = 0; iVar2 < numOfOutputAndInputVariables; ++iVar2 ){ + complexResidualsOrg[iVar2] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + double* variancesWithoutScaleOrg = new double[numOfOutputAndInputVariables]; + double* MDMod = new double[numSegments]; + double* weightsMod = new double[numSegments]; + double* variancesWithoutScaleMod = new double[numOfOutputAndInputVariables]; + for( int iVar2 = 0; iVar2 < numOfOutputAndInputVariables; ++iVar2 ){ + variancesWithoutScaleOrg[iVar2] = variancesWithoutScale[iVar2]; + variancesWithoutScaleMod[iVar2] = variancesWithoutScale[iVar2]; + } + const double dvar = variancesWithoutScale[iVar] * 0.001; + variancesWithoutScaleMod[iVar] += dvar; + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, resp, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleOrg, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleMod, MDMod ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double deriv = ( MDMod[iSeg] - MDOrg[iSeg] ) / dvar; + derivMD2[iSeg][iVar] = deriv; + } + + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixOrg[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + } + std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixMod[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + } + derivP2[0][iVar] = ( PMatrixMod[0][0] - PMatrixOrg[0][0] ) / dvar; + derivP2[1][iVar] = ( PMatrixMod[1][0] - PMatrixOrg[1][0] ) / dvar; + derivP2[2][iVar] = ( PMatrixMod[0][1] - PMatrixOrg[0][1] ) / dvar; + derivP2[3][iVar] = ( PMatrixMod[1][1] - PMatrixOrg[1][1] ) / dvar; + + const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1]/detOrg, -PMatrixOrg[0][1]/detOrg, -PMatrixOrg[1][0]/detOrg, PMatrixOrg[0][0]/detOrg }; + const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1]/detMod, -PMatrixMod[0][1]/detMod, -PMatrixMod[1][0]/detMod, PMatrixMod[0][0]/detMod }; + derivInvP2[0][iVar] = ( PInvMatrixMod[0][0] - PInvMatrixOrg[0][0] ) / dvar; + derivInvP2[1][iVar] = ( PInvMatrixMod[1][0] - PInvMatrixOrg[1][0] ) / dvar; + derivInvP2[2][iVar] = ( PInvMatrixMod[0][1] - PInvMatrixOrg[0][1] ) / dvar; + derivInvP2[3][iVar] = ( PInvMatrixMod[1][1] - PInvMatrixOrg[1][1] ) / dvar; + + std::complex** QMatrixOrg = new std::complex*[numOfOutputAndInputVariables]; + std::complex** QMatrixMod = new std::complex*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + QMatrixOrg[irow] = new std::complex[numOfReferenceVariables]; + QMatrixMod[irow] = new std::complex[numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + QMatrixOrg[irow][icol] = czero; + QMatrixMod[irow][icol] = czero; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + for( int iVar2 = 0; iVar2 < numOfOutputAndInputVariables; ++iVar2 ){ + const int irow = iVar + numOfOutputAndInputVariables * irr; + derivQ2[irow][iVar2] = ( QMatrixMod[iVar2][irr] - QMatrixOrg[iVar2][irr] ) / dvar; + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + std::complex valueOrg = czero; + std::complex valueMod = czero; + for( int i = 0; i < numOfReferenceVariables; ++i ){ + valueOrg += QMatrixOrg[irow2][i] * PInvMatrixOrg[i][icol2]; + valueMod += QMatrixMod[irow2][i] * PInvMatrixMod[i][icol2]; + } + const int index2 = 2 * icol2 + irow2 * 2 * numOfReferenceVariables; + derivResp2[index2 ][iVar] = ( valueMod.real() - valueOrg.real() ) / dvar; + derivResp2[index2+1][iVar] = ( valueMod.imag() - valueOrg.imag() )/ dvar; + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixOrg[irow2]; + } + delete [] QMatrixOrg; + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixMod[irow2]; + } + delete [] QMatrixMod; + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + delete [] variancesWithoutScaleOrg; + delete [] MDMod; + delete [] weightsMod; + delete [] variancesWithoutScaleMod; + } + //std::cout << "["; + //for( int row = 0; row < numSegments; ++row ){ + // for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ + // std::cout << derivMD[row][col] <<" "; + // } + // if( row+1 < numSegments ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivP[row][col].real() << "+" << derivP[row][col].imag() <<"im "; + // } + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivInvP[row][col].real() << "+" << derivInvP[row][col].imag() <<"im "; + // } + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivQ[row][col].real() << "+" << derivQ[row][col].imag() <<"im "; + // } + // if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + std::cout << "drv2" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ + std::cout << derivResp2[row][col] <<" "; + } + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + for( int irow = 0; irow < numSegments; ++irow ){ + delete [] derivMD2[irow]; + } + delete [] derivMD2; + for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + delete [] derivP2[irow]; + } + delete [] derivP2; + for( int irow = 0; irow < numOfReferenceVariables*numOfReferenceVariables; ++irow ){ + delete [] derivInvP2[irow]; + } + delete [] derivInvP2; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] derivQ2[irow]; + } + delete [] derivQ2; + for( int irow = 0; irow < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] derivResp2[irow]; + } + delete [] derivResp2; +#endif + + // Partial derivatives regarding scale + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + complexDerivatives[irow][icol] = czero;// Zero clear + } + } + for( int irowL = 0; irowL < numOfReferenceVariables * numOfOutputAndInputVariables; ++irowL ){ + std::complex value = czero; + // The 1st term + for( int i = 0; i < numOfReferenceVariables * numOfOutputAndInputVariables; ++i ){ + value -= PInvTIMatrix[irowL][i] * sumVeceh3[i]; + } + // The 2nd term + for( int i = 0; i < numOfReferenceVariables * numOfReferenceVariables; ++i ){ + value += IQPInvTPInvMatrix[irowL][i] * sumVechh3[i]; + } + complexDerivatives[irowL][1] = value; + } + delete [ ]sumVeceh3; + delete [] sumVechh3; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + const int ir = irow / numOfOutputAndInputVariables; + const int iq = irow % numOfOutputAndInputVariables; + const int index = 2 * ir + iq * 2 * numOfReferenceVariables; + derivativesRegardingScale[index ] = complexDerivatives[irow][1].real(); + derivativesRegardingScale[index+1] = complexDerivatives[irow][1].imag(); + } +#ifdef _DEBUG_WRITE + std::cout << "drs1" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + std::cout << derivativesRegardingScale[row] <<" "; + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif +#ifdef _DEBUG_WRITE + std::complex* derivP3 = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + std::complex* derivInvP3 = new std::complex[numOfReferenceVariables * numOfReferenceVariables]; + std::complex* derivQ3 = new std::complex[numOfReferenceVariables * numOfOutputAndInputVariables]; + double* derivResp3 = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + { + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar2 = 0; iVar2 < numOfOutputAndInputVariables; ++iVar2 ){ + complexResidualsOrg[iVar2] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + double* weightsMod = new double[numSegments]; + const double scaleOrg = scale; + const double dscale = scale * 0.001; + const double scaleMod = scale + dscale; + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, resp, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScale, MDOrg ); + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleOrg; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleMod; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixOrg[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + } + std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + PMatrixMod[0][0] += ftval[rr0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][0] += ftval[rr1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[0][1] += ftval[rr0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][1] += ftval[rr1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + } + derivP3[0] = ( PMatrixMod[0][0] - PMatrixOrg[0][0] ) / dscale; + derivP3[1] = ( PMatrixMod[1][0] - PMatrixOrg[1][0] ) / dscale; + derivP3[2] = ( PMatrixMod[0][1] - PMatrixOrg[0][1] ) / dscale; + derivP3[3] = ( PMatrixMod[1][1] - PMatrixOrg[1][1] ) / dscale; + const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1]/detOrg, -PMatrixOrg[0][1]/detOrg, -PMatrixOrg[1][0]/detOrg, PMatrixOrg[0][0]/detOrg }; + const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1]/detMod, -PMatrixMod[0][1]/detMod, -PMatrixMod[1][0]/detMod, PMatrixMod[0][0]/detMod }; + derivInvP3[0] = ( PInvMatrixMod[0][0] - PInvMatrixOrg[0][0] ) / dscale; + derivInvP3[1] = ( PInvMatrixMod[1][0] - PInvMatrixOrg[1][0] ) / dscale; + derivInvP3[2] = ( PInvMatrixMod[0][1] - PInvMatrixOrg[0][1] ) / dscale; + derivInvP3[3] = ( PInvMatrixMod[1][1] - PInvMatrixOrg[1][1] ) / dscale; + std::complex** QMatrixOrg = new std::complex*[numOfOutputAndInputVariables]; + std::complex** QMatrixMod = new std::complex*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + QMatrixOrg[irow] = new std::complex[numOfReferenceVariables]; + QMatrixMod[irow] = new std::complex[numOfReferenceVariables]; + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + QMatrixOrg[irow][icol] = czero; + QMatrixMod[irow][icol] = czero; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irr ); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + QMatrixOrg[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[iVar][irr] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + assert(index == iVar); + ++iVar; + } + } + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + const int irow = iVar + numOfOutputAndInputVariables * irr; + derivQ3[irow] = ( QMatrixMod[iVar][irr] - QMatrixOrg[iVar][irr] ) / dscale; + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + std::complex valueOrg = czero; + std::complex valueMod = czero; + for( int i = 0; i < numOfReferenceVariables; ++i ){ + valueOrg += QMatrixOrg[irow2][i] * PInvMatrixOrg[i][icol2]; + valueMod += QMatrixMod[irow2][i] * PInvMatrixMod[i][icol2]; + } + const int index2 = 2 * icol2 + irow2 * 2 * numOfReferenceVariables; + derivResp3[index2 ] = ( valueMod.real() - valueOrg.real() ) / dscale; + derivResp3[index2+1] = ( valueMod.imag() - valueOrg.imag() )/ dscale; + } + } + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixOrg[irow2]; + } + delete [] QMatrixOrg; + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + delete [] QMatrixMod[irow2]; + } + delete [] QMatrixMod; + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + delete [] weightsMod; + } + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // std::cout << derivP[row].real() << "+" << derivP[row].imag() <<"im "; + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ","; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfReferenceVariables; ++row ){ + // std::cout << derivInvP[row].real() << "+" << derivInvP[row].imag() <<"im "; + // if( row+1 < numOfReferenceVariables * numOfReferenceVariables ){ + // std::cout << ","; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + // std::cout << derivQ[row].real() << "+" << derivQ[row].imag() <<"im "; + // if( row+1 < numOfReferenceVariables * numOfOutputAndInputVariables ){ + // std::cout << ","; + // } + //} + //std::cout << "]" << std::endl; + std::cout << "drs2" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + std::cout << derivResp3[row] <<" "; + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + delete [] derivP3; + delete [] derivInvP3; + delete [] derivQ3; + delete [] derivResp3; +#endif + + for( int irow = 0; irow < 2 * numOfOutputAndInputVariables; ++irow ){ + delete [] PInvTIMatrix[irow]; + } + delete [] PInvTIMatrix; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] IQPInvTPInvMatrix[irow]; + } + delete [] IQPInvTPInvMatrix; + for( int irow = 0; irow < numOfReferenceVariables * numOfOutputAndInputVariables; ++irow ){ + delete [] complexDerivatives[irow]; + } + delete [] complexDerivatives; + +} + +// Calculate partial derivatives of scale +void AnalysisMultivariateRegression::calculatePartialDerivativesOfScale( const int numSegments, const double paramB, const double paramC, + std::complex** ftval, std::complex** resp, const double* const variancesWithoutScale, const double scale, + std::complex** complexResiduals, const double* const MD, const double* const weights, + double* derivativesRegardingResps, double* derivativesRegardingVariancesWithoutScale, double& derivativesRegardingScale ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + + const std::complex czero = std::complex( 0.0, 0.0 ); + + double* value1 = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + value1[icol] = 0.0;// Zero clear + } + double* value2 = new double[numOfOutputAndInputVariables]; + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + value2[icol] = 0.0;// Zero clear + } + double value3(0.0); + double* vecSigma = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + std::complex** hSigmaMatrix = new std::complex*[numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + hSigmaMatrix[irow] = new std::complex[numOfOutputAndInputVariables]; + } +//#ifdef _DEBUG_WRITE +// std::cout << "["; +//#endif + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + calculateVectorForPartialDerivatives( iSeg, ftval, variancesWithoutScale, complexResiduals, hSigmaMatrix, vecSigma); + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + double temp = vecSigma[icol]; + if( fabs(MD[iSeg]) < CommonParameters::EPS ){ + // Nothing to do + }else{ + temp *= weights[iSeg]; + } + value1[icol] -= temp; +//#ifdef _DEBUG_WRITE +// const int iq = icol / ( 2 * numOfReferenceVariables ); +// const int isign = ( icol / numOfReferenceVariables ) % 2; +// const int index = 2 * ( icol % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// std::cout << -temp <<" "; +//#endif + } +//#ifdef _DEBUG_WRITE +// if( iSeg + 1 < numSegments){ +// std::cout << ";"; +// } +//#endif + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + double temp = 0.5 * std::norm(complexResiduals[icol][iSeg]) / pow(variancesWithoutScale[icol], 2); + if( fabs(MD[iSeg]) < CommonParameters::EPS ){ + // Nothing to do + }else{ + temp *= weights[iSeg]; + } + value2[icol] -= temp; + } + const double val = MD[iSeg] / scale; + if( fabs(val) < CommonParameters::EPS ){ + // Nothing to do + }else{ + const double temp = 2.0 * pow(scale, 2) * RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) + - pow(MD[iSeg], 2) * weights[iSeg]; + value3 += temp / scale; + } + } +//#ifdef _DEBUG_WRITE +// std::cout << "]" << std::endl; +//#endif + delete [] vecSigma; + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + delete [] hSigmaMatrix[irow]; + } + delete [] hSigmaMatrix; + +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// const int iq = row / ( 2 * numOfReferenceVariables ); +// const int isign = ( row / numOfReferenceVariables ) % 2; +// const int index = 2 * ( row % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// std::cout << value1[index] <<" "; +// if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12),Re(Z21),Im(Z21),Re(Z22),Im(Z22),...,Re(Zq1),Im(Zq1),Re(Zq2),Im(Zq2) + const double factor = 1.0 / ( 2.0 * scale * static_cast(numSegments) * paramB ); + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + const int iq2 = icol / ( 2 * numOfReferenceVariables ); + const int offset = iq2 * 2 * numOfReferenceVariables; + const int amari = icol % ( 2 * numOfReferenceVariables ); + if( amari < numOfReferenceVariables ){ + // Real part + const int ir2 = amari; + const int index2 = 2 * ir2 + offset; + derivativesRegardingResps[index2] = factor * value1[icol]; + }else{ + // Imaginary part + const int ir2 = amari - numOfReferenceVariables; + const int index2 = 2 * ir2 + 1 + offset; + derivativesRegardingResps[index2] = factor * value1[icol]; + } + } + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + derivativesRegardingVariancesWithoutScale[icol] = factor * value2[icol]; + } + derivativesRegardingScale = factor * value3; + + delete [] value1; + delete [] value2; + +#ifdef _DEBUG_WRITE + std::cout << "dsr1" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + std::cout << derivativesRegardingResps[row] <<" "; + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "dsv1" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + std::cout << derivativesRegardingVariancesWithoutScale[row] <<" "; + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "dss1" << std::endl; + std::cout << derivativesRegardingScale << std::endl; +#endif +#ifdef _DEBUG_WRITE + const double valq = static_cast(numOfOutputAndInputVariables); + const double val2q = static_cast(degreeOfFreedom); + double** derivSumU1 = new double*[numSegments]; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + derivSumU1[iSeg] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + double* derivSquaredScale1 = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + double* derivScale1 = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + for( int isign = 0; isign < 2; ++isign ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + std::complex** respOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respOrg[i] = new std::complex[numOfReferenceVariables]; + } + std::complex** complexResidualsMod = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsMod[iVar] = new std::complex[numSegments]; + } + double* MDMod = new double[numSegments]; + std::complex** respMod = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respMod[i] = new std::complex[numOfReferenceVariables]; + } + + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + respOrg[irow2][icol2] = resp[irow2][icol2]; + respMod[irow2][icol2] = resp[irow2][icol2]; + } + } + double dresp(0.0); + if( isign == 0 ){ + dresp = resp[irow][icol].real() * 0.001; + respMod[irow][icol] += std::complex( dresp, 0.0 ); + }else{ + dresp = resp[irow][icol].imag() * 0.001; + respMod[irow][icol] += std::complex( 0.0, dresp ); + } + + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, respOrg, complexResidualsOrg ); + calculateComplexResiduals( numSegments, ftval, respMod, complexResidualsMod ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScale, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsMod, + variancesWithoutScale, MDMod ); + + const int index = 2 * icol + isign + irow * 2 * numOfReferenceVariables; + + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double valOrg = MDOrg[iSeg] / scale; + const double valMod = MDMod[iSeg] / scale; + const double uOrg = RobustWeightTukeysBiweights::calculateLossFunction(valOrg, paramC) * pow(scale, 2); + const double uMod = RobustWeightTukeysBiweights::calculateLossFunction(valMod, paramC) * pow(scale, 2); + derivSumU1[iSeg][index] = ( uMod - uOrg ) / dresp; + } + + double squareScaleOrg(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + if( fabs(MDOrg[iSeg]) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + squareScaleOrg += 0.5 * pow(MDOrg[iSeg], 2); + }else{ + const double val = MDOrg[iSeg] / scale; + squareScaleOrg += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scale, 2); + } + } + double squareScaleMod(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + if( fabs(val) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + squareScaleMod += 0.5 * pow(MDMod[iSeg], 2); + }else{ + squareScaleMod += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scale, 2); + } + } + + derivSquaredScale1[index] = ( squareScaleMod - squareScaleOrg ) / dresp; + + squareScaleOrg /= static_cast(numSegments); + squareScaleOrg /= paramB; + const double scaleOrg = sqrt(squareScaleOrg); + squareScaleMod /= static_cast(numSegments); + squareScaleMod /= paramB; + const double scaleMod = sqrt(squareScaleMod); + + derivScale1[index] = ( scaleMod - scaleOrg ) / dresp; + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respOrg[i]; + } + delete [] respOrg; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsMod[iVar]; + } + delete [] complexResidualsMod; + delete [] MDMod; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respMod[i]; + } + delete [] respMod; + } + } + } + //std::cout << "["; + //for( int row = 0; row < numSegments; ++row ){ + // for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + // std::cout << derivSumU1[row][col] <<" "; + // } + // if( row+1 < numSegments ){ + // std::cout << ";"; + // } + //} + //std::cout << "]" << std::endl; + //std::cout << "["; + //for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + // std::cout << derivSquaredScale1[row] <<" "; + // if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + // std::cout << ","; + // } + //} + //std::cout << "]" << std::endl; + std::cout << "dsr2" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ + std::cout << derivScale1[row] <<" "; + if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + delete [] derivSumU1[iSeg]; + } + delete [] derivSumU1; + delete [] derivSquaredScale1; + delete [] derivScale1; + + double* derivScale2 = new double[numOfOutputAndInputVariables]; + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* variancesWithoutScaleOrg = new double[numOfOutputAndInputVariables]; + double* MDMod = new double[numSegments]; + double* variancesWithoutScaleMod = new double[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + variancesWithoutScaleOrg[iVar] = variancesWithoutScale[iVar]; + variancesWithoutScaleMod[iVar] = variancesWithoutScale[iVar]; + } + const double dvar = variancesWithoutScale[icol] * 0.001; + variancesWithoutScaleMod[icol] += dvar; + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, resp, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleOrg, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleMod, MDMod ); + + double squareScaleOrg(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + if( fabs(val) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + squareScaleOrg += 0.5 * pow(MDOrg[iSeg], 2); + }else{ + squareScaleOrg += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scale, 2); + } + } + double squareScaleMod(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + if( fabs(val) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + squareScaleMod += 0.5 * pow(MDMod[iSeg], 2); + }else{ + squareScaleMod += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scale, 2); + } + } + + squareScaleOrg /= static_cast(numSegments); + squareScaleOrg /= paramB; + const double scaleOrg = sqrt(squareScaleOrg); + squareScaleMod /= static_cast(numSegments); + squareScaleMod /= paramB; + const double scaleMod = sqrt(squareScaleMod); + + derivScale2[icol] = ( scaleMod - scaleOrg ) / dvar; + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] variancesWithoutScaleOrg; + delete [] MDMod; + delete [] variancesWithoutScaleMod; + } + std::cout << "dsv2" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + std::cout << derivScale2[row] << " "; + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + + double derivScale3(0.0); + { + std::complex** complexResiduals = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar2 = 0; iVar2 < numOfOutputAndInputVariables; ++iVar2 ){ + complexResiduals[iVar2] = new std::complex[numSegments]; + } + double* MD = new double[numSegments]; + const double scaleOrg = scale; + const double dscale = scale * 0.001; + const double scaleMod = scale + dscale; + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, resp, complexResiduals ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResiduals, + variancesWithoutScale, MD ); + + double squareScaleOrg(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MD[iSeg] / scaleOrg; + if( fabs(val) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + squareScaleOrg += 0.5 * pow(MD[iSeg], 2); + }else{ + squareScaleOrg += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scaleOrg, 2); + } + } + double squareScaleMod(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MD[iSeg] / scaleMod; + if( fabs(val) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + squareScaleMod += 0.5 * pow(MD[iSeg], 2); + }else{ + squareScaleMod += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scaleMod, 2); + } + } + + squareScaleOrg /= static_cast(numSegments); + squareScaleOrg /= paramB; + const double scaleNewOrg = sqrt(squareScaleOrg); + squareScaleMod /= static_cast(numSegments); + squareScaleMod /= paramB; + const double scaleNewMod = sqrt(squareScaleMod); + + derivScale3 = ( scaleNewMod - scaleNewOrg ) / dscale; + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResiduals[iVar]; + } + delete [] complexResiduals; + delete [] MD; + } + std::cout << "dss2" << std::endl; + std::cout << derivScale3 << std::endl; +#endif + +} + +// Calculate partial derivatives of variances without scale for robust bootstrap +void AnalysisMultivariateRegression::calculatePartialDerivativesOfVariancesWithoutScale( const int numSegments, const double paramC, + std::complex** ftval, std::complex** resp, const double* const variancesWithoutScale, const double scale, const double determinant, + std::complex** complexResiduals, const double* const MD, const double* const weights, + double** derivativesRegardingResps, double** derivativesRegardingVariancesWithoutScale, double* derivativesRegardingScale ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + const double valq = static_cast(numOfOutputAndInputVariables); + + const std::complex czero = std::complex( 0.0, 0.0 ); + + // Variances with scale + double* variances = new double[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + variances[iVar] = variancesWithoutScale[iVar] * pow(determinant, 1.0/static_cast(degreeOfFreedom)); + } + + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + denominator += weights[iSeg] * pow(MD[iSeg] / scale, 2); + } + double* term1 = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + double* term1a = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + double* term2 = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + double* term3 = new double[numOfOutputAndInputVariables]; + double* term4 = new double[numOfOutputAndInputVariables]; + double** dSigma1 = new double*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + dSigma1[iVar] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + double** dSigma2 = new double*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + dSigma2[iVar] = new double[numOfOutputAndInputVariables]; + } + double* dSigma3 = new double[numOfOutputAndInputVariables]; + double* vecSigma = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + std::complex** hSigmaMatrix = new std::complex*[numOfReferenceVariables]; + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + hSigmaMatrix[irow] = new std::complex[numOfOutputAndInputVariables]; + } + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + const double sc = scale * paramC; + std::complex termFirst = czero; + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + term1[icol] = 0.0;// Zero clear + term1a[icol] = 0.0;// Zero clear + term2[icol] = 0.0;// Zero clear + } + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + term3[icol] = 0.0;// Zero clear + term4[icol] = 0.0;// Zero clear + } + double term5(0.0); + double term6(0.0); + double numerator (0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MD[iSeg] / scale; + const double diff = RobustWeightTukeysBiweights::calculateSecondDerivativeOfLossFunction(val, paramC) - RobustWeightTukeysBiweights::calculateWeights(val, paramC); + double factor1(0.0); + if( fabs(MD[iSeg]) < CommonParameters::EPS ){ + const double sc = scale * paramC; + factor1 = 4.0 * ( pow(MD[iSeg],2) / pow(sc,4) - 1.0 / pow(sc,2) ); + }else{ + factor1 = diff / pow(MD[iSeg], 2); + } + numerator += std::norm(complexResiduals[irow][iSeg]) * weights[iSeg]; + calculateVectorForPartialDerivatives( iSeg, ftval, variancesWithoutScale, complexResiduals, hSigmaMatrix, vecSigma ); + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + term1[icol] += std::norm(complexResiduals[irow][iSeg]) * factor1 * vecSigma[icol]; + term2[icol] += ( diff + 2.0 * weights[iSeg] ) / pow(scale, 2) * vecSigma[icol]; + } + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + const double temp = std::norm(complexResiduals[icol][iSeg]) / pow(variancesWithoutScale[icol], 2); + term3[icol] += std::norm(complexResiduals[irow][iSeg]) * 0.5 * factor1 * temp; + term4[icol] += ( diff * 0.5 + weights[iSeg] ) / pow(scale, 2) * temp; + } + term5 += std::norm(complexResiduals[irow][iSeg]) * diff / scale; + term6 += ( diff + 2.0 * weights[iSeg] ) / scale * pow(MD[iSeg] / scale, 2); + const double sigmaReal = complexResiduals[irow][iSeg].real(); + const double sigmaImag = complexResiduals[irow][iSeg].imag(); + const std::complex brx = ftval[ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0)][iSeg]; + const std::complex bry = ftval[ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1)][iSeg]; + const int offset = 2 * numOfReferenceVariables * irow; + term1a[offset ] += weights[iSeg] * ( sigmaReal * brx.real() + sigmaImag * brx.imag()); + term1a[offset + 1] += weights[iSeg] * ( sigmaReal * bry.real() + sigmaImag * bry.imag()); + term1a[offset + 2] += weights[iSeg] * (-sigmaReal * brx.imag() + sigmaImag * brx.real()); + term1a[offset + 3] += weights[iSeg] * (-sigmaReal * bry.imag() + sigmaImag * bry.real()); + } + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + dSigma1[irow][icol] = - valq / denominator * term1[icol] - 2.0 * valq / denominator * term1a[icol] + valq * numerator / pow(denominator,2) * term2[icol]; + } + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + dSigma2[irow][icol] = - valq / denominator * term3[icol] + valq * numerator / pow(denominator,2) * term4[icol]; + } + dSigma3[irow] = - valq / denominator * term5 + valq * numerator / pow(denominator,2) * term6; + } + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + delete [] hSigmaMatrix[irow]; + } + delete [] hSigmaMatrix; + delete [] vecSigma; + delete [] term1; + delete [] term1a; + delete [] term2; + delete [] term3; + delete [] term4; + +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ +// const int iq = col / ( 2 * numOfReferenceVariables ); +// const int isign = ( col / numOfReferenceVariables ) % 2; +// const int index = 2 * ( col % numOfReferenceVariables ) + isign + 2 * numOfReferenceVariables * iq; +// std::cout << dSigma1[row][index] <<" "; +// } +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ +// std::cout << dSigma2[row][col] <<" "; +// } +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +// std::cout << "["; +// for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ +// std::cout << dSigma3[row]; +// if( row+1 < numOfOutputAndInputVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + const double val2q = static_cast(degreeOfFreedom); + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + // Partial derivatives regarding responses + for( int icol = 0; icol < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++icol ){ + const double value1 = pow(determinant, -1.0/val2q) * dSigma1[irow][icol]; + double temp(0.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + temp += 2.0 / variances[iVar] * dSigma1[iVar][icol]; + } + const double value2 = variancesWithoutScale[irow] / val2q * temp; + const int iq2 = icol / ( 2 * numOfReferenceVariables ); + const int offset = iq2 * 2 * numOfReferenceVariables; + const int amari = icol % ( 2 * numOfReferenceVariables ); + if( amari < numOfReferenceVariables ){ + // Real part + const int ir2 = amari; + const int index2 = 2 * ir2 + offset; + derivativesRegardingResps[irow][index2] = value1 - value2; + }else{ + // Imaginary part + const int ir2 = amari - numOfReferenceVariables; + const int index2 = 2 * ir2 + 1 + offset; + derivativesRegardingResps[irow][index2] = value1 - value2; + } + } + // Partial derivatives regarding variances without scale + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + const double value1 = pow(determinant, -1.0/val2q) * dSigma2[irow][icol]; + double temp(0.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + temp += 2.0 / variances[iVar] * dSigma2[iVar][icol]; + } + const double value2 = variancesWithoutScale[irow] / val2q * temp; + derivativesRegardingVariancesWithoutScale[irow][icol] = value1 - value2; + } + // Partial derivatives regarding scale + const double value1 = pow(determinant, -1.0/val2q) * dSigma3[irow]; + double temp(0.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + temp += 2.0 / variances[iVar] * dSigma3[iVar]; + } + const double value2 = variancesWithoutScale[irow] / val2q * temp; + derivativesRegardingScale[irow] = value1 - value2; + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] dSigma1[iVar]; + } + delete [] dSigma1; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] dSigma2[iVar]; + } + delete [] dSigma2; + delete [] dSigma3; + delete [] variances; + +#ifdef _DEBUG_WRITE + std::cout << "dvr1" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << derivativesRegardingResps[row][col] <<" "; + } + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "dvv1" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ + std::cout << derivativesRegardingVariancesWithoutScale[row][col] <<" "; + } + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "dvs1" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + std::cout << derivativesRegardingScale[row]; + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif +#ifdef _DEBUG_WRITE + double** derivVar1 = new double*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + derivVar1[irow] = new double[2 * numOfReferenceVariables * numOfOutputAndInputVariables]; + } + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + for( int icol = 0; icol < numOfReferenceVariables; ++icol ){ + for( int isign = 0; isign < 2; ++isign ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + std::complex** respOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respOrg[i] = new std::complex[numOfReferenceVariables]; + } + double* variancesWithoutScaleOrg = new double[numOfOutputAndInputVariables]; + std::complex** complexResidualsMod = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsMod[iVar] = new std::complex[numSegments]; + } + double* MDMod = new double[numSegments]; + double* weightsMod = new double[numSegments]; + std::complex** respMod = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respMod[i] = new std::complex[numOfReferenceVariables]; + } + double* variancesWithoutScaleMod = new double[numOfOutputAndInputVariables]; + + for( int irow2 = 0; irow2 < numOfOutputAndInputVariables; ++irow2 ){ + for( int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2 ){ + respOrg[irow2][icol2] = resp[irow2][icol2]; + respMod[irow2][icol2] = resp[irow2][icol2]; + } + } + double dresp(0.0); + if( isign == 0 ){ + dresp = resp[irow][icol].real() * 0.001; + respMod[irow][icol] += std::complex( dresp, 0.0 ); + }else{ + dresp = resp[irow][icol].imag() * 0.001; + respMod[irow][icol] += std::complex( 0.0, dresp ); + } + + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, respOrg, complexResidualsOrg ); + calculateComplexResiduals( numSegments, ftval, respMod, complexResidualsMod ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScale, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsMod, + variancesWithoutScale, MDMod ); + + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + { + double determinantOrg(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsOrg[iSeg]; + denominator += pow(val, 2) * weightsOrg[iSeg]; + } + variancesWithoutScaleOrg[iVar] = valq * numerator / denominator; + determinantOrg *= variancesWithoutScaleOrg[iVar];// Real part + determinantOrg *= variancesWithoutScaleOrg[iVar];// Imaginary part + } + const double factor = pow(determinantOrg, -1.0/val2q); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScaleOrg[iVar] *= factor; + } + } + { + double determinantMod(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + numerator += std::norm(complexResidualsMod[iVar][iSeg]) * weightsMod[iSeg]; + denominator += pow(val, 2) * weightsMod[iSeg]; + } + variancesWithoutScaleMod[iVar] = valq * numerator / denominator; + determinantMod *= variancesWithoutScaleMod[iVar];// Real part + determinantMod *= variancesWithoutScaleMod[iVar];// Imaginary part + } + const double factor = pow(determinantMod, -1.0/val2q); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScaleMod[iVar] *= factor; + } + } + + const int index = 2 * icol + isign + irow * 2 * numOfReferenceVariables; + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + derivVar1[iVar][index] = ( variancesWithoutScaleMod[iVar] - variancesWithoutScaleOrg[iVar] ) / dresp; + } + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respOrg[i]; + } + delete [] respOrg; + delete [] variancesWithoutScaleOrg; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsMod[iVar]; + } + delete [] complexResidualsMod; + delete [] MDMod; + delete [] weightsMod; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respMod[i]; + } + delete [] respMod; + delete [] variancesWithoutScaleMod; + } + } + } + std::cout << "dvr2" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++col ){ + std::cout << derivVar1[row][col] <<" "; + } + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + delete [] derivVar1[irow]; + } + delete [] derivVar1; + + double** derivVar2 = new double*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + derivVar2[irow] = new double[numOfOutputAndInputVariables]; + } + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + double* variancesWithoutScaleOrg = new double[numOfOutputAndInputVariables]; + double* MDMod = new double[numSegments]; + double* weightsMod = new double[numSegments]; + double* variancesWithoutScaleMod = new double[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + variancesWithoutScaleOrg[iVar] = variancesWithoutScale[iVar]; + variancesWithoutScaleMod[iVar] = variancesWithoutScale[iVar]; + } + const double dvar = variancesWithoutScale[icol] * 0.001; + variancesWithoutScaleMod[icol] += dvar; + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, resp, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleOrg, MDOrg ); + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleMod, MDMod ); + + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + + { + double determinantOrg(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scale; + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsOrg[iSeg]; + denominator += pow(val, 2) * weightsOrg[iSeg]; + } + variancesWithoutScaleOrg[iVar] = valq * numerator / denominator; + determinantOrg *= variancesWithoutScaleOrg[iVar];// Real part + determinantOrg *= variancesWithoutScaleOrg[iVar];// Imaginary part + } + const double factor = pow(determinantOrg, -1.0/val2q); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScaleOrg[iVar] *= factor; + } + } + { + double determinantMod(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDMod[iSeg] / scale; + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsMod[iSeg]; + denominator += pow(val, 2) * weightsMod[iSeg]; + } + variancesWithoutScaleMod[iVar] = valq * numerator / denominator; + determinantMod *= variancesWithoutScaleMod[iVar];// Real part + determinantMod *= variancesWithoutScaleMod[iVar];// Imaginary part + } + const double factor = pow(determinantMod, -1.0/val2q); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScaleMod[iVar] *= factor; + } + } + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + derivVar2[iVar][icol] = ( variancesWithoutScaleMod[iVar] - variancesWithoutScaleOrg[iVar] ) / dvar; + } + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + delete [] variancesWithoutScaleOrg; + delete [] MDMod; + delete [] weightsMod; + delete [] variancesWithoutScaleMod; + } + std::cout << "dvv2" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ + std::cout << derivVar2[row][col] <<" "; + } + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + delete [] derivVar2[row]; + } + delete [] derivVar2; + + double* derivVar3 = new double[numOfOutputAndInputVariables]; + { + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar2 = 0; iVar2 < numOfOutputAndInputVariables; ++iVar2 ){ + complexResidualsOrg[iVar2] = new std::complex[numSegments]; + } + double* MDOrg = new double[numSegments]; + double* weightsOrg = new double[numSegments]; + double* variancesWithoutScaleOrg = new double[numOfOutputAndInputVariables]; + double* weightsMod = new double[numSegments]; + double* variancesWithoutScaleMod = new double[numOfOutputAndInputVariables]; + const double scaleOrg = scale; + const double dscale = scale * 0.001; + const double scaleMod = scale + dscale; + // Calculate complex residuals + calculateComplexResiduals( numSegments, ftval, resp, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD( numSegments, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScale, MDOrg ); + // Calculate original weights + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleOrg; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleMod; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + + { + double determinantOrg(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsOrg[iSeg]; + const double val = MDOrg[iSeg] / scaleOrg; + denominator += pow(val, 2) * weightsOrg[iSeg]; + } + variancesWithoutScaleOrg[iVar] = valq * numerator / denominator; + determinantOrg *= variancesWithoutScaleOrg[iVar];// Real part + determinantOrg *= variancesWithoutScaleOrg[iVar];// Imaginary part + } + const double factor = pow(determinantOrg, -1.0/val2q); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScaleOrg[iVar] *= factor; + } + } + { + double determinantMod(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsMod[iSeg]; + const double val = MDOrg[iSeg] / scaleMod; + denominator += pow(val, 2) * weightsMod[iSeg]; + } + variancesWithoutScaleMod[iVar] = valq * numerator / denominator; + determinantMod *= variancesWithoutScaleMod[iVar];// Real part + determinantMod *= variancesWithoutScaleMod[iVar];// Imaginary part + } + const double factor = pow(determinantMod, -1.0/val2q); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScaleMod[iVar] *= factor; + } + } + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + derivVar3[iVar] = ( variancesWithoutScaleMod[iVar] - variancesWithoutScaleOrg[iVar] ) / dscale; + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + delete [] weightsOrg; + delete [] variancesWithoutScaleOrg; + delete [] weightsMod; + delete [] variancesWithoutScaleMod; + } + std::cout << "dvs2" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfOutputAndInputVariables; ++row ){ + std::cout << derivVar3[row] <<" "; + if( row+1 < numOfOutputAndInputVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + delete [] derivVar3; +#endif + +} + +// Calculate response functions +void AnalysisMultivariateRegression::calculateResponseFunctions( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Calculate response functions by multivariate regression"); + ptrOutputFiles->writeCvgMessage("================================================================================"); + ptrOutputFiles->writeCvgMessage("Now Frequency(Hz): " + Util::toString(freq) + ", Period(s): " + Util::toString(1.0/freq)); + ptrOutputFiles->writeCvgMessage("================================================================================"); + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + + // Determine candidates + std::vector< std::pair > candidatesOfPairs; + std::vector< std::complex** > resp; + determineCandidates( freq, numSegmentsTotal, ftval, times, candidatesOfPairs, resp ); + const int numOfCancidates = static_cast( resp.size() ); + ptrOutputFiles->writeCvgAndLogMessage("Number of candidates: " + Util::toString(numOfCancidates)); + if( ptrControl->getOutputLevel() >= 3 ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Initial response functions of all candidates:"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Output candidates + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + std::ostringstream msg; + msg << "Candidate: " << std::setw(10) << iCan << ", "; + if( m_frequencies.empty() ){ + const int iSeg1 = candidatesOfPairs[iCan].first; + const int iSeg2 = candidatesOfPairs[iCan].second; + msg << "Segment pair: (" << std::setw(10) << iSeg1 << "," << std::setw(10) << iSeg2 << "), "; + } + msg << "Responses: "; + int iVar = 0; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << "); "; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << "; "; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + } + + double** variancesWithoutScale = new double*[numOfCancidates]; + double** covariancesLowerTriangleWithoutScale = new double* [numOfCancidates]; + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + variancesWithoutScale[iCan] = new double[numOfOutputAndInputVariables]; + covariancesLowerTriangleWithoutScale[iCan] = new double[numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1) / 2]; + } + double* scales = new double[numOfCancidates]; + double* determinants = new double[numOfCancidates]; + + // Perform I-steps for all candidates + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Improve all candidates"); + double paramB(0.0); + double paramC(0.0); + RobustWeightTukeysBiweights::calculateParams(degreeOfFreedom, numSegmentsTotal, paramB, paramC); + ptrOutputFiles->writeCvgMessage("Parameter b: " + Util::toString(paramB) + ", Parameter c: " + Util::toString(paramC)); + + const Control::ParamsForRobustMultivariateRegression params = ptrControl->getParamsForRobustMultivariateRegression(); + double* coherences = new double[numOfOutputVariables]; + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + const int numOfMaxIterations = params.numOfMaxIterationsOfFirstIstep; + const double convergenceCriteria = params.convergenceCriteriaOfFirstIstep; + if( ptrControl->getOutputLevel() >= 3 ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Candidate: " + Util::toString(iCan)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + improveCandidate(numSegmentsTotal, numOfMaxIterations, convergenceCriteria, true, paramB, paramC, + ftval, resp[iCan], variancesWithoutScale[iCan], scales[iCan], determinants[iCan], coherences, + covariancesLowerTriangleWithoutScale[iCan]); + } + + if( ptrControl->getOutputLevel() >= 3 ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Improved response functions of all candidates:"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Output resultant response functions + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + std::ostringstream msg; + msg << "Candidate: " << std::setw(10) << iCan << ", "; + if( m_frequencies.empty() ){ + const int iSeg1 = candidatesOfPairs[iCan].first; + const int iSeg2 = candidatesOfPairs[iCan].second; + msg << "Segment pair: (" << std::setw(10) << iSeg1 << "," << std::setw(10) << iSeg2 << "), "; + } + msg << "Responses: "; + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << "); "; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << "; "; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + + // Output scales and variances without scale + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Scales and covariance matrices without scale of all candidates:"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + std::ostringstream msg; + msg << "Candidate: " << std::setw(10) << iCan << ", "; + if( m_frequencies.empty() ){ + const int iSeg1 = candidatesOfPairs[iCan].first; + const int iSeg2 = candidatesOfPairs[iCan].second; + msg << "Segment pair: (" << std::setw(10) << iSeg1 << "," << std::setw(10) << iSeg2 << "), "; + } + msg << "Scale:" << std::setw(12) << std::setprecision(4) << std::scientific << scales[iCan] << ", Covariance matrix without scale:"; + msg << "("; + for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) { + msg << std::setw(12) << std::setprecision(4) << std::scientific << getValueOfCovarianceMatrix(numOfOutputAndInputVariables, variancesWithoutScale[iCan], covariancesLowerTriangleWithoutScale[iCan], irow, icol); + if (icol == numOfOutputAndInputVariables - 1) + { + if (irow == numOfOutputAndInputVariables - 1) + { + msg << ")"; + } + else + { + msg << ";"; + } + } + else + { + msg << ","; + } + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + } + } + + // Detetermine the best improved candidates, to which further I-step is applied + ptrOutputFiles->writeLogMessage("Detetermine the best improved candidates"); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + std::complex** complexResiduals = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResiduals[iVar] = new std::complex[numSegmentsTotal]; + } + double* MD = new double[numSegmentsTotal]; + + int numOfBestCandidates = params.numOfMaxCandidatesOfSecondIstep; + std::vector bestCandidates; + bestCandidates.reserve(numOfBestCandidates); + double maxScaleOfBestCandidates(-1.0); + int candidateWithMaxScale(-1); + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + assert( bestCandidates.size() <= numOfBestCandidates ); + if( bestCandidates.size() >= numOfBestCandidates ){ + // Calculate complex residuals + calculateComplexResiduals( numSegmentsTotal, ftval, resp[iCan], complexResiduals ); + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResiduals, variancesWithoutScale[iCan], + covariancesLowerTriangleWithoutScale[iCan], MD); + double averageOfLossFunction(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double val = MD[iSeg] / maxScaleOfBestCandidates; + averageOfLossFunction += RobustWeightTukeysBiweights::calculateLossFunction(val, paramC); + } + averageOfLossFunction /= static_cast(numSegmentsTotal); + if( averageOfLossFunction < paramB ){ + // Adopt this candidates as one of the best candidates + std::vector::iterator itrCan = std::find(bestCandidates.begin(), bestCandidates.end(), candidateWithMaxScale); + assert( itrCan != bestCandidates.end() ); + *itrCan = iCan; + maxScaleOfBestCandidates = -1.0; + candidateWithMaxScale = -1; + for( std::vector::const_iterator itr = bestCandidates.begin(); itr != bestCandidates.end(); ++itr ){ + if( scales[*itr] > maxScaleOfBestCandidates ){ + maxScaleOfBestCandidates = scales[*itr]; + candidateWithMaxScale= *itr; + } + } + } + }else{ + bestCandidates.push_back(iCan); + if( scales[iCan] > maxScaleOfBestCandidates ){ + maxScaleOfBestCandidates = scales[iCan]; + candidateWithMaxScale = iCan; + } + } + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResiduals[iVar]; + } + delete [] complexResiduals; + delete [] MD; + + std::sort( bestCandidates.begin(), bestCandidates.end() ); + if( ptrControl->getOutputLevel() >= 3 ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Response functions of the best " + Util::toString(bestCandidates.size()) + " candidates:"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + for( std::vector::const_iterator itrCanBest = bestCandidates.begin(); itrCanBest != bestCandidates.end(); ++itrCanBest ){ + const int iCan = *itrCanBest; + std::ostringstream msg; + msg << "Candidate: " << std::setw(10) << iCan << ", "; + if( m_frequencies.empty() ){ + const int iSeg1 = candidatesOfPairs[iCan].first; + const int iSeg2 = candidatesOfPairs[iCan].second; + msg << "Segment pair: (" << std::setw(10) << iSeg1 << "," << std::setw(10) << iSeg2 << "), "; + } + msg << "Responses: "; + int iVar = 0; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << "); "; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << "; "; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Scales and variance matrices without scale of the best " + Util::toString(bestCandidates.size()) + " candidates:"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + for( std::vector::const_iterator itrCanBest = bestCandidates.begin(); itrCanBest != bestCandidates.end(); ++itrCanBest ){ + const int iCan = *itrCanBest; + std::ostringstream msg; + msg << "Candidate: " << std::setw(10) << iCan << ", "; + if( m_frequencies.empty() ){ + const int iSeg1 = candidatesOfPairs[iCan].first; + const int iSeg2 = candidatesOfPairs[iCan].second; + msg << "Segment pair: (" << std::setw(10) << iSeg1 << "," << std::setw(10) << iSeg2 << "), "; + } + msg << "Scale:" << std::setw(12) << std::setprecision(4) << std::scientific << scales[iCan] << ", Covariances without scale:"; + msg << "("; + for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) { + msg << std::setw(12) << std::setprecision(4) << std::scientific << getValueOfCovarianceMatrix(numOfOutputAndInputVariables, variancesWithoutScale[iCan], covariancesLowerTriangleWithoutScale[iCan], irow, icol); + if (icol == numOfOutputAndInputVariables - 1) + { + if (irow == numOfOutputAndInputVariables - 1) + { + msg << ")"; + } + else + { + msg << ";"; + } + } + else + { + msg << ","; + } + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + } + } + + // Apply further I-step to the best improved candidates + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Perform further improvements to the best " + Util::toString(bestCandidates.size()) + " candidates"); + double smallestScale(1.0e20); + int candidateWithSmallestScale(-1); + for( std::vector::const_iterator itrCanBest = bestCandidates.begin(); itrCanBest != bestCandidates.end(); ++itrCanBest ){ + // Improve candidate by I-step + const int numOfMaxIterations = params.numOfMaxIterationsOfSecondIstep; + const double convergenceCriteria = params.convergenceCriteriaOfSecondIstep; + if( ptrControl->getOutputLevel() >= 3 ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Candidate: " + Util::toString(*itrCanBest)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + improveCandidate(numSegmentsTotal, numOfMaxIterations, convergenceCriteria, false, paramB, paramC, + ftval, resp[*itrCanBest], variancesWithoutScale[*itrCanBest], scales[*itrCanBest], determinants[*itrCanBest], coherences, + covariancesLowerTriangleWithoutScale[*itrCanBest]); + if( scales[*itrCanBest] < smallestScale) { + smallestScale = scales[*itrCanBest]; + candidateWithSmallestScale= *itrCanBest; + } + } + + // Calculate complex residuals + const bool outputResiduals = ptrControl->getOutputLevel() >= 2; + if( outputResiduals ){ + const int iCan = candidateWithSmallestScale; + // Calculate complex residuals + std::complex** complexResiduals = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResiduals[iVar] = new std::complex[numSegmentsTotal]; + } + calculateComplexResiduals( numSegmentsTotal, ftval, resp[iCan], complexResiduals ); + // Calculate Mahalanobis distance + double* MD = new double[numSegmentsTotal]; + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResiduals, variancesWithoutScale[iCan], + covariancesLowerTriangleWithoutScale[iCan], MD); + double* weights = new double[numSegmentsTotal]; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double val = MD[iSeg] / scales[iCan]; + weights[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + std::ostringstream oss; + oss << "segm" << iSegLen << "_index" << freqDegree << "_residuals.csv"; + writeResiduals( oss.str().c_str(), numSegmentsTotal, numOfOutputAndInputVariables, times, complexResiduals, + MD, weights ); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResiduals[iVar]; + } + delete [] complexResiduals; + delete [] MD; + delete [] weights; + } + + // Select the response with the smallest scale + ptrOutputFiles->writeLogMessage("Select the response with the smallest scale"); + { + const int iCan = candidateWithSmallestScale; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Best estimator of frequency " + Util::toString(freq) + "(Hz)"); + if( ptrControl->getOutputLevel() >= 3 ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Candidate: " + Util::toString(iCan)); + if( m_frequencies.empty() ){ + const int iSeg1 = candidatesOfPairs[iCan].first; + const int iSeg2 = candidatesOfPairs[iCan].second; + ptrOutputFiles->writeCvgMessage("Segment pair: (" + Util::toString(iSeg1) + "," + Util::toString(iSeg2) + ")"); + } + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + } + { + const int iCan = candidateWithSmallestScale; + ptrOutputFiles->writeCvgMessage("Response functions:"); + std::ostringstream msg; + int iVar = 0; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << ")" << std::endl; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iCan][iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << std::endl; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + { + const int iCan = candidateWithSmallestScale; + ptrOutputFiles->writeCvgMessage("Scale: " + Util::toString(scales[iCan])); + std::ostringstream msg; + msg << "Covariance matrix without scale: " << std::endl; + for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) { + msg << std::setw(12) << std::setprecision(4) << std::scientific << getValueOfCovarianceMatrix(numOfOutputAndInputVariables, variancesWithoutScale[iCan], covariancesLowerTriangleWithoutScale[iCan], irow, icol); + } + if (irow < numOfOutputAndInputVariables - 1) + { + msg << std::endl; + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + } + + if( ptrControl->getOutputLevel() > 0 ){ + // Output spectral density functions to cvg file + std::complex** complexResiduals = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResiduals[iVar] = new std::complex[numSegmentsTotal]; + } + double* MD = new double[numSegmentsTotal]; + double* weights = new double[numSegmentsTotal]; + const int iCan = candidateWithSmallestScale; + // Calculate complex residuals + calculateComplexResiduals( numSegmentsTotal, ftval, resp[iCan], complexResiduals ); + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResiduals, variancesWithoutScale[iCan], + covariancesLowerTriangleWithoutScale[iCan], MD); + // Calculate weights + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double val = MD[iSeg] / scales[iCan]; + weights[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + } + for( int iInVar = 0; iInVar < numOfInputVariables; ++iInVar ){ + ptrOutputFiles->writeCvgMessage("Spectral density functions for input variable " + Util::toString(iInVar)); + const int inp = ptrControl->getChannelIndex( CommonParameters::INPUT, iInVar ); + outputSpectralDensityFunctionsToCvgFile( numSegmentsTotal, timeLength, ftval[inp], ftval[rr0], ftval[rr1], weights ); + } + for( int iOutVar = 0; iOutVar < numOfOutputVariables; ++iOutVar ){ + ptrOutputFiles->writeCvgMessage("Spectral density functions for output variable " + Util::toString(iOutVar)); + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOutVar ); + outputSpectralDensityFunctionsToCvgFile( numSegmentsTotal, timeLength, ftval[out], ftval[rr0], ftval[rr1], weights ); + } + // Delete dynamic arrays + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResiduals[iVar]; + } + delete [] complexResiduals; + delete [] MD; + delete [] weights; + } + + // Output response functions + std::complex* resp0 = new std::complex[numOfOutputVariables]; + std::complex* resp1 = new std::complex[numOfOutputVariables]; + assert(numOfInputVariables == 2); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + const std::complex Txx = resp[candidateWithSmallestScale][in0][0]; + const std::complex Txy = resp[candidateWithSmallestScale][in0][1]; + const std::complex Tyx = resp[candidateWithSmallestScale][in1][0]; + const std::complex Tyy = resp[candidateWithSmallestScale][in1][1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + if( std::abs(det) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + ofsResp << std::setprecision(10) << std::scientific << freq; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0/freq; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::setprecision(10) << std::scientific << freq; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0/freq; + } + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const std::complex U_x = resp[candidateWithSmallestScale][index][0]; + const std::complex U_y = resp[candidateWithSmallestScale][index][1]; + resp0[iOut] = ( U_x * Tyy - U_y * Tyx ) / det; + resp1[iOut] = ( U_y * Txx - U_x * Txy ) / det; + ofsResp << "," << std::setprecision(10) << std::scientific << resp0[iOut].real(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp0[iOut].imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp1[iOut].real(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp1[iOut].imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << coherences[iOut]; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, resp0[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(resp0[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, resp1[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(resp1[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << coherences[iOut]; + } + } + delete [] coherences; + + // Estimate errors + double** respErr = new double*[numOfOutputVariables]; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + respErr[iOut] = new double[numOfReferenceVariables]; + } + const int typeOfErrorEstimationMethod = ptrControl->getErrorEstimationMethod(); + switch (typeOfErrorEstimationMethod) { + case Control::PARAMETRIC: + estimateErrorParametric(numSegmentsTotal, paramB, paramC, ftval, resp[candidateWithSmallestScale], variancesWithoutScale[candidateWithSmallestScale], + covariancesLowerTriangleWithoutScale[candidateWithSmallestScale], scales[candidateWithSmallestScale], respErr); + break; + case Control::FIXED_WEIGHTS_JACKKNIFE: + estimateErrorByFixedWeightsJackknife(numSegmentsTotal, paramB, paramC, ftval, resp0, resp1, resp[candidateWithSmallestScale], + variancesWithoutScale[candidateWithSmallestScale], covariancesLowerTriangleWithoutScale[candidateWithSmallestScale], scales[candidateWithSmallestScale], + respErr); + break; + case Control::FIXED_WEIGHTS_BOOTSTRAP: + // Go through + case Control::ROBUST_BOOTSTRAP: + estimateErrorByRobustBootstrap(numSegmentsTotal, paramB, paramC, ftval, resp[candidateWithSmallestScale], variancesWithoutScale[candidateWithSmallestScale], + covariancesLowerTriangleWithoutScale[candidateWithSmallestScale], scales[candidateWithSmallestScale], determinants[candidateWithSmallestScale], respErr); + break; + case Control::SUBSET_DELETION_JACKKNIFE: + estimateErrorBySubsetDeletionJackknife(numSegmentsTotal, ftval, resp[candidateWithSmallestScale], variancesWithoutScale[candidateWithSmallestScale], + covariancesLowerTriangleWithoutScale[candidateWithSmallestScale], scales[candidateWithSmallestScale], determinants[candidateWithSmallestScale], respErr); + break; + case Control::STRICT_BOOTSTRAP: + estimateErrorByStrictBootstrap(numSegmentsTotal, paramB, paramC, ftval, resp[candidateWithSmallestScale], variancesWithoutScale[candidateWithSmallestScale], + covariancesLowerTriangleWithoutScale[candidateWithSmallestScale], scales[candidateWithSmallestScale], determinants[candidateWithSmallestScale], respErr); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(typeOfErrorEstimationMethod)); + break; + } + + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + delete [] variancesWithoutScale[iCan]; + delete [] covariancesLowerTriangleWithoutScale[iCan]; + } + delete [] variancesWithoutScale; + delete [] covariancesLowerTriangleWithoutScale; + delete [] scales; + delete [] determinants; + + // Output errors + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const double dResp0 = respErr[iOut][0]; + const double dResp1 = respErr[iOut][1]; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + delete [] respErr[iOut]; + } + ofsResp << std::endl; + ofsResp.flush(); + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + delete [] resp0; + delete [] resp1; + delete [] respErr; + + // Add response functions to member variables + m_numOfOutputAndInputVariables = numOfOutputAndInputVariables; + if( m_responseFunctions == NULL ){ + m_responseFunctions = new std::vector< std::complex >*[m_numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < m_numOfOutputAndInputVariables; ++iVar ){ + m_responseFunctions[iVar] = new std::vector< std::complex >[numOfReferenceVariables]; + } + } + m_frequencies.push_back(freq); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + m_responseFunctions[iVar][iRR].push_back( resp[candidateWithSmallestScale][iVar][iRR] ); + } + } + + // Delete dynamic arrays + for( int iCan = 0; iCan < numOfCancidates; ++iCan ){ + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] resp[iCan][iVar]; + } + delete [] resp[iCan]; + } + +} + +// Calculate response functions from two samples +bool AnalysisMultivariateRegression::calculateResponseFunctionsFromTwoSamples( + const std::complex& out1, const std::complex& x1, const std::complex& y1, + const std::complex& out2, const std::complex& x2, const std::complex& y2, + std::complex& resp1, std::complex& resp2) const { + + const std::complex det = x1 * y2 - x2 * y1; + if (abs(det) < CommonParameters::EPS) { + return true; + } + resp1 = (out1 * y2 - out2 * y1) / det; + resp2 = (out2 * x1 - out1 * x2) / det; + + return false; +} + +// Calculate a vector for partial derivatives +void AnalysisMultivariateRegression::calculateVectorForPartialDerivatives( const int iSeg, std::complex** ftval, + const double* const variancesWithoutScale, std::complex** complexResiduals, + std::complex** hSigmaMatrix, double* vector ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + const int rr = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, irow ); + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + hSigmaMatrix[irow][icol] = std::conj(ftval[rr][iSeg]) * complexResiduals[icol][iSeg] / variancesWithoutScale[icol]; + } + } +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < numOfReferenceVariables; ++row ){ +// for( int col = 0; col < numOfOutputAndInputVariables; ++col ){ +// std::cout << hSigmaMatrix[row][col].real() << "+" << hSigmaMatrix[row][col].imag() <<"im "; +// } +// if( row+1 < numOfReferenceVariables ){ +// std::cout << ";"; +// } +// } +// std::cout << "]" << std::endl; +//#endif + + for( int icol = 0; icol < numOfOutputAndInputVariables; ++icol ){ + const int offset = 2 * numOfReferenceVariables * icol; + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + const int index = irow + offset; + vector[index] = hSigmaMatrix[irow][icol].real(); + } + for( int irow = 0; irow < numOfReferenceVariables; ++irow ){ + const int index = irow + numOfReferenceVariables + offset; + vector[index] = hSigmaMatrix[irow][icol].imag(); + } + } + +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for( int row = 0; row < 2 * numOfReferenceVariables * numOfOutputAndInputVariables; ++row ){ +// std::cout << vector[row] <<" "; +// if( row+1 < 2 * numOfReferenceVariables * numOfOutputAndInputVariables ){ +// std::cout << ","; +// } +// } +// std::cout << "]" << std::endl; +//#endif + +} + +// Determine candidates +void AnalysisMultivariateRegression::determineCandidates( const double freq, const int numSegmentsTotal, std::complex** ftval, + const std::vector< std::pair >& times, std::vector< std::pair >& candidatesOfPairs, + std::vector< std::complex** >& resp ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Determine candicates"); + + const Control* const ptrControl = Control::getInstance(); + const Control::ParamsForRobustMultivariateRegression paramsForRobustMultivariateRegression = ptrControl->getParamsForRobustMultivariateRegression(); + + if( m_frequencies.empty() || paramsForRobustMultivariateRegression.selectInitialCandidatesByRandomSamplingAtEachFrequency ){ + determineCandidatesByRandomSampling( freq, numSegmentsTotal, ftval, times, candidatesOfPairs, resp ); + } + else if( static_cast(m_frequencies.size()) == 1 ){ + candidatesOfPairs.push_back( std::make_pair(-1,-1) ); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + // This array must not be deleted because they are used out of the function + std::complex** respWork = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + respWork[iVar] = new std::complex[numOfReferenceVariables]; + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + respWork[iVar][iRR] = m_responseFunctions[iVar][iRR].back(); + } + } + resp.push_back(respWork); + } + else{ + const Control::ParamsForDecidingCandicatesForSubsequentFrequencies params = ptrControl->getParamsForDecidingCandicatesForSubsequentFrequencies(); + if(params.useResponseFunctionsOfPreviousFrequency){ + candidatesOfPairs.push_back( std::make_pair(-1,-1) ); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + // This array must not be deleted because they are used out of the function + std::complex** respWork = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + respWork[iVar] = new std::complex[numOfReferenceVariables]; + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + respWork[iVar][iRR] = m_responseFunctions[iVar][iRR].back(); + } + } + resp.push_back(respWork); + }else{ + determineCandidatesForLaterFrequencies( freq, numSegmentsTotal, resp ); + } + } + +} + +// Determine candidates for later frequencies +void AnalysisMultivariateRegression::determineCandidatesForLaterFrequencies( const double freq, const int numSegmentsTotal, std::vector< std::complex** >& resp ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + + std::vector::const_reverse_iterator ritrFreq = m_frequencies.rbegin(); + const double freqPre = *ritrFreq; + ++ritrFreq; + const double freqPrePre = *ritrFreq; + + const Control::ParamsForDecidingCandicatesForSubsequentFrequencies params = ptrControl->getParamsForDecidingCandicatesForSubsequentFrequencies(); + std::vector denominators; + denominators.reserve(numOfOutputAndInputVariables); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + std::complex respPre[2]; + std::complex respPrePre[2]; + assert( numOfReferenceVariables == 2 ); + const int typeOfThreshould = params.thresholdOfDifferences[iVar].type; + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + // Divide the impedance tensor by frequency to aviod the dependancy of impedance tensor on the frequency + std::vector< std::complex >::const_reverse_iterator citrResp = m_responseFunctions[iVar][iRR].rbegin(); + respPre[iRR] = *citrResp; + ++citrResp; + respPrePre[iRR] = *citrResp; + if( typeOfThreshould == Control::DIFFERENCE_OF_RESPONSES_DIVIDED_BY_SQUARE_ROOT_FREQUENCY ){ + respPre[iRR] /= sqrt(freqPre); + respPrePre[iRR] /= sqrt(freqPrePre); + } + } + const double absRespPre = sqrt( 0.5 * ( std::norm(respPre[0]) + std::norm(respPre[1]) ) ); + const double absRespPrePre = sqrt( 0.5 * ( std::norm(respPrePre[0]) + std::norm(respPrePre[1]) ) ); + denominators.push_back(std::min( absRespPre, absRespPrePre)); + } + + std::vector< std::complex >** candidates = new std::vector< std::complex >*[numOfOutputAndInputVariables]; + int numOfCandidates(1); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + candidates[iVar] = new std::vector< std::complex >[numOfReferenceVariables]; + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + std::vector< std::complex >::const_reverse_iterator citrResp = m_responseFunctions[iVar][iRR].rbegin(); + const std::complex respPre = *citrResp; + candidates[iVar][iRR].push_back(respPre); + ++citrResp; + const std::complex respPrePre = *citrResp; + const int typeOfThreshould = params.thresholdOfDifferences[iVar].type; + const double threshold = params.thresholdOfDifferences[iVar].threshold; + bool largeDifference(false); + if( typeOfThreshould == Control::DIFFERENCE_OF_RAW_RESPONSES ){ + if( fabs(respPre.real() - respPrePre.real()) > threshold * denominators[iVar] || + fabs(respPre.imag() - respPrePre.imag()) > threshold * denominators[iVar] ){ + largeDifference = true; + } + }else if( typeOfThreshould == Control::DIFFERENCE_OF_RESPONSES_DIVIDED_BY_SQUARE_ROOT_FREQUENCY ){ + const std::complex respModPre = respPre / sqrt(freqPre); + const std::complex respModPrePre = respPrePre / sqrt(freqPrePre); + if( fabs(respModPre.real() - respModPrePre.real()) > threshold * denominators[iVar] || + fabs(respModPre.imag() - respModPrePre.imag()) > threshold * denominators[iVar] ){ + largeDifference = true; + } + }else{ + ptrOutputFiles->writeErrorMessage("Unsupported type of response function: " +Util::toString(typeOfThreshould)); + } + if( largeDifference ){ + candidates[iVar][iRR].push_back(respPrePre); + numOfCandidates *= 2; + ptrOutputFiles->writeCvgAndLogMessage("The differene of response function (" + + Util::toString(iVar) + ", " + Util::toString(iRR) + ") is large"); + std::ostringstream msg; + msg << " Real part: " + << std::setw(12) << std::setprecision(4) << std::scientific << respPrePre.real() + << "->" + << std::setw(12) << std::setprecision(4) << std::scientific << respPre.real() << std::endl; + msg << "Imaginary part: " + << std::setw(12) << std::setprecision(4) << std::scientific << respPrePre.imag() + << "->" + << std::setw(12) << std::setprecision(4) << std::scientific << respPre.imag(); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + } + } + + int*** mapCandidateToIndexes = new int**[numOfCandidates]; + for( int iCan = 0; iCan < numOfCandidates; ++iCan ){ + mapCandidateToIndexes[iCan] = new int*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + mapCandidateToIndexes[iCan][iVar] = new int[numOfReferenceVariables]; + } + } + int chunkSize = numOfCandidates; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + const int numCans = static_cast(candidates[iVar][iRR].size()); + chunkSize /= numCans; + assert(chunkSize >= 1); + int counter(0); + for( int iChunk = 0; iChunk < numOfCandidates; iChunk += chunkSize, ++counter ){ + for( int iCan = iChunk; iCan < iChunk + chunkSize; ++iCan ){ + const int index = counter % numCans; + mapCandidateToIndexes[iCan][iVar][iRR] = index; + } + } + } + } + +#ifdef _DEBUG_WRITE + for( int iCan = 0; iCan < numOfCandidates; ++iCan ){ + std::cout << iCan << " "; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + const int index = mapCandidateToIndexes[iCan][iVar][iRR]; + std::cout << index << " "; + } + } + std::cout << std::endl; + } +#endif + + resp.reserve(numOfCandidates); + for( int iCan = 0; iCan < numOfCandidates; ++iCan ){ + // This array must not be deleted because they are used out of the function + std::complex** respWork = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + respWork[iVar] = new std::complex[numOfReferenceVariables]; + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + const int index = mapCandidateToIndexes[iCan][iVar][iRR]; + respWork[iVar][iRR] = candidates[iVar][iRR][index]; + } + } + resp.push_back(respWork); + } + + // Delete dymanic arrays + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] candidates[iVar]; + } + delete [] candidates; + for( int iCan = 0; iCan < numOfCandidates; ++iCan ){ + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] mapCandidateToIndexes[iCan][iVar]; + } + delete [] mapCandidateToIndexes[iCan]; + } + delete [] mapCandidateToIndexes; + +} + +// Determine candidates by random sampling +void AnalysisMultivariateRegression::determineCandidatesByRandomSampling( const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::vector< std::pair >& candidatesOfPairs, std::vector< std::complex** >& resp ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + + // Determine candidates + const Control::ParamsForRobustMultivariateRegression params = ptrControl->getParamsForRobustMultivariateRegression(); + const int timeStart = Util::convertHHMMSSToSeconds(params.startOfTimeRange); + const int timeEnd = Util::convertHHMMSSToSeconds(params.endOfTimeRange); + std::vector segmentsInTimeRange; + if( timeStart <= Util::convertHHMMSSToSeconds("00:00:00") && timeEnd >= Util::convertHHMMSSToSeconds("24:00:00") ){ + // Include all segments + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + segmentsInTimeRange.push_back(iSeg); + } + }else{ + // Include only the segments which locate in the specified time range + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const int time1 = Util::convertHHMMSSToSeconds(times[iSeg].first); + int time2 = Util::convertHHMMSSToSeconds(times[iSeg].second); + if( time2 < time1 ){ + // Add 24 hr + time2 += 24 * 3600; + } + if( time1 >= timeStart && time2 <= timeEnd ){ + segmentsInTimeRange.push_back(iSeg); + } + } + } + std::sort(segmentsInTimeRange.begin(), segmentsInTimeRange.end()); + segmentsInTimeRange.erase( std::unique( segmentsInTimeRange.begin(), segmentsInTimeRange.end() ), segmentsInTimeRange.end() ); + const int numOfSegmentsInTimeRange = static_cast(segmentsInTimeRange.size()); + const long long int numOfSegmentsInTimeRange_64 = static_cast(numOfSegmentsInTimeRange); + const long long int numOfCandidatesOfPairsAll = (numOfSegmentsInTimeRange_64 * numOfSegmentsInTimeRange_64 - numOfSegmentsInTimeRange_64) / 2; + + const long long int numOfCancidatesMax = static_cast(params.numOfMaxInitialCandidates); + std::vector< std::pair > candidatesOfPairsInit; + if( numOfCancidatesMax >= numOfCandidatesOfPairsAll ){ + for( int i1 = 0; i1 < numOfSegmentsInTimeRange; ++i1 ){ + const int iSeg1 = segmentsInTimeRange[i1]; + for( int i2 = i1 + 1; i2 < numOfSegmentsInTimeRange; ++i2 ){ + const int iSeg2 = segmentsInTimeRange[i2]; + candidatesOfPairsInit.push_back(std::make_pair(iSeg1, iSeg2)); + } + } + }else{ +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numOfSegmentsInTimeRange - 1); +#endif +#endif + int numIterationMax = 1000; + bool converge(false); + for( int iter = 0; iter < numIterationMax; ++iter ){ +#ifdef _RAND + const int i1 = (rand() / RAND_MAX) * (numOfSegmentsInTimeRange - 1); + const int i2 = (rand() / RAND_MAX) * (numOfSegmentsInTimeRange - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + const int i1 = static_cast(genrand64_real1() * numOfSegmentsInTimeRange); + const int i2 = static_cast(genrand64_real1() * numOfSegmentsInTimeRange); +#else + const int i1 = uniformDistibution(gen); + const int i2 = uniformDistibution(gen); +#endif +#endif + const int iSeg1 = segmentsInTimeRange[i1]; + const int iSeg2 = segmentsInTimeRange[i2]; + if( iSeg2 > iSeg1 ){ + candidatesOfPairsInit.push_back(std::make_pair(iSeg1, iSeg2)); + }else if( iSeg1 > iSeg2 ){ + candidatesOfPairsInit.push_back(std::make_pair(iSeg2, iSeg1)); + } + std::sort(candidatesOfPairsInit.begin(), candidatesOfPairsInit.end()); + candidatesOfPairsInit.erase( std::unique( candidatesOfPairsInit.begin(), candidatesOfPairsInit.end() ), candidatesOfPairsInit.end() ); + if( static_cast(candidatesOfPairsInit.size()) >= numOfCancidatesMax){ + converge = true; + break; + } + } + if(!converge){ + ptrOutputFiles->writeWarningMessage("Rearch maximum iteration: " + Util::toString(numIterationMax)); + } + } + + const int numOfInitialCancidates = static_cast( candidatesOfPairsInit.size() ); + ptrOutputFiles->writeCvgAndLogMessage("Number of initial candidates: " + Util::toString(numOfInitialCancidates)); + + resp.reserve(numOfInitialCancidates); + // This array must not be deleted because they are used out of the function + std::complex*** respWork = new std::complex**[numOfInitialCancidates]; + for( int iCan = 0; iCan < numOfInitialCancidates; ++iCan ){ + respWork[iCan] = new std::complex*[numOfOutputAndInputVariables]; + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + respWork[iCan][i] = new std::complex[numOfReferenceVariables]; + } + } + for( int iCan = 0; iCan < numOfInitialCancidates; ++iCan ){ + const int iSeg1 = candidatesOfPairsInit[iCan].first; + const int iSeg2 = candidatesOfPairsInit[iCan].second; + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + bool determinantIsTooSmall(false); + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const bool tooSmall = calculateResponseFunctionsFromTwoSamples( + ftval[index][iSeg1], ftval[rr0][iSeg1], ftval[rr1][iSeg1], + ftval[index][iSeg2], ftval[rr0][iSeg2], ftval[rr1][iSeg2], + respWork[iCan][iVar][0], respWork[iCan][iVar][1] ); + ++iVar; + if(tooSmall){ + determinantIsTooSmall = true; + } + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + const bool tooSmall = calculateResponseFunctionsFromTwoSamples( + ftval[index][iSeg1], ftval[rr0][iSeg1], ftval[rr1][iSeg1], + ftval[index][iSeg2], ftval[rr0][iSeg2], ftval[rr1][iSeg2], + respWork[iCan][iVar][0], respWork[iCan][iVar][1] ); + ++iVar; + if(tooSmall){ + determinantIsTooSmall = true; + } + } + assert(iVar == numOfOutputAndInputVariables); + if(determinantIsTooSmall){ + ptrOutputFiles->writeWarningMessage("Pair of segments (" + Util::toString(iSeg1) + ", " + + Util::toString(iSeg2) + ") is omitted because determinant is too small"); + // Delete because this candidate is not used out of the function + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + delete [] respWork[iCan][i]; + } + delete [] respWork[iCan]; + }else{ + // Add candidate + candidatesOfPairs.push_back( candidatesOfPairsInit[iCan] ); + resp.push_back(respWork[iCan]); + } + } + +} + +// Improve candidate by I-step +void AnalysisMultivariateRegression::improveCandidate( const int numSegmentsTotal, const int numOfMaxIterations, + const double convergenceCriteria, const bool initialCalculation, const double paramB, const double paramC, + std::complex** ftval, std::complex** resp, double* variancesWithoutScale, double& scale, double& determinant, + double* coherencesMin, double* covariancesLowerTriangleWithoutScale ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + + if( ptrControl->getOutputLevel() < 3 ){ + ptrOutputFiles->stopToWriteCvgMessage(); + } + + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + const int numOfLowerTriangles = numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1) / 2; + + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + std::complex** complexResiduals = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResiduals[iVar] = new std::complex[numSegmentsTotal]; + } + // Calculate complex residuals + calculateComplexResiduals( numSegmentsTotal, ftval, resp, complexResiduals ); + if(initialCalculation){ + ptrOutputFiles->writeCvgMessage("Initial response functions:"); + std::ostringstream msg; + int iVar = 0; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].imag() << ")" << std::endl; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << std::endl; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Calculate variances withoutu scale + double* work = new double[2 * numSegmentsTotal]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + work[2*iSeg ] = complexResiduals[iVar][iSeg].real(); + work[2*iSeg+1] = complexResiduals[iVar][iSeg].imag(); + } + const double sigma = Util::calculateMADN(2 * numSegmentsTotal, work); +#ifdef _DEBUG_WRITE + std::cout << "iVar , sigma: " << iVar << " " << sigma << std::endl; + for( int iSample = 0; iSample < 2 * numSegmentsTotal; ++iSample ){ + std::cout << work[iSample] << std::endl; + } +#endif + variancesWithoutScale[iVar] = pow(sigma, 2); + } + for (int iVar = 0; iVar < numOfLowerTriangles; ++iVar) { + covariancesLowerTriangleWithoutScale[iVar] = 0.0; + } + delete [] work; + determinant = 1.0; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + determinant *= variancesWithoutScale[iVar];// Real part + determinant *= variancesWithoutScale[iVar];// Imaginary part + } + const double factor = pow(determinant, -1.0/static_cast(degreeOfFreedom)); + // Make determinant of covariance matrix one + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + variancesWithoutScale[iVar] *= factor; + } +#ifdef _DEBUG_WRITE + for( int i = 0; i < numOfOutputAndInputVariables; ++i ){ + std::cout << "iVar, variancesWithoutScale: " << i << " " << variancesWithoutScale[i] << std::endl; + } +#endif + } + + // Calculate Mahalanobis distance + double* MD = new double[numSegmentsTotal]; + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResiduals, variancesWithoutScale, + covariancesLowerTriangleWithoutScale, MD); + + if(initialCalculation){ + scale = Util::calculateMedian(numSegmentsTotal, MD); + scale = RobustWeightTukeysBiweights::calculateRobustScale(numSegmentsTotal, MD, scale, paramB, paramC); + } + + // Calculate response functions + double* weights = new double[numSegmentsTotal]; + double* Gres = new double[numOfOutputAndInputVariables]; + double* GresPre = new double[numOfOutputAndInputVariables]; + double scalePre = scale; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Initialize + Gres[iVar] = 0.0; + GresPre[iVar] = 0.0; + } + bool converge(false); + for( int iter = 0; iter < numOfMaxIterations; ++iter ){ + double sumOfWeights(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + weights[iSeg] = RobustWeightTukeysBiweights::calculateWeights(MD[iSeg] / scale, paramC); + sumOfWeights += weights[iSeg]; + } + ptrOutputFiles->writeCvgMessage("Iteration number = " + Util::toString(iter) + ", Scale = " + Util::toString(scale) + + ", Sum of weights = " + Util::toString(sumOfWeights)); + std::ostringstream msgVariance; + msgVariance << "Covariance matrix without scale: " << std::endl; + for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) { + msgVariance << std::setw(12) << std::setprecision(4) << std::scientific << getValueOfCovarianceMatrix(numOfOutputAndInputVariables, variancesWithoutScale, covariancesLowerTriangleWithoutScale, irow, icol); + } + if (irow < numOfOutputAndInputVariables - 1) + { + msgVariance << std::endl; + } + } + ptrOutputFiles->writeCvgMessage(msgVariance.str()); + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + coherencesMin[iOut] = 1.0e20;// Initialize + } + int iVar(0); + bool diverge(false); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + double coherence(0.0); + ptrOutputFiles->writeCvgMessage("Calculate response functions for output variable " + + Util::toString(iOut) + " by the weighted least square method"); + const double GresWork = calculateResponseFunctionByWLS( ftval[index], ftval[rr0], ftval[rr1], numSegmentsTotal, + weights, complexResiduals[iVar], resp[iVar][0], resp[iVar][1], coherence ); + if( coherence < coherencesMin[iOut] ){ + coherencesMin[iOut] = coherence; + } + if( GresWork < CommonParameters::EPS ){ + ptrOutputFiles->writeCvgMessage(" Weighted residual power is too small (" + Util::toString(GresWork) + ")"); + ptrOutputFiles->writeWarningMessage("Weighted residual power is too small (" + Util::toString(GresWork) + ")"); + diverge = true; + } + Gres[iVar] = GresWork; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + double coherence(0.0); + ptrOutputFiles->writeCvgMessage("Calculate response functions for input variable " + + Util::toString(iInp) + " by the weighted least square method"); + const double GresWork = calculateResponseFunctionByWLS( ftval[index], ftval[rr0], ftval[rr1], numSegmentsTotal, + weights, complexResiduals[iVar], resp[iVar][0], resp[iVar][1], coherence ); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + if( coherence < coherencesMin[iOut] ){ + coherencesMin[iOut] = coherence; + } + } + if( GresWork < CommonParameters::EPS ){ + ptrOutputFiles->writeCvgMessage(" Weighted residual power is too small (" + Util::toString(GresWork) + ")"); + ptrOutputFiles->writeWarningMessage("Weighted residual power is too small (" + Util::toString(GresWork) + ")"); + diverge = true; + } + Gres[iVar] = GresWork; + ++iVar; + } + std::ostringstream msgGres; + msgGres << "Weighted residual powers: "; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + msgGres << std::setw(12) << std::setprecision(4) << std::scientific << Gres[iVar]; + if( iVar + 1 < numOfOutputAndInputVariables ){ + msgGres << ","; + } + } + ptrOutputFiles->writeCvgMessage(msgGres.str()); + assert(iVar == numOfOutputAndInputVariables); + if(diverge){ + // Go out from the iteration + break; + } + // Calculate variances without scale + double* covarianceMatrix = new double[numOfOutputAndInputVariables * numOfOutputAndInputVariables]; + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + // Make real residual vector from complex residual vector + double numerator(0.0); + double denominator(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + numerator += std::norm(complexResiduals[iVar][iSeg]) * weights[iSeg]; + const double val = MD[iSeg] / scale; + denominator += RobustWeightTukeysBiweights::calculateTermInDenominatorOfRobustCovariance(val, paramC); + } + if (denominator < 0.0) { + ptrOutputFiles->writeErrorMessage("Denominator of robust covariance is too negative (" + Util::toString(denominator) + ")"); + } + variancesWithoutScale[iVar] = static_cast(numOfOutputAndInputVariables) * numerator / denominator; + covarianceMatrix[iVar + iVar * numOfOutputAndInputVariables] = variancesWithoutScale[iVar]; + } + if (ptrControl->getProcedureType() == Control::MODIFIED_MULTIVARIATE_REGRESSION) + { + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) { + for (int irow = icol + 1; irow < numOfOutputAndInputVariables; ++irow) { + // Lower triangle part + double numerator(0.0); + double denominator(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + numerator += (complexResiduals[irow][iSeg] * std::conj(complexResiduals[icol][iSeg])).real() * weights[iSeg]; + const double val = MD[iSeg] / scale; + denominator += RobustWeightTukeysBiweights::calculateTermInDenominatorOfRobustCovariance(val, paramC); + } + if (denominator < CommonParameters::EPS) { + ptrOutputFiles->writeErrorMessage("Denominator of robust covariance is too small (" + Util::toString(denominator) + ")"); + } + const int index = irow - icol - 1 + numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1) / 2 - (numOfOutputAndInputVariables - icol) * (numOfOutputAndInputVariables - icol - 1) / 2; + covariancesLowerTriangleWithoutScale[index] = static_cast(numOfOutputAndInputVariables) * numerator / denominator; + covarianceMatrix[irow + icol * numOfOutputAndInputVariables] = covariancesLowerTriangleWithoutScale[index]; + covarianceMatrix[icol + irow * numOfOutputAndInputVariables] = covariancesLowerTriangleWithoutScale[index]; + } + } + } + else + { + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) { + for (int irow = icol + 1; irow < numOfOutputAndInputVariables; ++irow) { + covarianceMatrix[irow + icol * numOfOutputAndInputVariables] = 0.0; + covarianceMatrix[icol + irow * numOfOutputAndInputVariables] = 0.0; + } + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(numOfOutputAndInputVariables, numOfOutputAndInputVariables, covarianceMatrix); +#endif + const double determinant = Util::calculateDeterminantOfMatrix(numOfOutputAndInputVariables, covarianceMatrix); + delete[] covarianceMatrix; + if (determinant < 0.0) { + ptrOutputFiles->writeErrorMessage("Determinant of the covariance matrix is negative (" + Util::toString(determinant) + ")"); + } + const double factor = pow(determinant, -1.0 / static_cast(numOfOutputAndInputVariables)); + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + variancesWithoutScale[iVar] *= factor; + } + for (int index = 0; index < numOfLowerTriangles; ++index) { + covariancesLowerTriangleWithoutScale[index] *= factor; + } + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResiduals, variancesWithoutScale, covariancesLowerTriangleWithoutScale, MD); + scale = RobustWeightTukeysBiweights::calculateRobustScale(numSegmentsTotal, MD, scale, paramB, paramC ); + // Convergence judgment + converge = true; + if( fabs(scale - scalePre) / fabs(scalePre) > convergenceCriteria ){ + converge = false; + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + if( fabs(Gres[iVar] - GresPre[iVar]) / fabs(GresPre[iVar]) > convergenceCriteria ){ + converge = false; + break; + } + } + if(converge){ + // Converged + // Go out from the iteration + ptrOutputFiles->writeCvgMessage("Iteration converged"); + break; + } + scalePre = scale; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + GresPre[iVar] = Gres[iVar]; + } + } + + if(!converge){ + ptrOutputFiles->writeCvgMessage("Iteration does not converge"); + } + + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResiduals[iVar]; + } + delete [] complexResiduals; + delete [] MD; + delete [] weights; + delete [] Gres; + delete [] GresPre; + + if( ptrControl->getOutputLevel() < 3 ){ + ptrOutputFiles->restartToWriteCvgMessage(); + } + +} + +// Calculate Mahalanobis distances assuming diagonal matrix +void AnalysisMultivariateRegression::calculateMD( const int numSegmentsTotal, const int numOfOutputAndInputVariables, + std::complex** complexResiduals, const double* const variancesWithoutScale, double* MD ) const{ + + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + // Zero clear + MD[iSeg] = 0.0; + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + MD[iSeg] += pow(complexResiduals[iVar][iSeg].real(), 2) / variancesWithoutScale[iVar];// Real part + MD[iSeg] += pow(complexResiduals[iVar][iSeg].imag(), 2) / variancesWithoutScale[iVar];// Imaginary part + } + } + // Calculate Mahalanobis distance + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double work = sqrt(MD[iSeg]); + MD[iSeg] = work; +//#ifdef _DEBUG_WRITE +// std::cout << "iSeg , MD: " << iSeg << " " << MD[iSeg] << std::endl; +//#endif + } + +} + +// Calculate Mahalanobis distances +void AnalysisMultivariateRegression::calculateMD(const int numSegmentsTotal, const int numOfOutputAndInputVariables, std::complex** complexResiduals, + const double* const variancesWithoutScale, const double* const covariancesLowerTriangleWithoutScale, double* MD) const { + + if ((Control::getInstance())->getProcedureType() == Control::MULTIVARIATE_REGRESSION) { + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResiduals, variancesWithoutScale, MD); + return; + } + + DoubleDenseSquareSymmetricMatrix covarianceMatrix; + covarianceMatrix.setDegreeOfEquation(numOfOutputAndInputVariables); + int icount = 0; + for (int icol = 0; icol < numOfOutputAndInputVariables; ++icol) + { + // Diagonals + covarianceMatrix.setValue(icol, icol, variancesWithoutScale[icol]); + for (int irow = icol + 1; irow < numOfOutputAndInputVariables; ++irow) + { + // Lower triangle part + covarianceMatrix.setValue(irow, icol, covariancesLowerTriangleWithoutScale[icount]); + ++icount; + } + } +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif // _DEBUG_WRITE + + covarianceMatrix.factorizeMatrix(); + + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + // Zero clear + MD[iSeg] = 0.0; + } + double* tempRhsReal = new double[numOfOutputAndInputVariables]; + double* tempResReal = new double[numOfOutputAndInputVariables]; + double* tempRhsImag = new double[numOfOutputAndInputVariables]; + double* tempResImag = new double[numOfOutputAndInputVariables]; + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { +// std::cout << Util::toString(complexResiduals[irow][iSeg].real()) + "+" + Util::toString(complexResiduals[irow][iSeg].imag()) + "im"; +// if (irow < numOfOutputAndInputVariables - 1) +// { +// std::cout << ", "; +// } +// } +// std::cout << "]" << std::endl; +//#endif // _DEBUG_WRITE + for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { + tempRhsReal[irow] = complexResiduals[irow][iSeg].real(); + tempRhsImag[irow] = complexResiduals[irow][iSeg].imag(); + } + covarianceMatrix.solveLinearEquation(tempRhsReal, tempResReal); + covarianceMatrix.solveLinearEquation(tempRhsImag, tempResImag); +//#ifdef _DEBUG_WRITE +// std::cout << "["; +// for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { +// std::cout << Util::toString(tempResReal[irow]) + "+" + Util::toString(tempResImag[irow]) + "im"; +// if (irow < numOfOutputAndInputVariables - 1) +// { +// std::cout << ", "; +// } +// } +// std::cout << "]" << std::endl; +//#endif // _DEBUG_WRITE + for (int irow = 0; irow < numOfOutputAndInputVariables; ++irow) { + const std::complex val = std::complex(tempResReal[irow], tempResImag[irow]); + const std::complex product = std::conj(complexResiduals[irow][iSeg]) * val; + MD[iSeg] += product.real(); + } + } + delete[] tempRhsReal; + delete[] tempResReal; + delete[] tempRhsImag; + delete[] tempResImag; + + // Calculate Mahalanobis distance + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double work = sqrt(MD[iSeg]); + MD[iSeg] = work; + } + +} +// Estimate error by robust bootstrap +void AnalysisMultivariateRegression::estimateErrorByRobustBootstrap(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftval, std::complex** respOrg, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, const double determinantOrg, double** respErr) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + + bool fixedWeights(true); + const int typeOfErrorEstimationMethod = ptrControl->getErrorEstimationMethod(); + switch(typeOfErrorEstimationMethod){ + case Control::FIXED_WEIGHTS_BOOTSTRAP: + fixedWeights = true; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Estimate errors by fixed-weights bootstrap"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + break; + case Control::ROBUST_BOOTSTRAP: + fixedWeights = false; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Estimate errors by robust bootstrap"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(typeOfErrorEstimationMethod)); + break; + } + + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegmentsTotal]; + } + double* MDOrg = new double[numSegmentsTotal]; + double* weightsOrg = new double[numSegmentsTotal]; + double* termsInDenominatorOfRobustCovariance = new double[numSegmentsTotal]; + double* termsForScaleOrg = new double[numSegmentsTotal]; + + // Calculate complex residuals + calculateComplexResiduals( numSegmentsTotal, ftval, respOrg, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResidualsOrg, + variancesWithoutScaleOrg, covariancesLowerTriangleWithoutScaleOrg, MDOrg); + // Calculate original weights + double sumOfWeights(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleOrg; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + sumOfWeights += weightsOrg[iSeg]; + termsInDenominatorOfRobustCovariance[iSeg] = RobustWeightTukeysBiweights::calculateTermInDenominatorOfRobustCovariance(val, paramC); + if( fabs(val) < CommonParameters::EPS ){ + // rho''(0) / 2 = 1 / 2 + termsForScaleOrg[iSeg] = 0.5 * pow(MDOrg[iSeg], 2); + }else{ + termsForScaleOrg[iSeg] = RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scaleOrg, 2); + } + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << weightsOrg[iSeg] << std::endl; + } + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << termsForScaleOrg[iSeg] << std::endl; + } + { + double* variancesWithoutScale = new double[numOfOutputAndInputVariables]; + double determinant(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsOrg[iSeg]; + denominator += termsInDenominatorOfRobustCovariance[iSeg]; + } + if( denominator < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Denominator of robust covariance is too small (" + Util::toString(denominator) + ")"); + } + variancesWithoutScale[iVar] = static_cast(numOfOutputAndInputVariables) * numerator / denominator; + determinant *= variancesWithoutScale[iVar];// Real part + determinant *= variancesWithoutScale[iVar];// Imaginary part + } + const double factor = pow(determinant, -1.0/static_cast(degreeOfFreedom)); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScale[iVar] *= factor; + std::cout << "variance[" << iVar << "] = " << variancesWithoutScale[iVar] << std::endl; + } + // Calculate one-step estimates of the scale of Mahalanobis distance + double squareScale(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + squareScale += termsForScaleOrg[iSeg]; + } + squareScale /= static_cast(numSegmentsTotal); + squareScale /= paramB; + const double scale = sqrt(squareScale); + std::cout << "scale = " << scale << std::endl; + } +#endif + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + + // Find the minimum variance + double minimumVariance(1.0e20); + int indexOfMinimumVariance(-1); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + if( variancesWithoutScaleOrg[iVar] < minimumVariance ){ + minimumVariance = variancesWithoutScaleOrg[iVar]; + indexOfMinimumVariance = iVar; + } + } + +//#ifdef _DEBUG_WRITE +// DoubleDenseSquareMatrix testMatrix; +// testMatrix.setDegreeOfEquation(4); +// double tempMat[16] = {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}; +// double tempVec[4] = {1,2,3,4}; +// double tempRes[4] = {0.0,0.0,0.0,0.0}; +// int itemp(0); +// for( int irow = 0; irow < 4; ++irow ){ +// for( int icol = 0; icol < 4; ++icol ){ +// testMatrix.setValue(irow, icol, tempMat[itemp]); +// ++itemp; +// } +// } +// testMatrix.debugWriteMatrix(); +// testMatrix.factorizeMatrix(); +// testMatrix.solveLinearEquation(tempVec, tempRes); +// for( int i = 0; i < 4; ++i ){ +// std::cout << tempRes[i] << std::endl; +// } +//#endif + + // Bootstrap + const int dofOfMatrixForCorrection = degreeOfFreedom * numOfReferenceVariables + numOfOutputAndInputVariables; + DoubleDenseSquareMatrix matrixForCorrection; + if(!fixedWeights){ + matrixForCorrection.setDegreeOfEquation(dofOfMatrixForCorrection); + matrixForCorrection.zeroClearMatrix(); + for( int irow = 0; irow < dofOfMatrixForCorrection; ++irow ){ + matrixForCorrection.setValue(irow, irow, 1.0);// Unit matrix + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + + double** derivativesRespsResps = new double*[degreeOfFreedom * numOfReferenceVariables]; + for( int irow = 0; irow < degreeOfFreedom * numOfReferenceVariables; ++irow ){ + derivativesRespsResps[irow] = new double[degreeOfFreedom * numOfReferenceVariables]; + } + double** derivativesRespsVariances = new double*[degreeOfFreedom * numOfReferenceVariables]; + for( int irow = 0; irow < degreeOfFreedom * numOfReferenceVariables; ++irow ){ + derivativesRespsVariances[irow] = new double[numOfOutputAndInputVariables]; + } + double* derivativesRespsScale = new double[degreeOfFreedom * numOfReferenceVariables]; + calculatePartialDerivativesOfResponses( numSegmentsTotal, paramC, ftval, respOrg, variancesWithoutScaleOrg, scaleOrg, + complexResidualsOrg, MDOrg, weightsOrg, + derivativesRespsResps, derivativesRespsVariances, derivativesRespsScale ); + for( int irow = 0; irow < degreeOfFreedom * numOfReferenceVariables; ++irow ){ + int icol(0); + for( int icount = 0; icount < degreeOfFreedom * numOfReferenceVariables; ++icount ){ + matrixForCorrection.addValue(irow, icol, -derivativesRespsResps[irow][icount]); + ++icol; + } + for( int icount = 0; icount < numOfOutputAndInputVariables; ++icount ){ + if( icount != indexOfMinimumVariance ){ + matrixForCorrection.addValue(irow, icol, -derivativesRespsVariances[irow][icount]); + ++icol; + } + } + matrixForCorrection.addValue(irow, icol, -derivativesRespsScale[irow]); + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + for( int irow = 0; irow < degreeOfFreedom * numOfReferenceVariables; ++irow ){ + delete [] derivativesRespsResps[irow]; + } + delete [] derivativesRespsResps; + for( int irow = 0; irow < degreeOfFreedom * numOfReferenceVariables; ++irow ){ + delete [] derivativesRespsVariances[irow]; + } + delete [] derivativesRespsVariances; + delete [] derivativesRespsScale; + + double** derivativesVariancesResps = new double*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + derivativesVariancesResps[irow] = new double[degreeOfFreedom * numOfReferenceVariables]; + } + double** derivativesVariancesVariances = new double*[numOfOutputAndInputVariables]; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + derivativesVariancesVariances[irow] = new double[numOfOutputAndInputVariables]; + } + double* derivativesVariancesScale = new double[numOfOutputAndInputVariables]; + calculatePartialDerivativesOfVariancesWithoutScale( numSegmentsTotal, paramC, ftval, respOrg, variancesWithoutScaleOrg, + scaleOrg, determinantOrg, complexResidualsOrg, MDOrg, weightsOrg, + derivativesVariancesResps, derivativesVariancesVariances, derivativesVariancesScale ); + int varCount(0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + if( iVar == indexOfMinimumVariance ){ + continue; + } + const int irow = varCount + degreeOfFreedom * numOfReferenceVariables; + ++varCount; + int icol(0); + for( int icount = 0; icount < degreeOfFreedom * numOfReferenceVariables; ++icount ){ + matrixForCorrection.addValue(irow, icol, -derivativesVariancesResps[iVar][icount]); + ++icol; + } + for( int icount = 0; icount < numOfOutputAndInputVariables; ++icount ){ + if( icount != indexOfMinimumVariance ){ + matrixForCorrection.addValue(irow, icol, -derivativesVariancesVariances[iVar][icount]); + ++icol; + } + } + matrixForCorrection.addValue(irow, icol, -derivativesVariancesScale[iVar]); + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + delete [] derivativesVariancesResps[irow]; + } + delete [] derivativesVariancesResps; + for( int irow = 0; irow < numOfOutputAndInputVariables; ++irow ){ + delete [] derivativesVariancesVariances[irow]; + } + delete [] derivativesVariancesVariances; + delete [] derivativesVariancesScale; + + double* derivativesScaleResps = new double[degreeOfFreedom * numOfReferenceVariables]; + double* derivativesScaleVariances = new double[numOfOutputAndInputVariables]; + double derivativesScaleScale(0.0); + calculatePartialDerivativesOfScale( numSegmentsTotal, paramB, paramC, ftval, respOrg, variancesWithoutScaleOrg, scaleOrg, + complexResidualsOrg, MDOrg, weightsOrg, + derivativesScaleResps, derivativesScaleVariances, derivativesScaleScale ); + { + const int irow = dofOfMatrixForCorrection - 1; + int icol(0); + for( int icount = 0; icount < degreeOfFreedom * numOfReferenceVariables; ++icount ){ + matrixForCorrection.addValue(irow, icol, -derivativesScaleResps[icount]); + ++icol; + } + for( int icount = 0; icount < numOfOutputAndInputVariables; ++icount ){ + if( icount != indexOfMinimumVariance ){ + matrixForCorrection.addValue(irow, icol, -derivativesScaleVariances[icount]); + ++icol; + } + } + matrixForCorrection.addValue(irow, icol, -derivativesScaleScale); + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + delete [] derivativesScaleResps; + delete [] derivativesScaleVariances; + // Factorize matrix + matrixForCorrection.factorizeMatrix(); + } + + // Bootstrap + int* segmentIndexes = new int [numSegmentsTotal]; + std::complex** resp = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + resp[iVar] = new std::complex[numOfReferenceVariables]; + } + const int numOfDataSet = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex*** respFinal = new std::complex**[numOfDataSet]; + double* variancesWithoutScale = new double[numOfOutputAndInputVariables]; + double* vectorForCorrection = new double[dofOfMatrixForCorrection]; +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for( int iDataSet = 0; iDataSet < numOfDataSet; ++iDataSet ){ + // Make bootstrap samples + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << segmentIndexes[iSeg] << std::endl; + } +#endif + // Calculate one-step estimates of response functions + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + calculateResponseFunctionByWLSForBootstrap( numSegmentsTotal, segmentIndexes, ftval[index], ftval[rr0], ftval[rr1], + weightsOrg, resp[iVar][0], resp[iVar][1] ); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + calculateResponseFunctionByWLSForBootstrap( numSegmentsTotal, segmentIndexes, ftval[index], ftval[rr0], ftval[rr1], + weightsOrg, resp[iVar][0], resp[iVar][1] ); + ++iVar; + } + assert( iVar == numOfOutputAndInputVariables ); + // Calculate one-step estimates of variances without scale + double determinant(1.0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make real residual vector from complex residual vector + double numerator (0.0); + double denominator(0.0); +#ifdef _USE_OMP + int icount(0); + #pragma omp parallel for default(shared) private(icount) reduction(+ : numerator) + for( icount = 0; icount < numSegmentsTotal; ++icount ){ + numerator += std::norm(complexResidualsOrg[iVar][segmentIndexes[icount]]) * weightsOrg[segmentIndexes[icount]]; + } + #pragma omp parallel for default(shared) private(icount) reduction(+ : denominator) + for( icount = 0; icount < numSegmentsTotal; ++icount ){ + denominator += termsInDenominatorOfRobustCovariance[segmentIndexes[icount]]; + } +#else + for( int icount = 0; icount < numSegmentsTotal; ++icount ){ + const int iSeg = segmentIndexes[icount]; + numerator += std::norm(complexResidualsOrg[iVar][iSeg]) * weightsOrg[iSeg]; + denominator += termsInDenominatorOfRobustCovariance[iSeg]; + } +#endif +#ifdef _DEBUG_WRITE + std::cout << "numerator, denominator = " << numerator << "," << denominator << std::endl; +#endif + if( denominator < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Denominator of robust covariance is too small (" + Util::toString(denominator) + ")"); + } + variancesWithoutScale[iVar] = static_cast(numOfOutputAndInputVariables) * numerator / denominator; + determinant *= variancesWithoutScale[iVar];// Real part + determinant *= variancesWithoutScale[iVar];// Imaginary part + } + const double factor = pow(determinant, -1.0/static_cast(degreeOfFreedom)); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + // Make determinant of covariance matrix one + variancesWithoutScale[iVar] *= factor; + } + // Calculate one-step estimates of the scale of Mahalanobis distance + double squareScale(0.0); +#ifdef _USE_OMP + int icount(0); + #pragma omp parallel for default(shared) private(icount) reduction(+ : squareScale) + for( icount = 0; icount < numSegmentsTotal; ++icount ){ + squareScale += termsForScaleOrg[segmentIndexes[icount]]; + } +#else + for( int icount = 0; icount < numSegmentsTotal; ++icount ){ + const int iSeg = segmentIndexes[icount]; + squareScale += termsForScaleOrg[iSeg]; + } +#endif +#ifdef _DEBUG_WRITE + std::cout << "squareScale = " << squareScale << std::endl; +#endif + squareScale /= static_cast(numSegmentsTotal); + squareScale /= paramB; + const double scale = sqrt(squareScale); + if( ptrControl->getOutputLevel() >= 4 ){// Output one-step estimates + ptrOutputFiles->writeCvgMessage("Dataset " + Util::toString(iDataSet)); + ptrOutputFiles->writeCvgMessage("One-step estimates of response functions:"); + std::ostringstream msg; + int iVar = 0; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].imag() << ")" << std::endl; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << std::endl; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + respFinal[iDataSet] = new std::complex*[numOfOutputVariables]; + for (int iOut = 0; iOut < numOfOutputVariables; ++iOut) { + respFinal[iDataSet][iOut] = new std::complex[numOfReferenceVariables]; + } + if( ptrControl->getOutputLevel() >= 4 ){ + ptrOutputFiles->writeCvgMessage("One-step estimate of scale: " + Util::toString(scale)); + std::ostringstream msg; + msg << "One-step estimates of variances without scale:"; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + msg << std::setw(12) << std::setprecision(4) << std::scientific << variancesWithoutScale[iVar]; + if( iVar + 1 < numOfOutputAndInputVariables ){ + msg << ", "; + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + // Calculate estimates of final response functions + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const std::complex Txx = resp[in0][0]; + const std::complex Txy = resp[in0][1]; + const std::complex Tyx = resp[in1][0]; + const std::complex Tyy = resp[in1][1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + if (std::abs(det) < CommonParameters::EPS) { + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + for (int iOut = 0; iOut < numOfOutputVariables; ++iOut) { + const int index = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + const std::complex U_x = resp[index][0]; + const std::complex U_y = resp[index][1]; + const std::complex resp0 = (U_x * Tyy - U_y * Tyx) / det; + const std::complex resp1 = (U_y * Txx - U_x * Txy) / det; + respFinal[iDataSet][iOut][0] = resp0; + respFinal[iDataSet][iOut][1] = resp1; + } + ptrOutputFiles->writeCvgMessage("One-step estimates of final response functions:"); + std::ostringstream msg2; + for (int iOut = 0; iOut < numOfOutputVariables; ++iOut) { + msg2 << "(" << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][0].imag() << "), "; + msg2 << "(" << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][1].imag() << ")"; + if (iOut + 1 < numOfOutputVariables) { + msg2 << std::endl; + } + } + ptrOutputFiles->writeCvgMessage(msg2.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + + if(!fixedWeights){ + // Calculate differences between one-step estimates and original estimates + int index(0); + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12),Re(Z21),Im(Z21),Re(Z22),Im(Z22),...,Re(Zq1),Im(Zq1),Re(Zq2),Im(Zq2) + vectorForCorrection[index] = resp[iVar][irr].real() - respOrg[iVar][irr].real(); + ++index; + vectorForCorrection[index] = resp[iVar][irr].imag() - respOrg[iVar][irr].imag(); + ++index; + } + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + if( iVar == indexOfMinimumVariance ){ + continue; + } + vectorForCorrection[index] = variancesWithoutScale[iVar] - variancesWithoutScaleOrg[iVar]; + ++index; + } + vectorForCorrection[index] = scale - scaleOrg; + assert(index + 1 == dofOfMatrixForCorrection); +#if _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < dofOfMatrixForCorrection; ++row ){ + std::cout << vectorForCorrection[row] <<" "; + if( row+1 < dofOfMatrixForCorrection ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif + // Solve linear equation + matrixForCorrection.solveLinearEquation(vectorForCorrection, vectorForCorrection); +#if _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < dofOfMatrixForCorrection; ++row ){ + std::cout << vectorForCorrection[row] <<" "; + if( row+1 < dofOfMatrixForCorrection ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "["; +#endif + // Calculate corrected version of the output one-step estimates + index = 0;// Zero clear + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int irr = 0; irr < numOfReferenceVariables; ++irr ){ + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12),Re(Z21),Im(Z21),Re(Z22),Im(Z22),...,Re(Zq1),Im(Zq1),Re(Zq2),Im(Zq2) + const std::complex correction = std::complex(vectorForCorrection[index], vectorForCorrection[index+1]); +#if _DEBUG_WRITE + std::cout << correction.real() << "+" << correction.imag() <<"im "; +#endif + resp[iVar][irr] = respOrg[iVar][irr] + correction; + index += 2; + } +#if _DEBUG_WRITE + if( iVar+1 < numOfOutputAndInputVariables ){ + std::cout << ";"; + } +#endif + } +#if _DEBUG_WRITE + std::cout << "]" << std::endl; +#endif + if( ptrControl->getOutputLevel() >= 4 ){//Output corrected version of the output one-step estimates + ptrOutputFiles->writeCvgMessage("Corrected one-step estimates of response functions:"); + std::ostringstream msg; + int iVar = 0; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].imag() << ")" << std::endl; + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp[iVar][1].imag() << ")"; + ++iVar; + if( iInp + 1 < numOfInputVariables ){ + msg << std::endl; + } + } + assert(iVar == numOfOutputAndInputVariables); + ptrOutputFiles->writeCvgMessage(msg.str()); + } + } + + // Calculate estimates of final response functions + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const std::complex Txx = resp[in0][0]; + const std::complex Txy = resp[in0][1]; + const std::complex Tyx = resp[in1][0]; + const std::complex Tyy = resp[in1][1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + if( std::abs(det) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const std::complex U_x = resp[index][0]; + const std::complex U_y = resp[index][1]; + const std::complex resp0 = ( U_x * Tyy - U_y * Tyx ) / det; + const std::complex resp1 = ( U_y * Txx - U_x * Txy ) / det; + respFinal[iDataSet][iOut][0] = resp0; + respFinal[iDataSet][iOut][1] = resp1; + } + if( ptrControl->getOutputLevel() >= 4 ){// Output estimates of final response functions + ptrOutputFiles->writeCvgMessage("Estimates of final response functions:"); + std::ostringstream msg; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iDataSet][iOut][1].imag() << ")"; + if( iOut + 1 < numOfOutputVariables ){ + msg << std::endl; + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + } + delete [] MDOrg; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] weightsOrg; + delete [] termsInDenominatorOfRobustCovariance; + delete [] termsForScaleOrg; + delete [] segmentIndexes; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] resp[iVar]; + } + delete [] resp; + delete [] variancesWithoutScale; + delete [] vectorForCorrection; + + // Calculate error of response functions + assert(numOfDataSet > 2); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + // Calculate average + std::complex average = std::complex(0.0, 0.0); + for( int iDataSet = 0; iDataSet < numOfDataSet; ++iDataSet ){ + average += respFinal[iDataSet][iOut][iRR]; + } + average /= static_cast(numOfDataSet); + // Calculate variance + double variance(0.0); + for( int iDataSet = 0; iDataSet < numOfDataSet; ++iDataSet ){ + variance += std::norm(respFinal[iDataSet][iOut][iRR] - average); + } + variance /= static_cast(2 * numOfDataSet - 4); + respErr[iOut][iRR] = sqrt(variance); + } + } + + for( int iDataSet = 0; iDataSet < numOfDataSet; ++iDataSet ){ + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + delete [] respFinal[iDataSet][iOut]; + } + delete [] respFinal[iDataSet]; + } + delete [] respFinal; + +} + +// Estimate error by strict bootstrap +void AnalysisMultivariateRegression::estimateErrorByStrictBootstrap(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftvalOrg, std::complex** respOrg, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, const double determinantOrg, double** respErr) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Strict bootstrap is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + const int numChannels = ptrControl->getNumberOfChannels(); + + const Control::ParamsForRobustMultivariateRegression params = ptrControl->getParamsForRobustMultivariateRegression(); + const int numOfMaxIterations = params.numOfMaxIterationsOfSecondIstep; + const double convergenceCriteria = params.convergenceCriteriaOfSecondIstep; + + // Copy Fourier transformed values + std::complex** ftvalForBootstrap = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ftvalForBootstrap[iChan] = new std::complex[numSegmentsTotal]; + } + std::complex** resp = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + resp[iVar] = new std::complex[numOfReferenceVariables]; + } + double* variancesWithoutScale = new double[numOfOutputAndInputVariables]; + double* covariancesLowerTriangleWithoutScale = new double[numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1) / 2]; + double scales = scaleOrg; + double determinants = determinantOrg; + double* coherences = new double[numOfOutputVariables]; + int* segmentIndexes = new int[numSegmentsTotal]; + + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex*** respFinal = new std::complex**[numOfSamples]; + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + // Make bootstrap samples + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << segmentIndexes[iSeg] << std::endl; + } +#endif + // Copy data + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int icount = 0; icount < numSegmentsTotal; ++icount ){ + const int iSeg = segmentIndexes[icount]; + ftvalForBootstrap[iChan][icount] = ftvalOrg[iChan][iSeg]; + } + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + resp[iVar][iRR] = respOrg[iVar][iRR]; + } + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + variancesWithoutScale[iVar] = variancesWithoutScaleOrg[iVar]; + } + for (int i = 0; i < numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1) / 2; ++i) { + covariancesLowerTriangleWithoutScale[i] = covariancesLowerTriangleWithoutScaleOrg[i]; + } + double scales = scaleOrg; + double determinants = determinantOrg; + for( int iVar = 0; iVar < numOfOutputVariables; ++iVar ){ + coherences[iVar] = 0.0; + } + improveCandidate(numSegmentsTotal, numOfMaxIterations, convergenceCriteria, true, paramB, paramC, + ftvalForBootstrap, resp, variancesWithoutScale, scales, determinants, coherences, covariancesLowerTriangleWithoutScale); + // Calculate estimates of final response functions + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + const std::complex Txx = resp[in0][0]; + const std::complex Txy = resp[in0][1]; + const std::complex Tyx = resp[in1][0]; + const std::complex Tyy = resp[in1][1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + if( std::abs(det) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + respFinal[iSample] = new std::complex*[numOfOutputVariables]; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + respFinal[iSample][iOut] = new std::complex[numOfReferenceVariables]; + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const std::complex U_x = resp[index][0]; + const std::complex U_y = resp[index][1]; + const std::complex resp0 = ( U_x * Tyy - U_y * Tyx ) / det; + const std::complex resp1 = ( U_y * Txx - U_x * Txy ) / det; + respFinal[iSample][iOut][0] = resp0; + respFinal[iSample][iOut][1] = resp1; + } + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + + if( ptrControl->getOutputLevel() >= 4 ){// Output estimates of final response functions + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + ptrOutputFiles->writeCvgMessage("Dataset " + Util::toString(iSample)); + ptrOutputFiles->writeCvgMessage("Estimates of final response functions:"); + std::ostringstream msg; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iSample][iOut][0].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iSample][iOut][0].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iSample][iOut][1].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << respFinal[iSample][iOut][1].imag() << ")"; + if( iOut + 1 < numOfOutputVariables ){ + msg << std::endl; + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + } + + // Delete arrays + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] ftvalForBootstrap[iChan]; + } + delete [] ftvalForBootstrap; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] resp[iVar]; + } + delete [] resp; + delete [] variancesWithoutScale; + delete [] covariancesLowerTriangleWithoutScale; + delete [] coherences; + delete [] segmentIndexes; + + // Calculate error of response functions + assert(numOfSamples > 2); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + // Calculate average + std::complex average = std::complex(0.0, 0.0); + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + average += respFinal[iSample][iOut][iRR]; + } + average /= static_cast(numOfSamples); + // Calculate variance + double variance(0.0); + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + variance += std::norm(respFinal[iSample][iOut][iRR] - average); + } + variance /= static_cast(2 * numOfSamples - 4); + respErr[iOut][iRR] = sqrt(variance); + } + } + + // Delete arrays + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + delete [] respFinal[iSample][iOut]; + } + delete [] respFinal[iSample]; + } + delete [] respFinal; + +} + +// Estimate error by fixed-weights jackknife +void AnalysisMultivariateRegression::estimateErrorByFixedWeightsJackknife(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftval, const std::complex* const respOrg0, const std::complex* const respOrg1, + std::complex** respOrg, const double* const variancesWithoutScaleOrg, const double* const covariancesLowerTriangleWithoutScaleOrg, + const double scaleOrg, double** respErr) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Estimate errors by fixed-weights jackknife"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegmentsTotal]; + } + double* MDOrg = new double[numSegmentsTotal]; + double* weightsOrg = new double[numSegmentsTotal]; + // Calculate complex residuals + calculateComplexResiduals( numSegmentsTotal, ftval, respOrg, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResidualsOrg, variancesWithoutScaleOrg, + covariancesLowerTriangleWithoutScaleOrg, MDOrg); + // Calculate original weights + double sumOfWeights(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleOrg; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + sumOfWeights += weightsOrg[iSeg]; + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << weightsOrg[iSeg] << std::endl; + } +#endif + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + // Release memory + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + + double * hatDiagonals = new double [numSegmentsTotal]; + const double maxHatDiag = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, rr0, rr1, ftval, weightsOrg, hatDiagonals ); +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << hatDiagonals[iSeg] << std::endl; + } +#endif + + double* weights = new double[numSegmentsTotal]; + memcpy(weights, weightsOrg, sizeof(double)*numSegmentsTotal); + std::complex* temp0 = new std::complex[numOfOutputAndInputVariables]; + std::complex* temp1 = new std::complex[numOfOutputAndInputVariables]; + std::complex* resp0 = new std::complex[numOfOutputVariables]; + std::complex* resp1 = new std::complex[numOfOutputVariables]; + std::complex** pseudoResp0 = new std::complex*[numSegmentsTotal]; + std::complex** pseudoResp1 = new std::complex*[numSegmentsTotal]; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + weights[iSeg] = 0.0;// Replace +#ifdef _DEBUG_WRITE + for( int i = 0; i < numSegmentsTotal; ++i ){ + std::cout << i << " " << weights[i] << std::endl; + } +#endif + // Calculate one-step estimates of response functions + int iVar(0); + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + calculateResponseFunctionByWLSAux( numSegmentsTotal, ftval[index], ftval[rr0], ftval[rr1], weights, temp0[iVar], temp1[iVar] ); + ++iVar; + } + for( int iInp = 0; iInp < numOfInputVariables; ++iInp ){ + const int index = ptrControl->getChannelIndex( CommonParameters::INPUT, iInp ); + calculateResponseFunctionByWLSAux( numSegmentsTotal, ftval[index], ftval[rr0], ftval[rr1], weights, temp0[iVar], temp1[iVar] ); + ++iVar; + } + weights[iSeg] = weightsOrg[iSeg];// Restore +#ifdef _DEBUG_WRITE + for( int i = 0; i < numSegmentsTotal; ++i ){ + std::cout << i << " " << weights[i] << std::endl; + } +#endif + assert(numOfInputVariables == 2); + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + const std::complex Txx = temp0[in0]; + const std::complex Txy = temp1[in0]; + const std::complex Tyx = temp0[in1]; + const std::complex Tyy = temp1[in1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + if( std::abs(det) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + pseudoResp0[iSeg] = new std::complex[numOfOutputVariables]; + pseudoResp1[iSeg] = new std::complex[numOfOutputVariables]; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const std::complex U_x = temp0[index]; + const std::complex U_y = temp1[index]; + resp0[iOut] = ( U_x * Tyy - U_y * Tyx ) / det; + resp1[iOut] = ( U_y * Txx - U_x * Txy ) / det; + const double hatMatrixDiagonal = hatDiagonals[iSeg]; + double factor = static_cast(numSegmentsTotal) * (1.0 - hatMatrixDiagonal); + if( hatMatrixDiagonal > 1.0 ){ + factor= 0.0; + }else if( hatMatrixDiagonal < 0.0 ){ + factor = static_cast(numSegmentsTotal); + } + pseudoResp0[iSeg][iOut] = respOrg0[iOut] + factor * (respOrg0[iOut] - resp0[iOut]); + pseudoResp1[iSeg][iOut] = respOrg1[iOut] + factor * (respOrg1[iOut] - resp1[iOut]); + } + } + delete [] hatDiagonals; + delete [] weights; + delete [] weightsOrg; + delete [] temp0; + delete [] temp1; + delete [] resp0; + delete [] resp1; + + // Calculate & output error bars + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + if( numSegmentsTotal > 2 ){ + std::complex avgResp0(0.0, 0.0); + std::complex avgResp1(0.0, 0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + avgResp0 += pseudoResp0[iSeg][iOut]; + avgResp1 += pseudoResp1[iSeg][iOut]; + } + const double factor = 1.0 / static_cast(numSegmentsTotal); + avgResp0 *= factor; + avgResp1 *= factor; + double variance0(0.0); + double variance1(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + variance0 += std::norm( pseudoResp0[iSeg][iOut] - avgResp0 ); + variance1 += std::norm( pseudoResp1[iSeg][iOut] - avgResp1 ); + } + const double factor2 = factor / static_cast(2 * numSegmentsTotal - 4); + variance0 *= factor2; + variance1 *= factor2; + respErr[iOut][0] = sqrt(variance0); + respErr[iOut][1] = sqrt(variance1); + }else{ + respErr[iOut][0] = 1.0e10; + respErr[iOut][1] = 1.0e10; + } + } + // Release memory + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + delete [] pseudoResp0[iSeg]; + delete [] pseudoResp1[iSeg]; + } + delete [] pseudoResp0; + delete [] pseudoResp1; + +} + +// Estimate error by subset deletion jackknife +void AnalysisMultivariateRegression::estimateErrorBySubsetDeletionJackknife(const int numSegmentsTotal, std::complex** ftvalOrg, + std::complex** respOrg, const double* const variancesWithoutScaleOrg, const double* const covariancesLowerTriangleWithoutScaleOrg, + const double scaleOrg, const double determinantOrg, double** respErr) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Subset deletion jackknife is performed to estimate errors"); + const Control* const ptrControl = Control::getInstance(); + int numOmittedData = static_cast( 0.01 * ptrControl->getPercentageOfOmmitedDataSubsetDeletionJackknife() * static_cast(numSegmentsTotal) ); + if( numOmittedData < 1 ){ + numOmittedData = 1; + } + const int numOfSubsets = numSegmentsTotal / numOmittedData; + ptrOutputFiles->writeLogMessage("Number of ommited data : " + Util::toString(numOmittedData)); + ptrOutputFiles->writeLogMessage("Number of subsets : " + Util::toString(numOfSubsets)); + + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int degreeOfFreedom = 2 * numOfOutputAndInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + const int numChannels = ptrControl->getNumberOfChannels(); + + double paramB(0.0); + double paramC(0.0); + RobustWeightTukeysBiweights::calculateParams(degreeOfFreedom, numSegmentsTotal - numOmittedData, paramB, paramC); + + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + complexResidualsOrg[iVar] = new std::complex[numSegmentsTotal]; + } + double* MDOrg = new double[numSegmentsTotal]; + double* weightsOrg = new double[numSegmentsTotal]; + // Calculate complex residuals + calculateComplexResiduals( numSegmentsTotal, ftvalOrg, respOrg, complexResidualsOrg ); + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResidualsOrg, variancesWithoutScaleOrg, + covariancesLowerTriangleWithoutScaleOrg, MDOrg); + // Calculate original weights + double sumOfWeights(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + const double val = MDOrg[iSeg] / scaleOrg; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(val, paramC); + sumOfWeights += weightsOrg[iSeg]; + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << weightsOrg[iSeg] << std::endl; + } +#endif + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + // Release memory + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] complexResidualsOrg[iVar]; + } + delete [] complexResidualsOrg; + delete [] MDOrg; + double * hatDiagonals = new double [numSegmentsTotal]; + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + const double maxHatDiag = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, rr0, rr1, ftvalOrg, weightsOrg, hatDiagonals ); + delete [] weightsOrg; +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << hatDiagonals[iSeg] << std::endl; + } +#endif + + const Control::ParamsForRobustMultivariateRegression params = ptrControl->getParamsForRobustMultivariateRegression(); + const int numOfMaxIterations = params.numOfMaxIterationsOfSecondIstep; + const double convergenceCriteria = params.convergenceCriteriaOfSecondIstep; + +#ifdef _DEBUG_WRITE + for( int iSeg = 0;iSeg < numSegmentsTotal; ++iSeg){ + std::cout << std::setw(15) << hatDiagonals[iSeg] << std::endl; + } + for( int iChan = 0; iChan < ptrControl->getNumberOfChannels(); ++iChan ){ + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << "iChan iSeg val: " << iChan << " " << iSeg << " " << ftvalOrg[iChan][iSeg] << std::endl; + } + } +#endif + + // Copy Fourier transformed values + std::complex** ftvalForJackknife = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ftvalForJackknife[iChan] = new std::complex[numSegmentsTotal - numOmittedData]; + } + std::complex** resp = new std::complex*[numOfOutputAndInputVariables]; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + resp[iVar] = new std::complex[numOfReferenceVariables]; + } + double* variancesWithoutScale = new double[numOfOutputAndInputVariables]; + double* covariancesLowerTriangleWithoutScale = new double[2 * numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1)]; + double scales = scaleOrg; + double determinants = determinantOrg; + double* coherences = new double[numOfOutputVariables]; + std::complex** pseudoResp0 = new std::complex*[numOfSubsets]; + std::complex** pseudoResp1 = new std::complex*[numOfSubsets]; + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); + for( int iSubset = 0; iSubset < numOfSubsets; ++iSubset ){ + double averageHatDiags(0.0); + const int iSegOmitStart = iSubset * numOmittedData; + const int iSegOmitEnd = iSegOmitStart + numOmittedData; + assert(iSegOmitEnd <= numSegmentsTotal); + for( int iSeg = iSegOmitStart; iSeg < iSegOmitEnd; ++iSeg ){ + averageHatDiags += hatDiagonals[iSeg]; + } + averageHatDiags /= static_cast(numOmittedData); +#ifdef _DEBUG_WRITE + std::cout << std::setw(20) << averageHatDiags << std::endl; +#endif + // Copy data + for( int iChan = 0; iChan < numChannels; ++iChan ){ + int icount(0); + for( int iSeg = 0; iSeg < iSegOmitStart; ++iSeg, ++icount ){ + ftvalForJackknife[iChan][icount] = ftvalOrg[iChan][iSeg]; + } + for( int iSeg = iSegOmitEnd; iSeg < numSegmentsTotal; ++iSeg, ++icount ){ + ftvalForJackknife[iChan][icount] = ftvalOrg[iChan][iSeg]; + } + assert(icount == numSegmentsTotal - numOmittedData); + } +#ifdef _DEBUG_WRITE + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int i = 0; i < numSegmentsTotal - numOmittedData; ++i ){ + std::cout << "iChan i val: " << iChan << " " << i << " " << ftvalForJackknife[iChan][i] << std::endl; + } + } +#endif + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + for( int iRR = 0; iRR < numOfReferenceVariables; ++iRR ){ + resp[iVar][iRR] = respOrg[iVar][iRR]; + } + } + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + variancesWithoutScale[iVar] = variancesWithoutScaleOrg[iVar]; + } + for (int i = 0; i < 2 * numOfOutputAndInputVariables * (numOfOutputAndInputVariables - 1); ++i) { + covariancesLowerTriangleWithoutScale[i] = covariancesLowerTriangleWithoutScaleOrg[i]; + } + double scales = scaleOrg; + double determinants = determinantOrg; + for( int iVar = 0; iVar < numOfOutputVariables; ++iVar ){ + coherences[iVar] = 0.0; + } + improveCandidate(numSegmentsTotal - numOmittedData, numOfMaxIterations, convergenceCriteria, true, paramB, paramC, + ftvalForJackknife, resp, variancesWithoutScale, scales, determinants, coherences, covariancesLowerTriangleWithoutScale); + // Calculate estimates of final response functions + const int in0 = ptrControl->getChannelIndex( CommonParameters::INPUT, 0 ); + const int in1 = ptrControl->getChannelIndex( CommonParameters::INPUT, 1 ); + const std::complex Txx = resp[in0][0]; + const std::complex Txy = resp[in0][1]; + const std::complex Tyx = resp[in1][0]; + const std::complex Tyy = resp[in1][1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + if( std::abs(det) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + pseudoResp0[iSubset] = new std::complex[numOfOutputVariables]; + pseudoResp1[iSubset] = new std::complex[numOfOutputVariables]; + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + double factor = static_cast(numOfSubsets) * (1.0 - averageHatDiags); + if( averageHatDiags > 1.0 ){ + factor= 0.0; + }else if( averageHatDiags < 0.0 ){ + factor = static_cast(numOfSubsets); + } + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const std::complex U_x = resp[index][0]; + const std::complex U_y = resp[index][1]; + const std::complex resp0 = ( U_x * Tyy - U_y * Tyx ) / det; + const std::complex resp1 = ( U_y * Txx - U_x * Txy ) / det; + pseudoResp0[iSubset][iOut] = respOrg[index][0] + factor * (respOrg[index][0] - resp0); + pseudoResp1[iSubset][iOut] = respOrg[index][1] + factor * (respOrg[index][1] - resp1); + } + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + + // Delete arrays + delete [] hatDiagonals; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] ftvalForJackknife[iChan]; + } + delete [] ftvalForJackknife; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + delete [] resp[iVar]; + } + delete [] resp; + delete [] variancesWithoutScale; + delete [] covariancesLowerTriangleWithoutScale; + delete [] coherences; + + // Calculate & output error bars + for( int iOut = 0; iOut < numOfOutputVariables; ++iOut ){ + if( numOfSubsets > 2 ){ + std::complex avgResp0(0.0, 0.0); + std::complex avgResp1(0.0, 0.0); + for( int iSubset = 0; iSubset < numOfSubsets; ++iSubset ){ + avgResp0 += pseudoResp0[iSubset][iOut]; + avgResp1 += pseudoResp1[iSubset][iOut]; + } + const double factor = 1.0 / static_cast(numOfSubsets); + avgResp0 *= factor; + avgResp1 *= factor; + double variance0(0.0); + double variance1(0.0); + for( int iSubset = 0; iSubset < numOfSubsets; ++iSubset ){ + variance0 += std::norm( pseudoResp0[iSubset][iOut] - avgResp0 ); + variance1 += std::norm( pseudoResp1[iSubset][iOut] - avgResp1 ); + } + const double factor2 = factor / static_cast(2 * numOfSubsets - 4); + variance0 *= factor2; + variance1 *= factor2; + respErr[iOut][0] = sqrt(variance0); + respErr[iOut][1] = sqrt(variance1); + }else{ + respErr[iOut][0] = 1.0e10; + respErr[iOut][1] = 1.0e10; + } + } + // Release memory + for( int iSeg = 0; iSeg < numOfSubsets; ++iSeg ){ + delete [] pseudoResp0[iSeg]; + delete [] pseudoResp1[iSeg]; + } + delete [] pseudoResp0; + delete [] pseudoResp1; + + +} + +// Estimate error by a parametric approach +void AnalysisMultivariateRegression::estimateErrorParametric(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftval, std::complex** respOrg, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, double** respErr) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Estimate errors by a parametric approach"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + + const Control* const ptrControl = Control::getInstance(); + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfOutputAndInputVariables = numOfOutputVariables + numOfInputVariables; + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + + if (numSegmentsTotal <= 2) { + for (int iOut = 0; iOut < numOfOutputVariables; ++iOut) { + respErr[iOut][0] = 1.0e10; + respErr[iOut][1] = 1.0e10; + } + return; + } + + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + std::complex** complexResidualsOrg = new std::complex*[numOfOutputAndInputVariables]; + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + complexResidualsOrg[iVar] = new std::complex[numSegmentsTotal]; + } + // Calculate complex residuals + calculateComplexResiduals(numSegmentsTotal, ftval, respOrg, complexResidualsOrg); + double* MDOrg = new double[numSegmentsTotal]; + // Calculate Mahalanobis distance + calculateMD(numSegmentsTotal, numOfOutputAndInputVariables, complexResidualsOrg, variancesWithoutScaleOrg, + covariancesLowerTriangleWithoutScaleOrg, MDOrg); + double* numerators = new double[numOfOutputAndInputVariables]; + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + double numerator(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double val = MDOrg[iSeg] / scaleOrg; + const double influenceFunction = RobustWeightTukeysBiweights::calculateWeights(val, paramC) * val; + numerator += pow(influenceFunction, 2); + } + numerator /= static_cast(numSegmentsTotal - 2); + numerator *= pow(scaleOrg, 2) * variancesWithoutScaleOrg[iVar];// Multiply robust estimate of variance + numerators[iVar] = numerator; + } + double sumOfSecondDerivativeOfLossFunction(0.0); + double BrxBrx(0.0); + double BryBry(0.0); + std::complex BrxBry(0.0, 0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double val = MDOrg[iSeg] / scaleOrg; + sumOfSecondDerivativeOfLossFunction += RobustWeightTukeysBiweights::calculateSecondDerivativeOfLossFunction(val, paramC); + BrxBrx += std::norm(ftval[rr0][iSeg]); + BryBry += std::norm(ftval[rr1][iSeg]); + BrxBry += std::conj(ftval[rr0][iSeg]) * ftval[rr1][iSeg]; + } + double determinantOfBrBr = BrxBrx * BryBry - std::norm(BrxBry); + if (determinantOfBrBr < 1.0e-10) { + determinantOfBrBr = 1.0e-10; + } + double denominator = pow( sumOfSecondDerivativeOfLossFunction / static_cast(numSegmentsTotal), 2 ); + if (denominator < 1.0e-10) { + denominator = 1.0e-10; + } + double** istfErr = new double* [numOfOutputAndInputVariables]; + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + istfErr[iVar] = new double[2]; + istfErr[iVar][0] = sqrt( numerators[iVar] / denominator * BryBry / determinantOfBrBr); + istfErr[iVar][1] = sqrt( numerators[iVar] / denominator * BrxBrx / determinantOfBrBr); + } + delete[] numerators; + + const std::complex czero = std::complex(0.0, 0.0); + assert(numOfInputVariables == 2); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const std::complex Txx = respOrg[in0][0]; + const std::complex Txy = respOrg[in0][1]; + const std::complex Tyx = respOrg[in1][0]; + const std::complex Tyy = respOrg[in1][1]; + std::complex TMatrix[2][2] = { Txx, Txy, Tyx, Tyy }; +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < numOfInputVariables; ++row) { + for (int col = 0; col < numOfReferenceVariables; ++col) { + std::cout << TMatrix[row][col].real() << "+" << TMatrix[row][col].imag() << "im "; + } + if (row + 1 < numOfInputVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + const std::complex det = TMatrix[0][0] * TMatrix[1][1] - TMatrix[1][0] * TMatrix[0][1]; + const std::complex TInvMatrix[2][2] = { TMatrix[1][1] / det, -TMatrix[0][1] / det, -TMatrix[1][0] / det, TMatrix[0][0] / det }; + const std::complex TInvTMatrix[2][2] = { TInvMatrix[0][0], TInvMatrix[1][0], TInvMatrix[0][1], TInvMatrix[1][1] }; +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < numOfReferenceVariables; ++row) { + for (int col = 0; col < numOfInputVariables; ++col) { + std::cout << TInvTMatrix[row][col].real() << "+" << TInvTMatrix[row][col].imag() << "im "; + } + if (row + 1 < numOfReferenceVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::complex** TInvTTInvMatrix = new std::complex*[numOfInputVariables * numOfReferenceVariables]; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + TInvTTInvMatrix[irow] = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + TInvTTInvMatrix[irow][icol] = czero;// Zero clear + } + } + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + for (int icol = 0; icol < numOfInputVariables; ++icol) { + const std::complex factor = TInvTMatrix[irow][icol]; + for (int irow2 = 0; irow2 < numOfReferenceVariables; ++irow2) { + for (int icol2 = 0; icol2 < numOfInputVariables; ++icol2) { + const int irowOut = irow2 + irow * numOfReferenceVariables; + const int icolOut = icol2 + icol * numOfInputVariables; + TInvTTInvMatrix[irowOut][icolOut] = factor * TInvMatrix[irow2][icol2]; + } + } + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row) { + for (int col = 0; col < numOfInputVariables * numOfReferenceVariables; ++col) { + std::cout << TInvTTInvMatrix[row][col].real() << "+" << TInvTTInvMatrix[row][col].imag() << "im "; + } + if (row + 1 < numOfInputVariables * numOfReferenceVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + + for (int iOut = 0; iOut < numOfOutputVariables; ++iOut) { + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + std::complex UMatrix[2] = { respOrg[out][0], respOrg[out][1] }; +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int col = 0; col < numOfReferenceVariables; ++col) { + std::cout << UMatrix[col].real() << "+" << UMatrix[col].imag() << "im "; + } + std::cout << "]" << std::endl; +#endif + std::complex** IUMatrix = new std::complex*[numOfInputVariables]; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + IUMatrix[irow] = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + IUMatrix[irow][icol] = czero;// Zero clear + } + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < numOfInputVariables; ++icol) { + const double factor = irow == icol ? 1.0 : 0.0; + for (int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2) { + const int irowOut = irow; + const int icolOut = icol2 + icol * numOfReferenceVariables; + IUMatrix[irowOut][icolOut] = factor * UMatrix[icol2]; + } + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < numOfInputVariables; ++row) { + for (int col = 0; col < numOfInputVariables * numOfReferenceVariables; ++col) { + std::cout << IUMatrix[row][col].real() << "+" << IUMatrix[row][col].imag() << "im "; + } + if (row + 1 < numOfInputVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::complex** IUTInvTTInvMatrix = new std::complex*[numOfInputVariables]; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + IUTInvTTInvMatrix[irow] = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + IUTInvTTInvMatrix[irow][icol] = czero;// Zero clear + } + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + std::complex value = czero; + for (int i = 0; i < numOfInputVariables * numOfReferenceVariables; ++i) { + value += IUMatrix[irow][i] * TInvTTInvMatrix[i][icol]; + } + IUTInvTTInvMatrix[irow][icol] = value; + } + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + delete[] IUMatrix[irow]; + } + delete[] IUMatrix; +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < numOfInputVariables; ++row) { + for (int col = 0; col < numOfInputVariables * numOfReferenceVariables; ++col) { + std::cout << IUTInvTTInvMatrix[row][col].real() << "+" << IUTInvTTInvMatrix[row][col].imag() << "im "; + } + if (row + 1 < numOfInputVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::vector< std::complex > delta[2]; + const std::complex imaginaryUnit = std::complex(0.0, 1.0); + for (int i = 0; i < numOfInputVariables; ++i) { + for (int row = 0; row < numOfInputVariables; ++row) { + delta[i].push_back(TInvTMatrix[i][row] * istfErr[out][row]); + delta[i].push_back(TInvTMatrix[i][row] * istfErr[out][row] * imaginaryUnit); + } + for (int row = 0; row < numOfInputVariables; ++row) { + const int in = ptrControl->getChannelIndex(CommonParameters::INPUT, row); + for (int col = 0; col < numOfReferenceVariables; ++col) { + const int index = numOfInputVariables * col + row; + delta[i].push_back( - IUTInvTTInvMatrix[i][index] * istfErr[in][col]); + delta[i].push_back( - IUTInvTTInvMatrix[i][index] * istfErr[in][col] * imaginaryUnit); + } + } + } +#ifdef _DEBUG_WRITE + const std::complex Ux = respOrg[out][0]; + const std::complex Uy = respOrg[out][1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + const std::complex resp0 = (Ux * Tyy - Uy * Tyx) / det; + const std::complex resp1 = (Uy * Txx - Ux * Txy) / det; + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < numOfReferenceVariables; ++j) { + for (int isign = 0; isign < 2; ++isign){ + std::complex** respMod = new std::complex*[numOfOutputAndInputVariables]; + for (int i2 = 0; i2 < numOfOutputAndInputVariables; ++i2) { + respMod[i2] = new std::complex[numOfReferenceVariables]; + for (int j2 = 0; j2 < numOfReferenceVariables; ++j2) { + respMod[i2][j2] = respOrg[i2][j2]; + } + } + const double deltaRatio = 0.001; + double deltaValue(0.0); + int index = i; + if (i == 1) { + index = in0; + } + else if (i == 2) { + index = in1; + } + if (isign == 0) { + deltaValue = respOrg[index][j].real() * deltaRatio; + respMod[index][j] += deltaValue; + } + else { + deltaValue = respOrg[index][j].imag() * deltaRatio; + respMod[index][j] += imaginaryUnit * deltaValue; + } + // Slighty modify + const std::complex UxMod = respMod[out][0]; + const std::complex UyMod = respMod[out][1]; + const std::complex TxxMod = respMod[in0][0]; + const std::complex TxyMod = respMod[in0][1]; + const std::complex TyxMod = respMod[in1][0]; + const std::complex TyyMod = respMod[in1][1]; + const std::complex detMod = TxxMod * TyyMod - TxyMod * TyxMod; + const std::complex resp0Mod = (UxMod * TyyMod - UyMod * TyxMod) / detMod; + const std::complex resp1Mod = (UyMod * TxxMod - UxMod * TxyMod) / detMod; + // Calculate derivative + std::complex derivative0(0.0, 0.0); + std::complex derivative1(0.0, 0.0); + derivative0 = (resp0Mod - resp0) / deltaValue; + derivative1 = (resp1Mod - resp1) / deltaValue; + std::cout << i << " " << j << " " << isign + << " " << derivative0.real() << " " << derivative0.imag() + << " " << derivative1.real() << " " << derivative1.imag() << std::endl; + for (int i2 = 0; i2 < numOfOutputAndInputVariables; ++i2) { + delete[] respMod[i2]; + } + delete[] respMod; + } + } + } + +#endif + for (int irow = 0; irow < numOfInputVariables; ++irow) { + delete[] IUTInvTTInvMatrix[irow]; + } + delete[] IUTInvTTInvMatrix; + for (int i = 0; i < numOfInputVariables; ++i) { + double squareSumReal(0.0); + double squareSumImag(0.0); + for (std::vector< std::complex >::const_iterator itr = delta[i].begin(); itr != delta[i].end(); ++itr) { + squareSumReal += pow(itr->real(), 2); + squareSumImag += pow(itr->imag(), 2); + } + respErr[out][i] = sqrt(squareSumReal); + } + } + + // Release memory + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + delete[] complexResidualsOrg[iVar]; + } + delete[] complexResidualsOrg; + delete[] MDOrg; + for (int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar) { + delete[] istfErr[iVar]; + } + delete[] istfErr; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + delete[] TInvTTInvMatrix[irow]; + } + delete[] TInvTTInvMatrix; + +} + +// Get value of covariance matrix +double AnalysisMultivariateRegression::getValueOfCovarianceMatrix(const int dimension, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const int row, const int col) const { + + if (row > col) + { + // Lower triangle part + const int index = row - col - 1 + dimension * (dimension - 1) / 2 - (dimension - col) * (dimension - col - 1) / 2; + return covariancesLowerTriangleWithoutScaleOrg[index]; + } + else if(row < col) { + // Upper triangle part + const int index = col - row - 1 + dimension * (dimension - 1) / 2 - (dimension - row) * (dimension - row - 1) / 2; + return covariancesLowerTriangleWithoutScaleOrg[index]; + } + else + { + // Diagonal components + return variancesWithoutScaleOrg[row]; + } + +} + +// Write residuals +void AnalysisMultivariateRegression::writeResiduals( const std::string& fileName, const int numSegmentsTotal, + const int numOfOutputAndInputVariables, const std::vector< std::pair >& times, + std::complex** complexResiduals, const double* const MD, const double* const weights ) const{ + + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileName ); + } + ofs << "index"; + ofs << ",start_time,end_time"; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + ofs << ",residual_real_var_" << iVar; + ofs << ",residual_imag_var_" << iVar; + } + ofs << ",MD"; + ofs << ",weight"; + ofs << std::endl; + int index(0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg, ++index ){ + ofs << index; + const std::string timeStart = times[iSeg].first; + const std::string timeEnd = times[iSeg].second; + ofs << "," << timeStart << "," << timeEnd; + for( int iVar = 0; iVar < numOfOutputAndInputVariables; ++iVar ){ + ofs << "," << std::setprecision(10) << std::scientific << complexResiduals[iVar][iSeg].real(); + ofs << "," << std::setprecision(10) << std::scientific << complexResiduals[iVar][iSeg].imag(); + } + ofs << "," << std::setprecision(10) << std::scientific << MD[iSeg]; + ofs << "," << std::setprecision(10) << std::scientific << weights[iSeg]; + ofs << std::endl; + } + ofs.close(); + +} diff --git a/src/AnalysisMultivariateRegression.h b/src/AnalysisMultivariateRegression.h new file mode 100644 index 0000000..c6773aa --- /dev/null +++ b/src/AnalysisMultivariateRegression.h @@ -0,0 +1,161 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ANALYSIS_MULTIVARIATE_REGRESSION +#define DBLDEF_ANALYSIS_MULTIVARIATE_REGRESSION + +#include "Analysis.h" + +#include +#include + +// Class of analysis using multivariate regression +class AnalysisMultivariateRegression : public Analysis { + +public: + + // Default constructer + AnalysisMultivariateRegression(); + + // Destructer + virtual ~AnalysisMultivariateRegression(); + +private: + + // Number of input and output variables + int m_numOfOutputAndInputVariables; + + // Response functions between output/input variables and reference variables + std::vector< std::complex >** m_responseFunctions; + + // Frequencies + std::vector m_frequencies; + + // Calculate complex residuals + void calculateComplexResiduals( const int numSegmentsTotal, std::complex** ftval, + std::complex** resp, std::complex** complexResiduals ) const; + + // Calculate partial derivatives of responses for robust bootstrap + void calculatePartialDerivativesOfResponses( const int numSegments, const double paramC, + std::complex** ftval, std::complex** resp, const double* const variancesWithoutScale, const double scale, + std::complex** complexResiduals, const double* const MD, const double* const weights, + double** derivativesRegardingResps, double** derivativesRegardingVariancesWithoutScale, double* derivativesRegardingScale ) const; + + // Calculate partial derivatives of scale + void calculatePartialDerivativesOfScale( const int numSegments, const double paramB, const double paramC, + std::complex** ftval, std::complex** resp, const double* const variancesWithoutScale, const double scale, + std::complex** complexResiduals, const double* const MD, const double* const weights, + double* derivativesRegardingResps, double* derivativesRegardingVariancesWithoutScale, double& derivativesRegardingScale ) const; + + // Calculate partial derivatives of variances without scale for robust bootstrap + void calculatePartialDerivativesOfVariancesWithoutScale( const int numSegments, const double paramC, + std::complex** ftval, std::complex** resp, const double* const variancesWithoutScale, const double scale, const double determinant, + std::complex** complexResiduals, const double* const MD, const double* const weights, + double** derivativesRegardingResps, double** derivativesRegardingVariancesWithoutScale, double* derivativesRegardingScale ) const; + + // Calculate response functions + virtual void calculateResponseFunctions( const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ); + + // Calculate response functions from two samples + bool calculateResponseFunctionsFromTwoSamples( + const std::complex& out1,const std::complex& x1, const std::complex& y1, + const std::complex& out2, const std::complex& x2, const std::complex& y2, + std::complex& resp1, std::complex& resp2 ) const; + + // Calculate a vector for partial derivatives + void calculateVectorForPartialDerivatives( const int iSeg, std::complex** ftval, + const double* const variancesWithoutScale, std::complex** complexResiduals, + std::complex** hSigmaMatrix, double* vector ) const; + + // Determine candidates + void determineCandidates( const double freq, const int numSegmentsTotal, std::complex** ftval, + const std::vector< std::pair >& times, std::vector< std::pair >& candidatesOfPairs, + std::vector< std::complex** >& resp ) const; + + // Determine candidates for later frequencies + void determineCandidatesForLaterFrequencies( const double freq, const int numSegmentsTotal, std::vector< std::complex** >& resp ) const; + + // Determine candidates by random sampling + void determineCandidatesByRandomSampling( const double freq, const int numSegmentsTotal, std::complex** ftval, + const std::vector< std::pair >& times, std::vector< std::pair >& candidatesOfPairs, + std::vector< std::complex** >& resp ) const; + + // Improve candidate by I-steps + void improveCandidate( const int numSegmentsTotal, const int numOfMaxIterations, + const double convergenceCriteria, const bool initialCalculation, const double paramB, const double paramC, + std::complex** ftval, std::complex** resp, double* variancesWithoutScale, double& scale, double& determinant, + double* coherencesMin, double* covariancesLowerTriangleWithoutScale) const; + + // Calculate Mahalanobis distances + void calculateMD(const int numSegmentsTotal, const int numOfOutputAndInputVariables, std::complex** complexResiduals, + const double* const variancesWithoutScale, double* MD) const; + + // Estimate error by fixed-weights bootstrap + void calculateMD(const int numSegmentsTotal, const int numOfOutputAndInputVariables, std::complex** complexResiduals, + const double* const variancesWithoutScale, const double* const covariancesLowerTriangleWithoutScale, double* MD) const; + // Estimate error by robust bootstrap + void estimateErrorByRobustBootstrap(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftval, std::complex** respOrg, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, const double determinantOrg, + double** respErr) const; + + // Estimate error by strict bootstrap + void estimateErrorByStrictBootstrap(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftvalOrg, std::complex** respOrg, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, const double determinantOrg, double** respErr) const; + + // Estimate error by fixed-weights jackknife + void estimateErrorByFixedWeightsJackknife(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftvalOrg, const std::complex* const respOrg0, const std::complex* const respOrg1, + std::complex** respOrg, const double* const variancesWithoutScaleOrg, const double* const covariancesLowerTriangleWithoutScaleOrg, + const double scaleOrg, double** respErr) const; + + // Estimate error by subset deletion jackknife + void estimateErrorBySubsetDeletionJackknife(const int numSegmentsTotal, std::complex** ftvalOrg, std::complex** respOrg, + const double* const variancesWithoutScaleOrg, const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, + const double determinantOrg, double** respErr) const; + + // Estimate error by a parametric approach + void estimateErrorParametric(const int numSegmentsTotal, const double paramB, const double paramC, + std::complex** ftval, std::complex** respOrg, const double* const variancesWithoutScaleOrg, + const double* const covariancesLowerTriangleWithoutScaleOrg, const double scaleOrg, double** respErr) const; + + // Get value of covariance matrix + double getValueOfCovarianceMatrix(const int dimension, const double* const variancesWithoutScaleOrg, const double* const covariancesLowerTriangleWithoutScaleOrg, + const int row, const int col) const; + + // Write residuals + void writeResiduals( const std::string& fileName, const int numSegmentsTotal, const int numOfOutputAndInputVariables, + const std::vector< std::pair >& times, std::complex** complexResiduals, + const double* const MD, const double* const weights ) const; + +}; + +#endif diff --git a/src/AnalysisOrdinaryRemoteReference.cpp b/src/AnalysisOrdinaryRemoteReference.cpp new file mode 100644 index 0000000..3d22835 --- /dev/null +++ b/src/AnalysisOrdinaryRemoteReference.cpp @@ -0,0 +1,2263 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "AnalysisOrdinaryRemoteReference.h" +#include "Control.h" +#include "OutputFiles.h" +#include "DoubleDenseSquareMatrix.h" +#include +#include +#include +#include +#include +#ifdef _MERSENNE_TWISTER_ORIGINAL +#else +#include +#endif + +#include "Util.h" + +#ifdef _MERSENNE_TWISTER_ORIGINAL +#include "mt64.h" +#endif + +// Default constructer +AnalysisOrdinaryRemoteReference::AnalysisOrdinaryRemoteReference() +{ +} + +// Destructer +AnalysisOrdinaryRemoteReference::~AnalysisOrdinaryRemoteReference() +{ +} + +// Calculate partial derivatives of responses for robust bootstrap +void AnalysisOrdinaryRemoteReference::calculatePartialDerivativesOfResponses(const int numSegments, const double threshould, + std::complex** ftval, const std::complex resp0, const std::complex resp1, const double scale, + const std::complex* const residuals, const double* const weights, const int iOut, double** derivativesRegardingResps, + double* derivativesRegardingScale) const { + + const std::complex resp[2] = {resp0, resp1}; + + const Control* const ptrControl = Control::getInstance(); + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + assert(numOfInputVariables == 2); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + const std::complex czero = std::complex(0.0, 0.0); + + std::complex PMatrix[2][2] = { czero, czero, czero, czero }; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + PMatrix[0][0] += ftval[in0][iSeg] * std::conj(ftval[rr0][iSeg]) * weights[iSeg]; + PMatrix[1][0] += ftval[in1][iSeg] * std::conj(ftval[rr0][iSeg]) * weights[iSeg]; + PMatrix[0][1] += ftval[in0][iSeg] * std::conj(ftval[rr1][iSeg]) * weights[iSeg]; + PMatrix[1][1] += ftval[in1][iSeg] * std::conj(ftval[rr1][iSeg]) * weights[iSeg]; + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < numOfInputVariables; ++row) { + for (int col = 0; col < numOfReferenceVariables; ++col) { + std::cout << PMatrix[row][col].real() << "+" << PMatrix[row][col].imag() << "im "; + } + if (row + 1 < numOfInputVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + const std::complex det = PMatrix[0][0] * PMatrix[1][1] - PMatrix[1][0] * PMatrix[0][1]; + const std::complex PInvMatrix[2][2] = { PMatrix[1][1] / det, -PMatrix[0][1] / det, -PMatrix[1][0] / det, PMatrix[0][0] / det }; + const std::complex PInvTMatrix[2][2] = { PInvMatrix[0][0], PInvMatrix[1][0], PInvMatrix[0][1], PInvMatrix[1][1] }; + std::complex PInvTIMatrix[2][2] = { czero, czero, czero, czero }; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < numOfReferenceVariables; ++icol) { + // PInvTIMatrix = PInvTMatrix because Iqxq = 1 + PInvTIMatrix[irow][icol] = PInvTMatrix[irow][icol]; + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + for( int col = 0; col < numOfReferenceVariables; ++col ){ + std::cout << PInvTIMatrix[row][col].real() << "+" << PInvTIMatrix[row][col].imag() <<"im "; + } + if( row+1 < numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::complex** PInvTPInvMatrix = new std::complex*[numOfInputVariables * numOfReferenceVariables]; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + PInvTPInvMatrix[irow] = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + PInvTPInvMatrix[irow][icol] = czero;// Zero clear + } + } + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + for (int icol = 0; icol < numOfInputVariables; ++icol) { + const std::complex factor = PInvTMatrix[irow][icol]; + for (int irow2 = 0; irow2 < numOfReferenceVariables; ++irow2) { + for (int icol2 = 0; icol2 < numOfInputVariables; ++icol2) { + const int irowOut = irow2 + irow * numOfReferenceVariables; + const int icolOut = icol2 + icol * numOfInputVariables; + PInvTPInvMatrix[irowOut][icolOut] = factor * PInvMatrix[irow2][icol2]; + } + } + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + for( int col = 0; col < numOfInputVariables * numOfReferenceVariables; ++col ){ + std::cout << PInvTPInvMatrix[row][col].real() << "+" << PInvTPInvMatrix[row][col].imag() <<"im "; + } + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::complex QMatrix[2] = { czero, czero }; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + QMatrix[0] += ftval[out][iSeg] * std::conj(ftval[rr0][iSeg]) * weights[iSeg]; + QMatrix[1] += ftval[out][iSeg] * std::conj(ftval[rr1][iSeg]) * weights[iSeg]; + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int col = 0; col < numOfReferenceVariables; ++col ){ + std::cout << QMatrix[col].real() << "+" << QMatrix[col].imag() <<"im "; + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int col = 0; col < numOfReferenceVariables; ++col ){ + std::cout << resp[col].real() << "+" << resp[col].imag() <<"im "; + } + std::cout << "]" << std::endl; +#endif + std::complex** IQMatrix = new std::complex*[numOfInputVariables]; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + IQMatrix[irow] = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + IQMatrix[irow][icol] = czero;// Zero clear + } + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < numOfInputVariables; ++icol) { + const double factor = irow == icol ? 1.0 : 0.0; + for (int icol2 = 0; icol2 < numOfReferenceVariables; ++icol2) { + const int irowOut = irow; + const int icolOut = icol2 + icol * numOfReferenceVariables; + IQMatrix[irowOut][icolOut] = factor * QMatrix[icol2]; + } + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfInputVariables; ++row ){ + for( int col = 0; col < numOfInputVariables * numOfReferenceVariables; ++col ){ + std::cout << IQMatrix[row][col].real() << "+" << IQMatrix[row][col].imag() <<"im "; + } + if( row+1 < numOfInputVariables){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::complex** IQPInvTPInvMatrix = new std::complex*[numOfInputVariables]; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + IQPInvTPInvMatrix[irow] = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + IQPInvTPInvMatrix[irow][icol] = czero;// Zero clear + } + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < numOfInputVariables * numOfReferenceVariables; ++icol) { + std::complex value = czero; + for (int i = 0; i < numOfInputVariables * numOfReferenceVariables; ++i) { + value += IQMatrix[irow][i] * PInvTPInvMatrix[i][icol]; + } + IQPInvTPInvMatrix[irow][icol] = value; + } + } +#ifdef _DEBUG_WRITE +#else + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + delete[] PInvTPInvMatrix[irow]; + } + delete[] PInvTPInvMatrix; +#endif + for (int irow = 0; irow < numOfInputVariables; ++irow) { + delete[] IQMatrix[irow]; + } + delete[] IQMatrix; +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfInputVariables; ++row ){ + for( int col = 0; col < numOfInputVariables * numOfReferenceVariables; ++col ){ + std::cout << IQPInvTPInvMatrix[row][col].real() << "+" << IQPInvTPInvMatrix[row][col].imag() <<"im "; + } + if( row+1 < numOfInputVariables){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + std::complex** matrixVeceh1 = new std::complex*[numOfReferenceVariables]; + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + matrixVeceh1[irow] = new std::complex[2 * numOfInputVariables]; + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + matrixVeceh1[irow][icol] = czero;// Zero clear + } + } + std::complex** matrixVechh1 = new std::complex*[numOfInputVariables * numOfReferenceVariables]; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + matrixVechh1[irow] = new std::complex[2 * numOfInputVariables]; + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + matrixVechh1[irow][icol] = czero;// Zero clear + } + } + std::complex* veceh = new std::complex[numOfReferenceVariables]; + std::complex* vechh = new std::complex[numOfInputVariables * numOfReferenceVariables]; + std::complex* hSigmaMatrix = new std::complex[numOfInputVariables]; + double* vecSigma = new double[2 * numOfInputVariables]; + std::complex* sumVeceh3 = new std::complex[numOfReferenceVariables]; + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + sumVeceh3[irow] = czero;// Zero clear + } + std::complex* sumVechh3 = new std::complex[numOfInputVariables * numOfReferenceVariables]; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + sumVechh3[irow] = czero;// Zero clear + } +#ifdef _DEBUG_WRITE + std::cout << "["; +#endif + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double val = std::abs(residuals[iSeg]) / scale; + const double diff = RobustWeightTukeysBiweights::calculateSecondDerivativeOfLossFunction(val, threshould) - RobustWeightTukeysBiweights::calculateWeights(val, threshould); + double factor1(0.0); + if (std::norm(residuals[iSeg]) < CommonParameters::EPS) { + const double sc = scale * threshould; + factor1 = 4.0 * ( std::norm(residuals[iSeg]) / pow(sc, 4) - 1.0 / pow(sc, 2) ); + } + else { + factor1 = diff / std::norm(residuals[iSeg]); + } + const double factor2 = diff / scale; + for (int irr = 0; irr < numOfReferenceVariables; ++irr) { + const int rr = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, irr); + veceh[irr] = ftval[out][iSeg] * std::conj(ftval[rr][iSeg]) * factor1; + sumVeceh3[irr] += ftval[out][iSeg] * std::conj(ftval[rr][iSeg]) * factor2; + } + for (int irr = 0; irr < numOfReferenceVariables; ++irr) { + const int offset = numOfInputVariables * irr; + const int rr = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, irr); + for (int iInp = 0; iInp < numOfInputVariables; ++iInp) { + const int index = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + vechh[iInp + offset] = ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor1; + sumVechh3[iInp + offset] += ftval[index][iSeg] * std::conj(ftval[rr][iSeg]) * factor2; + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + std::cout << veceh[row].real() << "+" << veceh[row].imag() <<"im "; + if( row+1 < numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + std::cout << vechh[row].real() << "+" << vechh[row].imag() <<"im "; + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif + calculateVectorForPartialDerivatives(iSeg, ftval, residuals, hSigmaMatrix, vecSigma); + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + matrixVeceh1[irow][icol] += veceh[irow] * vecSigma[icol]; + } + } + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + matrixVechh1[irow][icol] += vechh[irow] * vecSigma[icol]; + } + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + std::cout << matrixVeceh1[row][col].real() << "+" << matrixVeceh1[row][col].imag() <<"im "; + } + if( row+1 < numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + std::cout << matrixVechh1[row][col].real() << "+" << matrixVechh1[row][col].imag() <<"im "; + } + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + } +#ifdef _DEBUG_WRITE + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + std::cout << sumVeceh3[row].real() << "+" << sumVeceh3[row].imag() <<"im "; + if( row+1 < numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + std::cout << sumVechh3[row].real() << "+" << sumVechh3[row].imag() <<"im "; + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + const int iq = col / ( 2 * numOfInputVariables); + const int isign = ( col / numOfInputVariables) % 2; + const int index = 2 * ( col % numOfInputVariables) + isign + 2 * numOfInputVariables * iq; + std::cout << -matrixVeceh1[row][index].real() << "+" << -matrixVeceh1[row][index].imag() <<"im "; + } + if( row+1 < numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + const int iq = col / ( 2 * numOfInputVariables); + const int isign = ( col / numOfInputVariables) % 2; + const int index = 2 * ( col % numOfInputVariables) + isign + 2 * numOfInputVariables * iq; + std::cout << -matrixVechh1[row][index].real() << "+" << -matrixVechh1[row][index].imag() <<"im "; + } + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow ){ + for( int icol = 0; icol < 2 * numOfInputVariables; ++icol ){ + std::complex value = czero; + const int iq = icol / ( 2 * numOfInputVariables); + const int isign = ( icol / numOfInputVariables) % 2; + const int index = 2 * ( icol % numOfInputVariables) + isign + 2 * numOfInputVariables * iq; + for( int i = 0; i < numOfInputVariables * numOfReferenceVariables; ++i ){ + value += PInvTPInvMatrix[irow][i] * matrixVechh1[i][index]; + } + std::cout << value.real() << "+" << value.imag() <<"im "; + } + if( irow+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + for( int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow ){ + delete [] PInvTPInvMatrix[irow]; + } + delete [] PInvTPInvMatrix; +#endif + delete[] veceh; + delete[] vechh; + delete[] hSigmaMatrix; + delete[] vecSigma; + + // Partial derivatives regarding responses + std::complex** complexDerivatives = new std::complex*[numOfInputVariables]; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + complexDerivatives[irow] = new std::complex[2 * numOfInputVariables]; + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + std::complex value = czero; + // The 1st term + for (int i = 0; i < numOfReferenceVariables; ++i) { + value -= PInvTIMatrix[irow][i] * matrixVeceh1[i][icol]; + } + // The 2nd term + for (int i = 0; i < numOfInputVariables * numOfReferenceVariables; ++i) { + value += IQPInvTPInvMatrix[irow][i] * matrixVechh1[i][icol]; + } + complexDerivatives[irow][icol] = value; + } + } + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + delete[] matrixVeceh1[irow]; + } + delete[] matrixVeceh1; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + delete[] matrixVechh1[irow]; + } + delete[] matrixVechh1; +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables; ++col ){ + std::cout << complexDerivatives[row][col].real() << "+" << complexDerivatives[row][col].imag() <<"im "; + } + if( row+1 < numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; +#endif + + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12) + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + const int ir = irow; + const int index = 2 * ir; + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + if (icol < numOfInputVariables) { + // Real part + const int ir2 = icol; + const int index2 = 2 * ir2; + derivativesRegardingResps[index][index2] = complexDerivatives[irow][icol].real(); + derivativesRegardingResps[index + 1][index2] = complexDerivatives[irow][icol].imag(); + } + else { + // Imaginary part + const int ir2 = icol - numOfInputVariables; + const int index2 = 2 * ir2 + 1; + derivativesRegardingResps[index][index2] = complexDerivatives[irow][icol].real(); + derivativesRegardingResps[index + 1][index2] = complexDerivatives[irow][icol].imag(); + } + } + } +#ifdef _DEBUG_WRITE + std::cout << "drr1" << std::endl; + std::cout << "["; + for (int row = 0; row < 2 * numOfInputVariables; ++row) { + for (int col = 0; col < 2 * numOfInputVariables; ++col) { + std::cout << derivativesRegardingResps[row][col] << " "; + } + if (row + 1 < 2 * numOfInputVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::complex** derivP1 = new std::complex*[numOfInputVariables * numOfReferenceVariables]; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + derivP1[irow] = new std::complex[2 * numOfInputVariables]; + } + std::complex** derivInvP1 = new std::complex*[numOfInputVariables * numOfReferenceVariables]; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + derivInvP1[irow] = new std::complex[2 * numOfInputVariables]; + } + std::complex** derivQ1 = new std::complex*[numOfReferenceVariables]; + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + derivQ1[irow] = new std::complex[2 * numOfInputVariables]; + } + double** derivResp1 = new double* [2 * numOfInputVariables]; + for (int irow = 0; irow < 2 * numOfInputVariables; ++irow) { + derivResp1[irow] = new double[2 * numOfInputVariables]; + } + for (int icol = 0; icol < numOfInputVariables; ++icol) { + for (int isign = 0; isign < 2; ++isign) { + std::complex* residualsOrg = new std::complex[numSegments]; + double* weightsOrg = new double[numSegments]; + std::complex* respOrg = new std::complex[numOfInputVariables]; + std::complex* residualsMod = new std::complex[numSegments]; + double* weightsMod = new double[numSegments]; + std::complex* respMod = new std::complex[numOfInputVariables]; + for (int icol2 = 0; icol2 < numOfInputVariables; ++icol2) { + respOrg[icol2] = resp[icol2]; + respMod[icol2] = resp[icol2]; + } + double dresp(0.0); + if (isign == 0) { + dresp = resp[icol].real() * 0.00001; + respMod[icol] += std::complex(dresp, 0.0); + } + else { + dresp = resp[icol].imag() * 0.00001; + respMod[icol] += std::complex(0.0, dresp); + } + // Calculate complex residuals + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const std::complex outSyn = respOrg[0] * ftval[in0][iSeg] + respOrg[1] * ftval[in1][iSeg]; + residualsOrg[iSeg] = ftval[out][iSeg] - outSyn; + } + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const std::complex outSyn = respMod[0] * ftval[in0][iSeg] + respMod[1] * ftval[in1][iSeg]; + residualsMod[iSeg] = ftval[out][iSeg] - outSyn; + } + const int index = 2 * icol + isign; + // Calculate original weights + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double x = std::abs(residualsOrg[iSeg]) / scale; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(x, threshould); + } + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double x = std::abs(residualsMod[iSeg]) / scale; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(x, threshould); + } + std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + PMatrixOrg[0][0] += ftval[in0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][0] += ftval[in1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[0][1] += ftval[in0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][1] += ftval[in1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + } + std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + PMatrixMod[0][0] += ftval[in0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][0] += ftval[in1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[0][1] += ftval[in0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][1] += ftval[in1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + } + derivP1[0][index] = (PMatrixMod[0][0] - PMatrixOrg[0][0]) / dresp; + derivP1[1][index] = (PMatrixMod[1][0] - PMatrixOrg[1][0]) / dresp; + derivP1[2][index] = (PMatrixMod[0][1] - PMatrixOrg[0][1]) / dresp; + derivP1[3][index] = (PMatrixMod[1][1] - PMatrixOrg[1][1]) / dresp; + + const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1] / detOrg, -PMatrixOrg[0][1] / detOrg, -PMatrixOrg[1][0] / detOrg, PMatrixOrg[0][0] / detOrg }; + const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1] / detMod, -PMatrixMod[0][1] / detMod, -PMatrixMod[1][0] / detMod, PMatrixMod[0][0] / detMod }; + derivInvP1[0][index] = (PInvMatrixMod[0][0] - PInvMatrixOrg[0][0]) / dresp; + derivInvP1[1][index] = (PInvMatrixMod[1][0] - PInvMatrixOrg[1][0]) / dresp; + derivInvP1[2][index] = (PInvMatrixMod[0][1] - PInvMatrixOrg[0][1]) / dresp; + derivInvP1[3][index] = (PInvMatrixMod[1][1] - PInvMatrixOrg[1][1]) / dresp; + + std::complex* QMatrixOrg = new std::complex[numOfReferenceVariables]; + std::complex* QMatrixMod = new std::complex[numOfReferenceVariables]; + for (int icol = 0; icol < numOfReferenceVariables; ++icol) { + QMatrixOrg[icol] = czero; + QMatrixMod[icol] = czero; + } + for (int irr = 0; irr < numOfReferenceVariables; ++irr) { + const int rr = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, irr); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + QMatrixOrg[irr] += ftval[out][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[irr] += ftval[out][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + } + for (int irr = 0; irr < numOfReferenceVariables; ++irr) { + derivQ1[irr][index] = (QMatrixMod[irr] - QMatrixOrg[irr]) / dresp; + } + for (int icol2 = 0; icol2 < numOfInputVariables; ++icol2) { + std::complex valueOrg = czero; + std::complex valueMod = czero; + for (int i = 0; i < numOfReferenceVariables; ++i) { + valueOrg += QMatrixOrg[i] * PInvMatrixOrg[i][icol2]; + valueMod += QMatrixMod[i] * PInvMatrixMod[i][icol2]; + } + const int index2 = 2 * icol2; + derivResp1[index2 ][index] = (valueMod.real() - valueOrg.real()) / dresp; + derivResp1[index2 + 1][index] = (valueMod.imag() - valueOrg.imag()) / dresp; + } + delete[] QMatrixOrg; + delete[] QMatrixMod; + delete[] residualsOrg; + delete[] weightsOrg; + delete[] respOrg; + delete[] residualsMod; + delete[] weightsMod; + delete[] respMod; + } + } + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + std::cout << derivP1[row][col].real() << "+" << derivP1[row][col].imag() <<"im "; + } + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + std::cout << derivInvP1[row][col].real() << "+" << derivInvP1[row][col].imag() <<"im "; + } + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables; ++row ){ + for( int col = 0; col < 2 * numOfReferenceVariables; ++col ){ + std::cout << derivQ1[row][col].real() << "+" << derivQ1[row][col].imag() <<"im "; + } + if( row+1 < numOfReferenceVariables ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "drr2" << std::endl; + std::cout << "["; + for (int row = 0; row < 2 * numOfInputVariables; ++row) { + for (int col = 0; col < 2 * numOfInputVariables; ++col) { + std::cout << derivResp1[row][col] << " "; + } + if (row + 1 < 2 * numOfInputVariables) { + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + delete[] derivP1[irow]; + } + delete[] derivP1; + for (int irow = 0; irow < numOfInputVariables * numOfReferenceVariables; ++irow) { + delete[] derivInvP1[irow]; + } + delete[] derivInvP1; + for (int irow = 0; irow < numOfReferenceVariables; ++irow) { + delete[] derivQ1[irow]; + } + delete[] derivQ1; + for (int irow = 0; irow < 2 * numOfInputVariables; ++irow) { + delete[] derivResp1[irow]; + } + delete[] derivResp1; +#endif + + // Partial derivatives regarding scale + for (int irow = 0; irow < numOfInputVariables; ++irow) { + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + complexDerivatives[irow][icol] = czero;// Zero clear + } + } + for (int irowL = 0; irowL < numOfInputVariables; ++irowL) { + std::complex value = czero; + // The 1st term + for (int i = 0; i < numOfReferenceVariables; ++i) { + value -= PInvTIMatrix[irowL][i] * sumVeceh3[i]; + } + // The 2nd term + for (int i = 0; i < numOfInputVariables * numOfReferenceVariables; ++i) { + value += IQPInvTPInvMatrix[irowL][i] * sumVechh3[i]; + } + complexDerivatives[irowL][1] = value; + } + delete[] sumVeceh3; + delete[] sumVechh3; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + const int index = 2 * irow; + derivativesRegardingScale[index ] = complexDerivatives[irow][1].real(); + derivativesRegardingScale[index + 1] = complexDerivatives[irow][1].imag(); + } +#ifdef _DEBUG_WRITE + std::cout << "drs1" << std::endl; + std::cout << "["; + for (int row = 0; row < 2 * numOfInputVariables; ++row) { + std::cout << derivativesRegardingScale[row] << " "; + if (row + 1 < 2 * numOfInputVariables) { + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::complex* derivP3 = new std::complex[numOfInputVariables * numOfReferenceVariables]; + std::complex* derivInvP3 = new std::complex[numOfInputVariables * numOfReferenceVariables]; + std::complex* derivQ3 = new std::complex[numOfReferenceVariables ]; + double* derivResp3 = new double[2 * numOfInputVariables]; + { + std::complex* residualsOrg = new std::complex[numSegments]; + double* weightsOrg = new double[numSegments]; + double* weightsMod = new double[numSegments]; + const double scaleOrg = scale; + const double dscale = scale * 0.001; + const double scaleMod = scale + dscale; + // Calculate complex residuals + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const std::complex outSyn = resp[0] * ftval[in0][iSeg] + resp[1] * ftval[in1][iSeg]; + residualsOrg[iSeg] = ftval[out][iSeg] - outSyn; + } + // Calculate original weights + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double x = std::abs(residualsOrg[iSeg]) / scaleOrg; + weightsOrg[iSeg] = RobustWeightTukeysBiweights::calculateWeights(x, threshould); + } + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double x = std::abs(residualsOrg[iSeg]) / scaleMod; + weightsMod[iSeg] = RobustWeightTukeysBiweights::calculateWeights(x, threshould); + } + std::complex PMatrixOrg[2][2] = { czero, czero, czero, czero }; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + PMatrixOrg[0][0] += ftval[in0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][0] += ftval[in1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[0][1] += ftval[in0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + PMatrixOrg[1][1] += ftval[in1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsOrg[iSeg]; + } + std::complex PMatrixMod[2][2] = { czero, czero, czero, czero }; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + PMatrixMod[0][0] += ftval[in0][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][0] += ftval[in1][iSeg] * std::conj(ftval[rr0][iSeg]) * weightsMod[iSeg]; + PMatrixMod[0][1] += ftval[in0][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + PMatrixMod[1][1] += ftval[in1][iSeg] * std::conj(ftval[rr1][iSeg]) * weightsMod[iSeg]; + } + derivP3[0] = (PMatrixMod[0][0] - PMatrixOrg[0][0]) / dscale; + derivP3[1] = (PMatrixMod[1][0] - PMatrixOrg[1][0]) / dscale; + derivP3[2] = (PMatrixMod[0][1] - PMatrixOrg[0][1]) / dscale; + derivP3[3] = (PMatrixMod[1][1] - PMatrixOrg[1][1]) / dscale; + const std::complex detOrg = PMatrixOrg[0][0] * PMatrixOrg[1][1] - PMatrixOrg[1][0] * PMatrixOrg[0][1]; + const std::complex PInvMatrixOrg[2][2] = { PMatrixOrg[1][1] / detOrg, -PMatrixOrg[0][1] / detOrg, -PMatrixOrg[1][0] / detOrg, PMatrixOrg[0][0] / detOrg }; + const std::complex detMod = PMatrixMod[0][0] * PMatrixMod[1][1] - PMatrixMod[1][0] * PMatrixMod[0][1]; + const std::complex PInvMatrixMod[2][2] = { PMatrixMod[1][1] / detMod, -PMatrixMod[0][1] / detMod, -PMatrixMod[1][0] / detMod, PMatrixMod[0][0] / detMod }; + derivInvP3[0] = (PInvMatrixMod[0][0] - PInvMatrixOrg[0][0]) / dscale; + derivInvP3[1] = (PInvMatrixMod[1][0] - PInvMatrixOrg[1][0]) / dscale; + derivInvP3[2] = (PInvMatrixMod[0][1] - PInvMatrixOrg[0][1]) / dscale; + derivInvP3[3] = (PInvMatrixMod[1][1] - PInvMatrixOrg[1][1]) / dscale; + std::complex* QMatrixOrg = new std::complex[numOfReferenceVariables]; + std::complex* QMatrixMod = new std::complex[numOfReferenceVariables]; + for (int icol = 0; icol < numOfReferenceVariables; ++icol) { + QMatrixOrg[icol] = czero; + QMatrixMod[icol] = czero; + } + for (int irr = 0; irr < numOfReferenceVariables; ++irr) { + const int rr = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, irr); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + QMatrixOrg[irr] += ftval[out][iSeg] * std::conj(ftval[rr][iSeg]) * weightsOrg[iSeg]; + QMatrixMod[irr] += ftval[out][iSeg] * std::conj(ftval[rr][iSeg]) * weightsMod[iSeg]; + } + } + for (int irr = 0; irr < numOfReferenceVariables; ++irr) { + derivQ3[irr] = (QMatrixMod[irr] - QMatrixOrg[irr]) / dscale; + } + for (int icol2 = 0; icol2 < numOfInputVariables; ++icol2) { + std::complex valueOrg = czero; + std::complex valueMod = czero; + for (int i = 0; i < numOfReferenceVariables; ++i) { + valueOrg += QMatrixOrg[i] * PInvMatrixOrg[i][icol2]; + valueMod += QMatrixMod[i] * PInvMatrixMod[i][icol2]; + } + const int index2 = 2 * icol2; + derivResp3[index2 ] = (valueMod.real() - valueOrg.real()) / dscale; + derivResp3[index2 + 1] = (valueMod.imag() - valueOrg.imag()) / dscale; + } + delete[] QMatrixOrg; + delete[] QMatrixMod; + delete[] residualsOrg; + delete[] weightsOrg; + delete[] weightsMod; + } + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + std::cout << derivP3[row].real() << "+" << derivP3[row].imag() <<"im "; + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfInputVariables * numOfReferenceVariables; ++row ){ + std::cout << derivInvP3[row].real() << "+" << derivInvP3[row].imag() <<"im "; + if( row+1 < numOfInputVariables * numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < numOfReferenceVariables ; ++row ){ + std::cout << derivQ3[row].real() << "+" << derivQ3[row].imag() <<"im "; + if( row+1 < numOfReferenceVariables ){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "drs3" << std::endl; + std::cout << "["; + for (int row = 0; row < 2 * numOfInputVariables; ++row) { + std::cout << derivResp3[row] << " "; + if (row + 1 < 2 * numOfInputVariables) { + std::cout << ","; + } + } + std::cout << "]" << std::endl; + delete[] derivP3; + delete[] derivInvP3; + delete[] derivQ3; + delete[] derivResp3; +#endif + for (int irow = 0; irow < numOfInputVariables; ++irow) { + delete[] IQPInvTPInvMatrix[irow]; + } + delete[] IQPInvTPInvMatrix; + for (int irow = 0; irow < numOfInputVariables; ++irow) { + delete[] complexDerivatives[irow]; + } + delete[] complexDerivatives; +} + +// Calculate partial derivatives of scale +void AnalysisOrdinaryRemoteReference::calculatePartialDerivativesOfScale(const int numSegments, const double threshould, const double paramB, + std::complex** ftval, const std::complex resp0, const std::complex resp1, const double scale, + const std::complex* const residuals, const double* const weights, const int iOut, double* derivativesRegardingResps, + double& derivativesRegardingScale) const { + + const std::complex resp[2] = { resp0, resp1 }; + + const Control* const ptrControl = Control::getInstance(); + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + assert(numOfInputVariables == 2); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + + const std::complex czero = std::complex(0.0, 0.0); + + double* value1 = new double[2 * numOfInputVariables]; + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + value1[icol] = 0.0;// Zero clear + } + double value3(0.0); + double* vecSigma = new double[2 * numOfInputVariables]; + std::complex* hSigmaMatrix = new std::complex[numOfInputVariables]; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + calculateVectorForPartialDerivatives(iSeg, ftval, residuals, hSigmaMatrix, vecSigma); + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + double temp = vecSigma[icol]; + if (std::abs(residuals[iSeg]) < CommonParameters::EPS) { + // Nothing to do + } + else { + temp *= weights[iSeg]; + } + value1[icol] -= temp; + } + if (std::abs(residuals[iSeg]) < CommonParameters::EPS) { + // Nothing to do + } + else { + const double val = std::abs(residuals[iSeg]) / scale; + const double temp = 2.0 * pow(scale, 2) * RobustWeightTukeysBiweights::calculateLossFunction(val, threshould) + - std::norm(residuals[iSeg]) * weights[iSeg]; + value3 += temp / scale; + } + } + delete[] vecSigma; + delete[] hSigmaMatrix; +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < 2 * numOfInputVariables; ++row ){ + const int isign = row / numOfInputVariables; + const int index = 2 * ( row % numOfInputVariables ) + isign; + std::cout << value1[index] <<" "; + if( row+1 < 2 * numOfInputVariables){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12) + const double factor = 1.0 / (2.0 * scale * static_cast(numSegments) * paramB); + for (int icol = 0; icol < 2 * numOfInputVariables; ++icol) { + if (icol < numOfInputVariables) { + // Real part + const int ir2 = icol; + const int index2 = 2 * ir2; + derivativesRegardingResps[index2] = factor * value1[icol]; + } + else { + // Imaginary part + const int ir2 = icol - numOfInputVariables; + const int index2 = 2 * ir2 + 1; + derivativesRegardingResps[index2] = factor * value1[icol]; + } + } + derivativesRegardingScale = factor * value3; + delete[] value1; +#ifdef _DEBUG_WRITE + std::cout << "dsr1" << std::endl; + std::cout << "["; + for (int row = 0; row < 2 * numOfInputVariables; ++row) { + std::cout << derivativesRegardingResps[row] << " "; + if (row + 1 < 2 * numOfInputVariables) { + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "dss1" << std::endl; + std::cout << derivativesRegardingScale << std::endl; + double** derivSumU1 = new double* [numSegments]; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + derivSumU1[iSeg] = new double[2 * numOfInputVariables]; + } + double* derivSquaredScale1 = new double[2 * numOfInputVariables]; + double* derivScale1 = new double[2 * numOfInputVariables]; + for (int icol = 0; icol < numOfInputVariables; ++icol) { + for (int isign = 0; isign < 2; ++isign) { + std::complex* residualsOrg = new std::complex[numSegments]; + std::complex* respOrg = new std::complex[numOfInputVariables]; + std::complex* residualsMod = new std::complex[numSegments]; + std::complex* respMod = new std::complex[numOfInputVariables]; + for (int icol2 = 0; icol2 < numOfInputVariables; ++icol2) { + respOrg[icol2] = resp[icol2]; + respMod[icol2] = resp[icol2]; + } + double dresp(0.0); + if (isign == 0) { + dresp = resp[icol].real() * 0.00001; + respMod[icol] += std::complex(dresp, 0.0); + } + else { + dresp = resp[icol].imag() * 0.00001; + respMod[icol] += std::complex(0.0, dresp); + } + // Calculate complex residuals + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const std::complex outSyn = respOrg[0] * ftval[in0][iSeg] + respOrg[1] * ftval[in1][iSeg]; + residualsOrg[iSeg] = ftval[out][iSeg] - outSyn; + } + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const std::complex outSyn = respMod[0] * ftval[in0][iSeg] + respMod[1] * ftval[in1][iSeg]; + residualsMod[iSeg] = ftval[out][iSeg] - outSyn; + } + const int index = 2 * icol + isign; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double valOrg = std::abs(residualsOrg[iSeg]) / scale; + const double valMod = std::abs(residualsMod[iSeg]) / scale; + const double uOrg = RobustWeightTukeysBiweights::calculateLossFunction(valOrg, threshould) * pow(scale, 2); + const double uMod = RobustWeightTukeysBiweights::calculateLossFunction(valMod, threshould) * pow(scale, 2); + derivSumU1[iSeg][index] = (uMod - uOrg) / dresp; + } + double squareScaleOrg(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + if (std::abs(residualsOrg[iSeg]) < CommonParameters::EPS) { + // rho''(0) / 2 = 1 / 2 + squareScaleOrg += 0.5 * std::norm(residualsOrg[iSeg]); + } + else { + const double val = std::abs(residualsOrg[iSeg]) / scale; + squareScaleOrg += RobustWeightTukeysBiweights::calculateLossFunction(val, threshould) * pow(scale, 2); + } + } + double squareScaleMod(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + if (std::abs(residualsMod[iSeg]) < CommonParameters::EPS) { + // rho''(0) / 2 = 1 / 2 + squareScaleMod += 0.5 * std::norm(residualsMod[iSeg]); + } + else { + const double val = std::abs(residualsMod[iSeg]) / scale; + squareScaleMod += RobustWeightTukeysBiweights::calculateLossFunction(val, threshould) * pow(scale, 2); + } + } + derivSquaredScale1[index] = (squareScaleMod - squareScaleOrg) / dresp; + squareScaleOrg /= static_cast(numSegments); + squareScaleOrg /= paramB; + const double scaleOrg = sqrt(squareScaleOrg); + squareScaleMod /= static_cast(numSegments); + squareScaleMod /= paramB; + const double scaleMod = sqrt(squareScaleMod); + derivScale1[index] = (scaleMod - scaleOrg) / dresp; + delete[] residualsOrg; + delete[] respOrg; + delete[] residualsMod; + delete[] respMod; + } + } + std::cout << "["; + for( int row = 0; row < numSegments; ++row ){ + for( int col = 0; col < 2 * numOfInputVariables; ++col ){ + std::cout << derivSumU1[row][col] <<" "; + } + if( row+1 < numSegments ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + std::cout << "["; + for( int row = 0; row < 2 * numOfInputVariables; ++row ){ + std::cout << derivSquaredScale1[row] <<" "; + if( row+1 < 2 * numOfInputVariables){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; + std::cout << "dsr2" << std::endl; + std::cout << "["; + for (int row = 0; row < 2 * numOfInputVariables; ++row) { + std::cout << derivScale1[row] << " "; + if (row + 1 < 2 * numOfInputVariables) { + std::cout << ","; + } + } + std::cout << "]" << std::endl; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + delete[] derivSumU1[iSeg]; + } + delete[] derivSumU1; + delete[] derivSquaredScale1; + delete[] derivScale1; + double derivScale3(0.0); + { + const double scaleOrg = scale; + const double dscale = scale * 0.001; + const double scaleMod = scale + dscale; + // Calculate complex residuals + std::complex* residuals = new std::complex[numSegments]; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const std::complex outSyn = resp[0] * ftval[in0][iSeg] + resp[1] * ftval[in1][iSeg]; + residuals[iSeg] = ftval[out][iSeg] - outSyn; + } + double squareScaleOrg(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + if (std::abs(residuals[iSeg]) < CommonParameters::EPS) { + // rho''(0) / 2 = 1 / 2 + squareScaleOrg += 0.5 * std::norm(residuals[iSeg]); + } + else { + const double val = std::abs(residuals[iSeg]) / scaleOrg; + squareScaleOrg += RobustWeightTukeysBiweights::calculateLossFunction(val, threshould) * pow(scaleOrg, 2); + } + } + double squareScaleMod(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + if (std::abs(residuals[iSeg]) < CommonParameters::EPS) { + // rho''(0) / 2 = 1 / 2 + squareScaleMod += 0.5 * std::norm(residuals[iSeg]); + } + else { + const double val = std::abs(residuals[iSeg]) / scaleMod; + squareScaleMod += RobustWeightTukeysBiweights::calculateLossFunction(val, threshould) * pow(scaleMod, 2); + } + } + squareScaleOrg /= static_cast(numSegments); + squareScaleOrg /= paramB; + const double scaleNewOrg = sqrt(squareScaleOrg); + squareScaleMod /= static_cast(numSegments); + squareScaleMod /= paramB; + const double scaleNewMod = sqrt(squareScaleMod); + derivScale3 = (scaleNewMod - scaleNewOrg) / dscale; + delete[] residuals; + } + std::cout << "dss1" << std::endl; + std::cout << derivScale3 << std::endl; +#endif +} + +// Calculate response functions +void AnalysisOrdinaryRemoteReference::calculateResponseFunctions(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs) { + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + std::complex* resp0 = new std::complex[numOutputVariables]; + std::complex* resp1 = new std::complex[numOutputVariables]; + double** hatDiagonals = new double* [numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + hatDiagonals[iOut] = new double[numSegmentsTotal]; + } + + ofsResp << std::setprecision(10) << std::scientific << freq; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0 / freq; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::setprecision(10) << std::scientific << freq; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0 / freq; + } + + // Estimate response functions + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, false, resp0, resp1, hatDiagonals); + + if (ptrControl->getErrorEstimationMethod() == Control::SUBSET_DELETION_JACKKNIFE) { + subsetDeletionJackknife(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, resp0, resp1, hatDiagonals); + } + else if (ptrControl->getErrorEstimationMethod() == Control::STRICT_BOOTSTRAP) { + strictBootstrap(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, resp0, resp1); + } + + delete[] resp0; + delete[] resp1; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + delete[] hatDiagonals[iOut]; + } + delete[] hatDiagonals; + +} + +void AnalysisOrdinaryRemoteReference::calculateResponseFunctionsAux(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const bool forJackknife, std::complex* respOut0, std::complex* respOut1, + double** hatDiagsOut) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + ptrOutputFiles->writeLogMessage("Calculate response functions by ordinary remote reference"); + ptrOutputFiles->writeCvgMessage("================================================================================"); + ptrOutputFiles->writeCvgMessage("Now Frequency(Hz): " + Util::toString(freq) + ", Period(s): " + Util::toString(1.0 / freq)); + ptrOutputFiles->writeCvgMessage("================================================================================"); + const Control* const ptrControl = Control::getInstance(); + if (ptrControl->getErrorEstimationMethod() == Control::ROBUST_BOOTSTRAP) { + if (getPointerToRobustWeight(0) == NULL || getPointerToRobustWeight(0)->getNameOfRobustWeight() != "Tukey's biweights") { + ptrOutputFiles->writeErrorMessage("The first M-estimator should be Tukey's biweights for robust bootstap method"); + } + if (getPointerToRobustWeight(1) != NULL) { + ptrOutputFiles->writeErrorMessage("The second M-estimator should be null for robust bootstap method"); + } + } + + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + double* unitWeights = new double[numSegmentsTotal]; + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + unitWeights[iSeg] = 1.0; + } + double** weights = new double* [numOutputVariables]; + for (int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar) { + weights[iOutVar] = new double[numSegmentsTotal]; + memcpy(weights[iOutVar], unitWeights, sizeof(double) * numSegmentsTotal); + } + double* errorMagnitudes0 = new double [numOutputVariables]; + double* errorMagnitudes1 = new double [numOutputVariables]; + double* scales = new double[numOutputVariables]; + for (int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar) { + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions for output variable " + Util::toString(iOutVar)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Calculate response functions by the ordinary least square method + double coherence(0.0); + std::complex resp0(0.0, 0.0); + std::complex resp1(0.0, 0.0); + std::complex* residuals = new std::complex[numSegmentsTotal]; + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOutVar); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions by the ordinary least square method"); + calculateResponseFunctionByWLSRemoteReference(ftval[out], ftval[in0], ftval[in1], ftval[rr0], ftval[rr1], + numSegmentsTotal, weights[iOutVar], residuals, resp0, resp1, coherence); + std::vector titles; + std::vector* outputValues = new std::vector[numSegmentsTotal]; + const bool outputResidual = !forJackknife && ptrControl->getOutputLevel() >= 2; + if (outputResidual) { + titles.push_back("OLS"); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + outputValues[iSeg].push_back(residuals[iSeg].real()); + outputValues[iSeg].push_back(residuals[iSeg].imag()); + outputValues[iSeg].push_back(weights[iOutVar][iSeg]); + } + } + double absMaxResidual(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double absResidual = std::abs(residuals[iSeg]); + if (absResidual > absMaxResidual) { + absMaxResidual = absResidual; + } + } + bool noRobust(false); + scales[iOutVar] = RobustWeight::calculateScaleByMADN(numSegmentsTotal, residuals); + if (absMaxResidual < CommonParameters::EPS) { + // Such a case where the remote reference field is equivalent to the input field + ptrOutputFiles->writeCvgMessage("Robust method is not performed because residuals is nearly zero"); + noRobust = true; + }else{ + // Calculate response functions by regression using the first M-estimator + calculateResponseFunctionsByIRWLSRemoteReference(0, ftval[out], ftval[in0], ftval[in1], ftval[rr0], ftval[rr1], + numSegmentsTotal, false, scales[iOutVar], unitWeights, weights[iOutVar], residuals, resp0, resp1, coherence, titles, outputValues); + // Calculate response functions by regression using the second M-estimator + calculateResponseFunctionsByIRWLSRemoteReference(1, ftval[out], ftval[in0], ftval[in1], ftval[rr0], ftval[rr1], + numSegmentsTotal, true, scales[iOutVar], unitWeights, weights[iOutVar], residuals, resp0, resp1, coherence, titles, outputValues); + } + if (!forJackknife && ptrControl->getOutputLevel() > 0) { + // Output spectral density functions to cvg file + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOutVar); + outputSpectralDensityFunctionsToCvgFile(numSegmentsTotal, timeLength, ftval[out], ftval[in0], ftval[in1], weights[iOutVar]); + } + respOut0[iOutVar] = resp0; + respOut1[iOutVar] = resp1; + if (!forJackknife) { + const double maxHatDiag = calculateDiagonalComponentsOfHatMatrix(numSegmentsTotal, in0, in1, ftval, weights[iOutVar], hatDiagsOut[iOutVar]); + // Output results + ofsResp << "," << std::setprecision(10) << std::scientific << resp0.real(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp0.imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp1.real(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp1.imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << coherence; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, resp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(resp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, resp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(resp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << coherence; + } + if (outputResidual) { + std::ostringstream oss; + oss << "segm" << iSegLen << "_index" << freqDegree << "_output" << iOutVar << "_residuals.csv"; + writeResiduals(oss.str(), numSegmentsTotal, times, titles, outputValues); + } + if (ptrControl->getErrorEstimationMethod() == Control::PARAMETRIC) { + parametricErrorEstimation(numSegmentsTotal, weights[iOutVar], ftval, residuals, scales[iOutVar], noRobust,errorMagnitudes0[iOutVar], errorMagnitudes1[iOutVar]); + } + } + // Release memory + delete[] residuals; + delete[] outputValues; + } + + const int typeOfErrorEstimationMethod = ptrControl->getErrorEstimationMethod(); + switch (typeOfErrorEstimationMethod) { + case Control::FIXED_WEIGHTS_JACKKNIFE: + // Fixed-weights jackknife + fixedWeightsJackknife(freq, numSegmentsTotal, weights, ftval, ofsResp, ofsRhoaPhs, respOut0, respOut1, hatDiagsOut); + break; + case Control::FIXED_WEIGHTS_BOOTSTRAP: + // Fixed-weights bootstrap + // Go through + case Control::ROBUST_BOOTSTRAP: + // Robust bootstrap + robustBootstrap(freq, numSegmentsTotal, weights, scales, ftval, ofsResp, ofsRhoaPhs, respOut0, respOut1); + break; + case Control::SUBSET_DELETION_JACKKNIFE: + // Go through + case Control::STRICT_BOOTSTRAP: + break; + case Control::PARAMETRIC: + for (int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar) { + const double dResp0 = errorMagnitudes0[iOutVar]; + const double dResp1 = errorMagnitudes1[iOutVar]; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, respOut0[iOutVar], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(respOut0[iOutVar], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, respOut1[iOutVar], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(respOut1[iOutVar], dResp1); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(typeOfErrorEstimationMethod)); + break; + } + + // Release memory + delete[] unitWeights; + for (int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar) { + delete[] weights[iOutVar]; + } + delete[] weights; + delete[] errorMagnitudes0; + delete[] errorMagnitudes1; + delete[] scales; + +} + +// Calculate a vector for partial derivatives +void AnalysisOrdinaryRemoteReference::calculateVectorForPartialDerivatives(const int iSeg, std::complex** ftval, const std::complex* const residuals, + std::complex* hSigmaMatrix, double* vector) const { + + const Control* const ptrControl = Control::getInstance(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + + for (int irow = 0; irow < numOfInputVariables; ++irow) { + const int in = ptrControl->getChannelIndex(CommonParameters::INPUT, irow); + hSigmaMatrix[irow] = std::conj(ftval[in][iSeg]) * residuals[iSeg]; + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < numOfInputVariables; ++row ){ + std::cout << hSigmaMatrix[row].real() << "+" << hSigmaMatrix[row].imag() <<"im "; + } + std::cout << "]" << std::endl; +#endif + + for (int irow = 0; irow < numOfInputVariables; ++irow) { + const int index = irow; + vector[index] = hSigmaMatrix[irow].real(); + } + for (int irow = 0; irow < numOfInputVariables; ++irow) { + const int index = irow + numOfInputVariables; + vector[index] = hSigmaMatrix[irow].imag(); + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int row = 0; row < 2 * numOfInputVariables; ++row ){ + std::cout << vector[row] <<" "; + if( row+1 < 2 * numOfInputVariables){ + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif +} + +// Perform fixed-weights jackknife +void AnalysisOrdinaryRemoteReference::fixedWeightsJackknife(const double freq, const int numSegmentsTotal, double** weightsOrg, std::complex** ftval, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Fixed-weights jackknife is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + double** weights = new double* [numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + weights[iOut] = new double[numSegmentsTotal]; + memcpy(weights[iOut], weightsOrg[iOut], sizeof(double) * numSegmentsTotal); + } + + std::complex** pseudoResp0 = new std::complex*[numSegmentsTotal]; + std::complex** pseudoResp1 = new std::complex*[numSegmentsTotal]; + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + pseudoResp0[iSeg] = new std::complex[numOutputVariables]; + pseudoResp1[iSeg] = new std::complex[numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + weights[iOut][iSeg] = 0.0;// Replace + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + std::complex temp0(0.0, 0.0); + std::complex temp1(0.0, 0.0); + calculateResponseFunctionByWLSRemoteReferenceAux(numSegmentsTotal, ftval[out], ftval[in0], ftval[in1], ftval[rr0], ftval[rr1], weights[iOut], temp0, temp1); + const double hatMatrixDiagonal = hatDiagonals[iOut][iSeg]; + double factor = static_cast(numSegmentsTotal) * (1.0 - hatMatrixDiagonal); + if (hatMatrixDiagonal > 1.0) { + factor = 0.0; + } + else if (hatMatrixDiagonal < 0.0) { + factor = static_cast(numSegmentsTotal); + } + pseudoResp0[iSeg][iOut] = resp0[iOut] + factor * (resp0[iOut] - temp0); + pseudoResp1[iSeg][iOut] = resp1[iOut] + factor * (resp1[iOut] - temp1); + weights[iOut][iSeg] = weightsOrg[iOut][iSeg];// Restore + } + } + // Release memory + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + delete[] weights[iOut]; + } + delete[] weights; + + // Calculate & output error bars + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + if (numSegmentsTotal > 2) { + std::complex avgResp0(0.0, 0.0); + std::complex avgResp1(0.0, 0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + avgResp0 += pseudoResp0[iSeg][iOut]; + avgResp1 += pseudoResp1[iSeg][iOut]; + } + const double factor = 1.0 / static_cast(numSegmentsTotal); + avgResp0 *= factor; + avgResp1 *= factor; + double variance0(0.0); + double variance1(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + variance0 += std::norm(pseudoResp0[iSeg][iOut] - avgResp0); + variance1 += std::norm(pseudoResp1[iSeg][iOut] - avgResp1); + } + const double factor2 = factor / static_cast(2 * numSegmentsTotal - 4); + variance0 *= factor2; + variance1 *= factor2; + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + else { + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + } + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + // Release memory + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + delete[] pseudoResp0[iSeg]; + delete[] pseudoResp1[iSeg]; + } + delete[] pseudoResp0; + delete[] pseudoResp1; + +} + +// Perform fixed-weights bootstrap +void AnalysisOrdinaryRemoteReference::fixedWeightsBootstrap(const double freq, const int numSegmentsTotal, double** weights, std::complex** ftval, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Fixed-weights bootstrap is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + int* segmentIndexes = new int[numSegmentsTotal]; + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex** resp0Sample = new std::complex*[numOfSamples]; + std::complex** resp1Sample = new std::complex*[numOfSamples]; +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + // Make bootstrap samples + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } + resp0Sample[iSample] = new std::complex[numOutputVariables]; + resp1Sample[iSample] = new std::complex[numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + std::complex temp0(0.0, 0.0); + std::complex temp1(0.0, 0.0); + calculateResponseFunctionByWLSRemoteReferenceForBootstrap(numSegmentsTotal, segmentIndexes, + ftval[out], ftval[in0], ftval[in1], ftval[rr0], ftval[rr1], weights[iOut], temp0, temp1); + resp0Sample[iSample][iOut] = temp0; + resp1Sample[iSample][iOut] = temp1; + } + } + delete[] segmentIndexes; + + if (ptrControl->getOutputLevel() >= 4) {// Output one-step estimates + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + ptrOutputFiles->writeCvgMessage("Dataset " + Util::toString(iSample)); + ptrOutputFiles->writeCvgMessage("One-step estimates of response functions:"); + std::ostringstream msg; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp0Sample[iSample][iOut].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp0Sample[iSample][iOut].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp1Sample[iSample][iOut].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1Sample[iSample][iOut].imag() << ")"; + ptrOutputFiles->writeCvgMessage(msg.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + } + } + + // Calculate error of response functions + assert(numOfSamples > 2); + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + // Calculate average + std::complex average0 = std::complex(0.0, 0.0); + std::complex average1 = std::complex(0.0, 0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + average0 += resp0Sample[iSample][iOut]; + average1 += resp1Sample[iSample][iOut]; + } + average0 /= static_cast(numOfSamples); + average1 /= static_cast(numOfSamples); + // Calculate variance + double variance0(0.0); + double variance1(0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + variance0 += std::norm(resp0Sample[iSample][iOut] - average0); + variance1 += std::norm(resp1Sample[iSample][iOut] - average1); + } + variance0 /= static_cast(2 * numOfSamples - 4); + variance1 /= static_cast(2 * numOfSamples - 4); + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + // Release memory + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + delete[] resp0Sample[iSample]; + delete[] resp1Sample[iSample]; + } + delete[] resp0Sample; + delete[] resp1Sample; + +} + +// Estimate errors by parametric method +void AnalysisOrdinaryRemoteReference::parametricErrorEstimation(const int numSegmentsTotal, const double* const weights, std::complex** ftval, + const std::complex* const residuals, const double scale, const bool noRobust, double& error0, double& error1) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Parametric error estimation is performed"); + + if (numSegmentsTotal <= 2) { + error0 = 1.0e10; + error1 = 1.0e10; + return; + } + + int index(1); + const RobustWeight* const robustWeight2nd = getPointerToRobustWeight(1); + if (robustWeight2nd == NULL || robustWeight2nd->getNumIterationMax() < 1) { + // The second M-estimater was not active + index = 0; + const RobustWeight* const robustWeight1st = getPointerToRobustWeight(0); + if (robustWeight1st == NULL || robustWeight1st->getNumIterationMax() < 1) { + // The 1st M-estimater was not active + index = -1; + } + } + + double numerator(0.0); + if (noRobust || index < 0) { + double variance(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + variance += std::norm(residuals[iSeg]); + } + variance /= static_cast(2 * numSegmentsTotal - 4); + numerator = variance; + } + else { + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double weightedAbsResidual = weights[iSeg] * std::abs(residuals[iSeg]); + numerator += pow(weightedAbsResidual, 2); + } + numerator /= static_cast(numSegmentsTotal - 2); + } + + double denominator = 0.0; + if (noRobust || index < 0) { + denominator = 1.0; + } + else { + const RobustWeight* const robustWeight = getPointerToRobustWeight(index); + double sumOf2ndOrderDerivativeOfLossFunction = robustWeight->calculateSumOf2ndOrderDerivativeOfLossFunction(numSegmentsTotal, residuals, scale); + sumOf2ndOrderDerivativeOfLossFunction /= static_cast(numSegmentsTotal); + denominator = pow(sumOf2ndOrderDerivativeOfLossFunction, 2); + if (denominator < 1.0e-10) { + denominator = 1.0e-10; + } + } + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + double BrxBrx(0.0); + double BryBry(0.0); + std::complex BrxBry(0.0, 0.0); + std::complex BrxBx(0.0, 0.0); + std::complex BryBy(0.0, 0.0); + std::complex BrxBy(0.0, 0.0); + std::complex BryBx(0.0, 0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + BrxBrx += std::norm(ftval[rr0][iSeg]); + BryBry += std::norm(ftval[rr1][iSeg]); + BrxBry += std::conj(ftval[rr0][iSeg]) * ftval[rr1][iSeg]; + BrxBx += std::conj(ftval[rr0][iSeg]) * ftval[in0][iSeg]; + BrxBy += std::conj(ftval[rr0][iSeg]) * ftval[in1][iSeg]; + BryBx += std::conj(ftval[rr1][iSeg]) * ftval[in0][iSeg]; + BryBy += std::conj(ftval[rr1][iSeg]) * ftval[in1][iSeg]; + } + const std::complex BrBr[2][2] = { {BrxBrx, BrxBry}, {std::conj(BrxBry), BryBry} }; + const std::complex BrB[2][2] = { {BrxBx, BrxBy}, {BryBx, BryBy} }; + const std::complex BBr[2][2] = { {std::conj(BrxBx), std::conj(BryBx)}, {std::conj(BrxBy), std::conj(BryBy)} }; + const std::complex invBrB[2][2] = { {BryBy, -BrxBy}, {-BryBx, BrxBx} }; + const std::complex invBBr[2][2] = { {std::conj(BryBy), -std::conj(BryBx)}, {-std::conj(BrxBy), std::conj(BrxBx)} }; + const std::complex determinantOfBrB = BrxBx * BryBy - BrxBy * BryBx; + const std::complex determinantOfBBr = std::conj(BrxBx) * std::conj(BryBy) - std::conj(BryBx) * std::conj(BrxBy); + const std::complex invBrBBrBr[2][2] = { + { BryBy * BrxBrx - BrxBy * std::conj(BrxBry), BryBy * BrxBry - BrxBy * BryBry}, + {-BryBx * BrxBrx + BrxBx * std::conj(BrxBry), -BryBx * BrxBry + BrxBx * BryBry} + }; + const std::complex invBrBBrBrinvBBrDiagonalXX = ( invBrBBrBr[0][0] * std::conj(BryBy) - invBrBBrBr[0][1] * std::conj(BrxBy)) / determinantOfBrB / determinantOfBBr; + const std::complex invBrBBrBrinvBBrDiagonalYY = (-invBrBBrBr[1][0] * std::conj(BryBx) + invBrBBrBr[1][1] * std::conj(BrxBx)) / determinantOfBrB / determinantOfBBr; + error0 = sqrt( numerator / denominator * std::abs(invBrBBrBrinvBBrDiagonalXX) ); + error1 = sqrt( numerator / denominator * std::abs(invBrBBrBrinvBBrDiagonalYY) ); + +} + +// Estimate error by fixed-weights bootstrap +void AnalysisOrdinaryRemoteReference::robustBootstrap(const double freq, const int numSegmentsTotal, double** weightsOrg, double* scalesOrg, std::complex** ftval, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0Org, const std::complex* const resp1Org) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control* const ptrControl = Control::getInstance(); + + bool fixedWeights(true); + const int typeOfErrorEstimationMethod = ptrControl->getErrorEstimationMethod(); + switch (typeOfErrorEstimationMethod) { + case Control::FIXED_WEIGHTS_BOOTSTRAP: + fixedWeights = true; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Estimate errors by fixed-weights bootstrap"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + break; + case Control::ROBUST_BOOTSTRAP: + fixedWeights = false; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Estimate errors by robust bootstrap"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(typeOfErrorEstimationMethod)); + break; + } + + const int numOfOutputVariables = ptrControl->getNumOutputVariables(); + const int numOfInputVariables = ptrControl->getNumInputVariables(); + const int numOfReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + + assert(numOfInputVariables == 2); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + assert(numOfReferenceVariables == 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + double paramB(0.0); + double paramC(0.0); + RobustWeightTukeysBiweights::calculateParams(2, numSegmentsTotal, paramB, paramC); + + for (int iOut = 0; iOut < numOfOutputVariables; ++iOut) { + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + // Calculate complex residuals + std::complex* complexResidualsOrg = new std::complex[numSegmentsTotal]; + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const std::complex outSyn = resp0Org[iOut] * ftval[in0][iSeg] + resp1Org[iOut] * ftval[in1][iSeg]; + complexResidualsOrg[iSeg] = ftval[out][iSeg] - outSyn; + } + // Calculate original weights + double* termsForScaleOrg = new double[numSegmentsTotal]; + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double val = std::abs(complexResidualsOrg[iSeg]) / scalesOrg[iOut]; + if (fabs(val) < CommonParameters::EPS) { + // rho''(0) / 2 = 1 / 2 + termsForScaleOrg[iSeg] = 0.5 * std::norm(complexResidualsOrg[iSeg]); + } + else { + termsForScaleOrg[iSeg] = RobustWeightTukeysBiweights::calculateLossFunction(val, paramC) * pow(scalesOrg[iOut], 2); + } + } + // Calculate partial derivatives for robust bootstrap + const int dofOfMatrixForCorrection = 2 * numOfInputVariables + 1; + DoubleDenseSquareMatrix matrixForCorrection; + if (!fixedWeights) { + matrixForCorrection.setDegreeOfEquation(dofOfMatrixForCorrection); + matrixForCorrection.zeroClearMatrix(); + for (int irow = 0; irow < dofOfMatrixForCorrection; ++irow) { + matrixForCorrection.setValue(irow, irow, 1.0);// Unit matrix + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + double** derivativesRespsResps = new double* [2 * numOfInputVariables]; + for (int irow = 0; irow < 2 * numOfInputVariables; ++irow) { + derivativesRespsResps[irow] = new double[2 * numOfInputVariables]; + } + double* derivativesRespsScale = new double[2 * numOfInputVariables]; + calculatePartialDerivativesOfResponses(numSegmentsTotal, paramC, ftval, resp0Org[iOut], resp1Org[iOut], scalesOrg[iOut], + complexResidualsOrg, weightsOrg[iOut], iOut, derivativesRespsResps, derivativesRespsScale); + for (int irow = 0; irow < 2 * numOfInputVariables; ++irow) { + int icol(0); + for (; icol < 2 * numOfInputVariables; ++icol) { + matrixForCorrection.addValue(irow, icol, -derivativesRespsResps[irow][icol]); + } + matrixForCorrection.addValue(irow, icol, -derivativesRespsScale[irow]); + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + for (int irow = 0; irow < 2 * numOfReferenceVariables; ++irow) { + delete[] derivativesRespsResps[irow]; + } + delete[] derivativesRespsResps; + delete[] derivativesRespsScale; + + double* derivativesScaleResps = new double[2 * numOfInputVariables]; + double derivativesScaleScale(0.0); + calculatePartialDerivativesOfScale(numSegmentsTotal, paramC, paramB, ftval, resp0Org[iOut], resp1Org[iOut], scalesOrg[iOut], + complexResidualsOrg, weightsOrg[iOut], iOut, derivativesScaleResps, derivativesScaleScale); + { + const int irow = dofOfMatrixForCorrection - 1; + int icol(0); + for (; icol < 2 * numOfInputVariables; ++icol) { + matrixForCorrection.addValue(irow, icol, -derivativesScaleResps[icol]); + } + matrixForCorrection.addValue(irow, icol, -derivativesScaleScale); + } +#ifdef _DEBUG_WRITE + matrixForCorrection.debugWriteMatrix(); +#endif + delete[] derivativesScaleResps; + // Factorize matrix + matrixForCorrection.factorizeMatrix(); + } + + // Bootstrap + int* segmentIndexes = new int[numSegmentsTotal]; + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex* resp0Sample = new std::complex[numOfSamples]; + std::complex* resp1Sample = new std::complex[numOfSamples]; + double* vectorForCorrection = new double[dofOfMatrixForCorrection]; +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + // Make bootstrap samples + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } + // Calculate one-step estimates of response functions + std::complex resp0(0.0, 0.0); + std::complex resp1(0.0, 0.0); + calculateResponseFunctionByWLSRemoteReferenceForBootstrap(numSegmentsTotal, segmentIndexes, + ftval[out], ftval[in0], ftval[in1], ftval[rr0], ftval[rr1], weightsOrg[iOut], resp0, resp1); + // Calculate one-step estimates of the scale + double squareScale(0.0); +#ifdef _USE_OMP + int icount(0); +#pragma omp parallel for default(shared) private(icount) reduction(+ : squareScale) + for (icount = 0; icount < numSegmentsTotal; ++icount) { + squareScale += termsForScaleOrg[segmentIndexes[icount]]; + } +#else + for (int icount = 0; icount < numSegmentsTotal; ++icount) { + const int iSeg = segmentIndexes[icount]; + squareScale += termsForScaleOrg[iSeg]; + } +#endif + squareScale /= static_cast(numSegmentsTotal); + squareScale /= paramB; + const double scale = sqrt(squareScale); + if (ptrControl->getOutputLevel() >= 4) {// Output one-step estimates + ptrOutputFiles->writeCvgMessage("Dataset " + Util::toString(iSample)); + ptrOutputFiles->writeCvgMessage("One-step estimates of response functions:"); + std::ostringstream msg; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp0.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp0.imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp1.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1.imag() << ")"; + ptrOutputFiles->writeCvgMessage(msg.str()); + if (!fixedWeights) { + ptrOutputFiles->writeCvgMessage("One-step estimate of scale: " + Util::toString(scale)); + } + } + if (!fixedWeights) { + // Calculate differences between one-step estimates and original estimates + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12) + vectorForCorrection[0] = resp0.real() - resp0Org[iOut].real(); + vectorForCorrection[1] = resp0.imag() - resp0Org[iOut].imag(); + vectorForCorrection[2] = resp1.real() - resp1Org[iOut].real(); + vectorForCorrection[3] = resp1.imag() - resp1Org[iOut].imag(); + vectorForCorrection[4] = scale - scalesOrg[iOut]; +#if _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < dofOfMatrixForCorrection; ++row) { + std::cout << vectorForCorrection[row] << " "; + if (row + 1 < dofOfMatrixForCorrection) { + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif + // Solve linear equation + matrixForCorrection.solveLinearEquation(vectorForCorrection, vectorForCorrection); +#if _DEBUG_WRITE + std::cout << "["; + for (int row = 0; row < dofOfMatrixForCorrection; ++row) { + std::cout << vectorForCorrection[row] << " "; + if (row + 1 < dofOfMatrixForCorrection) { + std::cout << ","; + } + } + std::cout << "]" << std::endl; +#endif + // Calculate corrected version of the output one-step estimates + // Order: Re(Z11),Im(Z11),Re(Z12),Im(Z12) + resp0 = resp0Org[iOut] + std::complex(vectorForCorrection[0], vectorForCorrection[1]); + resp1 = resp1Org[iOut] + std::complex(vectorForCorrection[2], vectorForCorrection[3]); + if (ptrControl->getOutputLevel() >= 4) { + //Output corrected version of the output one-step estimates + ptrOutputFiles->writeCvgMessage("Corrected one-step estimates of response functions:"); + std::ostringstream msg; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp0.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp0.imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp1.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1.imag() << ")"; + ptrOutputFiles->writeCvgMessage(msg.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + } + resp0Sample[iSample] = resp0; + resp1Sample[iSample] = resp1; + } + // Calculate error of response functions + assert(numOfSamples > 2); + // Calculate average + std::complex average0 = std::complex(0.0, 0.0); + std::complex average1 = std::complex(0.0, 0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + average0 += resp0Sample[iSample]; + average1 += resp1Sample[iSample]; + } + average0 /= static_cast(numOfSamples); + average1 /= static_cast(numOfSamples); + // Calculate variance + double variance0(0.0); + double variance1(0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + variance0 += std::norm(resp0Sample[iSample] - average0); + variance1 += std::norm(resp1Sample[iSample] - average1); + } + variance0 /= static_cast(2 * numOfSamples - 4); + variance1 /= static_cast(2 * numOfSamples - 4); + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0Org[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0Org[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1Org[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1Org[iOut], dResp1); + } + // Release memory + delete[] complexResidualsOrg; + delete[] termsForScaleOrg; + delete[] segmentIndexes; + delete[] resp0Sample; + delete[] resp1Sample; + delete[] vectorForCorrection; + } + + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + +} + +// Estimate error by strict bootstrap +void AnalysisOrdinaryRemoteReference::strictBootstrap(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Strict bootstrap is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + // Copy Fourier transformed values + const int numChannels = ptrControl->getNumberOfChannels(); + std::complex** ftvalForBootstrap = new std::complex*[numChannels]; + for (int iChan = 0; iChan < numChannels; ++iChan) { + ftvalForBootstrap[iChan] = new std::complex[numSegmentsTotal]; + } + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex** resp0Sample = new std::complex*[numOfSamples]; + std::complex** resp1Sample = new std::complex*[numOfSamples]; + int* segmentIndexes = new int[numSegmentsTotal]; + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + // Make bootstrap samples + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } + // Copy data + for (int iChan = 0; iChan < numChannels; ++iChan) { + for (int icount = 0; icount < numSegmentsTotal; ++icount) { + const int iSeg = segmentIndexes[icount]; + ftvalForBootstrap[iChan][icount] = ftval[iChan][iSeg]; + } + } + resp0Sample[iSample] = new std::complex[numOutputVariables]; + resp1Sample[iSample] = new std::complex[numOutputVariables]; + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftvalForBootstrap, times, + ofsResp, ofsRhoaPhs, true, resp0Sample[iSample], resp1Sample[iSample], NULL); + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + + if (ptrControl->getOutputLevel() >= 4) {// Output estimates of final response functions + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + ptrOutputFiles->writeCvgMessage("Dataset " + Util::toString(iSample)); + ptrOutputFiles->writeCvgMessage("Estimates of final response functions:"); + std::ostringstream msg; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp0Sample[iSample][iOut].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp0Sample[iSample][iOut].imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp1Sample[iSample][iOut].real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1Sample[iSample][iOut].imag() << ")"; + if (iOut + 1 < numOutputVariables) { + msg << std::endl; + } + } + ptrOutputFiles->writeCvgMessage(msg.str()); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + } + } + + // Calculate error of response functions + assert(numOfSamples > 2); + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + // Calculate average + std::complex average0 = std::complex(0.0, 0.0); + std::complex average1 = std::complex(0.0, 0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + average0 += resp0Sample[iSample][iOut]; + average1 += resp1Sample[iSample][iOut]; + } + average0 /= static_cast(numOfSamples); + average1 /= static_cast(numOfSamples); + // Calculate variance + double variance0(0.0); + double variance1(0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + variance0 += std::norm(resp0Sample[iSample][iOut] - average0); + variance1 += std::norm(resp1Sample[iSample][iOut] - average1); + } + variance0 /= static_cast(2 * numOfSamples - 4); + variance1 /= static_cast(2 * numOfSamples - 4); + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + // Release memory + for (int iChan = 0; iChan < numChannels; ++iChan) { + delete[] ftvalForBootstrap[iChan]; + } + delete[] ftvalForBootstrap; + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + delete[] resp0Sample[iSample]; + delete[] resp1Sample[iSample]; + } + delete[] resp0Sample; + delete[] resp1Sample; + delete[] segmentIndexes; + +} + +// Perform subset deletion jackknife +void AnalysisOrdinaryRemoteReference::subsetDeletionJackknife(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Subset deletion jackknife is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + int numOmittedData = static_cast(0.01 * ptrControl->getPercentageOfOmmitedDataSubsetDeletionJackknife() * static_cast(numSegmentsTotal)); + if (numOmittedData < 1) { + numOmittedData = 1; + } + const int numOfSubsets = numSegmentsTotal / numOmittedData; + + ptrOutputFiles->writeLogMessage("Number of ommited data : " + Util::toString(numOmittedData)); + ptrOutputFiles->writeLogMessage("Number of subsets : " + Util::toString(numOfSubsets)); + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); + + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + // Copy Fourier transformed values + const int numChannels = ptrControl->getNumberOfChannels(); + std::complex** ftvalForJackknife = new std::complex*[numChannels]; + for (int iChan = 0; iChan < numChannels; ++iChan) { + ftvalForJackknife[iChan] = new std::complex[numSegmentsTotal - numOmittedData]; + } + std::complex** pseudoResp0 = new std::complex*[numOfSubsets]; + std::complex** pseudoResp1 = new std::complex*[numOfSubsets]; + for (int iSubset = 0; iSubset < numOfSubsets; ++iSubset) { + double* averageHatDiags = new double[numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + // Zero clear + averageHatDiags[iOut] = 0.0; + } + const int iSegOmitStart = iSubset * numOmittedData; + const int iSegOmitEnd = iSegOmitStart + numOmittedData; + assert(iSegOmitEnd <= numSegmentsTotal); + for (int iSeg = iSegOmitStart; iSeg < iSegOmitEnd; ++iSeg) { + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + averageHatDiags[iOut] += hatDiagonals[iOut][iSeg]; + } + } + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + averageHatDiags[iOut] /= static_cast(numOmittedData); + } + for (int iChan = 0; iChan < numChannels; ++iChan) { + int icount(0); + for (int iSeg = 0; iSeg < iSegOmitStart; ++iSeg, ++icount) { + ftvalForJackknife[iChan][icount] = ftval[iChan][iSeg]; + } + for (int iSeg = iSegOmitEnd; iSeg < numSegmentsTotal; ++iSeg, ++icount) { + ftvalForJackknife[iChan][icount] = ftval[iChan][iSeg]; + } + assert(icount == numSegmentsTotal - numOmittedData); + } + std::complex* temp0 = new std::complex[numOutputVariables]; + std::complex* temp1 = new std::complex[numOutputVariables]; + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal - numOmittedData, + ftvalForJackknife, times, ofsResp, ofsRhoaPhs, true, temp0, temp1, NULL); + pseudoResp0[iSubset] = new std::complex[numOutputVariables]; + pseudoResp1[iSubset] = new std::complex[numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + double factor = static_cast(numOfSubsets) * (1.0 - averageHatDiags[iOut]); + if (averageHatDiags[iOut] > 1.0) { + factor = 0.0; + } + else if (averageHatDiags[iOut] < 0.0) { + factor = static_cast(numOfSubsets); + } + pseudoResp0[iSubset][iOut] = resp0[iOut] + factor * (resp0[iOut] - temp0[iOut]); + pseudoResp1[iSubset][iOut] = resp1[iOut] + factor * (resp1[iOut] - temp1[iOut]); + } + delete[] averageHatDiags; + delete[] temp0; + delete[] temp1; + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + for (int iChan = 0; iChan < numChannels; ++iChan) { + delete[] ftvalForJackknife[iChan]; + } + delete[] ftvalForJackknife; + + // Calculate & output error bars + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + if (numOfSubsets > 2) { + std::complex avgResp0(0.0, 0.0); + std::complex avgResp1(0.0, 0.0); + for (int iSubset = 0; iSubset < numOfSubsets; ++iSubset) { + avgResp0 += pseudoResp0[iSubset][iOut]; + avgResp1 += pseudoResp1[iSubset][iOut]; + } + const double factor = 1.0 / static_cast(numOfSubsets); + avgResp0 *= factor; + avgResp1 *= factor; + double variance0(0.0); + double variance1(0.0); + for (int iSubset = 0; iSubset < numOfSubsets; ++iSubset) { + variance0 += std::norm(pseudoResp0[iSubset][iOut] - avgResp0); + variance1 += std::norm(pseudoResp1[iSubset][iOut] - avgResp1); + } + const double factor2 = factor / static_cast(2 * numOfSubsets - 4); + variance0 *= factor2; + variance1 *= factor2; + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + else { + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + } + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + for (int iSubset = 0; iSubset < numOfSubsets; ++iSubset) { + delete[] pseudoResp0[iSubset]; + delete[] pseudoResp1[iSubset]; + } + delete[] pseudoResp0; + delete[] pseudoResp1; + +} + +// Write residuals +void AnalysisOrdinaryRemoteReference::writeResiduals(const std::string& fileName, const int numSegmentsTotal, + const std::vector< std::pair >& times, const std::vector& titles, const std::vector* outputValues) const { + + std::ofstream ofs; + ofs.open(fileName.c_str(), std::ios::out); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if (ofs.fail()) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + ofs << "index"; + ofs << ",start_time,end_time"; + for (std::vector::const_iterator itr = titles.begin(); itr != titles.end(); ++itr) { + ofs << ",residual_real_" << *itr; + ofs << ",residual_imag_" << *itr; + ofs << ",weight_" << *itr; + } + ofs << std::endl; + + int index(0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + ofs << index; + const std::string timeStart = times[iSeg].first; + const std::string timeEnd = times[iSeg].second; + ofs << "," << timeStart << "," << timeEnd; + for (std::vector::const_iterator itr = outputValues[index].begin(); itr != outputValues[index].end(); ++itr) { + ofs << "," << std::setprecision(10) << std::scientific << *itr; + } + ofs << std::endl; + ++index; + } + ofs.close(); + +} \ No newline at end of file diff --git a/src/AnalysisOrdinaryRemoteReference.h b/src/AnalysisOrdinaryRemoteReference.h new file mode 100644 index 0000000..4e38fa3 --- /dev/null +++ b/src/AnalysisOrdinaryRemoteReference.h @@ -0,0 +1,102 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ANALYSIS_ORDINARY_REMOTE_REFERENCE +#define DBLDEF_ANALYSIS_ORDINARY_REMOTE_REFERENCE + +#include "Analysis.h" + +// Class of ordinary remote reference method +class AnalysisOrdinaryRemoteReference : public Analysis { + +public: + + // Default constructer + AnalysisOrdinaryRemoteReference(); + + // Destructer + virtual ~AnalysisOrdinaryRemoteReference(); + +private: + + // Calculate partial derivatives of responses for robust bootstrap + void calculatePartialDerivativesOfResponses(const int numSegments, const double threshould, std::complex** ftval, + const std::complex resp0, const std::complex resp1, const double scale, const std::complex* const residuals, + const double* const weights, const int iOut, double** derivativesRegardingResps, double* derivativesRegardingScale) const; + + // Calculate partial derivatives of scale + void calculatePartialDerivativesOfScale(const int numSegments, const double threshould, const double paramB, std::complex** ftval, + const std::complex resp0, const std::complex resp1, const double scale, const std::complex* const residuals, + const double* const weights, const int iOut, double* derivativesRegardingResps, double& derivativesRegardingScale) const; + + // Calculate response functions + virtual void calculateResponseFunctions( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ); + + void calculateResponseFunctionsAux(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const bool forJackknife, std::complex* respOut0, std::complex* respOut1, + double** hatDiagsOut) const; + + // Calculate a vector for partial derivatives + void calculateVectorForPartialDerivatives(const int iSeg, std::complex** ftval, const std::complex* const residuals, + std::complex* hSigmaMatrix, double* vector) const; + + // Perform fixed-weights jackknife + void fixedWeightsJackknife(const double freq, const int numSegmentsTotal, double** weightsOrg, std::complex** ftval, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals) const; + + // Perform fixed-weights bootstrap + void fixedWeightsBootstrap(const double freq, const int numSegmentsTotal, double** weights, std::complex** ftval, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1) const; + + // Estimate errors by parametric method + void parametricErrorEstimation(const int numSegmentsTotal, const double* const weights, std::complex** ftval, + const std::complex* const residuals, const double scale, const bool noRobust, double& error0, double& error1) const; + + // Estimate error by fixed-weights bootstrap + void robustBootstrap(const double freq, const int numSegmentsTotal, double** weightsOrg, double* scalesOrg, std::complex** ftval, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0Org, const std::complex* const resp1Org) const; + + // Estimate errors by strict bootstrap + void strictBootstrap(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1 ) const; + + // Perform subset deletion jackknife + void subsetDeletionJackknife(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals) const; + + // Write residuals + void writeResiduals(const std::string& fileName, const int numSegmentsTotal, + const std::vector< std::pair >& times, const std::vector& titles, const std::vector* outputValues) const; + +}; +#endif diff --git a/src/AnalysisRepeatedMedian.cpp b/src/AnalysisRepeatedMedian.cpp new file mode 100644 index 0000000..efd50f1 --- /dev/null +++ b/src/AnalysisRepeatedMedian.cpp @@ -0,0 +1,188 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "AnalysisRepeatedMedian.h" +#include "Control.h" +#include "OutputFiles.h" + +#include +#include +#include +#include +#include + +#include "Util.h" + + +// Default constructer +AnalysisRepeatedMedian::AnalysisRepeatedMedian() +{ +} + +// Destructer +AnalysisRepeatedMedian::~AnalysisRepeatedMedian() +{ +} + +// Calculate response functions +void AnalysisRepeatedMedian::calculateResponseFunctions(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs) { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Calculate response functions by repeated median estimator"); + ptrOutputFiles->writeCvgMessage("================================================================================"); + ptrOutputFiles->writeCvgMessage("Now Frequency(Hz): " + Util::toString(freq) + ", Period(s): " + Util::toString(1.0 / freq)); + ptrOutputFiles->writeCvgMessage("================================================================================"); + const Control* const ptrControl = Control::getInstance(); + const int in0 = ptrControl->getChannelIndex(CommonParameters::INPUT, 0); + const int in1 = ptrControl->getChannelIndex(CommonParameters::INPUT, 1); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + ofsResp << std::setprecision(10) << std::scientific << freq; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0 / freq; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::setprecision(10) << std::scientific << freq; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0 / freq; + } + + std::complex* respOut0 = new std::complex[numOutputVariables]; + std::complex* respOut1 = new std::complex[numOutputVariables]; + double* dResp0 = new double[numOutputVariables]; + double* dResp1 = new double[numOutputVariables]; + for (int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar) { + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions for output variable " + Util::toString(iOutVar)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + const double weights[2] = { 1.0, 1.0 }; + std::complex ftvalOut[2]; + std::complex ftvalIn0[2]; + std::complex ftvalIn1[2]; + std::complex ftvalRr0[2]; + std::complex ftvalRr1[2]; + double* resp0RealMedian = new double[numSegmentsTotal]; + double* resp0ImagMedian = new double[numSegmentsTotal]; + double* resp1RealMedian = new double[numSegmentsTotal]; + double* resp1ImagMedian = new double[numSegmentsTotal]; + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOutVar); + for (int iSeg0 = 0; iSeg0 < numSegmentsTotal; ++iSeg0) { + double* resp0Real = new double[numSegmentsTotal - 1]; + double* resp0Imag = new double[numSegmentsTotal - 1]; + double* resp1Real = new double[numSegmentsTotal - 1]; + double* resp1Imag = new double[numSegmentsTotal - 1]; + int icount(0); + ftvalOut[0] = ftval[out][iSeg0]; + ftvalIn0[0] = ftval[in0][iSeg0]; + ftvalIn1[0] = ftval[in1][iSeg0]; + ftvalRr0[0] = ftval[rr0][iSeg0]; + ftvalRr1[0] = ftval[rr1][iSeg0]; + for (int iSeg1 = 0; iSeg1 < numSegmentsTotal; ++iSeg1) { + if (iSeg0 != iSeg1) { + ftvalOut[1] = ftval[out][iSeg1]; + ftvalIn0[1] = ftval[in0][iSeg1]; + ftvalIn1[1] = ftval[in1][iSeg1]; + ftvalRr0[1] = ftval[rr0][iSeg1]; + ftvalRr1[1] = ftval[rr1][iSeg1]; + std::complex resp0(0.0, 0.0); + std::complex resp1(0.0, 0.0); + calculateResponseFunctionByWLSRemoteReferenceAux(2, ftvalOut, ftvalIn0, ftvalIn1, ftvalRr0, ftvalRr1, + weights, resp0, resp1); + resp0Real[icount] = resp0.real(); + resp0Imag[icount] = resp0.imag(); + resp1Real[icount] = resp1.real(); + resp1Imag[icount] = resp1.imag(); + ++icount; + } + } + resp0RealMedian[iSeg0] = Util::calculateMedian(numSegmentsTotal - 1, resp0Real); + resp0ImagMedian[iSeg0] = Util::calculateMedian(numSegmentsTotal - 1, resp0Imag); + resp1RealMedian[iSeg0] = Util::calculateMedian(numSegmentsTotal - 1, resp1Real); + resp1ImagMedian[iSeg0] = Util::calculateMedian(numSegmentsTotal - 1, resp1Imag); + delete[] resp0Real; + delete[] resp0Imag; + delete[] resp1Real; + delete[] resp1Imag; + } + const double respOut0Real = Util::calculateMedian(numSegmentsTotal, resp0RealMedian); + const double respOut0Imag = Util::calculateMedian(numSegmentsTotal, resp0ImagMedian); + const double respOut1Real = Util::calculateMedian(numSegmentsTotal, resp1RealMedian); + const double respOut1Imag = Util::calculateMedian(numSegmentsTotal, resp1ImagMedian); + // Output results + const double coherence = 1.0; + ofsResp << "," << std::setprecision(10) << std::scientific << respOut0Real; + ofsResp << "," << std::setprecision(10) << std::scientific << respOut0Imag; + ofsResp << "," << std::setprecision(10) << std::scientific << respOut1Real; + ofsResp << "," << std::setprecision(10) << std::scientific << respOut1Imag; + ofsResp << "," << std::setprecision(10) << std::scientific << coherence; + respOut0[iOutVar] = std::complex(respOut0Real, respOut0Imag); + respOut1[iOutVar] = std::complex(respOut1Real, respOut1Imag); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, respOut0[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(respOut0[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, respOut1[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(respOut1[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << coherence; + } + const double factor = 1.483 / sqrt(numSegmentsTotal); + const double dResp0Real = factor * Util::calculateMAD(numSegmentsTotal, respOut0Real, resp0RealMedian); + const double dResp0Imag = factor * Util::calculateMAD(numSegmentsTotal, respOut0Imag, resp0ImagMedian); + const double dResp1Real = factor * Util::calculateMAD(numSegmentsTotal, respOut1Real, resp1RealMedian); + const double dResp1Imag = factor * Util::calculateMAD(numSegmentsTotal, respOut1Imag, resp1ImagMedian); + dResp0[iOutVar] = sqrt(0.5 * (pow(dResp0Real, 2) + pow(dResp0Imag, 2))); + dResp1[iOutVar] = sqrt(0.5 * (pow(dResp1Real, 2) + pow(dResp1Imag, 2))); + delete[] resp0RealMedian; + delete[] resp0ImagMedian; + delete[] resp1RealMedian; + delete[] resp1ImagMedian; + } + for (int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar) { + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0[iOutVar]; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1[iOutVar]; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, respOut0[iOutVar], dResp0[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(respOut0[iOutVar], dResp0[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, respOut1[iOutVar], dResp1[iOutVar]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(respOut1[iOutVar], dResp1[iOutVar]); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + delete[] respOut0; + delete[] respOut1; + delete[] dResp0; + delete[] dResp1; + +} diff --git a/src/AnalysisRepeatedMedian.h b/src/AnalysisRepeatedMedian.h new file mode 100644 index 0000000..67b495b --- /dev/null +++ b/src/AnalysisRepeatedMedian.h @@ -0,0 +1,54 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_REPEATED_MEDIAN +#define DBLDEF_REPEATED_MEDIAN + +#include "Analysis.h" + +// Class of repeated median estimator +class AnalysisRepeatedMedian : public Analysis { + +public: + + // Default constructer + AnalysisRepeatedMedian(); + + // Destructer + virtual ~AnalysisRepeatedMedian(); + +private: + + // Calculate response functions + virtual void calculateResponseFunctions( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ); + +}; + +#endif diff --git a/src/AnalysisTest.cpp b/src/AnalysisTest.cpp new file mode 100644 index 0000000..ff714e4 --- /dev/null +++ b/src/AnalysisTest.cpp @@ -0,0 +1,447 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "AnalysisTest.h" +#include "Control.h" +#include "OutputFiles.h" + +#include +#include +#include +#include +#include +#ifdef _MERSENNE_TWISTER_ORIGINAL +#else +#include +#endif + +#include "Util.h" + +#ifdef _MERSENNE_TWISTER_ORIGINAL +#include "mt64.h" +#endif + +// Default constructer +AnalysisTest::AnalysisTest() +{ +} + +// Destructer +AnalysisTest::~AnalysisTest() +{ +} + +// Calculate response functions +void AnalysisTest::calculateResponseFunctions(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs) { + + // Estimate response functions + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumInputVariables(); + assert(numInputVariables == 2); + std::complex* istf0 = new std::complex[numOutputVariables + numInputVariables]; + std::complex* istf1 = new std::complex[numOutputVariables + numInputVariables]; + double coherenceMin(1.0); + int icount(0); + for (int iOut = 0; iOut < numOutputVariables; ++iOut, ++icount) { + const int index = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + double coherence(0.0); + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, false, index, istf0[icount], istf1[icount], coherence); + if (coherence < coherenceMin) { + coherenceMin = coherence; + } + } + for (int iInp = 0; iInp < numInputVariables; ++iInp, ++icount ) { + const int index = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + double coherence(0.0); + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, false, index, istf0[icount], istf1[icount], coherence); + if (coherence < coherenceMin) { + coherenceMin = coherence; + } + } + + // Output response functions + const std::complex Txx = istf0[numOutputVariables]; + const std::complex Txy = istf1[numOutputVariables]; + const std::complex Tyx = istf0[numOutputVariables + 1]; + const std::complex Tyy = istf1[numOutputVariables + 1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if (std::abs(det) < CommonParameters::EPS) { + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + ofsResp << std::setprecision(10) << std::scientific << freq; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0 / freq; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::setprecision(10) << std::scientific << freq; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0 / freq; + } + std::complex* respOut0 = new std::complex[numOutputVariables]; + std::complex* respOut1 = new std::complex[numOutputVariables]; + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + const int index = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + const std::complex U_x = istf0[index]; + const std::complex U_y = istf1[index]; + respOut0[iOut] = (U_x * Tyy - U_y * Tyx) / det; + respOut1[iOut] = (U_y * Txx - U_x * Txy) / det; + ofsResp << "," << std::setprecision(10) << std::scientific << respOut0[iOut].real(); + ofsResp << "," << std::setprecision(10) << std::scientific << respOut0[iOut].imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << respOut1[iOut].real(); + ofsResp << "," << std::setprecision(10) << std::scientific << respOut1[iOut].imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << coherenceMin; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, respOut0[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(respOut0[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, respOut1[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(respOut1[iOut]); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << coherenceMin; + } + } + + if (ptrControl->getErrorEstimationMethod() == Control::STRICT_BOOTSTRAP) { + strictBootstrap(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, respOut0, respOut1); + } + else { + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(ptrControl->getErrorEstimationMethod())); + } + + delete[] istf0; + delete[] istf1; + delete[] respOut0; + delete[] respOut1; + +} + +void AnalysisTest::calculateResponseFunctionsAux(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const bool forJackknife, const int out, std::complex& respOut0, std::complex& respOut1, + double& coherenceOut ) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + ptrOutputFiles->writeLogMessage("Calculate response functions by ordinary remote reference"); + ptrOutputFiles->writeCvgMessage("================================================================================"); + ptrOutputFiles->writeCvgMessage("Now Frequency(Hz): " + Util::toString(freq) + ", Period(s): " + Util::toString(1.0 / freq)); + ptrOutputFiles->writeCvgMessage("================================================================================"); + const Control* const ptrControl = Control::getInstance(); + + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + + double* unitWeights = new double[numSegmentsTotal]; + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + unitWeights[iSeg] = 1.0; + } + + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions for output variable " + Util::toString(out)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Calculate response functions by the ordinary least square method + double coherence(0.0); + std::complex resp0(0.0, 0.0); + std::complex resp1(0.0, 0.0); + double* weights = new double[numSegmentsTotal]; + double sumOfWeights(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + weights[iSeg] = 1.0; + sumOfWeights += weights[iSeg]; + } + if (sumOfWeights < CommonParameters::EPS) { + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + std::complex* residuals = new std::complex[numSegmentsTotal]; + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions by the ordinary least square method"); + calculateResponseFunctionByWLSRemoteReference(ftval[out], ftval[rr0], ftval[rr1], ftval[rr0], ftval[rr1], + numSegmentsTotal, weights, residuals, resp0, resp1, coherence); + coherenceOut = coherence; + std::vector titles; + std::vector* outputValues = new std::vector[numSegmentsTotal]; + const bool outputResidual = !forJackknife && ptrControl->getOutputLevel() >= 2; + if (outputResidual) { + titles.push_back("OLS"); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + outputValues[iSeg].push_back(residuals[iSeg].real()); + outputValues[iSeg].push_back(residuals[iSeg].imag()); + outputValues[iSeg].push_back(weights[iSeg]); + } + } + double absMaxResidual(0.0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + const double absResidual = std::abs(residuals[iSeg]); + if (absResidual > absMaxResidual) { + absMaxResidual = absResidual; + } + } + if (absMaxResidual < CommonParameters::EPS) { + // Such a case where the remote reference field is equivalent to the input field + ptrOutputFiles->writeCvgMessage("Robust method is not performed because residuals is nearly zero"); + }else{ + double scale = RobustWeight::calculateScaleByMADN(numSegmentsTotal, residuals); + // Calculate response functions by regression using the first M-estimator + calculateResponseFunctionsByIRWLSRemoteReference(0, ftval[out], ftval[rr0], ftval[rr1], ftval[rr0], ftval[rr1], + numSegmentsTotal, false, scale, unitWeights, weights, residuals, resp0, resp1, coherence, titles, outputValues); + // Calculate response functions by regression using the second M-estimator + calculateResponseFunctionsByIRWLSRemoteReference(1, ftval[out], ftval[rr0], ftval[rr1], ftval[rr0], ftval[rr1], + numSegmentsTotal, true, scale, unitWeights, weights, residuals, resp0, resp1, coherence, titles, outputValues); + coherenceOut = coherence; + } + if (!forJackknife && ptrControl->getOutputLevel() > 0) { + // Output spectral density functions to cvg file + outputSpectralDensityFunctionsToCvgFile(numSegmentsTotal, timeLength, ftval[out], ftval[rr0], ftval[rr1], weights); + } + respOut0 = resp0; + respOut1 = resp1; + + if (outputResidual) { + std::ostringstream oss; + oss << "segm" << iSegLen << "_index" << freqDegree << "_output" << out << "_residuals.csv"; + writeResiduals(oss.str(), numSegmentsTotal, times, titles, outputValues); + } + + // Release memory + delete[] residuals; + delete[] outputValues; + delete[] weights; + delete[] unitWeights; + +} + +// Estimate error by strict bootstrap +void AnalysisTest::strictBootstrap(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Strict bootstrap is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + const int numInputVariables = ptrControl->getNumInputVariables(); + assert(numInputVariables == 2); + + // Copy Fourier transformed values + const int numChannels = ptrControl->getNumberOfChannels(); + std::complex** ftvalForBootstrap = new std::complex*[numChannels]; + for (int iChan = 0; iChan < numChannels; ++iChan) { + ftvalForBootstrap[iChan] = new std::complex[numSegmentsTotal]; + } +#ifdef _DEBUG_WRITE + for (int iChan = 0; iChan < numChannels; ++iChan) { + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + std::cout << iChan << " " << iSeg << " " << ftval[iChan][iSeg] << std::endl; + } + } +#endif + + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex** resp0Sample = new std::complex*[numOfSamples]; + std::complex** resp1Sample = new std::complex*[numOfSamples]; + int* segmentIndexes = new int[numSegmentsTotal]; + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + // Make bootstrap samples + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } +#ifdef _DEBUG_WRITE + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + std::cout << iSeg << " " << segmentIndexes[iSeg] << std::endl; + } +#endif + // Copy data + for (int iChan = 0; iChan < numChannels; ++iChan) { + for (int icount = 0; icount < numSegmentsTotal; ++icount) { + const int iSeg = segmentIndexes[icount]; + ftvalForBootstrap[iChan][icount] = ftval[iChan][iSeg]; + } + } + std::complex* istf0 = new std::complex[numOutputVariables + numInputVariables]; + std::complex* istf1 = new std::complex[numOutputVariables + numInputVariables]; + int icount(0); + for (int iOut = 0; iOut < numOutputVariables; ++iOut, ++icount) { + const int index = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + double coherence(0.0); + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftvalForBootstrap, times, + ofsResp, ofsRhoaPhs, true, index, istf0[icount], istf1[icount], coherence); + } + for (int iInp = 0; iInp < numInputVariables; ++iInp, ++icount) { + const int index = ptrControl->getChannelIndex(CommonParameters::INPUT, iInp); + double coherence(0.0); + calculateResponseFunctionsAux(iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftvalForBootstrap, times, + ofsResp, ofsRhoaPhs, true, index, istf0[icount], istf1[icount], coherence); + } +#ifdef _DEBUG_WRITE + for (int i = 0; i < numOutputVariables + numInputVariables; ++i) { + std::cout << i << " " << iSample << " " << istf0[i] << " " << istf1[i] << std::endl; + } +#endif + resp0Sample[iSample] = new std::complex[numOutputVariables]; + resp1Sample[iSample] = new std::complex[numOutputVariables]; + const std::complex Txx = istf0[numOutputVariables]; + const std::complex Txy = istf1[numOutputVariables]; + const std::complex Tyx = istf0[numOutputVariables + 1]; + const std::complex Tyy = istf1[numOutputVariables + 1]; + const std::complex det = Txx * Tyy - Txy * Tyx; + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if (std::abs(det) < CommonParameters::EPS) { + ptrOutputFiles->writeErrorMessage("Determinant is too small: " + Util::toString(std::abs(det))); + } + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + const int index = ptrControl->getChannelIndex(CommonParameters::OUTPUT, iOut); + const std::complex U_x = istf0[index]; + const std::complex U_y = istf1[index]; + resp0Sample[iSample][iOut] = (U_x * Tyy - U_y * Tyx) / det; + resp1Sample[iSample][iOut] = (U_y * Txx - U_x * Txy) / det; + } + delete [] istf0; + delete [] istf1; + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + +#ifdef _DEBUG_WRITE + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + std::cout << iOut << " " << iSample << " " << resp0Sample[iSample][iOut] << " " << resp1Sample[iSample][iOut] << std::endl; + } + } +#endif + + // Calculate error of response functions + assert(numOfSamples > 2); + for (int iOut = 0; iOut < numOutputVariables; ++iOut) { + // Calculate average + std::complex average0 = std::complex(0.0, 0.0); + std::complex average1 = std::complex(0.0, 0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + average0 += resp0Sample[iSample][iOut]; + average1 += resp1Sample[iSample][iOut]; + } + average0 /= static_cast(numOfSamples); + average1 /= static_cast(numOfSamples); + // Calculate variance + double variance0(0.0); + double variance1(0.0); + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + variance0 += std::norm(resp0Sample[iSample][iOut] - average0); + variance1 += std::norm(resp1Sample[iSample][iOut] - average1); + } + variance0 /= static_cast(2 * numOfSamples - 4); + variance1 /= static_cast(2 * numOfSamples - 4); + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if (ptrControl->doesOutputApparentResistivityAndPhase()) { + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + // Release memory + for (int iChan = 0; iChan < numChannels; ++iChan) { + delete[] ftvalForBootstrap[iChan]; + } + delete[] ftvalForBootstrap; + for (int iSample = 0; iSample < numOfSamples; ++iSample) { + delete[] resp0Sample[iSample]; + delete[] resp1Sample[iSample]; + } + delete[] resp0Sample; + delete[] resp1Sample; + delete[] segmentIndexes; + +} + +// Write residuals +void AnalysisTest::writeResiduals(const std::string& fileName, const int numSegmentsTotal, + const std::vector< std::pair >& times, const std::vector& titles, const std::vector* outputValues) const { + + std::ofstream ofs; + ofs.open(fileName.c_str(), std::ios::out); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if (ofs.fail()) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + ofs << "index"; + ofs << ",start_time,end_time"; + for (std::vector::const_iterator itr = titles.begin(); itr != titles.end(); ++itr) { + ofs << ",residual_real_" << *itr; + ofs << ",residual_imag_" << *itr; + ofs << ",weight_" << *itr; + } + ofs << std::endl; + + int index(0); + for (int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg) { + ofs << index; + const std::string timeStart = times[iSeg].first; + const std::string timeEnd = times[iSeg].second; + ofs << "," << timeStart << "," << timeEnd; + for (std::vector::const_iterator itr = outputValues[index].begin(); itr != outputValues[index].end(); ++itr) { + ofs << "," << std::setprecision(10) << std::scientific << *itr; + } + ofs << std::endl; + ++index; + } + ofs.close(); + +} \ No newline at end of file diff --git a/src/AnalysisTest.h b/src/AnalysisTest.h new file mode 100644 index 0000000..9d22a3e --- /dev/null +++ b/src/AnalysisTest.h @@ -0,0 +1,70 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ANALYSIS_TEST +#define DBLDEF_ANALYSIS_TEST + +#include "Analysis.h" + +// Class of test +class AnalysisTest : public Analysis { + +public: + + // Default constructer + AnalysisTest(); + + // Destructer + virtual ~AnalysisTest(); + +private: + + // Calculate response functions + virtual void calculateResponseFunctions( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ); + + void parametricErrorEstimation() const; + + void calculateResponseFunctionsAux(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const bool forJackknife, const int out, std::complex& respOut0, std::complex& respOut1, + double& coherenceOut ) const; + + // Estimate errors by strict bootstrap + void strictBootstrap(const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1 ) const; + + // Write residuals + void writeResiduals(const std::string& fileName, const int numSegmentsTotal, + const std::vector< std::pair >& times, const std::vector& titles, const std::vector* outputValues) const; + +}; + +#endif diff --git a/src/AnalysisTwoStage.cpp b/src/AnalysisTwoStage.cpp new file mode 100644 index 0000000..0bc0126 --- /dev/null +++ b/src/AnalysisTwoStage.cpp @@ -0,0 +1,1153 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "AnalysisTwoStage.h" +#include "Control.h" +#include "OutputFiles.h" + +#include +#include +#include +#include +#include +#ifdef _MERSENNE_TWISTER_ORIGINAL +#else +#include +#endif + +#include "Util.h" + +#ifdef _MERSENNE_TWISTER_ORIGINAL +#include "mt64.h" +#endif + +// Default constructer +AnalysisTwoStage::AnalysisTwoStage() +{ +} + +// Destructer +AnalysisTwoStage::~AnalysisTwoStage() +{ +} + +// Calculate response functions +void AnalysisTwoStage::calculateResponseFunctions( const int iSegLen, const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ){ + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + std::complex* resp0 = new std::complex[numOutputVariables]; + std::complex* resp1 = new std::complex[numOutputVariables]; + double** hatDiagonals = new double* [numOutputVariables]; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + hatDiagonals[iOut] = new double [numSegmentsTotal]; + } + // Estimate response functions + calculateResponseFunctionsAux( iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, false, resp0, resp1, hatDiagonals ); + + if( ptrControl->getErrorEstimationMethod() == Control::SUBSET_DELETION_JACKKNIFE ){ + subsetDeletionJackknife( iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, resp0, resp1, hatDiagonals ); + } + else if( ptrControl->getErrorEstimationMethod() == Control::STRICT_BOOTSTRAP ){ + strictBootstrap( iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftval, times, ofsResp, ofsRhoaPhs, resp0, resp1 ); + } + + delete [] resp0; + delete [] resp1; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + delete [] hatDiagonals[iOut]; + } + delete [] hatDiagonals; + +} + +void AnalysisTwoStage::calculateResponseFunctionsAux( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const bool forJackknife, + std::complex* respOut0, std::complex* respOut1, double** hatDiagsOut ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + ptrOutputFiles->writeLogMessage("Calculate response functions by two stage procedure"); + ptrOutputFiles->writeCvgMessage("================================================================================"); + ptrOutputFiles->writeCvgMessage("Now Frequency(Hz): " + Util::toString(freq) + ", Period(s): " + Util::toString(1.0/freq)); + ptrOutputFiles->writeCvgMessage("================================================================================"); + const Control* const ptrControl = Control::getInstance(); + + // First stage + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Start the first stage processing"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + const int numInputVariables = ptrControl->getNumInputVariables(); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + const bool outputResidual = !forJackknife && ptrControl->getOutputLevel() >= 2; + // Parameters used in the second stage + double* weights1stStage = new double[numSegmentsTotal]; + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + weights1stStage[iSeg] = 1.0; + } + std::complex** dataSyn = new std::complex*[numInputVariables]; + for( int iInVar = 0; iInVar < numInputVariables; ++iInVar ){ + dataSyn[iInVar] = new std::complex[numSegmentsTotal]; + } + for( int iInVar = 0; iInVar < numInputVariables; ++iInVar ){ + assert( numRemoteReferenceVariables == 2 ); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions for input variable " + Util::toString(iInVar)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Calculate response functions by ordinary least square method + double coherence(0.0); + std::complex resp0(0.0, 0.0); + std::complex resp1(0.0, 0.0); + double* weights = new double[numSegmentsTotal]; + double sumOfWeights(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + weights[iSeg] = 1.0; + sumOfWeights += weights[iSeg]; + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + std::cout << "iSeg weights: " << iSeg << " " << weights[iSeg] << std::endl; + } +#endif + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + std::complex* residuals = new std::complex[numSegmentsTotal]; + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions by the ordinary least square method"); + calculateResponseFunctionsByWLSForFirstStage( iInVar, numSegmentsTotal, ftval, weights, residuals, resp0, resp1, coherence ); + std::vector titles; + std::vector* outputValues = new std::vector[numSegmentsTotal]; + if( outputResidual ){ + titles.push_back("OLS"); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + outputValues[iSeg].push_back(residuals[iSeg].real()); + outputValues[iSeg].push_back(residuals[iSeg].imag()); + outputValues[iSeg].push_back(weights[iSeg]); + } + } + double absMaxResidual(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + const double absResidual = std::abs(residuals[iSeg]); + if( absResidual > absMaxResidual ){ + absMaxResidual = absResidual; + } + } + bool skipRobustMethod(false); + if( absMaxResidual < CommonParameters::EPS ){ + // Such a case where the remote reference field is equivalent to the input field + ptrOutputFiles->writeCvgMessage("Robust method is not performed because residuals is nearly zero"); + skipRobustMethod = true; + } + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + if(!skipRobustMethod){ + double* hatDiagonals = new double[numSegmentsTotal]; + const double maxHatDiagOrg = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, rr0, rr1, ftval, weights, hatDiagonals ); + double sumOfWeights(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + sumOfWeights += weights[iSeg]; + } + const double maxYOrg = maxHatDiagOrg * sumOfWeights / 2; + double* leverageWeights = new double[numSegmentsTotal]; + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + // The leverage weights are initialized with original weights + leverageWeights[iSeg] = 1.0; + } + // Outer loop by gradual downweighting of leverage points + const Control::ParamsForTreatmentOfHatMatrix paramsLeverageWeights = ptrControl->getParamsForTreatmentOfHatMatrix(); + const double chiFinal = paramsLeverageWeights.threshold; + int numOuterIteration = 1; + double baseNumber = 2; + if( paramsLeverageWeights.applyLeverageWeights && maxYOrg > chiFinal ){ + assert( maxYOrg > 0.0 ); + numOuterIteration += static_cast( log(maxYOrg/chiFinal)/log(baseNumber) ) + 1; + } + if( numOuterIteration > paramsLeverageWeights.maxNumberOfOuterIteration ){ + baseNumber = pow( maxYOrg/chiFinal, 1.0/(static_cast(paramsLeverageWeights.maxNumberOfOuterIteration) - 1.0) ); + numOuterIteration = paramsLeverageWeights.maxNumberOfOuterIteration; + } + double scale = RobustWeight::calculateScaleByMADN(numSegmentsTotal, residuals); + // Calculate hat matris diagonals + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Maximum number of the outer iteration: " + Util::toString(numOuterIteration)); + for( int outerIter = 0; outerIter < numOuterIteration; ++outerIter ){ + const double chi = std::max( maxYOrg / pow(baseNumber, outerIter), chiFinal ); + double sumOfWeights(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + sumOfWeights += weights[iSeg]; + } + if( sumOfWeights < CommonParameters::EPS ){ + const std::string msg = "Iteration is finished because the sum of weights (" + Util::toString(sumOfWeights) + ") is too small"; + ptrOutputFiles->writeCvgMessage(msg); + ptrOutputFiles->writeWarningMessage(msg); + break; + } + const double hatDiagExpected = 2.0 / sumOfWeights; + const double maxHatDiag = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, rr0, rr1, ftval, weights, hatDiagonals ); + const double maxY = maxHatDiag / hatDiagExpected; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Outer iteration " + Util::toString(outerIter)); + ptrOutputFiles->writeCvgMessage("Maximum value of statistic y: " + Util::toString(maxY)); + ptrOutputFiles->writeCvgMessage("Target chi value: " + Util::toString(chi)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + if( paramsLeverageWeights.applyLeverageWeights ){ + // Calculate leverage weights + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + // The leverage weights are initialized with unity + const double term0 = exp( exp( - chi * chi ) ); + const double y = hatDiagonals[iSeg] / hatDiagExpected; + const double term1 = exp( - exp( chi * (y - chi) ) ); + leverageWeights[iSeg] *= term0 * term1; +#ifdef _DEBUG_WRITE + std::cout << "iSeg hatDiagonals y term0*term1 leverageWeights: " << + iSeg << " " << hatDiagonals[iSeg] << " " << y << " " << term0*term1 << " " << leverageWeights[iSeg] << std::endl; +#endif + } + } + if( outputResidual ){ + titles.push_back("outer_"+Util::toString(outerIter)); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + outputValues[iSeg].push_back(hatDiagonals[iSeg]/hatDiagExpected); + outputValues[iSeg].push_back(leverageWeights[iSeg]); + } + } + // Calculate response functions by linear regression using the first M-estimator + calculateResponseFunctionsByIRWLSForFirstStage(0, iInVar, numSegmentsTotal, false, scale, ftval, leverageWeights, weights, residuals, + resp0, resp1, coherence, titles, outputValues); + // Calculate response functions by linear regression using the second M-estimator + calculateResponseFunctionsByIRWLSForFirstStage(1, iInVar, numSegmentsTotal, true, scale, ftval, leverageWeights, weights, residuals, + resp0, resp1, coherence, titles, outputValues); + } + delete [] hatDiagonals; + delete [] leverageWeights; + if( ptrControl->getOutputLevel() > 0 ){ + // Output spectral density functions to cvg file + const int inp = ptrControl->getChannelIndex( CommonParameters::INPUT, iInVar ); + outputSpectralDensityFunctionsToCvgFile( numSegmentsTotal, timeLength, ftval[inp], ftval[rr0], ftval[rr1], weights ); + } + } + // Output responses at the first stage + std::ostringstream msg; + msg << "Responses at the 1st stage: "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp0.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp0.imag() << "), "; + msg << "(" << std::setw(12) << std::setprecision(4) << std::scientific << resp1.real() << "," + << std::setw(12) << std::setprecision(4) << std::scientific << resp1.imag() << ")"; + ptrOutputFiles->writeCvgMessage(msg.str()); + // Copy parameters used for the second stage + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + if( weights[iSeg] < weights1stStage[iSeg] ){ + weights1stStage[iSeg] = weights[iSeg]; + } + dataSyn[iInVar][iSeg] = resp0 * ftval[rr0][iSeg] + resp1 * ftval[rr1][iSeg]; +#ifdef _DEBUG_WRITE + const int inp = ptrControl->getChannelIndex( CommonParameters::INPUT, iInVar ); + std::cout << iSeg << " " << ftval[rr0][iSeg] << " " << ftval[rr1][iSeg] << " " << resp0 << " " << resp1 << " " << dataSyn[iInVar][iSeg] << std::endl; +#endif + } + if( outputResidual ){ + std::ostringstream oss; + oss << "segm" << iSegLen << "_index" << freqDegree << "_output" << iInVar << "_residuals_first_stage.csv"; + writeResiduals( oss.str(), numSegmentsTotal, times, titles, outputValues ); + } + // Release memory + delete [] residuals; + delete [] outputValues; + delete [] weights; + } + if( !forJackknife && ptrControl->doesOutputFreqDomainDataToCsv() ){ + outputSyntheticInputData( iSegLen, freqDegree, numSegmentsTotal, dataSyn ); + } + // Second stage + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Start the second stage processing"); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + if( !forJackknife ){ + ofsResp << std::setprecision(10) << std::scientific << freq; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0/freq; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::setprecision(10) << std::scientific << freq; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0/freq; + } + } + const int numOutputVariables = ptrControl->getNumOutputVariables(); + double** weightsFinal = new double*[numOutputVariables]; + for( int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar ){ + weightsFinal[iOutVar] = NULL;// Initialize + } + for( int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar ){ + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions for output variable " + Util::toString(iOutVar)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + // Calculate response functions by ordinary least square method + double coherence(0.0); + std::complex resp0(0.0, 0.0); + std::complex resp1(0.0, 0.0); + double* weights = new double[numSegmentsTotal]; + double sumOfWeights(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + weights[iSeg] = weights1stStage[iSeg]; + sumOfWeights += weights[iSeg]; + } + if( sumOfWeights < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Sum of weights is too small: " + Util::toString(sumOfWeights)); + } + std::complex* residuals = new std::complex[numSegmentsTotal]; + ptrOutputFiles->writeCvgAndLogMessage("Calculate response functions by the ordinary least square method"); + calculateResponseFunctionsByWLSForSecondStage( iOutVar, numSegmentsTotal, ftval, dataSyn, weights, residuals, resp0, resp1, coherence ); + std::vector titles; + std::vector* outputValues = new std::vector[numSegmentsTotal]; + if( outputResidual ){ + titles.push_back("OLS"); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + outputValues[iSeg].push_back(residuals[iSeg].real()); + outputValues[iSeg].push_back(residuals[iSeg].imag()); + outputValues[iSeg].push_back(weights[iSeg]); + } + } + double absMaxResidual(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + const double absResidual = std::abs(residuals[iSeg]); + if( absResidual > absMaxResidual ){ + absMaxResidual = absResidual; + } + } + bool skipRobustMethod(false); + if( absMaxResidual < CommonParameters::EPS ){ + // Such a case where the remote reference field is equivalent to the input field + ptrOutputFiles->writeCvgMessage("Robust method is not performed because residuals is nearly zero"); + skipRobustMethod = true; + } + if(!skipRobustMethod){ + // Calculate hat matris diagonals + double* hatDiagonals = new double[numSegmentsTotal]; + assert( numInputVariables == 2 ); + const double maxHatDiagOrg = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, 0, 1, dataSyn, weights, hatDiagonals ); + double sumOfWeights(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + sumOfWeights += weights[iSeg]; + } + const double maxYOrg = maxHatDiagOrg * sumOfWeights / 2; + double* leverageWeights = new double[numSegmentsTotal]; + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + leverageWeights[iSeg] = weights1stStage[iSeg]; +#ifdef _DEBUG_WRITE + std::cout << "iSeg leverageWeights: " << iSeg << " " << leverageWeights[iSeg] << std::endl; +#endif + } + // Outer loop by gradual downweighting of leverage points + const Control::ParamsForTreatmentOfHatMatrix paramsLeverageWeights = ptrControl->getParamsForTreatmentOfHatMatrix(); + const double chiFinal = paramsLeverageWeights.threshold; + int numOuterIteration = 1; + double baseNumber = 2; + if( paramsLeverageWeights.applyLeverageWeights && maxYOrg > chiFinal ){ + assert( maxYOrg > 0.0 ); + numOuterIteration += static_cast( log(maxYOrg/chiFinal)/log(baseNumber) ) + 1; + } + if( numOuterIteration > paramsLeverageWeights.maxNumberOfOuterIteration ){ + baseNumber = pow( maxYOrg/chiFinal, 1.0/(static_cast(paramsLeverageWeights.maxNumberOfOuterIteration) - 1.0) ); + numOuterIteration = paramsLeverageWeights.maxNumberOfOuterIteration; + } + double scale = RobustWeight::calculateScaleByMADN(numSegmentsTotal, residuals); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Maximum number of the outer iteration: " + Util::toString(numOuterIteration)); + for( int outerIter = 0; outerIter < numOuterIteration; ++outerIter ){ + const double chi = std::max( maxYOrg / pow(baseNumber, outerIter), chiFinal ); + double sumOfWeights(0.0); + for( int iSeg = 0 ; iSeg < numSegmentsTotal; ++iSeg){ + sumOfWeights += weights[iSeg]; + } + if( sumOfWeights < CommonParameters::EPS ){ + const std::string msg = "Iteration is finished because the sum of weights (" + Util::toString(sumOfWeights) + ") is too small"; + ptrOutputFiles->writeCvgMessage(msg); + ptrOutputFiles->writeWarningMessage(msg); + break; + } + const double hatDiagExpected = 2.0 / sumOfWeights; + const double maxHatDiag = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, 0, 1, dataSyn, weights, hatDiagonals ); + const double maxY = maxHatDiag / hatDiagExpected; + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); + ptrOutputFiles->writeCvgMessage("Outer iteration " + Util::toString(outerIter)); + ptrOutputFiles->writeCvgMessage("Maximum value of statistic y: " + Util::toString(maxY)); + ptrOutputFiles->writeCvgMessage("Target chi value: " + Util::toString(chi)); + ptrOutputFiles->writeCvgMessage("--------------------------------------------------------------------------------"); +#ifdef _DEBUG_WRITE + std::cout << "hatDiagExpected maxHatDiag maxY chi: " << hatDiagExpected << " " << maxHatDiag << " " <getOutputLevel() > 0 ){ + // Output spectral density functions to cvg file + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOutVar ); + outputSpectralDensityFunctionsToCvgFile( numSegmentsTotal, timeLength, ftval[out], dataSyn[0], dataSyn[1], weights ); + } + } + respOut0[iOutVar] = resp0; + respOut1[iOutVar] = resp1; + if( !forJackknife ){ + const double maxHatDiag = calculateDiagonalComponentsOfHatMatrix( numSegmentsTotal, 0, 1, dataSyn, weights, hatDiagsOut[iOutVar] ); + // Output results + ofsResp << "," << std::setprecision(10) << std::scientific << resp0.real(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp0.imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp1.real(); + ofsResp << "," << std::setprecision(10) << std::scientific << resp1.imag(); + ofsResp << "," << std::setprecision(10) << std::scientific << coherence; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, resp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(resp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivity(freq, resp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhase(resp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << coherence; + } + weightsFinal[iOutVar] = new double[numSegmentsTotal]; + memcpy(weightsFinal[iOutVar], weights, sizeof(double)*numSegmentsTotal); + } + if( outputResidual ){ + std::ostringstream oss; + oss << "segm" << iSegLen << "_index" << freqDegree << "_output" << iOutVar << "_residuals_second_stage.csv"; + writeResiduals( oss.str(), numSegmentsTotal, times, titles, outputValues ); + } + // Release memory + delete [] residuals; + delete [] outputValues; + delete [] weights; + } + // Release memory + delete [] weights1stStage; + + const int typeOfErrorEstimationMethod = ptrControl->getErrorEstimationMethod(); + switch(typeOfErrorEstimationMethod){ + case Control::FIXED_WEIGHTS_JACKKNIFE: + // Fixed-weights jackknife + fixedWeightsJackknife( freq, numSegmentsTotal, weightsFinal, ftval, dataSyn, ofsResp, ofsRhoaPhs, respOut0, respOut1, hatDiagsOut ); + break; + case Control::FIXED_WEIGHTS_BOOTSTRAP: + // Fixed-weights bootstrap + fixedWeightsBootstrap( freq, numSegmentsTotal, weightsFinal, ftval, dataSyn, ofsResp, ofsRhoaPhs, respOut0, respOut1 ); + break; + case Control::SUBSET_DELETION_JACKKNIFE: + // Go through + case Control::STRICT_BOOTSTRAP: + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(typeOfErrorEstimationMethod)); + break; + } + + // Release memory + for( int iInVar = 0; iInVar < numInputVariables; ++iInVar ){ + delete [] dataSyn[iInVar]; + } + delete [] dataSyn; + for( int iOutVar = 0; iOutVar < numOutputVariables; ++iOutVar ){ + if( weightsFinal[iOutVar] != NULL ){ + delete [] weightsFinal[iOutVar]; + } + } + delete [] weightsFinal; + +} + +// Calculate response functions by iteratively reweighted least squares for the first stage +void AnalysisTwoStage::calculateResponseFunctionsByIRWLSForFirstStage(const int iRobustWeight, const int inputVariableIndex, + const int numSegments, const bool fixScale, double& scale, std::complex** data, const double* const leverageWeights, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, + double& coherence, std::vector& titles, std::vector* outputValues) const { + + const Control* const ptrControl = Control::getInstance(); + const int inp = ptrControl->getChannelIndex(CommonParameters::INPUT, inputVariableIndex); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert(numRemoteReferenceVariables >= 2); + const int rr0 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 0); + const int rr1 = ptrControl->getChannelIndex(CommonParameters::REMOTE_REFERENCE, 1); + const bool priorityOnFirst = (inputVariableIndex % 2 == 0) ? true : false;// Priority on diagonals + + calculateResponseFunctionsByIRWLS(iRobustWeight, data[inp], data[rr0], data[rr1], numSegments, fixScale, scale, leverageWeights, + weights, residuals, resp0, resp1, coherence, titles, outputValues, priorityOnFirst); + +} + +// Calculate response functions by iteratively reweighted least squares for the second stage +void AnalysisTwoStage::calculateResponseFunctionsByIRWLSForSecondStage(const int iRobustWeight, const int outputVariableIndex, + const int numSegments, const bool fixScale, double& scale, std::complex** data, std::complex** dataSyn, const double* const leverageWeights, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence, + std::vector& titles, std::vector* outputValues) const { + + const Control* const ptrControl = Control::getInstance(); + const int out = ptrControl->getChannelIndex(CommonParameters::OUTPUT, outputVariableIndex); + const bool priorityOnFirst = (outputVariableIndex % 2 == 0) ? false : true;// Priority on off-diagonals + + calculateResponseFunctionsByIRWLS(iRobustWeight, data[out], dataSyn[0], dataSyn[1], numSegments, fixScale, scale, leverageWeights, + weights, residuals, resp0, resp1, coherence, titles, outputValues, priorityOnFirst); + +} + +// Calculate response function by the weighted least square method for the first stage +void AnalysisTwoStage::calculateResponseFunctionsByWLSForFirstStage( const int inputVariableIndex, const int numSegments, std::complex** data, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int inp = ptrControl->getChannelIndex( CommonParameters::INPUT, inputVariableIndex ); + const int numRemoteReferenceVariables = ptrControl->getNumRemoteReferenceVariables(); + assert( numRemoteReferenceVariables >= 2 ); + const int rr0 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 0 ); + const int rr1 = ptrControl->getChannelIndex( CommonParameters::REMOTE_REFERENCE, 1 ); + const bool priorityOnFirst = ( inputVariableIndex % 2 == 0 ) ? true : false;// Priority on diagonals + + calculateResponseFunctionByWLS( data[inp], data[rr0], data[rr1], numSegments, weights, residuals, resp0, resp1, coherence, priorityOnFirst ); + +} + +// Calculate response function by the weighted least square method for the second stage +void AnalysisTwoStage::calculateResponseFunctionsByWLSForSecondStage( const int outputVariableIndex, const int numSegments, std::complex** data, + std::complex** dataSyn, double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence ) const{ + + const Control* const ptrControl = Control::getInstance(); + const int out = ptrControl->getChannelIndex( CommonParameters::OUTPUT, outputVariableIndex ); + const bool priorityOnFirst = ( outputVariableIndex % 2 == 0 ) ? false : true;// Priority on off-diagonals + + calculateResponseFunctionByWLS( data[out], dataSyn[0], dataSyn[1], numSegments, weights, residuals, resp0, resp1, coherence, priorityOnFirst ); + +} + +// Perform fixed-weights jackknife +void AnalysisTwoStage::fixedWeightsJackknife( const double freq, const int numSegmentsTotal, double** weightsOrg, std::complex** ftval, + std::complex** dataSyn, std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, + const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Fixed-weights jackknife is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + double** weights = new double*[numOutputVariables]; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + weights[iOut] = new double[numSegmentsTotal]; + memcpy(weights[iOut], weightsOrg[iOut], sizeof(double)*numSegmentsTotal); + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + std::cout << weightsOrg[iOut][iSeg] << " "; + } + std::cout << std::endl; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + std::cout << weights[iOut][iSeg] << " "; + } + std::cout << std::endl; + } +#endif + + std::complex** pseudoResp0 = new std::complex*[numSegmentsTotal]; + std::complex** pseudoResp1 = new std::complex*[numSegmentsTotal]; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + pseudoResp0[iSeg] = new std::complex[numOutputVariables]; + pseudoResp1[iSeg] = new std::complex[numOutputVariables]; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + weights[iOut][iSeg] = 0.0;// Replace + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const bool priorityOnFirst = ( iOut % 2 == 0 ) ? false : true;// Priority on off-diagonals + std::complex temp0(0.0,0.0); + std::complex temp1(0.0,0.0); + calculateResponseFunctionByWLSAux( numSegmentsTotal, ftval[index], dataSyn[0], dataSyn[1], weights[iOut], temp0, temp1, priorityOnFirst ); + const double hatMatrixDiagonal = hatDiagonals[iOut][iSeg]; + double factor = static_cast(numSegmentsTotal) * (1.0 - hatMatrixDiagonal); + if( hatMatrixDiagonal > 1.0 ){ + factor= 0.0; + }else if( hatMatrixDiagonal < 0.0 ){ + factor = static_cast(numSegmentsTotal); + } + pseudoResp0[iSeg][iOut] = resp0[iOut] + factor * (resp0[iOut] - temp0); + pseudoResp1[iSeg][iOut] = resp1[iOut] + factor * (resp1[iOut] - temp1); + weights[iOut][iSeg] = weightsOrg[iOut][iSeg];// Restore + } + } + // Release memory + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + delete [] weights[iOut]; + } + delete [] weights; + + // Calculate & output error bars + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + if( numSegmentsTotal > 2 ){ + std::complex avgResp0(0.0, 0.0); + std::complex avgResp1(0.0, 0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + avgResp0 += pseudoResp0[iSeg][iOut]; + avgResp1 += pseudoResp1[iSeg][iOut]; + } + const double factor = 1.0 / static_cast(numSegmentsTotal); + avgResp0 *= factor; + avgResp1 *= factor; + double variance0(0.0); + double variance1(0.0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + variance0 += std::norm( pseudoResp0[iSeg][iOut] - avgResp0 ); + variance1 += std::norm( pseudoResp1[iSeg][iOut] - avgResp1 ); + } + const double factor2 = factor / static_cast(2 * numSegmentsTotal - 4); + variance0 *= factor2; + variance1 *= factor2; + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + }else{ + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + } + } + } + ofsResp << std::endl; + ofsResp.flush(); + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + // Release memory + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + delete [] pseudoResp0[iSeg]; + delete [] pseudoResp1[iSeg]; + } + delete [] pseudoResp0; + delete [] pseudoResp1; + +} + +// Perform fixed-weights bootstrap +void AnalysisTwoStage::fixedWeightsBootstrap( const double freq, const int numSegmentsTotal, double** weightsOrg, std::complex** ftval, + std::complex** dataSyn, std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, + const std::complex* const resp0, const std::complex* const resp1 ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Fixed-weights bootstrap is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + int* segmentIndexes = new int[numSegmentsTotal]; + + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex** resp0Sample = new std::complex*[numOfSamples]; + std::complex** resp1Sample = new std::complex*[numOfSamples]; +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + // Make bootstrap samples + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << segmentIndexes[iSeg] << std::endl; + } +#endif + resp0Sample[iSample] = new std::complex[numOutputVariables]; + resp1Sample[iSample] = new std::complex[numOutputVariables]; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + const int index = ptrControl->getChannelIndex( CommonParameters::OUTPUT, iOut ); + const bool priorityOnFirst = ( iOut % 2 == 0 ) ? false : true;// Priority on off-diagonals + std::complex temp0(0.0,0.0); + std::complex temp1(0.0,0.0); + calculateResponseFunctionByWLSForBootstrap( numSegmentsTotal, segmentIndexes, ftval[index], dataSyn[0], dataSyn[1], weightsOrg[iOut], + temp0, temp1, priorityOnFirst ); + resp0Sample[iSample][iOut] = temp0; + resp1Sample[iSample][iOut] = temp1; + } + } + delete [] segmentIndexes; + + // Calculate error of response functions + assert(numOfSamples > 2); + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + // Calculate average + std::complex average0 = std::complex(0.0, 0.0); + std::complex average1 = std::complex(0.0, 0.0); + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + average0 += resp0Sample[iSample][iOut]; + average1 += resp1Sample[iSample][iOut]; + } + average0 /= static_cast(numOfSamples); + average1 /= static_cast(numOfSamples); + // Calculate variance + double variance0(0.0); + double variance1(0.0); + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + variance0 += std::norm(resp0Sample[iSample][iOut] - average0); + variance1 += std::norm(resp1Sample[iSample][iOut] - average1); + } + variance0 /= static_cast(2 * numOfSamples - 4); + variance1 /= static_cast(2 * numOfSamples - 4); + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + // Release memory + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + delete [] resp0Sample[iSample]; + delete [] resp1Sample[iSample]; + } + delete [] resp0Sample; + delete [] resp1Sample; + +} + +// Output synthetic input data +void AnalysisTwoStage::outputSyntheticInputData( const int iSegLen, const int freqDegree, const int numSegmentsTotal, std::complex** dataSyn ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Output synthetic input data"); + + const Control* const ptrControl = Control::getInstance(); + for( int iInVar = 0; iInVar < ptrControl->getNumInputVariables(); ++iInVar ){ + const int iChan = ptrControl->getChannelIndex( CommonParameters::INPUT, iInVar ); + std::ostringstream fileName; + fileName << "syn_inp_data_segm" << iSegLen << "_index" << freqDegree << "_chan_" << iChan << ".csv"; + std::ofstream ofs; + ofs.open( fileName.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeLogMessage("File open error !! : " + fileName.str()); + } + ofs << "real,imaginary" << std::endl; + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + ofs << std::setprecision(12) << std::scientific << dataSyn[iInVar][iSeg].real() << ","; + ofs << std::setprecision(12) << std::scientific << dataSyn[iInVar][iSeg].imag() << std::endl; + } + ofs.close(); + } + +} + +// Estimate error by strict bootstrap +void AnalysisTwoStage::strictBootstrap( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, + const std::complex* const resp0, const std::complex* const resp1 ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Strict bootstrap is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + const int numOutputVariables = ptrControl->getNumOutputVariables(); + + // Copy Fourier transformed values + const int numChannels = ptrControl->getNumberOfChannels(); + std::complex** ftvalForBootstrap = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ftvalForBootstrap[iChan] = new std::complex[numSegmentsTotal]; + } + const int numOfSamples = ptrControl->getNumRepetitionsOfBootstrap(); + std::complex** resp0Sample = new std::complex*[numOfSamples]; + std::complex** resp1Sample = new std::complex*[numOfSamples]; + int* segmentIndexes = new int[numSegmentsTotal]; + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); +#ifdef _RAND + srand(1234); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + init_genrand64(1234); +#else + std::mt19937_64 gen(1234); + std::uniform_int_distribution uniformDistibution(0, numSegmentsTotal - 1); +#endif +#endif + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + // Make bootstrap samples + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ +#ifdef _RAND + segmentIndexes[iSeg] = (rand() / RAND_MAX) * (numSegmentsTotal - 1); +#else +#ifdef _MERSENNE_TWISTER_ORIGINAL + segmentIndexes[iSeg] = static_cast(genrand64_real1() * numSegmentsTotal); +#else + segmentIndexes[iSeg] = uniformDistibution(gen); +#endif +#endif + } +#ifdef _DEBUG_WRITE + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << iSeg << " " << segmentIndexes[iSeg] << std::endl; + } +#endif + // Copy data + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int icount = 0; icount < numSegmentsTotal; ++icount ){ + const int iSeg = segmentIndexes[icount]; + ftvalForBootstrap[iChan][icount] = ftval[iChan][iSeg]; + } + } + resp0Sample[iSample] = new std::complex[numOutputVariables]; + resp1Sample[iSample] = new std::complex[numOutputVariables]; + calculateResponseFunctionsAux( iSegLen, freqDegree, timeLength, freq, numSegmentsTotal, ftvalForBootstrap, times, + ofsResp, ofsRhoaPhs, true, resp0Sample[iSample], resp1Sample[iSample], NULL ); + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + + // Calculate error of response functions + assert(numOfSamples > 2); + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + // Calculate average + std::complex average0 = std::complex(0.0, 0.0); + std::complex average1 = std::complex(0.0, 0.0); + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + average0 += resp0Sample[iSample][iOut]; + average1 += resp1Sample[iSample][iOut]; + } + average0 /= static_cast(numOfSamples); + average1 /= static_cast(numOfSamples); + // Calculate variance + double variance0(0.0); + double variance1(0.0); + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + variance0 += std::norm(resp0Sample[iSample][iOut] - average0); + variance1 += std::norm(resp1Sample[iSample][iOut] - average1); + } + variance0 /= static_cast(2 * numOfSamples - 4); + variance1 /= static_cast(2 * numOfSamples - 4); + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + } + ofsResp << std::endl; + ofsResp.flush(); + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + // Release memory + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] ftvalForBootstrap[iChan]; + } + delete [] ftvalForBootstrap; + for( int iSample = 0; iSample < numOfSamples; ++iSample ){ + delete [] resp0Sample[iSample]; + delete [] resp1Sample[iSample]; + } + delete [] resp0Sample; + delete [] resp1Sample; + delete [] segmentIndexes; + +} + +// Perform subset deletion jackknife +void AnalysisTwoStage::subsetDeletionJackknife( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, + const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Subset deletion jackknife is performed to estimate errors"); + + const Control* const ptrControl = Control::getInstance(); + int numOmittedData = static_cast( 0.01 * ptrControl->getPercentageOfOmmitedDataSubsetDeletionJackknife() * static_cast(numSegmentsTotal) ); + if( numOmittedData < 1 ){ + numOmittedData = 1; + } + const int numOfSubsets = numSegmentsTotal / numOmittedData; + + ptrOutputFiles->writeLogMessage("Number of ommited data : " + Util::toString(numOmittedData)); + ptrOutputFiles->writeLogMessage("Number of subsets : " + Util::toString(numOfSubsets)); + ptrOutputFiles->stopToWriteCvgMessage(); + ptrOutputFiles->stopToWriteLogMessage(); + ptrOutputFiles->stopToWriteWarningMessage(); + + const int numOutputVariables = ptrControl->getNumOutputVariables(); + +#ifdef _DEBUG_WRITE + for( int iSeg = 0;iSeg < numSegmentsTotal; ++iSeg){ + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + std::cout << std::setw(15) << hatDiagonals[iOut][iSeg]; + } + std::cout << std::endl; + } + std::cout << std::endl; + for( int iChan = 0; iChan < ptrControl->getNumberOfChannels(); ++iChan ){ + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + std::cout << "iChan iSeg val: " << iChan << " " << iSeg << " " << ftval[iChan][iSeg] << std::endl; + } + } +#endif + + // Copy Fourier transformed values + const int numChannels = ptrControl->getNumberOfChannels(); + std::complex** ftvalForJackknife = new std::complex*[numChannels]; + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ftvalForJackknife[iChan] = new std::complex[numSegmentsTotal - numOmittedData]; + } + std::complex** pseudoResp0 = new std::complex*[numOfSubsets]; + std::complex** pseudoResp1 = new std::complex*[numOfSubsets]; + for( int iSubset = 0 ; iSubset < numOfSubsets; ++iSubset ){ + double* averageHatDiags = new double[numOutputVariables]; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + // Zero clear + averageHatDiags[iOut] = 0.0; + } + const int iSegOmitStart = iSubset * numOmittedData; + const int iSegOmitEnd = iSegOmitStart + numOmittedData; + assert(iSegOmitEnd <= numSegmentsTotal); + for( int iSeg = iSegOmitStart; iSeg < iSegOmitEnd; ++iSeg ){ + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + averageHatDiags[iOut] += hatDiagonals[iOut][iSeg]; + } + } + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + averageHatDiags[iOut] /= static_cast(numOmittedData); + } +#ifdef _DEBUG_WRITE + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + std::cout << std::setw(20) << averageHatDiags[iOut]; + } + std::cout << std::endl; +#endif + for( int iChan = 0; iChan < numChannels; ++iChan ){ + int icount(0); + for( int iSeg = 0; iSeg < iSegOmitStart; ++iSeg, ++icount ){ + ftvalForJackknife[iChan][icount] = ftval[iChan][iSeg]; + } + for( int iSeg = iSegOmitEnd; iSeg < numSegmentsTotal; ++iSeg, ++icount ){ + ftvalForJackknife[iChan][icount] = ftval[iChan][iSeg]; + } + assert(icount == numSegmentsTotal - numOmittedData); + } +#ifdef _DEBUG_WRITE + for( int iChan = 0; iChan < numChannels; ++iChan ){ + for( int i = 0; i < numSegmentsTotal - numOmittedData; ++i ){ + std::cout << "iChan i val: " << iChan << " " << i << " " << ftvalForJackknife[iChan][i] << std::endl; + } + } +#endif + std::complex* temp0 = new std::complex[numOutputVariables]; + std::complex* temp1 = new std::complex[numOutputVariables]; + calculateResponseFunctionsAux( iSegLen, freqDegree, timeLength, freq, numSegmentsTotal - numOmittedData, + ftvalForJackknife, times, ofsResp, ofsRhoaPhs, true, temp0, temp1, NULL ); + pseudoResp0[iSubset] = new std::complex[numOutputVariables]; + pseudoResp1[iSubset] = new std::complex[numOutputVariables]; + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + double factor = static_cast(numOfSubsets) * (1.0 - averageHatDiags[iOut]); + if( averageHatDiags[iOut] > 1.0 ){ + factor= 0.0; + }else if( averageHatDiags[iOut] < 0.0 ){ + factor = static_cast(numOfSubsets); + } + pseudoResp0[iSubset][iOut] = resp0[iOut] + factor * (resp0[iOut] - temp0[iOut]); + pseudoResp1[iSubset][iOut] = resp1[iOut] + factor * (resp1[iOut] - temp1[iOut]); + } + delete [] averageHatDiags; + delete [] temp0; + delete [] temp1; + } + ptrOutputFiles->restartToWriteCvgMessage(); + ptrOutputFiles->restartToWriteLogMessage(); + ptrOutputFiles->restartToWriteWarningMessage(); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + delete [] ftvalForJackknife[iChan]; + } + delete [] ftvalForJackknife; + + // Calculate & output error bars + for( int iOut = 0; iOut < numOutputVariables; ++iOut ){ + if( numOfSubsets > 2 ){ + std::complex avgResp0(0.0, 0.0); + std::complex avgResp1(0.0, 0.0); + for( int iSubset = 0 ; iSubset < numOfSubsets; ++iSubset ){ + avgResp0 += pseudoResp0[iSubset][iOut]; + avgResp1 += pseudoResp1[iSubset][iOut]; + } + const double factor = 1.0 / static_cast(numOfSubsets); + avgResp0 *= factor; + avgResp1 *= factor; + double variance0(0.0); + double variance1(0.0); + for( int iSubset = 0 ; iSubset < numOfSubsets; ++iSubset ){ + variance0 += std::norm( pseudoResp0[iSubset][iOut] - avgResp0 ); + variance1 += std::norm( pseudoResp1[iSubset][iOut] - avgResp1 ); + } + const double factor2 = factor / static_cast(2 * numOfSubsets - 4); + variance0 *= factor2; + variance1 *= factor2; + const double dResp0 = sqrt(variance0); + const double dResp1 = sqrt(variance1); + ofsResp << "," << std::setprecision(10) << std::scientific << dResp0; + ofsResp << "," << std::setprecision(10) << std::scientific << dResp1; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp0[iOut], dResp0); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcApparentResistivityError(freq, resp1[iOut], dResp1); + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << calcPhaseError(resp1[iOut], dResp1); + } + }else{ + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsResp << "," << std::setprecision(10) << std::scientific << 1.0e10; + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 1.0e10; + ofsRhoaPhs << "," << std::setprecision(10) << std::scientific << 180.0; + } + } + } + ofsResp << std::endl; + ofsResp.flush(); + if( ptrControl->doesOutputApparentResistivityAndPhase() ){ + ofsRhoaPhs << std::endl; + ofsRhoaPhs.flush(); + } + + for( int iSubset = 0 ; iSubset < numOfSubsets; ++iSubset ){ + delete [] pseudoResp0[iSubset]; + delete [] pseudoResp1[iSubset]; + } + delete [] pseudoResp0; + delete [] pseudoResp1; + +} + +// Write residuals +void AnalysisTwoStage::writeResiduals( const std::string& fileName, const int numSegmentsTotal, + const std::vector< std::pair >& times, const std::vector& titles, const std::vector* outputValues ) const{ + + std::ofstream ofs; + ofs.open( fileName.c_str(), std::ios::out ); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + fileName ); + } + ofs << "index"; + ofs << ",start_time,end_time"; + for( std::vector::const_iterator itr = titles.begin(); itr != titles.end(); ++itr ){ + if( itr->substr(0,6) == "outer_" ){ + ofs << ",statistic_y_" << *itr; + ofs << ",leverage_weight_" << *itr; + }else{ + ofs << ",residual_real_" << *itr; + ofs << ",residual_imag_" << *itr; + ofs << ",weight_" << *itr; + } + } + ofs << std::endl; + + int index(0); + for( int iSeg = 0; iSeg < numSegmentsTotal; ++iSeg ){ + ofs << index; + const std::string timeStart = times[iSeg].first; + const std::string timeEnd = times[iSeg].second; + ofs << "," << timeStart << "," << timeEnd; + for( std::vector::const_iterator itr = outputValues[index].begin(); itr != outputValues[index].end(); ++itr ){ + ofs << "," << std::setprecision(10) << std::scientific << *itr; + } + ofs << std::endl; + ++index; + } + ofs.close(); + +} diff --git a/src/AnalysisTwoStage.h b/src/AnalysisTwoStage.h new file mode 100644 index 0000000..fab2231 --- /dev/null +++ b/src/AnalysisTwoStage.h @@ -0,0 +1,109 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ANALYSIS_TWO_STAGE +#define DBLDEF_ANALYSIS_TWO_STAGE + +#include "Analysis.h" + +// Class of analysis for two stage remote reference approach +class AnalysisTwoStage : public Analysis { + +public: + + // Default constructer + AnalysisTwoStage(); + + // Destructer + virtual ~AnalysisTwoStage(); + +private: + + // Calculate the maximum value of hat matrix diagonals + double calculateMaximumValueOfHatMatrixDiagonals( ) const; + + // Calculate response functions + virtual void calculateResponseFunctions( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs ); + + void calculateResponseFunctionsAux( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const bool forJackknife, std::complex* respOut0, std::complex* respOut1, double** hatDiagsOut ) const; + + // Calculate response functions by iteratively reweighted least squares for the first stage + void calculateResponseFunctionsByIRWLSForFirstStage( const int iRobustWeight, const int inputVariableIndex, + const int numSegments, const bool fixScale, double& scale, std::complex** data, const double* const leverageWeights, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, + double& coherence, std::vector& titles, std::vector* outputValues ) const; + + // Calculate response functions by iteratively reweighted least squares for the second stage + void calculateResponseFunctionsByIRWLSForSecondStage( const int iRobustWeight, const int outputVariableIndex, + const int numSegments, const bool fixScale, double& scale, std::complex** data, std::complex** dataSyn, const double* const leverageWeights, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, + double& coherence, std::vector& titles, std::vector* outputValues ) const; + + // Calculate response function by the weighted least square method for the first stage + void calculateResponseFunctionsByWLSForFirstStage( const int inputVariableIndex, const int numSegments, std::complex** data, + double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, double& coherence ) const; + + // Calculate response function by the weighted least square method for the second stage + void calculateResponseFunctionsByWLSForSecondStage( const int outputVariableIndex, const int numSegments, std::complex** data, + std::complex** dataSyn, double* weights, std::complex* residuals, std::complex& resp0, std::complex& resp1, + double& coherence ) const; + + // Perform fixed-weights jackknife + void fixedWeightsJackknife( const double freq, const int numSegmentsTotal, double** weightsOrg, std::complex** ftval, + std::complex** dataSyn, std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, + const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals ) const; + + // Perform fixed-weights bootstrap + void fixedWeightsBootstrap( const double freq, const int numSegmentsTotal, double** weightsOrg, std::complex** ftval, + std::complex** dataSyn, std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, + const std::complex* const resp0, const std::complex* const resp1 ) const; + + // Output synthetic input data + void outputSyntheticInputData( const int iSegLen, const int freqDegree, const int numSegmentsTotal, std::complex** dataSyn ) const; + + // Estimate error by strict bootstrap + void strictBootstrap( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1 ) const; + + // Perform subset deletion jackknife + void subsetDeletionJackknife( const int iSegLen,const int freqDegree, const double timeLength, const double freq, + const int numSegmentsTotal, std::complex** ftval, const std::vector< std::pair >& times, + std::ofstream& ofsResp, std::ofstream& ofsRhoaPhs, const std::complex* const resp0, const std::complex* const resp1, double** hatDiagonals ) const; + + // Write residuals + void writeResiduals( const std::string& fileName, const int numSegmentsTotal, + const std::vector< std::pair >& times, const std::vector& titles, const std::vector* outputValues ) const; + +}; + +#endif diff --git a/src/Ats.cpp b/src/Ats.cpp new file mode 100644 index 0000000..ffbe75f --- /dev/null +++ b/src/Ats.cpp @@ -0,0 +1,456 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define snprintf _snprintf + +#include "Ats.h" +#include "Util.h" +#include "OutputFiles.h" +#include "CommonParameters.h" +#include "Control.h" + +// Default constructer +Ats::Ats(): + m_isCalADUResp(false) +{ +} + +// Destructer +Ats::~Ats(){ +} + +// Return the instance of the class +Ats* Ats::getInstance(){ + static Ats instance;// The only instance + return &instance; +} + +// Read ats file +void Ats::readAtsFile( const std::string& fileName, const int numSkipData, const int numDataPoints, double* data ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read data from "+fileName); + + FILE* fp = fopen(fileName.c_str(), "rb"); + if (fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + unsigned char* buff2bytes = new unsigned char[2]; + unsigned char* buff4bytes = new unsigned char[4]; + unsigned char* buff8bytes = new unsigned char[8]; + fread(buff2bytes, 2, 1, fp); + const int headerLength = bytesToInt16(buff2bytes); + fread(buff2bytes, 2, 1, fp); + const int headerVersion = bytesToInt16(buff2bytes); + fread(buff4bytes, 4, 1, fp); + const int numDataInFile = bytesToInt32(buff4bytes); + fread(buff4bytes, 4, 1, fp); + const float samplingFreq = bytesToFloat(buff4bytes); + fread(buff4bytes, 4, 1, fp); + const int startDate = bytesToInt32(buff4bytes); + fread(buff8bytes, 8, 1, fp); + const double lsbmv = bytesToDouble(buff8bytes); + unsigned char* buffRemaining = new unsigned char[headerLength - 24]; + fread(buffRemaining, headerLength - 24, 1, fp); + delete[] buffRemaining; + + if (numDataPoints + numSkipData > numDataInFile) { + ptrOutputFiles->writeErrorMessage("The number of data in the ATS file (" + Util::toString(numDataInFile) + + ") is lower than NSkip(" + Util::toString(numSkipData) + ") + NData(" + Util::toString(numDataPoints) + ")"); + }; + for (int i = 0; i < numSkipData; ++i) { + fread(buff4bytes, 4, 1, fp); + } + int icount(0); + for (int i = numSkipData; i < numSkipData + numDataPoints; ++i, ++icount) { + fread(buff4bytes, 4, 1, fp); + int32_t ibuf = bytesToInt32(buff4bytes); + data[icount] = static_cast(ibuf) * lsbmv; + } + fclose(fp); + + delete[] buff2bytes; + delete[] buff4bytes; + delete[] buff8bytes; + +} + +// Get calibration file name +std::string Ats::getCalibrationFileName( const int channelIndex ) const{ + + std::ostringstream fileName; + fileName << "channel" << channelIndex << ".cal"; + + return fileName.str(); + +} + +// Make calibration file +void Ats::makeCalibrationFile( const std::string& inputString, const int channelIndex, const std::vector& freq ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + const std::string outputFileName = getCalibrationFileName(channelIndex); + std::ofstream ofs; + ofs.open( outputFileName.c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error: " + outputFileName ); + } + + const int numFreq = static_cast(freq.size()); + if( numFreq < 1 ){ + ptrOutputFiles->writeErrorMessage( "Number of the frequencies for which calibrations are estimated is less than 1 : " + Util::toString(numFreq) ); + } + if( inputString.find("MFS06") != std::string::npos ){ + std::complex* calibFuncCoil = new std::complex[numFreq]; + calculateCalibrationFunctionForCoil( inputString, MFS06, freq, calibFuncCoil ); + ofs << std::setw(20) << std::scientific << std::setprecision(9) << 1.0 << std::endl; + ofs << std::setw(10) << numFreq << std::endl; + for( int iFreq = 0; iFreq < numFreq; ++iFreq ){ + std::complex invCal = 1.0 / calibFuncCoil[iFreq]; + if( isCalADUResp() ){ + invCal /= calculateCalibrationFunctionForADULFhannel(freq[iFreq]); + } + ofs << std::setw(20) << std::scientific << std::setprecision(9) << freq[iFreq]; + ofs << std::setw(20) << std::scientific << std::setprecision(9) << invCal.real(); + ofs << std::setw(20) << std::scientific << std::setprecision(9) << invCal.imag() << std::endl; + } + delete [] calibFuncCoil; + }else if( inputString.find("MFS07") != std::string::npos ){ + std::complex* calibFuncCoil = new std::complex[numFreq]; + calculateCalibrationFunctionForCoil( inputString, MFS07, freq, calibFuncCoil ); + ofs << std::setw(20) << std::scientific << std::setprecision(9) << 1.0 << std::endl; + ofs << std::setw(10) << numFreq << std::endl; + for( int iFreq = 0; iFreq < numFreq; ++iFreq ){ + std::complex invCal = 1.0 / calibFuncCoil[iFreq]; + if( isCalADUResp() ){ + invCal /= calculateCalibrationFunctionForADULFhannel(freq[iFreq]); + } + ofs << std::setw(20) << std::scientific << std::setprecision(9) << freq[iFreq]; + ofs << std::setw(20) << std::scientific << std::setprecision(9) << invCal.real(); + ofs << std::setw(20) << std::scientific << std::setprecision(9) << invCal.imag() << std::endl; + } + delete [] calibFuncCoil; + }else{ + // Channel for the electric field [mV/km] + // The input should be dipole length [m] + std::istringstream iss(inputString); + double dipoleLength(0.0); + iss >> dipoleLength; + dipoleLength /= -1000.0;// [m] -> [km] and invert sign + ofs << std::setw(20) << std::scientific << std::setprecision(9) << 1.0/dipoleLength << std::endl; + if( m_isCalADUResp ){ + ofs << std::setw(10) << numFreq << std::endl; + for( int iFreq = 0; iFreq < numFreq; ++iFreq ){ + const std::complex invCal = 1.0 / calculateCalibrationFunctionForADULFhannel(freq[iFreq]); + ofs << std::setw(20) << std::scientific << std::setprecision(9) << freq[iFreq]; + ofs << std::setw(20) << std::scientific << std::setprecision(9) << invCal.real(); + ofs << std::setw(20) << std::scientific << std::setprecision(9) << invCal.imag() << std::endl; + } + }else{ + ofs << std::setw(10) << 0 << std::endl; + } + } + + ofs.close(); + +} + +// Get flag specifing whether the calibration function for ADU is calculated +bool Ats::isCalADUResp() const{ + return m_isCalADUResp; +} + +// Set flag specifing whether the calibration function for ADU is calculated +void Ats::setIsCalADUResp( const bool isCalADUResp ){ + m_isCalADUResp = isCalADUResp; +} + +// Calculate calibration function for coil +void Ats::calculateCalibrationFunctionForCoil( const std::string& calibrationFile, const int coilType, + const std::vector& freq, std::complex* calibrationFunction ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ifstream ifs( calibrationFile.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + calibrationFile); + } + + ptrOutputFiles->writeLogMessage("Read calibration function from " + calibrationFile , false); + +#if 0 + int numFreqInCoilCalFile(0); + ifs >> numFreqInCoilCalFile; + double* freqInCoilCalFile = new double[numFreqInCoilCalFile]; + double* logFreqInCoilCalFile = new double[numFreqInCoilCalFile]; + double* amp = new double[numFreqInCoilCalFile]; + double* phs = new double[numFreqInCoilCalFile]; + for( int iFreq = 0; iFreq < numFreqInCoilCalFile; ++iFreq ){ + double dbuf(0.0); + ifs >> dbuf; + freqInCoilCalFile[iFreq] = dbuf; + logFreqInCoilCalFile[iFreq] = log10(dbuf); + ifs >> dbuf; + // [V/nT/Hz] => [mV/nT] + amp[iFreq] = dbuf * freqInCoilCalFile[iFreq] * 1000.0; + ifs >> dbuf; + // [deg] => [rad] + phs[iFreq] = dbuf * CommonParameters::DEG2RAD; + if( ifs.eof() ){ + ptrOutputFiles->writeErrorMessage("Number of frequencies in " + calibrationFile + " is less than " + Util::toString(numFreqInCoilCalFile) ); + break; + } + } +#else + std::string sbuf; + std::vector lines; + while(getline(ifs,sbuf)){ + if( sbuf.substr(0,1) == "+" ){ + lines.push_back(sbuf); + }else if( !lines.empty() ){ + break; + } + if( ifs.eof() ){ + break; + } + } + const int numFreqInCoilCalFile = static_cast(lines.size()); + double* freqsTemp = new double[numFreqInCoilCalFile]; + double* amp = new double[numFreqInCoilCalFile]; + double* phs = new double[numFreqInCoilCalFile]; + for( int iFreq = 0; iFreq < numFreqInCoilCalFile; ++iFreq ){ + std::istringstream iss(lines[iFreq]); + double dbuf(0.0); + iss >> dbuf; + freqsTemp[iFreq] = dbuf; + iss >> dbuf; + // [V/nT/Hz] => [mV/nT] + amp[iFreq] = dbuf * freqsTemp[iFreq] * 1000.0; + iss >> dbuf; + // [deg] => [rad] + phs[iFreq] = dbuf * CommonParameters::DEG2RAD; + } +#endif + ifs.close(); + + // Arrange the data in ascending order + int* ids = new int[numFreqInCoilCalFile]; + for( int iFreq = 0; iFreq < numFreqInCoilCalFile; ++iFreq ){ + ids[iFreq] = iFreq; + } + Util::quickSort(numFreqInCoilCalFile, ids, freqsTemp); + double* freqInCoilCalFile = new double[numFreqInCoilCalFile]; + double* logFreqInCoilCalFile = new double[numFreqInCoilCalFile]; + double* coilCalAmp = new double[numFreqInCoilCalFile]; + double* coilCalLogAmp = new double[numFreqInCoilCalFile]; + double* coilCalPhs = new double[numFreqInCoilCalFile]; + for( int iFreq = 0; iFreq < numFreqInCoilCalFile; ++iFreq ){ + const int index = ids[iFreq]; + if( iFreq >= 1 ){ + const int indexPre = ids[iFreq-1]; + assert( freqsTemp[index] > freqsTemp[indexPre] ); + } + freqInCoilCalFile[iFreq] = freqsTemp[index]; + logFreqInCoilCalFile[iFreq] = log10(freqsTemp[index]); + coilCalAmp[iFreq] = amp[index]; + coilCalLogAmp[iFreq] = log10(amp[index]); + coilCalPhs[iFreq] = phs[index]; + } + delete [] ids; + delete [] freqsTemp; + delete [] amp; + delete [] phs; + + double cutoffFrequency(0.0); + double fc1(0.0); + double fc2(0.0); + double AFactor(0.0); + switch (coilType){ + case Ats::MFS06: + cutoffFrequency = 0.5; + fc1 = 4.0; + fc2 = 8192.0; + AFactor = 0.8; + break; + case Ats::MFS07: + cutoffFrequency = 5.0; + fc1 = 32.0; + fc2 = 40000.0; + AFactor = 0.64; + break; + default: + ptrOutputFiles->writeErrorMessage("Unknown coil type : " + Util::toString(coilType) ); + break; + } + + if( freqInCoilCalFile[0] < cutoffFrequency - CommonParameters::EPS ){ + int numFreqLower(0); + double fc1Avg = 0.0; + for( int iFreq = 0; iFreq < numFreqInCoilCalFile; ++iFreq ){ + const double freq = freqInCoilCalFile[iFreq]; + if( freq > cutoffFrequency ){ + continue; + } + const double phaseP2 = atan2( freq, fc2 ); + fc1Avg += freq * tan( coilCalPhs[iFreq] + phaseP2 ); + ++numFreqLower; + } + fc1 = fc1Avg / static_cast(numFreqLower); + + double AAvg = 0.0; + for( int iFreq = 0; iFreq < numFreqInCoilCalFile; ++iFreq ){ + const double freq = freqInCoilCalFile[iFreq]; + if( freq > cutoffFrequency ){ + continue; + } + const double term1 = pow(fc1/freq, 2) + 1.0;// (f1/f)^2 + 1 + const double term2 = pow(freq/fc2, 2) + 1.0;// 1 + (f/f2)^2 + AAvg += coilCalAmp[iFreq] * sqrt(term1 * term2); + } + AFactor = AAvg / static_cast(numFreqLower); + } + + int iFreq(0); + for( std::vector::const_iterator itrFreq = freq.begin(); itrFreq != freq.end(); ++itrFreq, ++iFreq ){ + const double freq = *itrFreq; + if( freq < freqInCoilCalFile[0] ){ + // Calculate by estimated transfer function + const double ffc1 = freq / fc1; + const double ffc2 = freq / fc2; + calibrationFunction[iFreq] = + AFactor * std::complex(0.0, ffc1) / std::complex(1.0, ffc1) / std::complex(1.0, ffc2); + }else{ + // Interpolation in logarithmic axes + const double logAmp = Util::interpolationAkima( numFreqInCoilCalFile, logFreqInCoilCalFile, coilCalLogAmp, log10(freq) ); + const double phs = Util::interpolationAkima( numFreqInCoilCalFile, logFreqInCoilCalFile, coilCalPhs, log10(freq) ); + const double amp = pow(10.0, logAmp); + calibrationFunction[iFreq] = amp * std::complex( cos(phs), sin(phs) ); + } + } + + delete [] freqInCoilCalFile; + delete [] logFreqInCoilCalFile; + delete [] coilCalAmp; + delete [] coilCalLogAmp; + delete [] coilCalPhs; + +#ifdef _DEBUG_WRITE + iFreq = 0; + for( std::vector::const_iterator itrFreq = freq.begin(); itrFreq != freq.end(); ++itrFreq, ++iFreq ){ + const double freq = *itrFreq; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq; + std::cout << std::setw(20) << calibrationFunction[iFreq] << std::endl; + } +#endif + +} + +// Calculate calibration function for LF-channel of ADU +std::complex Ats::calculateCalibrationFunctionForADULFhannel( const double freq ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage(static_cast(__FUNCTION__) + "cannot be used in this version"); + return std::complex(0.0, 0.0); + +} + +short int Ats::bytesToInt16(unsigned char* ptr) const { + + union { + unsigned char c[2]; + short int i; + } tmp; + + tmp.c[0] = *ptr++; + tmp.c[1] = *ptr; + + return tmp.i; + +} + +int Ats::bytesToInt32(unsigned char* ptr) const { + + union { + unsigned char c[4]; + int i; + } tmp; + + tmp.c[0] = *ptr++; + tmp.c[1] = *ptr++; + tmp.c[2] = *ptr++; + tmp.c[3] = *ptr; + + return tmp.i; + +} + +float Ats::bytesToFloat(unsigned char* ptr) const { + + union { + unsigned char c[4]; + float f; + } tmp; + + tmp.c[0] = *ptr++; + tmp.c[1] = *ptr++; + tmp.c[2] = *ptr++; + tmp.c[3] = *ptr; + + return tmp.f; + +} + +double Ats::bytesToDouble(unsigned char* ptr) const { + + union { + unsigned char c[8]; + double d; + } tmp; + + tmp.c[0] = *ptr++; + tmp.c[1] = *ptr++; + tmp.c[2] = *ptr++; + tmp.c[3] = *ptr++; + tmp.c[4] = *ptr++; + tmp.c[5] = *ptr++; + tmp.c[6] = *ptr++; + tmp.c[7] = *ptr; + + return tmp.d; + +} \ No newline at end of file diff --git a/src/Ats.h b/src/Ats.h new file mode 100644 index 0000000..3ada949 --- /dev/null +++ b/src/Ats.h @@ -0,0 +1,98 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ATS +#define DBLDEF_ATS + +#include +#include +#include + +// Class of ats file +class Ats{ + +public: + + enum CoilType{ + MFS06 = 0, + MFS07 + }; + + // Return the the instance of the class + static Ats* getInstance(); + + // Read ats file + void readAtsFile( const std::string& fileName, const int numSkipData, const int numDataPoints, double* data ) const; + + // Get calibration file name + std::string getCalibrationFileName( const int channelIndex ) const; + + // Make calibration file + void makeCalibrationFile( const std::string& inputString, const int channelIndex, const std::vector& freq ) const; + + // Get flag specifing whether the calibration function for ADU is calculated + bool isCalADUResp() const; + + // Set flag specifing whether the calibration function for ADU is calculated + void setIsCalADUResp( const bool isCalADUResp ); + +private: + + short int bytesToInt16(unsigned char* ptr) const; + + int bytesToInt32(unsigned char* ptr) const; + + float bytesToFloat(unsigned char* ptr) const; + + double bytesToDouble(unsigned char* ptr) const; + + // Constructer + Ats(); + + // Destructer + ~Ats(); + + // Copy constructer + Ats(const Ats& rhs); + + // Assignment operator + Ats& operator=(const Ats& rhs); + + // Calculate calibration function for coil + void calculateCalibrationFunctionForCoil( const std::string& calibrationFile, const int coilType, + const std::vector& freq, std::complex* calibrationFunction ) const; + + // Calculate calibration function for ADU + std::complex calculateCalibrationFunctionForADULFhannel( const double freq ) const; + + // Flag specifing whether the calibration function for ADU is calculated + bool m_isCalADUResp; + +}; + +#endif diff --git a/src/CalibrationFunction.cpp b/src/CalibrationFunction.cpp new file mode 100644 index 0000000..92cd6eb --- /dev/null +++ b/src/CalibrationFunction.cpp @@ -0,0 +1,175 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "CalibrationFunction.h" +#include "Util.h" +#include "OutputFiles.h" +#include "CommonParameters.h" + +#include +#include + +// Constructer +CalibrationFunction::CalibrationFunction( const std::string& calibrationFile ): + m_factor(1.0), + m_numFreqs(0), + m_logFreqs(NULL), + m_logAmps(NULL), + m_phases(NULL) +{ + readCalibrationFunction(calibrationFile); +} + +// Default constructer +CalibrationFunction::CalibrationFunction(): + m_factor(1.0), + m_numFreqs(0), + m_logFreqs(NULL), + m_logAmps(NULL), + m_phases(NULL) +{ +} + +// Destructer +CalibrationFunction::~CalibrationFunction(){ + + if( m_logFreqs != NULL ){ + delete [] m_logFreqs; + }; + + if( m_logAmps != NULL ){ + delete [] m_logAmps; + }; + + if( m_phases != NULL ){ + delete [] m_phases; + }; + +} + +// Read calibration function +void CalibrationFunction::readCalibrationFunction( const std::string& calibrationFile ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ifstream ifs( calibrationFile.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + calibrationFile); + } + ptrOutputFiles->writeLogMessage("Read calibration function from " + calibrationFile , false); + + ifs >> m_factor; + ifs >> m_numFreqs; +#ifdef _DEBUG_WRITE + std::cout << calibrationFile.c_str() << std::endl; + std::cout << "m_factor, m_numFreqs: " << m_factor << " " << m_numFreqs << std::endl; +#endif + + if( m_numFreqs < 1 ){ + return; + } + + double* freqs = new double[m_numFreqs]; + double* calReal = new double[m_numFreqs]; + double* calImag = new double[m_numFreqs]; + for( int iFreq = 0; iFreq < m_numFreqs; ++iFreq ){ + double dbuf(0.0); + ifs >> dbuf; + freqs[iFreq] = dbuf; + ifs >> dbuf; + calReal[iFreq] = dbuf; + ifs >> dbuf; + calImag[iFreq] = dbuf; + if( ifs.eof() ){ + ptrOutputFiles->writeErrorMessage("Number of frequencies in " + calibrationFile + " is less than " + Util::toString(m_numFreqs) ); + break; + } + } + ifs.close(); + + // Arrange the data in ascending order + int* ids = new int[m_numFreqs]; + for( int iFreq = 0; iFreq < m_numFreqs; ++iFreq ){ + ids[iFreq] = iFreq; + } + Util::quickSort(m_numFreqs, ids, freqs); + if( m_logFreqs != NULL ){ + delete [] m_logFreqs; + }; + if( m_logAmps != NULL ){ + delete [] m_logAmps; + }; + if( m_phases != NULL ){ + delete [] m_phases; + }; + m_logFreqs = new double[m_numFreqs]; + m_logAmps = new double[m_numFreqs]; + m_phases = new double[m_numFreqs]; + for( int iFreq = 0; iFreq < m_numFreqs; ++iFreq ){ + const int index = ids[iFreq]; + if( iFreq >= 1 ){ + const int indexPre = ids[iFreq-1]; + assert( freqs[index] > freqs[indexPre] ); + } + m_logFreqs[iFreq] = log10( freqs[index] ); + const double amplitude = hypot( calReal[index], calImag[index] ); + m_logAmps[iFreq] = log10(amplitude); + m_phases[iFreq] = atan2( calImag[index], calReal[index] ); +#ifdef _DEBUG_WRITE + std::cout << "m_logFreqs, amplitude, m_logAmps, m_phases: " + << m_logFreqs[iFreq] << " " << amplitude << " " << m_logAmps[iFreq] << " " << m_phases[iFreq] << std::endl; +#endif + } + + delete [] freqs; + delete [] calReal; + delete [] calImag; + delete [] ids; + +} + +// Calculate calibration function for a input log frequency +std::complex CalibrationFunction::calculateCalibrationFunction( const double freq ) const{ + + if( m_numFreqs < 1 ){ + return std::complex(m_factor, 0.0); + } + + const double log10Freq = log10(freq); + + const double logAmp = Util::interpolationAkima( m_numFreqs, m_logFreqs, m_logAmps, log10Freq ); + const double phs = Util::interpolationAkima( m_numFreqs, m_logFreqs, m_phases, log10Freq ); + const double amp = m_factor * pow(10.0, logAmp); + return amp * std::complex( cos(phs), sin(phs) ); + +} + +// Get constant factor +double CalibrationFunction::getFactor() const{ + return m_factor; +} diff --git a/src/CalibrationFunction.h b/src/CalibrationFunction.h new file mode 100644 index 0000000..77c73e1 --- /dev/null +++ b/src/CalibrationFunction.h @@ -0,0 +1,82 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_CALIBRATION_FUNCTION +#define DBLDEF_CALIBRATION_FUNCTION + +#include +#include + +// Class of calibration function +class CalibrationFunction{ + +public: + + // Constructer + CalibrationFunction( const std::string& calibrationFile ); + + // Default constructer + CalibrationFunction(); + + // Destructer + ~CalibrationFunction(); + + // Read calibration function + void readCalibrationFunction( const std::string& calibrationFile ); + + // Calculate calibration function for a input frequency + std::complex calculateCalibrationFunction( const double freq ) const; + + // Get constant factor + double getFactor() const; + +private: + // Constant factor + double m_factor; + + // Number of frequencies in logarithmic scale + int m_numFreqs; + + // Arrays of frequencies in logarithmic scale + double* m_logFreqs; + + // Arrays of amplitudes in logarithmic scale + double* m_logAmps; + + // Arrays of phase (radian) + double* m_phases; + + // Copy constructer + CalibrationFunction(const CalibrationFunction& CalibrationFunction); + + // Assignment operator + CalibrationFunction& operator=(const CalibrationFunction& CalibrationFunction); + +}; + +#endif diff --git a/src/CommonParameters.h b/src/CommonParameters.h new file mode 100644 index 0000000..543f165 --- /dev/null +++ b/src/CommonParameters.h @@ -0,0 +1,72 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_COMMON_PARAMETERS +#define DBLDEF_COMMON_PARAMETERS + +#include +#include + +namespace CommonParameters{ + +enum DataType{ + OUTPUT = 0, + INPUT, + REMOTE_REFERENCE +}; + +struct DataFile{ + std::string fileName; + std::string mth5GroupName; + int numSkipData; + double* data; +}; + +struct DataFileSet{ + int numDataPoints; + std::vector dataFile; +}; + +// Circular constant +const static double PI = 3.14159265358979323846; + +// Factor converting values from radians to degrees +const static double RAD2DEG = 180.0 / PI; + +// Factor converting values from degrees to radians +const static double DEG2RAD = PI / 180.0; + +const static double EPS = 1.0e-20; + +static char programName[]="TRACMT"; + +static char version[] = "v2.3.0"; + +} + +#endif diff --git a/src/Control.cpp b/src/Control.cpp new file mode 100644 index 0000000..868b571 --- /dev/null +++ b/src/Control.cpp @@ -0,0 +1,1987 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "Control.h" +#include "OutputFiles.h" +#include "Util.h" +#include "TableOfTukeysBiweightParameters.h" +#include "AnalysisMultivariateRegression.h" +#include "AnalysisTwoStage.h" +#include "AnalysisRepeatedMedian.h" +#include "AnalysisOrdinaryRemoteReference.h" +#include "AnalysisTest.h" +#include "RobustWeightHuber.h" +#include "RobustWeightThomson.h" +#include "RobustWeightTukeysBiweights.h" +#include "Ats.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _USE_OMP +#include +#endif + +// Return the instance of the class +Control* Control::getInstance(){ + static Control instance;// The only instance + return &instance; +} + +// Default constructer +Control::Control() : + m_cutoffFrequencyForIIRHighPassFilter(-1.0), + m_cutoffFrequencyForIIRLowPassFilter(-1.0), + m_doesApplyIIRHighPassFilter(false), + m_doesApplyIIRLowPassFilter(false), + m_doesPeformEOFBasedDenoising(false), + m_elogMTReadingOption(Control::NOT_SPECIFIED), + m_errorEstimationMethod(Control::FIXED_WEIGHTS_BOOTSTRAP), + m_numOutputVariables(-1), + m_numInputVariables(2), + m_numRemoteReferenceVariables(2), + m_samplingFrequency(-1), + m_samplingFrequencyOrg(-1), + m_numThreads(1), + m_numTimeSeriesSections(-1), + m_numRepetitionsOfBootstrap(1000), + m_overlappingRatio(0.5), + m_calibForMFS(false), + m_calibForElogDual(false), + m_calibForElogMT(false), + m_rotationAngle(0.0), + m_analysis(NULL), + m_outputApparentResistivityAndPhase(false), + m_outputLevel(0), + m_outputFreqDomainDataToCsv(false), + m_outputTimeSeriesToCsv(false), + m_outputCalibratedTimeSeriesToCsv(false), + m_parameterQForNotchFilter(10.0), + m_percentageOfOmmitedDataSubsetDeletionJackknife(5.0), + m_procedureType(Control::ORDINARY_REMOTE_REFERENCE), + m_readAtsBinary(false), + m_readMTH5(false), + m_readElogDualBinary(false), + m_readElogMTBinary(false), + m_timingEOFBasedDenoising(Control::BEFORE_DECIMATION), + m_typeOfElogDual(Control::ELOG1K), + m_typeOfElogMT(Control::ELOGMT_ADU_MODE) +{ + // Parameters for ELOG calibration + m_paramsForElogDualCalibration.unitGroupDelay = 5.17; + m_paramsForElogMTCalibration.unitGroupDelay = 5.17; + + // Parameters for the data-segment evaluation prior to the calculation of the response functions + m_paramsForDataSegmentEvaluation.doEvaluation = false; + m_paramsForDataSegmentEvaluation.numDataSegments = 10; + + // Parameters for decimation + m_paramsForDecimation.applyDecimation = false; + m_paramsForDecimation.decimationInterval = 1; + m_paramsForDecimation.filterLength = 100; + m_paramsForDecimation.transitionBandWidthInLogarithmicScale = 0.5; + + // Parameters for the frequency-domain evaluation prior to the calculation of the response functions + m_paramsForFreqDomainEvaluation.doEvaluation = false; + m_paramsForFreqDomainEvaluation.startOutputFrequency = 1.0e-10; + m_paramsForFreqDomainEvaluation.endOutputFrequency = 1.0e+10; + m_paramsForFreqDomainEvaluation.numOfOutputFrequency = 100000; + m_paramsForFreqDomainEvaluation.numOfOutputFrequencyForAverage = 100; + + // Parameters for the time-domain evaluation prior to the calculation of the response functions + m_paramsForTimeDomainEvaluation.doEvaluation = false; + m_paramsForTimeDomainEvaluation.timeSeriesInterval = 10; + + // Parameters for Hampel filter + m_paramsForParamsForHampelFilter.applyHampelFilter = false; + m_paramsForParamsForHampelFilter.numNeighborsOnEitherSide = 50; + m_paramsForParamsForHampelFilter.nsigma = 100.0; + + // Parameters for degree of polarizatiton direction criteria + m_paramsForDegreeOfMagneticPolarizationCriteria.applyDegreeOfMagneticPolarizationCriteria = false; + m_paramsForDegreeOfMagneticPolarizationCriteria.numSegments = 10; + m_paramsForDegreeOfMagneticPolarizationCriteria.threshold = 0.9; + + // Parameters for magnetic polarizatiton direction criteria + m_paramsForMagneticPolarizatitonDirectionCriteria.applyMagneticPolarizatitonDirectionCriteria = false; + m_paramsForMagneticPolarizatitonDirectionCriteria.threshold = 5.0; + + // Parameters for mean square criteria + m_paramsForMeanSquareCriteria.applyMeanSquareCriteria = false; + m_paramsForMeanSquareCriteria.nsigma = 5.0; + + // Parameters for square coherence criteria + m_paramsForSquareCoherenceCriteria.applySquareCoherenceCriteria = false; + m_paramsForSquareCoherenceCriteria.numSegments = 10; + m_paramsForSquareCoherenceCriteria.threshold = 0.3; + + // Parameters for square coherence criteria with random sampling + m_paramsForSquareCoherenceCriteriaWithRandomSampling.applySquareCoherenceCriteria = false; + m_paramsForSquareCoherenceCriteriaWithRandomSampling.numSegments = 10; + m_paramsForSquareCoherenceCriteriaWithRandomSampling.numRandomSamples = 1000; + m_paramsForSquareCoherenceCriteriaWithRandomSampling.threshold = 0.3; + + // Parameters for robust calculation of autocovariance matrix + m_paramsForRobustAutoCovariance.percentageOfSmallNumberAddedToDiagonals = 0.0; + m_paramsForRobustAutoCovariance.maxNumOfIterations = 10; + m_paramsForRobustAutoCovariance.convergenceCriteria = 0.05; + + // Parameters for robust prewhitening + m_paramsForPrewhitening.applyPrewhitening = false; + m_paramsForPrewhitening.typeOfEstimator = Control::USE_LEAST_SQUARE_ESTIMATOR_FOR_PREWHITENING; + m_paramsForPrewhitening.maxDegreeOfARModel = 10; + m_paramsForPrewhitening.numCandidatesOfPartialAutocorrelationFunction = 5; + + // Parameters for robust filter + m_paramsForRobustFilter.applyRobustFilter = false; + m_paramsForRobustFilter.replaceTimeSeriesWithFilteredValues = false; + + // Parameters for robust multivariate regression + m_paramsForRobustMultivariateRegression.selectInitialCandidatesByRandomSamplingAtEachFrequency = true; + m_paramsForRobustMultivariateRegression.numOfMaxInitialCandidates = 100; + m_paramsForRobustMultivariateRegression.numOfMaxIterationsOfFirstIstep = 3; + m_paramsForRobustMultivariateRegression.convergenceCriteriaOfFirstIstep = 0.05; + m_paramsForRobustMultivariateRegression.numOfMaxCandidatesOfSecondIstep = 10; + m_paramsForRobustMultivariateRegression.numOfMaxIterationsOfSecondIstep = 16; + m_paramsForRobustMultivariateRegression.convergenceCriteriaOfSecondIstep = 0.01; + m_paramsForRobustMultivariateRegression.startOfTimeRange = "00:00:00"; + m_paramsForRobustMultivariateRegression.endOfTimeRange = "24:00:00"; + + // Parameters for deciding candicates for subsequent frequencies + m_paramsForDecidingCandicatesForSubsequentFrequencies.useResponseFunctionsOfPreviousFrequency = true; + + // Parameters for the treatment of hat matrix + m_paramsForTreatmentOfHatMatrix.applyLeverageWeights = false; + m_paramsForTreatmentOfHatMatrix.threshold = 3.0; + m_paramsForTreatmentOfHatMatrix.maxNumberOfOuterIteration = 5; + +} + +// Destructer +Control::~Control(){ + + if( m_analysis != NULL ){ + delete m_analysis; + } + + // Delete allocated memory for time-series data + for( std::vector::const_iterator itrDataFileSet = m_dataFileSets.begin(); + itrDataFileSet != m_dataFileSets.end(); ++itrDataFileSet ){ + for( std::vector::const_iterator itrDataFile = itrDataFileSet->dataFile.begin(); + itrDataFile != itrDataFileSet->dataFile.end(); ++itrDataFile ){ + delete [] itrDataFile->data; + } + } + +} + +// Run analysis +void Control::run(const bool outputToConsole){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->setOutputToConsole(outputToConsole); + readParameterFile(); + + m_analysis->run(m_dataFileSets); + + ptrOutputFiles->writeLogMessage("End " + Util::toString(CommonParameters::programName) ); + +} + +// Get flag specifing whether IIR high-pass filter is applied +bool Control::doesApplyIIRHighPassFilter() const{ + return m_doesApplyIIRHighPassFilter; +} + +// Get flag specifing whether IIR low-pass filter is applied +bool Control::doesApplyIIRLowPassFilter() const{ + return m_doesApplyIIRLowPassFilter; +} + +// Get flag specifing whether calibration for MFS is performed +bool Control::doesMakeCalibrationFileForMFS() const { + return m_calibForMFS; +} + +// Get flag specifing whether calibration for ELOG-Dual file is performed +bool Control::doesMakeCalibrationFileForElogDual() const { + return m_calibForElogDual; +} + +// Get flag specifing whether calibration for ELOG-MT file is performed +bool Control::doesMakeCalibrationFileForElogMT() const{ + return m_calibForElogMT; +} + +// Get flag specifing whether apparent resistivity and phase are outputed in a seperate file +bool Control::doesOutputApparentResistivityAndPhase() const{ + return m_outputApparentResistivityAndPhase; +} + +// Get flag specifing wheter output frequency domain data as csv file +bool Control::doesOutputFreqDomainDataToCsv() const{ + return m_outputFreqDomainDataToCsv; +} + +// Get flag specifing wheter output time series data as csv file +bool Control::doesOutputTimeSeriesToCsv() const{ + return m_outputTimeSeriesToCsv; +} + +// Get flag specifing wheter output calibrated time series data as csv file +bool Control::doesOutputCalibratedTimeSeriesToCsv() const { + return m_outputCalibratedTimeSeriesToCsv; +} + +// Get flag specifing whether input file is ATS binary file +bool Control::doesReadAtsBinary() const{ + return m_readAtsBinary; +} + +// Get flag specifing whether input file is ELOG-Dual binary file +bool Control::doesReadMTH5() const { + return m_readMTH5; +} + +// Get flag specifing whether input file is ELOG-Dual binary file +bool Control::doesReadElogDualBinary() const { + return m_readElogDualBinary; +} + +// Get flag specifing whether input file is ELOG-MT binary file +bool Control::doesReadElogMTBinary() const{ + return m_readElogMTBinary; +} + +// Get azimuth +double Control::getAzimuth( const int iChan ) const{ + return m_azimuths[iChan]; +} + +// Get flag specifing whether denoising based on EOF is performed +bool Control::doesPeformEOFBasedDenoising() const { + return m_doesPeformEOFBasedDenoising; +} + +// Get channel index +int Control::getChannelIndex( const int dataType, const int index ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + switch (dataType) + { + case CommonParameters::OUTPUT: + if( index < 0 || index > getNumOutputVariables() ){ + ptrOutputFiles->writeErrorMessage("Index of output variable is wrong: " + Util::toString(index)); + } + return index; + case CommonParameters::INPUT: + if( index < 0 || index > getNumInputVariables() ){ + ptrOutputFiles->writeErrorMessage("Index of input variable is wrong: " + Util::toString(index)); + } + return index + getNumOutputVariables(); + case CommonParameters::REMOTE_REFERENCE: + if( index < 0 || index > getNumRemoteReferenceVariables() ){ + ptrOutputFiles->writeErrorMessage("Index of remote reference variable is wrong: " + Util::toString(index)); + } + return index + getNumOutputVariables() + getNumInputVariables(); + default: + ptrOutputFiles->writeErrorMessage("Wrong type of data: " + Util::toString(dataType)); + break; + } + + return -1; + +} + +// Get option of ELOG-Dual binary data reading +int Control::getElogDualReadingOption() const { + return m_elogDualReadingOption; +} + +// Get option of ELOG-MT binary data reading +int Control::getElogMTReadingOption() const { + return m_elogMTReadingOption; +} + +// Get error estimation method +int Control::getErrorEstimationMethod() const{ + return m_errorEstimationMethod; +} + +// Get number of output variables +int Control::getNumOutputVariables() const{ + return m_numOutputVariables; +} + +// Get number of input variables +int Control::getNumInputVariables() const{ + return m_numInputVariables; +} + +// Get number of remote reference variables +int Control::getNumRemoteReferenceVariables() const{ + return m_numRemoteReferenceVariables; +} + +// Get sampling frequency +double Control::getSamplingFrequency() const{ + return m_samplingFrequency; +} + +// Get original sampling frequency +double Control::getSamplingFrequencyOrg() const { + return m_samplingFrequencyOrg; +} + +// Get number of threads +int Control::getNumThreads() const{ + return m_numThreads; +} + +// Get number of time-series sections +int Control::getNumTimeSeriesSections() const{ + return m_numTimeSeriesSections; +} + +// Get number of segment lengths +int Control::getNumSegmentLengths() const{ + return static_cast( m_segments.size() ); +} + +// Get number of target frequency in an input segment +int Control::getNumTargetFrequencyInSegment( const int iSeg ) const{ + return static_cast( m_segments[iSeg].degrees.size() ); +} + +// Get number of the ranges of sections for merge +int Control::getNumRangeOfSectionsForMerge() const{ + return static_cast( m_rangeOfSectionsForMerge.size() ); +} + +// Get number of repetitions of bootstrap method +int Control::getNumRepetitionsOfBootstrap() const{ + return m_numRepetitionsOfBootstrap; +} + +// Get target frequency degrees in an input segment +int Control::getTargetFrequencyDegreesInSegment( const int iSeg, const int index ) const{ + return m_segments[iSeg].degrees[index]; +} + +// Get length of each segment +int Control::getSegmentLength( const int iSeg ) const{ + return m_segments[iSeg].length; +} + +// Get ratio of overlapping part to whole segment length +double Control::getOverlappingRatio() const{ + return m_overlappingRatio; +} + +// Get rotation angle +double Control::getRotationAngle() const{ + return m_rotationAngle; +} + +// Get numebur of calibration files for MFS +int Control::getNumCalibrationFilesForMFS() const { + return static_cast(m_calibrationFilesForMFS.size()); +} + +// Get name of calibration file for MFS +std::string Control::getCalibrationFileNameForMFS(const int iFile) const { + return m_calibrationFilesForMFS[iFile]; +} +// Get numebur of calibration files +int Control::getNumCalibrationFiles() const{ + return static_cast( m_calibrationFiles.size() ); +} + +// Get name of calibration file +std::string Control::getCalibrationFileName( const int iFile ) const{ + return m_calibrationFiles[iFile]; +} + +// Get cutoff frequency for IIR high-pass filter +double Control::getCutoffFrequencyForIIRHighPassFilter() const{ + return m_cutoffFrequencyForIIRHighPassFilter; +} + +// Get cutoff frequency for IIR low-pass filter +double Control::getCutoffFrequencyForIIRLowPassFilter() const{ + return m_cutoffFrequencyForIIRLowPassFilter; +} + +// Get cutoff frequencies for notch filter +std::vector Control::getCutoffFrequenciesForNotchFilter() const{ + return m_cutoffFrequenciesForNotchFilter; +} + +// Get directory of logger calibration files +std::string Control::getDirectoryOfLoggerCalibrationFiles() const { + return m_directoryOfLoggerCalibrationFiles; +} + +// Get number of channels +int Control::getNumberOfChannels() const{ + return getNumOutputVariables() + getNumInputVariables() + getNumRemoteReferenceVariables(); +} + +// Get number of frequencies +int Control::getNumberOfFrequencies() const{ + return static_cast( m_frequencies.size() ); +} + +// Get number of cutoff frequencies for notch filter +int Control::getNumberOfCutoffFrequenciesForNotchFilter() const{ + return static_cast( m_cutoffFrequenciesForNotchFilter.size() ); +} + +// Get frequency +double Control::getFrequency( const int iFreq ) const{ + return m_frequencies[iFreq]; +} + +// Get all frequencies without duplications +std::vector Control::getFrequenciesAllWithoutDuplications() const{ + + std::vector temp = m_frequencies; + std::sort(temp.begin(), temp.end()); + + std::vector freqOut; + double freqPre(-1.0); + for( std::vector::const_iterator itr = temp.begin(); itr != temp.end(); ++itr ){ + if( fabs(*itr - freqPre) > 1.0e-6 ){ + freqOut.push_back(*itr); + freqPre = *itr; + } + } + + return freqOut; + +} + +// Get output level +int Control::getOutputLevel() const{ + return m_outputLevel; +} + +// Get parameters for ELOG-Dual calibration +Control::ParamsForElogCalibration Control::getParamsForElogDualCalibration() const { + return m_paramsForElogDualCalibration; +} + +// Get parameters for ELOG-MT calibration +Control::ParamsForElogCalibration Control::getParamsForElogMTCalibration() const{ + return m_paramsForElogMTCalibration; +} + +// Get parameters for the data-segment evaluation prior to the calculation of the response functions +Control::ParamsForDataSegmentEvaluation Control::getParamsForDataSegmentEvaluation() const{ + return m_paramsForDataSegmentEvaluation; +} + +// Get parameters for decimation +Control::ParamsForDecimation Control::getParamsForDecimation() const{ + return m_paramsForDecimation; +} + +// Get parameters for the frequency-domain evaluation prior to the calculation of the response functions +Control::ParamsForFreqDomainEvaluation Control::getParamsForFreqDomainEvaluation() const{ + return m_paramsForFreqDomainEvaluation; +} + +// Get parameters for the time-domain evaluation prior to the calculation of the response functions +Control::ParamsForTimeDomainEvaluation Control::getParamsForTimeDomainEvaluation() const{ + return m_paramsForTimeDomainEvaluation; +} + +// Get parameters for Hampel filter +Control::ParamsForHampelFilter Control::getParamsForHampelFilter() const{ + return m_paramsForParamsForHampelFilter; +} + +// Get parameters for degree of magnetic polarizatiton criteria +Control::ParamsForDegreeOfMagneticPolarizationCriteria Control::getParamsForDegreeOfMagneticPolarizationCriteria() const{ + return m_paramsForDegreeOfMagneticPolarizationCriteria; +} + +// Get parameters for magnetic polarizatiton direction criteria +Control::ParamsForMagneticPolarizatitonDirectionCriteria Control::getParamsForMagneticPolarizatitonDirectionCriteria() const{ + return m_paramsForMagneticPolarizatitonDirectionCriteria; +} + +// Get parameters for mean square criteria +Control::ParamsForMeanSquareCriteria Control::getParamsForMeanSquareCriteria() const{ + return m_paramsForMeanSquareCriteria; +} + +// Get parameters for square coherence thresholding +Control::ParamsForSquareCoherenceCriteria Control::getParamsForSquareCoherenceCriteria() const{ + return m_paramsForSquareCoherenceCriteria; +} + +// Get parameters for square coherence criteria with random sampling +Control::ParamsForSquareCoherenceCriteriaWithRandomSampling Control::getParamsForSquareCoherenceCriteriaWithRandomSampling() const{ + return m_paramsForSquareCoherenceCriteriaWithRandomSampling; +} + +// Get parameters for robust calculation of autocovariance matrix +Control::ParamsForRobustAutoCovariance Control::getParamsForRobustAutoCovariance() const{ + return m_paramsForRobustAutoCovariance; +} + +// Get parameters for robust prewhitening +Control::ParamsForPrewhitening Control::getParamsForPrewhitening() const{ + return m_paramsForPrewhitening; +} + +// Get parameters for robust filter +Control::ParamsForRobustFilter Control::getParamsForRobustFilter() const{ + return m_paramsForRobustFilter; +} + +// Get parameters for the treatment of hat matrix +Control::ParamsForTreatmentOfHatMatrix Control::getParamsForTreatmentOfHatMatrix() const{ + return m_paramsForTreatmentOfHatMatrix; +} + +// Get parameters for robust multivariate regression +Control::ParamsForRobustMultivariateRegression Control::getParamsForRobustMultivariateRegression() const{ + return m_paramsForRobustMultivariateRegression; +} + +// Get parameters for deciding candicates for subsequent frequencies +Control::ParamsForDecidingCandicatesForSubsequentFrequencies Control::getParamsForDecidingCandicatesForSubsequentFrequencies() const{ + return m_paramsForDecidingCandicatesForSubsequentFrequencies; +} + +// Get parameter Q for notch filter +double Control::getParameterQForNotchFilter() const{ + return m_parameterQForNotchFilter; +} + +// Get percentage of ommited data in subset deletion jackknife +double Control::getPercentageOfOmmitedDataSubsetDeletionJackknife() const{ + return m_percentageOfOmmitedDataSubsetDeletionJackknife; +} + +// Get ranges of sections for merge +std::pair Control::getRangeOfSectionsForMerge( const int iSectionAfterMerge ) const{ + return m_rangeOfSectionsForMerge[iSectionAfterMerge]; +} + +// Get time from start time and elapsed time (seconds) +std::string Control::getTimeFromStartTimeOfEachSection( const int sectionIndex, const double elapsedTime, const bool forAfterMergingSections ) const{ + + assert( sectionIndex >=0 && sectionIndex < m_numTimeSeriesSections ); + + int sectionIndexMod(sectionIndex); + if( forAfterMergingSections && getNumRangeOfSectionsForMerge() > 0 ){ + sectionIndexMod = getRangeOfSectionsForMerge(sectionIndex).first; + } + const int hour0 = Util::stringToInt( m_startTimeOfEachSection[sectionIndexMod].substr(0,2) ); + const int min0 = Util::stringToInt( m_startTimeOfEachSection[sectionIndexMod].substr(3,2) ); + const double sec0 = Util::stringToDouble( m_startTimeOfEachSection[sectionIndexMod].substr(6) ); + + double temp = sec0 + elapsedTime; + if( m_paramsForDecimation.applyDecimation ){ + const double samplingFreq = getSamplingFrequency(); + const double samplingFreqBeforeDecimation = getSamplingFrequencyOrg(); + const int halfOfDimension = m_paramsForDecimation.filterLength / 2; + temp += static_cast(halfOfDimension) / samplingFreqBeforeDecimation; + } + int dhour = static_cast(floor(temp)) / 3600; + int dmin = ( static_cast(floor(temp)) - dhour * 3600 ) / 60; + const double sec1 = temp - static_cast(dhour) * 3600 - static_cast(dmin) * 60; + if( min0 + dmin >= 60 ){ + const int ddhour = ( min0 + dmin ) / 60; + assert( ddhour == 1 ); + dhour += ddhour; + dmin -= ddhour * 60; + } + + const int hour1 = ( hour0 + dhour ) % 24; + const int min1 = min0 + dmin; + + std::ostringstream(oss); + if( hour1 < 10 ){ + oss << "0"; + } + oss << hour1 << ":"; + if( min1 < 10 ){ + oss << "0"; + } + oss << min1 << ":"; + if( sec1 < 10 ){ + oss << "0"; + } + oss << static_cast(std::floor(sec1)); + + return oss.str(); + +} + +// Get number of start times of sections +int Control::getNumStartTimesSections() const{ + + return static_cast( m_startTimeOfEachSection.size() ); + +} + +// Get procedure type +int Control::getProcedureType () const{ + + return m_procedureType; + +} + +// Get type of ELOG-Dual +int Control::getTimingEOFBasedDenoising() const { + + return m_timingEOFBasedDenoising; + +} + +// Get type of ELOG-Dual +int Control::getTypeOfElogDual() const { + return m_typeOfElogDual; +} + +// Get type of ELOG-MT +int Control::getTypeOfElogMT() const { + return m_typeOfElogMT; +} + +// Set sampling frequency +void Control::setSamplingFrequency( const double samplingFrequency ){ + m_samplingFrequency = samplingFrequency; +} + +// Read control parameters from input file +void Control::readParameterFile(){ + + const std::string fileName = "param.dat"; + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read parameters."); + + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + RobustWeightHuber objRobustWeightHuber; + RobustWeightThomson objRobustWeightThomson; + RobustWeightTukeysBiweights objRobustWeightTukeysBiweights; + int typesOfRobustWeight[2] = { HUBER, TUKEYS_BIWEIGHTS }; + + std::string line; + while( getline( ifs, line ) ){ +#ifdef _DEBUG_WRITE + std::cout << "line : " << line << std::endl; +#endif + if( line.substr(0,1).compare("#") == 0 ){ + continue; + }else if( line.find("NUM_OUT") != std::string::npos ){ + ifs >> m_numOutputVariables; + } + else if( line.find("NUM_RR") != std::string::npos ){ + ifs >> m_numRemoteReferenceVariables; + } + else if( line.find("SAMPLING_FREQ") != std::string::npos ){ + double dbuf(0.0); + ifs >> dbuf; + m_samplingFrequency = dbuf; + m_samplingFrequencyOrg = dbuf; + } + else if( line.find("NUM_SECTION") != std::string::npos ){ + ifs >> m_numTimeSeriesSections; + } + else if( line.substr(0,7).compare("SEGMENT") == 0 ){ + int numSegments(0); + ifs >> numSegments; + for( int iSeg = 0 ; iSeg < numSegments; ++iSeg ){ + SegmentInfo segBuf; + int ibuf(0); + ifs >> ibuf; + if(!Util::isPow2(ibuf)){ + ptrOutputFiles->writeErrorMessage("Length of each segment must be power of two."); + } + segBuf.length = ibuf; + int num(0); + ifs >> num; + for( int i = 0 ; i < num; ++i ){ + ifs >> ibuf; + if( ibuf < 0 ){ + std::ostringstream msg; + msg << "The frequency index (" << ibuf << ") of the " << iSeg << "-th segment (" << segBuf.length << ") is too small."; + ptrOutputFiles->writeErrorMessage(msg.str()); + } + if( ibuf > segBuf.length / 2 ){ + std::ostringstream msg; + msg << "The " << ibuf << "-th frequency of the " << iSeg << "-th segment (" << segBuf.length << ") is greater than the Nyquists frequency."; + ptrOutputFiles->writeErrorMessage(msg.str()); + } + segBuf.degrees.push_back(ibuf); + } + m_segments.push_back(segBuf); + } + } + else if( line.find("OVERLAP") != std::string::npos ){ + ifs >> m_overlappingRatio; + } + else if( line.find("DATA_FILES") != std::string::npos ){ + if( m_numOutputVariables < 0 ){ + ptrOutputFiles->writeErrorMessage("You must define NOUT data before DATA_FILES data."); + } + if( m_numTimeSeriesSections < 0 ){ + ptrOutputFiles->writeErrorMessage("You must define NSECT data before DATA_FILES data."); + } + m_dataFileSets.reserve(m_numTimeSeriesSections); + for( int iSect = 0; iSect < m_numTimeSeriesSections; ++iSect ){ + CommonParameters::DataFileSet dataFileSetTemp; + ifs >> dataFileSetTemp.numDataPoints; + const int numChans = getNumberOfChannels(); + dataFileSetTemp.dataFile.reserve(numChans); + for (int iChan = 0; iChan < numChans; ++iChan) { + CommonParameters::DataFile dataFileTemp; + ifs >> dataFileTemp.fileName; + if (doesReadMTH5() && Util::extractExtensionOfFileName(dataFileTemp.fileName).find("mth5") != std::string::npos) + { + ifs >> dataFileTemp.mth5GroupName; + } + ifs >> dataFileTemp.numSkipData; + dataFileTemp.data = NULL; + dataFileSetTemp.dataFile.push_back(dataFileTemp); + } + m_dataFileSets.push_back(dataFileSetTemp); + } + } + else if( line.find("AZIMUTH") != std::string::npos ){ + const int numChannels = getNumberOfChannels(); + m_azimuths.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + double dbuf(0.0); + ifs >> dbuf; + m_azimuths.push_back(dbuf); + } + } + else if( line.find("ROTATION") != std::string::npos ){ + double dbuf(0.0); + ifs >> dbuf; + m_rotationAngle = dbuf; + } + else if (line.find("MFS_CAL") != std::string::npos) { + m_calibForMFS = true; + const int numChannels = getNumberOfChannels(); + m_calibrationFilesForMFS.clear(); + m_calibrationFiles.clear(); + m_calibrationFilesForMFS.reserve(numChannels); + m_calibrationFiles.reserve(numChannels); + const Ats* ptrAts = Ats::getInstance(); + for (int iChan = 0; iChan < numChannels; ++iChan) { + std::string sbuf; + ifs >> sbuf; + m_calibrationFilesForMFS.push_back(sbuf); + m_calibrationFiles.push_back(ptrAts->getCalibrationFileName(iChan)); + } + } + else if (line.find("ATS_CAL") != std::string::npos) { + m_calibForMFS = true; + const int numChannels = getNumberOfChannels(); + m_calibrationFilesForMFS.clear(); + m_calibrationFiles.clear(); + m_calibrationFilesForMFS.reserve(numChannels); + m_calibrationFiles.reserve(numChannels); + Ats* ptrAts = Ats::getInstance(); + ptrAts->setIsCalADUResp(true); + for (int iChan = 0; iChan < numChannels; ++iChan) { + std::string sbuf; + ifs >> sbuf; + m_calibrationFilesForMFS.push_back(sbuf); + m_calibrationFiles.push_back(ptrAts->getCalibrationFileName(iChan)); + } + } + else if( line.find("ATS_BINARY") != std::string::npos ){ + m_readAtsBinary = true; + } + else if (line.find("MTH5") != std::string::npos) { + m_readMTH5 = true; + } + else if (line.find("ELOGDUAL_CAL") != std::string::npos) { + m_calibForElogDual = true; + int ibuf(0); + ifs >> ibuf; + m_typeOfElogDual = ibuf; + std::string sbuf; + ifs >> sbuf; + m_paramsForElogDualCalibration.fileName = sbuf; + double dbuf(0.0); + ifs >> dbuf; + m_paramsForElogDualCalibration.unitGroupDelay = dbuf; + } + else if (line.find("ELOGDUAL_BINARY") != std::string::npos) { + m_readElogDualBinary = true; + } + else if( line.find("ELOGMT_CAL") != std::string::npos ){ + m_calibForElogMT = true; + int ibuf(0); + ifs >> ibuf; + m_typeOfElogMT = ibuf; + std::string sbuf; + ifs >> sbuf; + m_paramsForElogMTCalibration.fileName = sbuf; + double dbuf(0.0); + ifs >> dbuf; + m_paramsForElogMTCalibration.unitGroupDelay = dbuf; + } + else if( line.find("ELOGMT_BINARY") != std::string::npos ){ + m_readElogMTBinary = true; + } + else if (line.find("ELOGMT_READ_OPTION") != std::string::npos) { + int ibuf(0); + ifs >> ibuf; + if (ibuf < 0 && ibuf > Control::NUM_TYPE_OF_ELOGMT_READING_OPTION) { + ptrOutputFiles->writeErrorMessage("Unsupported type of ELOG-MT reading option: " + Util::toString(ibuf)); + } + m_elogMTReadingOption = ibuf; + } + else if (line.find("LOGGER_CAL_DIRECTORY") != std::string::npos) { + std::string sbuf; + ifs >> sbuf; + m_directoryOfLoggerCalibrationFiles = sbuf; + } + else if( line.find("CAL_FILES") != std::string::npos ){ + const int numChannels = getNumberOfChannels(); + m_calibrationFiles.clear(); + m_calibrationFiles.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + std::string sbuf; + ifs >> sbuf; + m_calibrationFiles.push_back(sbuf); + } + } + else if( line.find("OUTPUT_LEVEL") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + m_outputLevel = ibuf; + } + else if( line.find("DATA_SEGMENT_EVAL") != std::string::npos ){ + m_paramsForDataSegmentEvaluation.doEvaluation = true; + int ibuf(0); + ifs >> ibuf; + m_paramsForDataSegmentEvaluation.numDataSegments = ibuf; + } + else if( line.find("FREQ_DOMAIN_EVAL") != std::string::npos ){ + m_paramsForFreqDomainEvaluation.doEvaluation = true; + double dbuf(0); + ifs >> dbuf; + m_paramsForFreqDomainEvaluation.startOutputFrequency = dbuf; + ifs >> dbuf; + m_paramsForFreqDomainEvaluation.endOutputFrequency = dbuf; + int ibuf(0); + ifs >> ibuf; + m_paramsForFreqDomainEvaluation.numOfOutputFrequency = ibuf; + ifs >> ibuf; + m_paramsForFreqDomainEvaluation.numOfOutputFrequencyForAverage = ibuf; + } + else if( line.find("TIME_DOMAIN_EVAL") != std::string::npos ){ + m_paramsForTimeDomainEvaluation.doEvaluation = true; + int ibuf(0); + ifs >> ibuf; + m_paramsForTimeDomainEvaluation.timeSeriesInterval = ibuf; + } + else if( line.find("DECIMATION") != std::string::npos ){ + m_paramsForDecimation.applyDecimation = true; + int ibuf(0); + ifs >> ibuf; + m_paramsForDecimation.decimationInterval = ibuf; + ifs >> ibuf; + m_paramsForDecimation.filterLength = ibuf; + double dbuf(0); + ifs >> dbuf; + m_paramsForDecimation.transitionBandWidthInLogarithmicScale = dbuf; + } + else if( line.find("START_TIMES") != std::string::npos ){ + for( int iSect = 0 ; iSect < m_numTimeSeriesSections; ++iSect ){ + std::string sbuf; + ifs >> sbuf; + m_startTimeOfEachSection.push_back(sbuf); + } + } + else if( line.find("COHERENCE_CRITERIA") != std::string::npos && line.length() < 25){ + m_paramsForSquareCoherenceCriteria.applySquareCoherenceCriteria = true; + int ibuf(0); + ifs >> ibuf; + if( ibuf < 2 ){ + ptrOutputFiles->writeErrorMessage("Segment size for square coherence criteria is too small: " + Util::toString(ibuf)); + } + m_paramsForSquareCoherenceCriteria.numSegments = ibuf; + double dbuf(0); + ifs >> dbuf; + if( dbuf < 0.0 ){ + ptrOutputFiles->writeErrorMessage("Square coherence criteria is less than 0.0: " + Util::toString(dbuf)); + } + if( dbuf > 1.0 ){ + ptrOutputFiles->writeErrorMessage("Square coherence criteria is larger than 1.0: " + Util::toString(dbuf)); + } + m_paramsForSquareCoherenceCriteria.threshold = dbuf; + } + else if( line.find("COHERENCE_CRITERIA_RANDOM") != std::string::npos ){ + m_paramsForSquareCoherenceCriteriaWithRandomSampling.applySquareCoherenceCriteria = true; + int ibuf(0); + ifs >> ibuf; + if( ibuf < 2 ){ + ptrOutputFiles->writeErrorMessage("Segment size for square coherence criteria is too small: " + Util::toString(ibuf)); + } + m_paramsForSquareCoherenceCriteriaWithRandomSampling.numSegments = ibuf; + ifs >> ibuf; + m_paramsForSquareCoherenceCriteriaWithRandomSampling.numRandomSamples = ibuf; + double dbuf(0); + ifs >> dbuf; + if( dbuf < 0.0 ){ + ptrOutputFiles->writeErrorMessage("Square coherence criteria is less than 0.0: " + Util::toString(dbuf)); + } + if( dbuf > 1.0 ){ + ptrOutputFiles->writeErrorMessage("Square coherence criteria is larger than 1.0: " + Util::toString(dbuf)); + } + m_paramsForSquareCoherenceCriteriaWithRandomSampling.threshold = dbuf; + } + else if( line.find("HAMPEL_FILTER") != std::string::npos ){ + m_paramsForParamsForHampelFilter.applyHampelFilter = true; + int ibuf(0); + ifs >> ibuf;// Number of neighbor points on either side for Hampel filter + if( ibuf < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of neighbor points on either side for Hampel filter is less than 1: " + Util::toString(ibuf)); + } + m_paramsForParamsForHampelFilter.numNeighborsOnEitherSide = ibuf; + double dbuf(0); + ifs >> dbuf; + if( dbuf <= 0 ){ + ptrOutputFiles->writeErrorMessage("Criteria for Hampel filter must be positive: " + Util::toString(dbuf)); + } + m_paramsForParamsForHampelFilter.nsigma = dbuf; + } + else if( line.find("MS_CRITERIA") != std::string::npos ){ + m_paramsForMeanSquareCriteria.applyMeanSquareCriteria = true; + double dbuf(0); + ifs >> dbuf; + if( dbuf <= 0 ){ + ptrOutputFiles->writeErrorMessage("Mean square criteria must be positive: " + Util::toString(dbuf)); + } + m_paramsForMeanSquareCriteria.nsigma = dbuf; + } + else if( line.find("PROCEDURE") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + if( ibuf < 0 || ibuf >= Control::NUM_TYPE_OF_PROCEDURE_TYPE ){ + ptrOutputFiles->writeErrorMessage("Unsupported type of procedure : " + Util::toString(ibuf)); + } + m_procedureType = ibuf; + } + else if( line.find("MESTIMATORS") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + if( ibuf < Control::NOT_USED || ibuf >= Control::NUM_TYPE_OF_MESTIMATORS ){ + ptrOutputFiles->writeErrorMessage("Unsupported type of M-estimator : " + Util::toString(ibuf)); + } + typesOfRobustWeight[0] = ibuf; + ifs >> ibuf; + if( ibuf < Control::NOT_USED || ibuf >= Control::NUM_TYPE_OF_MESTIMATORS ){ + ptrOutputFiles->writeErrorMessage("Unsupported type of M-estimator : " + Util::toString(ibuf)); + } + typesOfRobustWeight[1] = ibuf; + } + else if( line.find("HUBER") != std::string::npos ){ + double dbuf(0); + ifs >> dbuf; + objRobustWeightHuber.setThreshould(dbuf); + int ibuf(0); + ifs >> ibuf; + objRobustWeightHuber.setNumIterationMax(ibuf); + ifs >> dbuf; + objRobustWeightHuber.setConvergenceCriteria(dbuf); + } + else if( line.find("THOMSON") != std::string::npos ){ + double dbuf(0); + ifs >> dbuf; + objRobustWeightThomson.setParameterForDetermingProbability(dbuf); + int ibuf(0); + ifs >> ibuf; + objRobustWeightThomson.setNumIterationMax(ibuf); + ifs >> dbuf; + objRobustWeightThomson.setConvergenceCriteria(dbuf); + } + else if( line.find("TUKEYS_BIWEIGHTS") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + objRobustWeightTukeysBiweights.setNumIterationMax(ibuf); + double dbuf(0); + ifs >> dbuf; + objRobustWeightTukeysBiweights.setConvergenceCriteria(dbuf); + } + else if( line.find("HAT_MATRIX") != std::string::npos ){ + m_paramsForTreatmentOfHatMatrix.applyLeverageWeights = true; + double dbuf(0); + ifs >> dbuf; + m_paramsForTreatmentOfHatMatrix.threshold = dbuf; + int ibuf(0); + ifs >> ibuf; + if( ibuf < 1 ){ + ptrOutputFiles->writeErrorMessage("Maximum number of the outer iteration is less than 1: " + Util::toString(ibuf)); + } + m_paramsForTreatmentOfHatMatrix.maxNumberOfOuterIteration = ibuf; + } + else if( line.find("OUTPUT_TIME_SERIES") != std::string::npos ){ + m_outputTimeSeriesToCsv = true; + } + else if (line.find("OUTPUT_CALIBRATED_TIME_SERIES") != std::string::npos) { + m_outputCalibratedTimeSeriesToCsv = true; + } + else if( line.find("JACKKNIFE") != std::string::npos ){ + double dbuf(0); + ifs >> dbuf; + m_percentageOfOmmitedDataSubsetDeletionJackknife = dbuf; + } + else if( line.find("HIGH_PASS") != std::string::npos ){ + m_doesApplyIIRHighPassFilter = true; + double dbuf(0.0); + ifs >> dbuf; + if( dbuf <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Cutoff frequency must be positive"); + } + m_cutoffFrequencyForIIRHighPassFilter = dbuf; + } + else if( line.find("LOW_PASS") != std::string::npos ){ + m_doesApplyIIRLowPassFilter = true; + double dbuf(0.0); + ifs >> dbuf; + if( dbuf <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Cutoff frequency must be positive"); + } + m_cutoffFrequencyForIIRLowPassFilter = dbuf; + } + else if( line.find("ROBUST_AUTO_COVARIANCE") != std::string::npos ){ + // Parameters for robust calculation of autocovariance matrix + double dbuf(0.0); + ifs >> dbuf; + if( dbuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Percentage of the small number added to diagonals of auto-covariance matrix is negative"); + } + m_paramsForRobustAutoCovariance.percentageOfSmallNumberAddedToDiagonals = dbuf; + int ibuf(0); + ifs >> ibuf; + if( ibuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Maximum number of the iterations of robust auto-covariance calculation is negative"); + } + m_paramsForRobustAutoCovariance.maxNumOfIterations = ibuf; + ifs >> dbuf; + if( dbuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Convergence criteria of the iterations of robust auto-covariance calculation"); + } + m_paramsForRobustAutoCovariance.convergenceCriteria = dbuf; + } + else if( line.find("PREWHITENING") != std::string::npos ){ + // Parameters for robust prewhitening + m_paramsForPrewhitening.applyPrewhitening = true; + int ibuf(0); + ifs >> ibuf; + if( ibuf >= Control::NUM_TYPE_OF_MESTIMATORS_FOR_PREWHITENING ){ + ptrOutputFiles->writeErrorMessage("Unsupported type of pre-whitening : " + Util::toString(ibuf)); + } + m_paramsForPrewhitening.typeOfEstimator = ibuf; + ifs >> ibuf; + if( ibuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Degree of AR model is negative"); + } + m_paramsForPrewhitening.maxDegreeOfARModel = ibuf; + ifs >> ibuf; + if( ibuf % 2 == 0 ){ + ptrOutputFiles->writeErrorMessage("Numbef of candidates of partial autocorrelation function should be an odd number"); + } + m_paramsForPrewhitening.numCandidatesOfPartialAutocorrelationFunction = ibuf; + } + else if( line.find("ROBUST_FILTER") != std::string::npos ){ + // Parameters for robust filter + m_paramsForRobustFilter.applyRobustFilter = true; + int ibuf(0); + ifs >> ibuf; + if( ibuf != 0 ){ + m_paramsForRobustFilter.replaceTimeSeriesWithFilteredValues = true; + }else{ + m_paramsForRobustFilter.replaceTimeSeriesWithFilteredValues = false; + } + const int numChannels = getNumberOfChannels(); + m_paramsForRobustFilter.thresholds.clear(); + m_paramsForRobustFilter.thresholds.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ThresholdsForRobustFilter thresholds; + ifs >> thresholds.firstThresholdFactor; + if( thresholds.firstThresholdFactor < 0 ){ + ptrOutputFiles->writeErrorMessage("Threshold factor must be positive"); + } + ifs >> thresholds.secondThresholdFactor; + if( thresholds.secondThresholdFactor < 0 ){ + ptrOutputFiles->writeErrorMessage("Threshold factor must be positive"); + } + if( thresholds.firstThresholdFactor >= thresholds.secondThresholdFactor ){ + ptrOutputFiles->writeErrorMessage("The second threshold factor must be larger than the first threshould factor"); + } + ifs >> thresholds.maxNumOfConsecutiveReplacements; + m_paramsForRobustFilter.thresholds.push_back(thresholds); + } + } + else if( line.find("ROBUST_MULTIVARIATE_REGRESSION") != std::string::npos || line.find("RRMS") != std::string::npos){ + // Parameters for robust multivariate regression + int ibuf(0); + ifs >> ibuf; + if( ibuf == 1 ){ + m_paramsForRobustMultivariateRegression.selectInitialCandidatesByRandomSamplingAtEachFrequency = true; + } + ifs >> ibuf; + if( ibuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Maximum number of initial candidates is negative"); + } + m_paramsForRobustMultivariateRegression.numOfMaxInitialCandidates = ibuf; + ifs >> ibuf; + if( ibuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Maximum number of iteration of the first imporvements is negative"); + } + m_paramsForRobustMultivariateRegression.numOfMaxIterationsOfFirstIstep = ibuf; + double dbuf(0.0); + ifs >> dbuf; + if( dbuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Convegence criteria of the first imporvements is negative"); + } + m_paramsForRobustMultivariateRegression.convergenceCriteriaOfFirstIstep = dbuf; + ifs >> ibuf; + if( ibuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Maximum number of the candidates of the second imporvements is negative"); + } + m_paramsForRobustMultivariateRegression.numOfMaxCandidatesOfSecondIstep = ibuf; + ifs >> ibuf; + if( ibuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Maximum number of iteration of the second imporvements is negative"); + } + m_paramsForRobustMultivariateRegression.numOfMaxIterationsOfSecondIstep = ibuf; + ifs >> dbuf; + if( dbuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Convegence criteria of the second imporvements is negative"); + } + m_paramsForRobustMultivariateRegression.convergenceCriteriaOfSecondIstep = dbuf; + } + else if( line.find("DIFFERENCE_THRESHOLD") != std::string::npos ){ + m_paramsForDecidingCandicatesForSubsequentFrequencies.useResponseFunctionsOfPreviousFrequency = false; + const int numChannels = getNumberOfChannels() - getNumRemoteReferenceVariables(); + m_paramsForDecidingCandicatesForSubsequentFrequencies.thresholdOfDifferences.clear(); + m_paramsForDecidingCandicatesForSubsequentFrequencies.thresholdOfDifferences.reserve(numChannels); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ParamsOfThresholdOfDifferenceResponseFuctions params; + int ibuf(0); + ifs >> ibuf; + if( ibuf < 0 && ibuf > Control::NUM_OF_THRESHOLD_TYPE_OF_DIFFERENCE_OF_RESPONSE_FUCTIONS ){ + ptrOutputFiles->writeErrorMessage("Unsupported type of difference threshold of response fuctions: " + Util::toString(ibuf)); + } + params.type = ibuf; + double dbuf(0.0); + ifs >> dbuf; + if( dbuf < 0 ){ + ptrOutputFiles->writeErrorMessage("Difference threshold is negative"); + } + params.threshold = dbuf; + m_paramsForDecidingCandicatesForSubsequentFrequencies.thresholdOfDifferences.push_back(params); + } + } + else if( line.find("TIME_RANGE_OF_CANDIDATES") != std::string::npos ){ + std::string sbuf; + ifs >> sbuf; + m_paramsForRobustMultivariateRegression.startOfTimeRange = sbuf; + ifs >> sbuf; + m_paramsForRobustMultivariateRegression.endOfTimeRange = sbuf; + } + else if( line.find("BOOTSTRAP") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + if( ibuf < 2 ){ + ptrOutputFiles->writeErrorMessage("Number of repetitions of bootstrap is too small: " + Util::toString(ibuf)); + } + m_numRepetitionsOfBootstrap = ibuf; + } + else if( line.find("ERROR_ESTIMATION") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + m_errorEstimationMethod = ibuf; + } + else if( line.find("OUTPUT_FREQ_DOMAIN_DATA") != std::string::npos ){ + m_outputFreqDomainDataToCsv = true; + } + else if( line.find("NUM_THREADS") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + m_numThreads = ibuf; + } + else if( line.find("NOTCH") != std::string::npos && line.length() < 12 ){ + int ibuf(0); + ifs >> ibuf; + const int numFreqs = ibuf; + m_cutoffFrequenciesForNotchFilter.reserve(numFreqs); + for( int iFreq = 0; iFreq < numFreqs; ++iFreq ){ + double dbuf(0.0); + ifs >> dbuf; + if( dbuf <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Cutoff frequency must be positive"); + } + m_cutoffFrequenciesForNotchFilter.push_back(dbuf); + } + } + else if( line.find("NOTCH_PARAM_Q") != std::string::npos ){ + double dbuf(0); + ifs >> dbuf; + if( dbuf <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Parameter Q must be positive"); + } + m_parameterQForNotchFilter = dbuf; + } + else if( line.find("DMP_CRITERIA") != std::string::npos ){ + m_paramsForDegreeOfMagneticPolarizationCriteria.applyDegreeOfMagneticPolarizationCriteria = true; + int ibuf(0); + ifs >> ibuf; + if( ibuf < 2 ){ + ptrOutputFiles->writeErrorMessage("Segment size for degree of magnetic polarization criteria is too small: " + Util::toString(ibuf)); + } + m_paramsForDegreeOfMagneticPolarizationCriteria.numSegments = ibuf; + double dbuf(0); + ifs >> dbuf; + if( dbuf <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Threshold must be positive"); + } + m_paramsForDegreeOfMagneticPolarizationCriteria.threshold = dbuf; + } + else if( line.find("MPD_CRITERIA") != std::string::npos ){ + m_paramsForMagneticPolarizatitonDirectionCriteria.applyMagneticPolarizatitonDirectionCriteria = true; + double dbuf(0); + ifs >> dbuf; + if( dbuf <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Threshold must be positive"); + } + m_paramsForMagneticPolarizatitonDirectionCriteria.threshold = dbuf; + } + else if( line.find("OUTPUT_RHOA_PHS") != std::string::npos ){ + m_outputApparentResistivityAndPhase = true; + } + else if( line.find("MERGE_SECTIONS") != std::string::npos ){ + int ibuf(0); + ifs >> ibuf; + if( ibuf < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of sections after merging is too small: " + Util::toString(ibuf)); + } + const int numSectionsAfterMerge(ibuf); + for( int iSection = 0; iSection < numSectionsAfterMerge; ++iSection ){ + int startSectionIndex(-1); + int endSectionIndex(-1); + ifs >> startSectionIndex >> endSectionIndex; + m_rangeOfSectionsForMerge.push_back ( std::make_pair(startSectionIndex, endSectionIndex ) ); + } + } + else if (line.find("EOF_ANALYSIS") != std::string::npos) { + m_doesPeformEOFBasedDenoising = true; + int ibuf(0); + ifs >> ibuf; + m_timingEOFBasedDenoising = ibuf; + } + else if( line.find("END") != std::string::npos ){ + break; + } + } + + ifs.close(); + + if (getNumCalibrationFilesForMFS() > 0) { + assert(getNumCalibrationFilesForMFS() == getNumberOfChannels()); + } + if( getNumCalibrationFiles() > 0 ){ + assert( getNumCalibrationFiles() == getNumberOfChannels() ); + } + if (getElogMTReadingOption() == Control::NOT_SPECIFIED) { + switch (getNumOutputVariables()) + { + case 1: + m_elogMTReadingOption = Control::READ_HZ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA; + break; + case 2: + m_elogMTReadingOption = Control::READ_EX_EY_HX_HY_HRX_HRY_FROM_ELOGMT_DATA; + break; + case 3: + m_elogMTReadingOption = Control::READ_EX_EY_HX_HY_HZ_HRX_HRY_FROM_ELOGMT_DATA; + break; + default: + m_elogMTReadingOption = Control::READ_EX_EY_HX_HY_HZ_HRX_HRY_FROM_ELOGMT_DATA; + break; + } + } + + const double samplingFrequencyAfterDecimation = m_samplingFrequency / static_cast(m_paramsForDecimation.decimationInterval); + + ptrOutputFiles->writeLogMessage("================================================================================",false); + ptrOutputFiles->writeLogMessage("Summary of control parameters",false); + ptrOutputFiles->writeLogMessage("================================================================================",false); + ptrOutputFiles->writeLogMessage("Number of threads : " + Util::toString(getNumThreads()),false); +#ifdef _USE_OMP + omp_set_num_threads( getNumThreads() ); +#endif + switch (getProcedureType()){ + case Control::TWO_STAGE: + ptrOutputFiles->writeLogMessage("Procedure type : two stage procedure", false); + break; + case Control::MULTIVARIATE_REGRESSION: + ptrOutputFiles->writeLogMessage("Procedure type : multivariate regression (RRMS)", false); + break; + case Control::MODIFIED_MULTIVARIATE_REGRESSION: + ptrOutputFiles->writeLogMessage("Procedure type : modified multivariate regression (MRRMS)", false); + break; + case Control::ORDINARY_REMOTE_REFERENCE: + ptrOutputFiles->writeLogMessage("Procedure type : ordinary remote reference", false); + break; + case Control::REPEATED_MEDIAN: + ptrOutputFiles->writeLogMessage("Procedure type : repeated median estimator", false); + break; + case Control::TEST: + ptrOutputFiles->writeLogMessage("Procedure type : test", false); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported procedure type : " + Util::toString(getProcedureType())); + break; + } + // Make instance for analysis class + switch (getProcedureType()) + { + case Control::TWO_STAGE: + m_analysis = new AnalysisTwoStage(); + break; + case Control::MULTIVARIATE_REGRESSION: + m_analysis = new AnalysisMultivariateRegression(); + break; + case Control::MODIFIED_MULTIVARIATE_REGRESSION: + m_analysis = new AnalysisMultivariateRegression(); + break; + case Control::ORDINARY_REMOTE_REFERENCE: + m_analysis = new AnalysisOrdinaryRemoteReference(); + break; + case Control::REPEATED_MEDIAN: + m_analysis = new AnalysisRepeatedMedian(); + break; + case Control::TEST: + m_analysis = new AnalysisTest(); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported procedure type : " + Util::toString(getProcedureType())); + break; + } + // Output parameters of procedures + if (getProcedureType() == Control::TWO_STAGE || getProcedureType() == Control::ORDINARY_REMOTE_REFERENCE || getProcedureType() == Control::TEST) { + for( int index = 0; index < 2; ++index ){ + std::string sbuf; + if( index == 0 ){ + sbuf = "The first M-estimator : "; + }else{ + sbuf = "The second M-estimator : "; + } + switch (typesOfRobustWeight[index]) + { + case Control::HUBER: + m_analysis->setRobustWeightHuber( index, &objRobustWeightHuber ); + sbuf += "Hubur"; + ptrOutputFiles->writeLogMessage(sbuf, false); + ptrOutputFiles->writeLogMessage(" Threshould value for downweighting : " + Util::toString(objRobustWeightHuber.getThreshould()), false); + ptrOutputFiles->writeLogMessage(" Maximum number of iteration : " + Util::toString(objRobustWeightHuber.getNumIterationMax()), false); + ptrOutputFiles->writeLogMessage(" Convergence criteria : " + Util::toString(objRobustWeightHuber.getConvergenceCriteria()), false); + break; + case Control::THOMSON: + m_analysis->setRobustWeightThomson( index, &objRobustWeightThomson ); + sbuf += "Thomson"; + ptrOutputFiles->writeLogMessage(sbuf, false); + ptrOutputFiles->writeLogMessage(" Parameter for determing the probability used for outlier rejection : " + Util::toString(objRobustWeightThomson.getParameterForDetermingProbability()), false); + ptrOutputFiles->writeLogMessage(" Maximum number of iteration : " + Util::toString(objRobustWeightThomson.getNumIterationMax()), false); + ptrOutputFiles->writeLogMessage(" Convergence criteria : " + Util::toString(objRobustWeightThomson.getConvergenceCriteria()), false); + break; + case Control::TUKEYS_BIWEIGHTS: + m_analysis->setRobustWeightTukeysBiweights( index, &objRobustWeightTukeysBiweights ); + sbuf += "Tukey's biweights"; + ptrOutputFiles->writeLogMessage(sbuf, false); + ptrOutputFiles->writeLogMessage(" Maximum number of iteration : " + Util::toString(objRobustWeightTukeysBiweights.getNumIterationMax()), false); + ptrOutputFiles->writeLogMessage(" Convergence criteria : " + Util::toString(objRobustWeightTukeysBiweights.getConvergenceCriteria()), false); + break; + case Control::NOT_USED: + // The pointer remains to be NULL + sbuf += "not to be used"; + ptrOutputFiles->writeLogMessage(sbuf, false); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported type of M-estimator : " + Util::toString(typesOfRobustWeight[index])); + break; + } + } + if (getProcedureType() == Control::TWO_STAGE && m_paramsForTreatmentOfHatMatrix.applyLeverageWeights) { + ptrOutputFiles->writeLogMessage("Parameters for leverage weights based on hat matrix : ", false); + ptrOutputFiles->writeLogMessage(" Threshold value for determing leverage points: " + Util::toString(m_paramsForTreatmentOfHatMatrix.threshold), false); + ptrOutputFiles->writeLogMessage(" Maximum number of the outer iteration: " + Util::toString(m_paramsForTreatmentOfHatMatrix.maxNumberOfOuterIteration), false); + } + } + else if (getProcedureType() == Control::MULTIVARIATE_REGRESSION || getProcedureType() == Control::MODIFIED_MULTIVARIATE_REGRESSION) { + if( m_paramsForRobustMultivariateRegression.selectInitialCandidatesByRandomSamplingAtEachFrequency ){ + ptrOutputFiles->writeLogMessage("At each frequency, initial candidates are selected by random sampling", false); + } + ptrOutputFiles->writeLogMessage("Maximum number of initial candidates: " + + Util::toString(m_paramsForRobustMultivariateRegression.numOfMaxInitialCandidates), false); + ptrOutputFiles->writeLogMessage("Maximum number of iteration of the first imporvements: " + + Util::toString(m_paramsForRobustMultivariateRegression.numOfMaxIterationsOfFirstIstep), false); + ptrOutputFiles->writeLogMessage("Convegence criteria of the first imporvements: " + + Util::toString(m_paramsForRobustMultivariateRegression.convergenceCriteriaOfFirstIstep), false); + ptrOutputFiles->writeLogMessage("Maximum number of the candidates of the second imporvements: " + + Util::toString(m_paramsForRobustMultivariateRegression.numOfMaxCandidatesOfSecondIstep), false); + ptrOutputFiles->writeLogMessage("Maximum number of iteration of the second imporvements: " + + Util::toString(m_paramsForRobustMultivariateRegression.numOfMaxIterationsOfSecondIstep), false); + ptrOutputFiles->writeLogMessage("Convegence criteria of the second imporvements: " + + Util::toString(m_paramsForRobustMultivariateRegression.convergenceCriteriaOfSecondIstep), false); + ptrOutputFiles->writeLogMessage("Time range for selecting intial candidates: " + + m_paramsForRobustMultivariateRegression.startOfTimeRange + " - " + + m_paramsForRobustMultivariateRegression.endOfTimeRange, false); + if( !m_paramsForDecidingCandicatesForSubsequentFrequencies.useResponseFunctionsOfPreviousFrequency ){ + const int numChannels = getNumberOfChannels() - getNumRemoteReferenceVariables(); + ptrOutputFiles->writeLogMessage("Threshold type of differences of response functions:", false); + ptrOutputFiles->writeLogMessage(" Channel# Type Threshold", false); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + const ParamsOfThresholdOfDifferenceResponseFuctions& params = m_paramsForDecidingCandicatesForSubsequentFrequencies.thresholdOfDifferences[iChan]; + std::ostringstream oss; + oss << std::setw(10) << iChan; + oss << std::setw(10) << params.type; + oss << std::setw(10) << params.threshold; + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + } + } + switch (getErrorEstimationMethod()) + { + case SUBSET_DELETION_JACKKNIFE: + ptrOutputFiles->writeLogMessage("Error estimation method : subset deletion jackknife", false); + ptrOutputFiles->writeLogMessage("Percentage of ommited data in subset deletion jackknife : " + Util::toString(m_percentageOfOmmitedDataSubsetDeletionJackknife), false); + break; + case FIXED_WEIGHTS_JACKKNIFE: + ptrOutputFiles->writeLogMessage("Error estimation method : fixed-weights jackknife", false); + break; + case ROBUST_BOOTSTRAP: + ptrOutputFiles->writeLogMessage("Error estimation method : robust bootstrap", false); + ptrOutputFiles->writeLogMessage("Number or repetitions in bootstrap : " + Util::toString(getNumRepetitionsOfBootstrap()), false); + break; + case FIXED_WEIGHTS_BOOTSTRAP: + ptrOutputFiles->writeLogMessage("Error estimation method : fixed-weights bootstrap", false); + ptrOutputFiles->writeLogMessage("Number or repetitions in bootstrap : " + Util::toString(getNumRepetitionsOfBootstrap()), false); + break; + case STRICT_BOOTSTRAP: + ptrOutputFiles->writeLogMessage("Error estimation method : strict bootstrap", false); + ptrOutputFiles->writeLogMessage("Number or repetitions in bootstrap : " + Util::toString(getNumRepetitionsOfBootstrap()), false); + break; + case PARAMETRIC: + ptrOutputFiles->writeLogMessage("Error estimation method : parametric", false); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported error estimation method : " + Util::toString(getErrorEstimationMethod())); + break; + } + + if (getProcedureType() == Control::MODIFIED_MULTIVARIATE_REGRESSION && getErrorEstimationMethod() == ROBUST_BOOTSTRAP) + { + ptrOutputFiles->writeErrorMessage("Robust bootstrap cannot be used for MRRMS estimator"); + } + + ptrOutputFiles->writeLogMessage("Number of output variables : " + Util::toString(getNumOutputVariables()), false); + ptrOutputFiles->writeLogMessage("Number of input variables : " + Util::toString(getNumInputVariables()), false); + ptrOutputFiles->writeLogMessage("Number of remote reference variables : " + Util::toString(getNumRemoteReferenceVariables()), false); + ptrOutputFiles->writeLogMessage("Sampling frequency (Hz) : " + Util::toString(getSamplingFrequency()), false); + ptrOutputFiles->writeLogMessage("Number of time-series sections : " + Util::toString(getNumTimeSeriesSections()), false); + ptrOutputFiles->writeLogMessage("Ratio of overlapping part to whole segment length : " + Util::toString(getOverlappingRatio()), false); + ptrOutputFiles->writeLogMessage("Output level : " + Util::toString(getOutputLevel()), false); + if( doesOutputTimeSeriesToCsv() ){ + ptrOutputFiles->writeLogMessage("Output time-series data to csv files", false); + } + if (doesOutputCalibratedTimeSeriesToCsv()) { + ptrOutputFiles->writeLogMessage("Output calibrated time-series data to csv files", false); + } + if( doesOutputFreqDomainDataToCsv() ){ + ptrOutputFiles->writeLogMessage("Output frequency-domain data to csv files", false); + } + if( doesOutputApparentResistivityAndPhase() ){ + ptrOutputFiles->writeLogMessage("Output apparent resistivity and phase to a seperate csv file", false); + } + ptrOutputFiles->writeLogMessage("Information about the segment lengths and frequencies : ", false); + { + ptrOutputFiles->writeLogMessage(" Segment# Length Index Frequency(Hz) Period(sec)", false); + int iSeg(0); + for( std::vector::const_iterator itrSeg = m_segments.begin(); itrSeg != m_segments.end(); ++itrSeg, ++iSeg ){ + for( std::vector::const_iterator itr = itrSeg->degrees.begin(); itr != itrSeg->degrees.end(); ++itr ){ + std::ostringstream oss; + oss << std::setw(10) << iSeg; + oss << std::setw(10) << itrSeg->length; + oss << std::setw(10) << *itr; + const double freq = samplingFrequencyAfterDecimation * static_cast(*itr) / static_cast(itrSeg->length); + const double period = 1.0 / freq; + oss << std::setw(20) << std::scientific << std::setprecision(9) << freq; + oss << std::setw(20) << std::scientific << std::setprecision(9) << period; + ptrOutputFiles->writeLogMessage(oss.str(), false); + m_frequencies.push_back(freq);// Construct array for frequencies + } + } + } + ptrOutputFiles->writeLogMessage("Information about the time-series data : ", false); + ptrOutputFiles->writeLogMessage(" Section# Channel# Type NSkip NData File", false); + for( int iSect = 0; iSect < m_numTimeSeriesSections; ++iSect ){ + const int numDataPoints = m_dataFileSets[iSect].numDataPoints; + std::vector& dataFileList = m_dataFileSets[iSect].dataFile; + for( int i = 0; i < m_numOutputVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::OUTPUT, i ); + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + std::ostringstream oss; + oss << std::setw(10) << iSect; + oss << std::setw(10) << iChan; + oss << std::setw(10) << "Out"+Util::toString(i); + oss << std::setw(15) << numSkipData; + oss << std::setw(15) << numDataPoints; + oss << std::setw(5) << ""; + oss << fileName; + if (doesReadMTH5() && !dataFileList[iChan].mth5GroupName.empty()){ + oss << " " << dataFileList[iChan].mth5GroupName; + } + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for( int i = 0; i < m_numInputVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::INPUT, i ); + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + std::ostringstream oss; + oss << std::setw(10) << iSect; + oss << std::setw(10) << iChan; + oss << std::setw(10) << "Inp"+Util::toString(i); + oss << std::setw(15) << numSkipData; + oss << std::setw(15) << numDataPoints; + oss << std::setw(5) << ""; + oss << fileName; + if (doesReadMTH5() && !dataFileList[iChan].mth5GroupName.empty()) { + oss << " " << dataFileList[iChan].mth5GroupName; + } + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for( int i = 0; i < m_numRemoteReferenceVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::REMOTE_REFERENCE, i ); + const std::string fileName = dataFileList[iChan].fileName; + const int numSkipData = dataFileList[iChan].numSkipData; + std::ostringstream oss; + oss << std::setw(10) << iSect; + oss << std::setw(10) << iChan; + oss << std::setw(10) << "RR"+Util::toString(i); + oss << std::setw(15) << numSkipData; + oss << std::setw(15) << numDataPoints; + oss << std::setw(5) << ""; + oss << fileName; + if (doesReadMTH5() && !dataFileList[iChan].mth5GroupName.empty()) { + oss << " " << dataFileList[iChan].mth5GroupName; + } + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + } + if( getNumRangeOfSectionsForMerge() > 0 ){ + const int numRangeOfSectionsForMerge = getNumRangeOfSectionsForMerge(); + ptrOutputFiles->writeLogMessage("Number of sections after merging : " + Util::toString(numRangeOfSectionsForMerge), false); + ptrOutputFiles->writeLogMessage(" Original section# Merged section#", false); + int endSectionIndexPre(-1); + for( int iSectionAfterMerge = 0; iSectionAfterMerge < numRangeOfSectionsForMerge; ++iSectionAfterMerge ){ + const std::pair range = getRangeOfSectionsForMerge(iSectionAfterMerge); + std::ostringstream oss; + oss << std::setw(19) << range.first << std::setw(17) << range.second; + ptrOutputFiles->writeLogMessage(oss.str(), false); + if( range.first < 0 ){ + ptrOutputFiles->writeErrorMessage("Start section index is too small: " + Util::toString(range.first)); + } + if( range.second < 0 ){ + ptrOutputFiles->writeErrorMessage("End section index is too small: " + Util::toString(range.second)); + } + if( range.first >= getNumTimeSeriesSections() ){ + ptrOutputFiles->writeErrorMessage("Start section index is too large: " + Util::toString(range.first)); + } + if( range.second >= getNumTimeSeriesSections() ){ + ptrOutputFiles->writeErrorMessage("End section index is too large: " + Util::toString(range.second)); + } + if( range.second < range.first ){ + ptrOutputFiles->writeErrorMessage("End section index should be larger than start section index!!"); + } + if( range.first <= endSectionIndexPre ){ + ptrOutputFiles->writeErrorMessage("Start section index should be greater than the previous end section index."); + } + endSectionIndexPre = range.second; + } + } + if( !m_startTimeOfEachSection.empty() ){ + if( getNumStartTimesSections() != getNumTimeSeriesSections() ){ + ptrOutputFiles->writeErrorMessage("Number of start times is not equal to the number of sections"); + } + ptrOutputFiles->writeLogMessage("Start time of each section : ", false); + ptrOutputFiles->writeLogMessage(" Section# Time(hh:mm::ss)", false); + for( int iSect = 0; iSect < m_numTimeSeriesSections; ++iSect ){ + std::ostringstream oss; + oss << std::setw(10) << iSect; + oss << std::setw(20) << m_startTimeOfEachSection[iSect]; + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + }else{ + // If start times are not specified, all start times are forced to be 00:00:00 + for( int iSect = 0 ; iSect < m_numTimeSeriesSections; ++iSect ){ + const std::string sbuf = "00:00:00"; + m_startTimeOfEachSection.push_back(sbuf); + } + } + const int numChannels = getNumberOfChannels(); + if( m_azimuths.empty() ){ + ptrOutputFiles->writeErrorMessage("Azimuth is not defined."); + } + ptrOutputFiles->writeLogMessage("Rotation angle (deg.) : " + Util::toString(getRotationAngle()), false); + ptrOutputFiles->writeLogMessage(" Channel# Type Azimuth(deg.)", false); + { + for( int i = 0; i < m_numOutputVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::OUTPUT, i ); + std::ostringstream oss; + oss << std::setw(10) << iChan; + oss << std::setw(10) << "Out"+Util::toString(i); + oss << std::setw(15) << getAzimuth(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for( int i = 0; i < m_numInputVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::INPUT, i ); + std::ostringstream oss; + oss << std::setw(10) << iChan; + oss << std::setw(10) << "Inp"+Util::toString(i); + oss << std::setw(15) << getAzimuth(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for( int i = 0; i < m_numRemoteReferenceVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::REMOTE_REFERENCE, i ); + std::ostringstream oss; + oss << std::setw(10) << iChan; + oss << std::setw(10) << "RR"+Util::toString(i); + oss << std::setw(15) << getAzimuth(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + } + if( doesReadAtsBinary() ){ + ptrOutputFiles->writeLogMessage("Read binary ATS files", false); + } + if( doesReadMTH5() ) { + ptrOutputFiles->writeLogMessage("Read MTH5 files", false); + } + if (doesMakeCalibrationFileForMFS()) { + ptrOutputFiles->writeLogMessage("Information about the inputs for calibration files : ", false); + ptrOutputFiles->writeLogMessage(" Type Input", false); + const Ats* ptrAts = Ats::getInstance(); + for (int i = 0; i < m_numOutputVariables; ++i) { + const int iChan = getChannelIndex(CommonParameters::OUTPUT, i); + std::ostringstream oss; + oss << std::setw(10) << "Out" + Util::toString(i) << " "; + oss << getCalibrationFileNameForMFS(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for (int i = 0; i < m_numInputVariables; ++i) { + const int iChan = getChannelIndex(CommonParameters::INPUT, i); + std::ostringstream oss; + oss << std::setw(10) << "Inp" + Util::toString(i) << " "; + oss << getCalibrationFileNameForMFS(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for (int i = 0; i < m_numRemoteReferenceVariables; ++i) { + const int iChan = getChannelIndex(CommonParameters::REMOTE_REFERENCE, i); + std::ostringstream oss; + oss << std::setw(10) << "RR" + Util::toString(i) << " "; + oss << getCalibrationFileNameForMFS(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + } + if (doesReadElogDualBinary()){ + ptrOutputFiles->writeLogMessage("Read two electric field data from ELOG1K/ELOG-Dual binary files", false); + } + if (doesMakeCalibrationFileForElogDual()) { + ptrOutputFiles->writeLogMessage("Information about the inputs for calibration of ELOG-Dual files : ", false); + switch (getTypeOfElogDual()) + { + case Control::ELOG1K: + ptrOutputFiles->writeLogMessage(" Type : ELOG1K" , false); + break; + case Control::ELOGDUAL_ADU_MODE: + ptrOutputFiles->writeLogMessage(" Type : ELOG-Dual (ADU mode)", false); + break; + case Control::ELOGDUAL_PHX_MODE: + ptrOutputFiles->writeLogMessage(" Type : ELOG-Dual (PHX mode)", false); + break; + default: + break; + } + ptrOutputFiles->writeLogMessage(" Calibration file : " + Util::toString(m_paramsForElogDualCalibration.fileName), false); + ptrOutputFiles->writeLogMessage(" Unit group delay : " + Util::toString(m_paramsForElogDualCalibration.unitGroupDelay), false); + } + if( doesReadElogMTBinary() ){ + switch (getElogMTReadingOption()){ + case Control::READ_EX_EY_HX_HY_HZ_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Ex, Ey, Hx, Hy, and Hz from ELOG-MT binary files", false); + break; + case Control::READ_EX_EY_HX_HY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Ex, Ey, Hx, and Hy from ELOG-MT binary files", false); + break; + case Control::READ_HZ_HX_HY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Hx, Hy, and Hz from ELOG-MT binary files", false); + break; + case Control::READ_EX_EY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Ex and Ey from ELOG-MT binary files", false); + break; + case Control::READ_EX_EY_HX_HY_HZ_HRX_HRY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Ex, Ey, Hx, Hy, Hz, Hrx, and Hry from ELOG-MT binary files", false); + break; + case Control::READ_EX_EY_HX_HY_HRX_HRY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Ex, Ey, Hx, Hy, Hrx, and Hry from ELOG-MT binary files", false); + break; + case Control::READ_HZ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Hx, Hy, Hz, Hrx, and Hry from ELOG-MT binary files", false); + break; + case Control::READ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Hx, Hy, Hrx, and Hry from ELOG-MT binary files", false); + break; + case Control::READ_HX_HY_FROM_ELOGMT_DATA: + ptrOutputFiles->writeLogMessage("Read Hx and Hy from ELOG-MT binary files", false); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported type of ELOG-MT reading option: " + Util::toString(getElogMTReadingOption())); + break; + } + } + if( doesMakeCalibrationFileForElogMT() ){ + ptrOutputFiles->writeLogMessage("Information about the inputs for calibration of ELOG-MT files : ", false); + switch (getTypeOfElogMT()) + { + case Control::ELOGMT_ADU_MODE: + ptrOutputFiles->writeLogMessage(" Type : ELOG-MT (ADU mode)", false); + break; + case Control::ELOGMT_PHX_MODE: + ptrOutputFiles->writeLogMessage(" Type : ELOG-MT (PHX mode)", false); + break; + default: + break; + } + ptrOutputFiles->writeLogMessage(" Calibration file : " + Util::toString(m_paramsForElogMTCalibration.fileName), false); + ptrOutputFiles->writeLogMessage(" Unit group delay : " + Util::toString(m_paramsForElogMTCalibration.unitGroupDelay), false); + } + if( !m_calibrationFiles.empty() ){ + assert( m_calibrationFiles.size() == getNumberOfChannels() ); + ptrOutputFiles->writeLogMessage("Information about calibration files : ", false); + ptrOutputFiles->writeLogMessage(" Type Calibration file", false); + { + for( int i = 0; i < m_numOutputVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::OUTPUT, i ); + std::ostringstream oss; + oss << std::setw(10) << "Out"+Util::toString(i); + oss << std::setw(5) << ""; + oss << getCalibrationFileName(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for( int i = 0; i < m_numInputVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::INPUT, i ); + std::ostringstream oss; + oss << std::setw(10) << "Inp"+Util::toString(i); + oss << std::setw(5) << ""; + oss << getCalibrationFileName(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + for( int i = 0; i < m_numRemoteReferenceVariables; ++i ){ + const int iChan = getChannelIndex( CommonParameters::REMOTE_REFERENCE, i ); + std::ostringstream oss; + oss << std::setw(10) << "RR"+Util::toString(i); + oss << std::setw(5) << ""; + oss << getCalibrationFileName(iChan); + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + } + } + if (!getDirectoryOfLoggerCalibrationFiles().empty()) { + ptrOutputFiles->writeLogMessage("Directory of logger calibration files : " + getDirectoryOfLoggerCalibrationFiles(), false); + } + if( m_paramsForParamsForHampelFilter.applyHampelFilter ){ + ptrOutputFiles->writeLogMessage("Parameters for Hampel filter : ", false); + ptrOutputFiles->writeLogMessage(" Number of neighbor points on either side for Hampel filter: " + Util::toString(m_paramsForParamsForHampelFilter.numNeighborsOnEitherSide), false); + ptrOutputFiles->writeLogMessage(" Criteria for Hampel filter: " + Util::toString(m_paramsForParamsForHampelFilter.nsigma), false); + } + if( doesApplyIIRHighPassFilter() ){ + ptrOutputFiles->writeLogMessage("Parameters for high-pass filter : ", false); + ptrOutputFiles->writeLogMessage(" Cutoff frequency (Hz): " + Util::toString(getCutoffFrequencyForIIRHighPassFilter()), false); + } + if( doesApplyIIRLowPassFilter() ){ + ptrOutputFiles->writeLogMessage("Parameters for low-pass filter : ", false); + ptrOutputFiles->writeLogMessage(" Cutoff frequency (Hz): " + Util::toString(getCutoffFrequencyForIIRLowPassFilter()), false); + } + if( !m_cutoffFrequenciesForNotchFilter.empty() ){ + ptrOutputFiles->writeLogMessage("Parameters for notch filter : ", false); + ptrOutputFiles->writeLogMessage(" Q: " + Util::toString(m_parameterQForNotchFilter), false); + std::ostringstream oss; + oss << " Cutoff frequencies (Hz): "; + for( std::vector::const_iterator itr = m_cutoffFrequenciesForNotchFilter.begin(); + itr != m_cutoffFrequenciesForNotchFilter.end(); ++itr ){ + oss << *itr << " "; + } + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + if (doesPeformEOFBasedDenoising()) { + switch (getTimingEOFBasedDenoising()) + { + case Control::BEFORE_DECIMATION: + ptrOutputFiles->writeLogMessage("EOF analysis is performed before decimation", false); + break; + case Control::AFTER_DEGITAL_FILTERS: + ptrOutputFiles->writeLogMessage("EOF analysis is performed after the application of digital filters", false); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported timing of EOF analysis: " + Util::toString(getTimingEOFBasedDenoising())); + break; + } + } + if( m_paramsForDecimation.applyDecimation ){ + ptrOutputFiles->writeLogMessage("Parameters for decimation : ", false); + ptrOutputFiles->writeLogMessage(" Decimation interval: " + Util::toString(m_paramsForDecimation.decimationInterval), false); + ptrOutputFiles->writeLogMessage(" Filter length: " + Util::toString(m_paramsForDecimation.filterLength), false); + ptrOutputFiles->writeLogMessage(" Transition band width in logarithmic scale: " + Util::toString(m_paramsForDecimation.transitionBandWidthInLogarithmicScale), false); + } + if( m_paramsForPrewhitening.applyPrewhitening ){ + ptrOutputFiles->writeLogMessage("Parameters for robust prewhitening : ", false); + switch (m_paramsForPrewhitening.typeOfEstimator) + { + case Control::USE_LEAST_SQUARE_ESTIMATOR_FOR_PREWHITENING: + ptrOutputFiles->writeLogMessage(" Least square estimator is used", false); + ptrOutputFiles->writeLogMessage(" Maximum degree of AR model: " + Util::toString(m_paramsForPrewhitening.maxDegreeOfARModel), false); + break; + case Control::USE_S_ESTIMATOR_FOR_PREWHITENING: + ptrOutputFiles->writeLogMessage(" S-estimator is used", false); + ptrOutputFiles->writeLogMessage(" Maximum degree of AR model: " + Util::toString(m_paramsForPrewhitening.maxDegreeOfARModel), false); + ptrOutputFiles->writeLogMessage(" Numbef of candidates of partial autocorrelation function: " + Util::toString(m_paramsForPrewhitening.numCandidatesOfPartialAutocorrelationFunction), false); + break; + case Control::MANUAL_INPUTS_AR_COEFFICIENTS_FOR_PREWHITENING: + ptrOutputFiles->writeLogMessage(" AR coefficients are specified by an input file", false); + break; + default: + ptrOutputFiles->writeErrorMessage("Unsupported type of estimator for prewhitening: " + Util::toString(m_paramsForPrewhitening.typeOfEstimator)); + break; + } + } + if( m_paramsForRobustFilter.applyRobustFilter ){ + if (m_paramsForPrewhitening.maxDegreeOfARModel >= TableOfTukeysBiweightParameters::numDimensions) { + ptrOutputFiles->writeErrorMessage("Degree of AR model is too large for the robust filter (" + Util::toString(m_paramsForPrewhitening.maxDegreeOfARModel) + ")"); + } + ptrOutputFiles->writeLogMessage("Parameters for robust filter : ", false); + if( m_paramsForRobustFilter.replaceTimeSeriesWithFilteredValues ){ + ptrOutputFiles->writeLogMessage(" Time-series data are repladed with filtered values", false); + } + ptrOutputFiles->writeLogMessage(" Channel# The 1st threshold The 2nd threshold Max consecutive replacements", false); + if( m_paramsForRobustFilter.thresholds.size() != numChannels ){ + ptrOutputFiles->writeErrorMessage("Number of thresholds for robust filter (" + Util::toString(m_paramsForRobustFilter.thresholds.size()) + + ") is not equal to the number of channel (" + Util::toString(numChannels) + ")" ); + } + for( int iChan = 0; iChan < numChannels; ++iChan ){ + const ThresholdsForRobustFilter& thresholds = m_paramsForRobustFilter.thresholds[iChan]; + std::ostringstream oss; + oss << " "; + oss << std::setw(10) << iChan; + oss << std::setw(20) << thresholds.firstThresholdFactor; + oss << std::setw(20) << thresholds.secondThresholdFactor; + oss << std::setw(30) << thresholds.maxNumOfConsecutiveReplacements; + ptrOutputFiles->writeLogMessage(oss.str(), false); + } + ptrOutputFiles->writeLogMessage("Parameters for robust auto-covariance calculation : ", false); + ptrOutputFiles->writeLogMessage(" Percentage of the small number added to diagonals: " + Util::toString(m_paramsForRobustAutoCovariance.percentageOfSmallNumberAddedToDiagonals), false); + ptrOutputFiles->writeLogMessage(" Maximum number of the iterations: " + Util::toString(m_paramsForRobustAutoCovariance.maxNumOfIterations), false); + ptrOutputFiles->writeLogMessage(" Convergence criteria of the iterations: " + Util::toString(m_paramsForRobustAutoCovariance.convergenceCriteria), false); + } + if( m_paramsForMeanSquareCriteria.applyMeanSquareCriteria ){ + ptrOutputFiles->writeLogMessage("Mean square criteria : " + Util::toString(m_paramsForMeanSquareCriteria.nsigma), false); + } + if( m_paramsForSquareCoherenceCriteria.applySquareCoherenceCriteria ){ + ptrOutputFiles->writeLogMessage("Parameters for square coherence criteria : ", false); + ptrOutputFiles->writeLogMessage(" Number of segments: " + Util::toString(m_paramsForSquareCoherenceCriteria.numSegments), false); + ptrOutputFiles->writeLogMessage(" Square coherence criteria: " + Util::toString(m_paramsForSquareCoherenceCriteria.threshold), false); + } + if( m_paramsForSquareCoherenceCriteriaWithRandomSampling.applySquareCoherenceCriteria ){ + ptrOutputFiles->writeLogMessage("Parameters for square coherence criteria with random sampling: ", false); + ptrOutputFiles->writeLogMessage(" Number of segments: " + Util::toString(m_paramsForSquareCoherenceCriteriaWithRandomSampling.numSegments), false); + ptrOutputFiles->writeLogMessage(" Number of random samples: " + Util::toString(m_paramsForSquareCoherenceCriteriaWithRandomSampling.numRandomSamples), false); + ptrOutputFiles->writeLogMessage(" Square coherence criteria: " + Util::toString(m_paramsForSquareCoherenceCriteriaWithRandomSampling.threshold), false); + } + if( m_paramsForDegreeOfMagneticPolarizationCriteria.applyDegreeOfMagneticPolarizationCriteria ){ + ptrOutputFiles->writeLogMessage("Parameters for degree of magnetic polarizatiton criteria: ", false); + ptrOutputFiles->writeLogMessage(" Number of segments: " + Util::toString(m_paramsForDegreeOfMagneticPolarizationCriteria.numSegments), false); + ptrOutputFiles->writeLogMessage(" Threshould: " + Util::toString(m_paramsForDegreeOfMagneticPolarizationCriteria.threshold), false); + } + if( m_paramsForMagneticPolarizatitonDirectionCriteria.applyMagneticPolarizatitonDirectionCriteria ){ + ptrOutputFiles->writeLogMessage("Parameters for magnetic polarizatiton direction criteria: ", false); + ptrOutputFiles->writeLogMessage(" Threshould: " + Util::toString(m_paramsForMagneticPolarizatitonDirectionCriteria.threshold), false); + } + if( m_paramsForDataSegmentEvaluation.doEvaluation ){ + ptrOutputFiles->writeLogMessage("Parameters for evaluations of data segments: ", false); + ptrOutputFiles->writeLogMessage(" Number of data segments: " + Util::toString(m_paramsForDataSegmentEvaluation.numDataSegments), false); + } + if( m_paramsForFreqDomainEvaluation.doEvaluation ){ + if( m_paramsForFreqDomainEvaluation.startOutputFrequency < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Start of output frequency (" + Util::toString(m_paramsForFreqDomainEvaluation.startOutputFrequency) + + ") is too small" ); + } + if( m_paramsForFreqDomainEvaluation.endOutputFrequency > 0.5 * samplingFrequencyAfterDecimation ){ + ptrOutputFiles->writeWarningMessage("End of output frequency (" + Util::toString(m_paramsForFreqDomainEvaluation.endOutputFrequency) + + ") is changed to be the Nyquist frequency ("+ Util::toString(0.5 * samplingFrequencyAfterDecimation) +")" ); + m_paramsForFreqDomainEvaluation.endOutputFrequency = 0.5 * samplingFrequencyAfterDecimation; + } + ptrOutputFiles->writeLogMessage("Parameters for prior evaluations of frequency-domain characteristics: ", false); + ptrOutputFiles->writeLogMessage(" Start of output frequency: " + Util::toString(m_paramsForFreqDomainEvaluation.startOutputFrequency), false); + ptrOutputFiles->writeLogMessage(" End of output frequency: " + Util::toString(m_paramsForFreqDomainEvaluation.endOutputFrequency), false); + ptrOutputFiles->writeLogMessage(" Number of output frequencies: " + Util::toString(m_paramsForFreqDomainEvaluation.numOfOutputFrequency), false); + ptrOutputFiles->writeLogMessage(" Number of output frequencies for average values: " + Util::toString(m_paramsForFreqDomainEvaluation.numOfOutputFrequencyForAverage), false); + } + if( m_paramsForTimeDomainEvaluation.doEvaluation ){ + ptrOutputFiles->writeLogMessage("Parameters for prior evaluations of time-domain characteristics: ", false); + ptrOutputFiles->writeLogMessage(" Time-series interval: " + Util::toString(m_paramsForTimeDomainEvaluation.timeSeriesInterval), false); + } + ptrOutputFiles->writeLogMessage("================================================================================",false); + +} diff --git a/src/Control.h b/src/Control.h new file mode 100644 index 0000000..1dfd3e7 --- /dev/null +++ b/src/Control.h @@ -0,0 +1,710 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_CONTROL +#define DBLDEF_CONTROL + +#include +#include "CommonParameters.h" +#include "Analysis.h" + +// Class of the control parameters +class Control{ + +public: + + enum ElogDualType { + ELOG1K = 0, + ELOGDUAL_ADU_MODE, + ELOGDUAL_PHX_MODE, + NUM_TYPE_OF_ELOGDUAL_TYPE, + }; + + enum ElogMTType { + ELOGMT_ADU_MODE, + ELOGMT_PHX_MODE, + NUM_TYPE_OF_ELOGMT_TYPE, + }; + + enum ElogMTReadingOption { + NOT_SPECIFIED = -1, + READ_EX_EY_HX_HY_HZ_HRX_HRY_FROM_ELOGMT_DATA = 0, + READ_EX_EY_HX_HY_HRX_HRY_FROM_ELOGMT_DATA, + READ_HZ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA, + READ_EX_EY_HX_HY_HZ_FROM_ELOGMT_DATA, + READ_EX_EY_HX_HY_FROM_ELOGMT_DATA, + READ_HZ_HX_HY_FROM_ELOGMT_DATA, + READ_EX_EY_FROM_ELOGMT_DATA, + READ_HX_HY_HRX_HRY_FROM_ELOGMT_DATA, + READ_HX_HY_FROM_ELOGMT_DATA, + NUM_TYPE_OF_ELOGMT_READING_OPTION, + }; + + enum ErrorEstimationMethod{ + PARAMETRIC = 0, + FIXED_WEIGHTS_BOOTSTRAP, + STRICT_BOOTSTRAP, + ROBUST_BOOTSTRAP, + FIXED_WEIGHTS_JACKKNIFE, + SUBSET_DELETION_JACKKNIFE, + NUM_TYPE_OF_ERROR_ESTIMATION_METHOD, + }; + + enum ProcedureType{ + ORDINARY_REMOTE_REFERENCE = 0, + MULTIVARIATE_REGRESSION, + MODIFIED_MULTIVARIATE_REGRESSION, + TWO_STAGE, + REPEATED_MEDIAN, + TEST, + NUM_TYPE_OF_PROCEDURE_TYPE, + }; + + enum TypeOfEstimatorForPrewhitening{ + MANUAL_INPUTS_AR_COEFFICIENTS_FOR_PREWHITENING = -1, + USE_LEAST_SQUARE_ESTIMATOR_FOR_PREWHITENING = 0, + USE_S_ESTIMATOR_FOR_PREWHITENING, + NUM_TYPE_OF_MESTIMATORS_FOR_PREWHITENING, + }; + + enum TypeOfRobustWeight { + NOT_USED = -1, + HUBER = 0, + TUKEYS_BIWEIGHTS, + THOMSON, + NUM_TYPE_OF_MESTIMATORS, + }; + + // Type of the threshold of the difference of response fuctions + enum ThresholdTypeOfDifferenceOfResponseFuctions{ + DIFFERENCE_OF_RESPONSES_DIVIDED_BY_SQUARE_ROOT_FREQUENCY, + DIFFERENCE_OF_RAW_RESPONSES, + NUM_OF_THRESHOLD_TYPE_OF_DIFFERENCE_OF_RESPONSE_FUCTIONS + }; + + // Segment length and the index of the frequency where response functions are estimated + enum TimingEOFBasedDenoising{ + BEFORE_DECIMATION = 0 , + AFTER_DEGITAL_FILTERS, + }; + + // Segment length and the index of the frequency where response functions are estimated + struct SegmentInfo{ + int length; + std::vector degrees; + }; + + // Parameters for ELOG calibration + struct ParamsForElogCalibration{ + std::string fileName; + double unitGroupDelay; + }; + + // Parameters for the data-segment evaluation prior to the calculation of the response functions + struct ParamsForDataSegmentEvaluation{ + bool doEvaluation; + int numDataSegments; + }; + + // Parameters for decimation + struct ParamsForDecimation{ + bool applyDecimation; + int decimationInterval; + int filterLength; + double transitionBandWidthInLogarithmicScale; + }; + + // Parameters for the frequency-domain evaluation prior to the calculation of the response functions + struct ParamsForFreqDomainEvaluation{ + bool doEvaluation; + double startOutputFrequency; + double endOutputFrequency; + int numOfOutputFrequency; + int numOfOutputFrequencyForAverage; + }; + + // Parameters for the time-domain evaluation prior to the calculation of the response functions + struct ParamsForTimeDomainEvaluation{ + bool doEvaluation; + int timeSeriesInterval; + }; + + // Parameters for Hampel filter + struct ParamsForHampelFilter{ + bool applyHampelFilter; + int numNeighborsOnEitherSide; + double nsigma; + }; + + // Parameters for mean square criteria + struct ParamsForMeanSquareCriteria{ + bool applyMeanSquareCriteria; + double nsigma; + }; + + // Parameters for square coherence criteria + struct ParamsForSquareCoherenceCriteria{ + bool applySquareCoherenceCriteria; + int numSegments; + double threshold; + }; + + // Parameters for square coherence criteria with random sampling + struct ParamsForSquareCoherenceCriteriaWithRandomSampling{ + bool applySquareCoherenceCriteria; + int numSegments; + int numRandomSamples; + double threshold; + }; + + // Parameters for robust calculation of autocovariance matrix + struct ParamsForRobustAutoCovariance{ + double percentageOfSmallNumberAddedToDiagonals; + int maxNumOfIterations; + double convergenceCriteria; + }; + + // Parameters of the threshold of the difference of response fuctions + struct ParamsOfThresholdOfDifferenceResponseFuctions{ + int type; + double threshold; + }; + + // Parameters for prewhitening + struct ParamsForPrewhitening{ + bool applyPrewhitening; + int typeOfEstimator; + int maxDegreeOfARModel; + int numCandidatesOfPartialAutocorrelationFunction; + }; + + // Thresholds for robust filter + struct ThresholdsForRobustFilter{ + double firstThresholdFactor; + double secondThresholdFactor; + int maxNumOfConsecutiveReplacements; + }; + + // Parameters for robust filter + struct ParamsForRobustFilter{ + bool applyRobustFilter; + bool replaceTimeSeriesWithFilteredValues; + std::vector thresholds; + }; + + // Parameters for robust multivariate regression + struct ParamsForRobustMultivariateRegression{ + bool selectInitialCandidatesByRandomSamplingAtEachFrequency; + int numOfMaxInitialCandidates; + int numOfMaxIterationsOfFirstIstep; + double convergenceCriteriaOfFirstIstep; + int numOfMaxCandidatesOfSecondIstep; + int numOfMaxIterationsOfSecondIstep; + double convergenceCriteriaOfSecondIstep; + std::string startOfTimeRange; + std::string endOfTimeRange; + }; + + // Parameters for deciding candicates for subsequent frequencies + struct ParamsForDecidingCandicatesForSubsequentFrequencies{ + bool useResponseFunctionsOfPreviousFrequency; + std::vector thresholdOfDifferences; + }; + + // Parameters for degree of polarizatiton direction criteria + struct ParamsForDegreeOfMagneticPolarizationCriteria{ + bool applyDegreeOfMagneticPolarizationCriteria; + int numSegments; + double threshold; + }; + + // Parameters for magnetic polarizatiton direction criteria + struct ParamsForMagneticPolarizatitonDirectionCriteria{ + bool applyMagneticPolarizatitonDirectionCriteria; + double threshold; + }; + + // Parameters for the treatment of hat matrix + struct ParamsForTreatmentOfHatMatrix{ + bool applyLeverageWeights; + double threshold; + int maxNumberOfOuterIteration; + }; + + // Return the the instance of the class + static Control* getInstance(); + + // Run analysis + void run(const bool outputToConsole); + + // Get flag specifing whether IIR high-pass filter is applied + bool doesApplyIIRHighPassFilter() const; + + // Get flag specifing whether IIR low-pass filter is applied + bool doesApplyIIRLowPassFilter() const; + + // Get flag specifing whether calibration for MFS is performed + bool doesMakeCalibrationFileForMFS() const; + + // Get flag specifing whether calibration for ELOG-Dual file is performed + bool doesMakeCalibrationFileForElogDual() const; + + // Get flag specifing whether calibration for ELOG-MT file is performed + bool doesMakeCalibrationFileForElogMT() const; + + // Get flag specifing whether apparent resistivity and phase are outputed in a seperate file + bool doesOutputApparentResistivityAndPhase() const; + + // Get flag specifing wheter output frequency domain data as csv file + bool doesOutputFreqDomainDataToCsv() const; + + // Get flag specifing wheter output time series data as csv file + bool doesOutputTimeSeriesToCsv() const; + + // Get flag specifing whether input file is ATS binary file + bool doesOutputCalibratedTimeSeriesToCsv() const; + + // Get flag specifing whether input file is ATS binary file + bool doesReadAtsBinary() const; + + // Get flag specifing whether input file is ELOG-Dual binary file + bool doesReadMTH5() const; + + // Get flag specifing whether input file is ELOG-Dual binary file + bool doesReadElogDualBinary() const; + + // Get flag specifing whether input file is ELOG-MT binary file + bool doesReadElogMTBinary() const; + + // Get azimuth + bool doesPeformEOFBasedDenoising() const; + + // Get azimuth + double getAzimuth( const int iChan ) const; + + // Get channel index + int getChannelIndex( const int dataType, const int index ) const; + + // Get option of ELOG-Dual binary data reading + int getElogDualReadingOption() const; + + // Get option of ELOG-MT binary data reading + int getElogMTReadingOption() const; + + // Get error estimation method + int getErrorEstimationMethod() const; + + // Get number of output variables + int getNumOutputVariables() const; + + // Get number of input variables + int getNumInputVariables() const; + + // Get number of remote reference variables + int getNumRemoteReferenceVariables() const; + + // Get sampling frequency + double getSamplingFrequency() const; + + // Get number of threads + double getSamplingFrequencyOrg() const; + + // Get number of threads + int getNumThreads() const; + + // Get number of time-series sections + int getNumTimeSeriesSections() const; + + // Get number of segment lengths + int getNumSegmentLengths() const; + + // Get number of target frequency degrees in an input segment + int getNumTargetFrequencyInSegment( const int iSeg ) const; + + // Get number of the ranges of sections for merge + int getNumRangeOfSectionsForMerge() const; + + // Get number of repetitions of bootstrap method + int getNumRepetitionsOfBootstrap() const; + + // Get target frequency degrees in an input segment + int getTargetFrequencyDegreesInSegment( const int iSeg, const int index ) const; + + // Get length of each segment + int getSegmentLength( const int iSeg ) const; + + // Get ratio of overlapping part to whole segment length + double getOverlappingRatio() const; + + // Get rotation angle + double getRotationAngle() const; + + // Get numebur of calibration files for MFS + int getNumCalibrationFilesForMFS() const; + + // Get name of calibration file for MFS + std::string getCalibrationFileNameForMFS(const int iFile) const; + + // Get numebur of calibration files + int getNumCalibrationFiles() const; + + // Get name of calibration file + std::string getCalibrationFileName( const int iFile ) const; + + // Get cutoff frequency for IIR high-pass filter + double getCutoffFrequencyForIIRHighPassFilter() const; + + // Get cutoff frequency for IIR low-pass filter + double getCutoffFrequencyForIIRLowPassFilter() const; + + // Get cutoff frequencies for notch filter + std::vector getCutoffFrequenciesForNotchFilter() const; + + // Get directory of logger calibration files + std::string getDirectoryOfLoggerCalibrationFiles() const; + + // Get number of ichannels + int getNumberOfChannels() const; + + // Get number of cutoff frequencies for notch filter + int getNumberOfCutoffFrequenciesForNotchFilter() const; + + // Get number of frequencies + int getNumberOfFrequencies() const; + + // Get frequency + double getFrequency( const int iFreq ) const; + + // Get all frequencies without duplications + std::vector getFrequenciesAllWithoutDuplications() const; + + // Get output level + int getOutputLevel() const; + + // Get parameter Q for notch filter + double getParameterQForNotchFilter() const; + + // Get parameters for ELOG-Dual calibration + ParamsForElogCalibration getParamsForElogDualCalibration() const; + + // Get parameters for ELOG-MT calibration + ParamsForElogCalibration getParamsForElogMTCalibration() const; + + // Get parameters for the data-segment evaluation prior to the calculation of the response functions + ParamsForDataSegmentEvaluation getParamsForDataSegmentEvaluation() const; + + // Get parameters for decimation + ParamsForDecimation getParamsForDecimation() const; + + // Get parameters for the frequency-domain evaluation prior to the calculation of the response functions + ParamsForFreqDomainEvaluation getParamsForFreqDomainEvaluation() const; + + // Get parameters for the time-domain evaluation prior to the calculation of the response functions + ParamsForTimeDomainEvaluation getParamsForTimeDomainEvaluation() const; + + // Get parameters for Hampel filter + ParamsForHampelFilter getParamsForHampelFilter() const; + + // Get parameters for mean square criteria + ParamsForMeanSquareCriteria getParamsForMeanSquareCriteria() const; + + // Get parameters for degree of polarizatiton direction criteria + ParamsForDegreeOfMagneticPolarizationCriteria getParamsForDegreeOfMagneticPolarizationCriteria() const; + + // Get parameters for magnetic polarizatiton direction criteria + ParamsForMagneticPolarizatitonDirectionCriteria getParamsForMagneticPolarizatitonDirectionCriteria() const; + + // Get parameters for square coherence criteria + ParamsForSquareCoherenceCriteria getParamsForSquareCoherenceCriteria() const; + + // Get parameters for square coherence criteria with random sampling + ParamsForSquareCoherenceCriteriaWithRandomSampling getParamsForSquareCoherenceCriteriaWithRandomSampling() const; + + // Get parameters for robust calculation of autocovariance matrix + ParamsForRobustAutoCovariance getParamsForRobustAutoCovariance() const; + + // Get parameters for robust prewhitening + ParamsForPrewhitening getParamsForPrewhitening() const; + + // Get parameters for robust filter + ParamsForRobustFilter getParamsForRobustFilter() const; + + // Get parameters for robust multivariate regression + ParamsForRobustMultivariateRegression getParamsForRobustMultivariateRegression() const; + + // Get parameters for deciding candicates for subsequent frequencies + ParamsForDecidingCandicatesForSubsequentFrequencies getParamsForDecidingCandicatesForSubsequentFrequencies() const; + + // Get parameters for the treatment of hat matrix + ParamsForTreatmentOfHatMatrix getParamsForTreatmentOfHatMatrix() const; + + // Get percentage of ommited data in subset deletion jackknife + double getPercentageOfOmmitedDataSubsetDeletionJackknife() const; + + // Get ranges of sections for merge + std::pair getRangeOfSectionsForMerge( const int iSectionAfterMerge ) const; + + // Get time from start time and elapsed time (seconds) + std::string getTimeFromStartTimeOfEachSection( const int sectionIndex, const double elapsedTime, const bool forAfterMergingSections = true ) const; + + // Get number of start times of sections + int getNumStartTimesSections() const; + + // Get procedure type + int getProcedureType() const; + + // Get timing of denoising based on EOF + int getTimingEOFBasedDenoising() const; + + // Get type of ELOG-Dual + int getTypeOfElogDual() const; + + // Get type of ELOG-MT + int getTypeOfElogMT() const; + + // Set sampling frequency + void setSamplingFrequency( const double samplingFrequency ); + + // Set original sampling frequency + void setSamplingFrequencyOrg(const double samplingFrequency); + +private: + + // Constructer + Control(); + + // Destructer + ~Control(); + + // Copy constructer + Control(const Control& rhs); + + // Assignment operator + Control& operator=(const Control& rhs); + + // Azimuths + std::vector m_azimuths; + + // Cutoff frequency for IIR high-pass filter + double m_cutoffFrequencyForIIRHighPassFilter; + + // Cutoff frequency for IIR low-pass filter + double m_cutoffFrequencyForIIRLowPassFilter; + + // Cutoff frequencies for notch filter + std::vector m_cutoffFrequenciesForNotchFilter; + + // Directory of logger calibration files + std::string m_directoryOfLoggerCalibrationFiles; + + // Flag specifing whether IIR high-pass filter is applied + bool m_doesApplyIIRHighPassFilter; + + // Flag specifing whether IIR low-pass filter is applied + bool m_doesApplyIIRLowPassFilter; + + // Option of ELOG-Dual binary data reading + bool m_doesPeformEOFBasedDenoising; + + // Option of ELOG-Dual binary data reading + int m_elogDualReadingOption; + + // Option of ELOG-MT binary data reading + int m_elogMTReadingOption; + + // Error estimation method + int m_errorEstimationMethod; + + // Number of output variables + int m_numOutputVariables; + + // Number of input variables + int m_numInputVariables; + + // Number of remote reference variables + int m_numRemoteReferenceVariables; + + // Sampling frequency + double m_samplingFrequencyOrg; + + // Sampling frequency + double m_samplingFrequency; + + // Number of threads + int m_numThreads; + + // Number of time-series sections + int m_numTimeSeriesSections; + + // Number of repetitions of bootstrap method + int m_numRepetitionsOfBootstrap; + + // Array for segment length and the index of the frequency where response functions are estimated + std::vector m_segments; + + // Ratio of overlapping part to whole segment length + double m_overlappingRatio; + + // Frequencies where response functions are estimated + std::vector m_frequencies; + + // Flag specifing whether input calibration for MFS is performed + bool m_calibForMFS; + + // Flag specifing whether input calibration for ELOG-Dual file is performed + bool m_calibForElogDual; + + // Flag specifing whether input calibration for ELOG-MT file is performed + bool m_calibForElogMT; + + // Pointer to Analysis class + Analysis* m_analysis; + + // Data file sets + std::vector m_dataFileSets; + + // Rotation angles + double m_rotationAngle; + + // Calibration files + std::vector m_calibrationFiles; + + // Calibration file for MFS + std::vector m_calibrationFilesForMFS; + + // Percentage of ommited data in subset deletion jackknife + double m_percentageOfOmmitedDataSubsetDeletionJackknife; + + // Start time of each section + std::vector m_startTimeOfEachSection; + + // Flag specifing whether apparent resistivity and phase are outputed in a seperate file + bool m_outputApparentResistivityAndPhase; + + // Output level + int m_outputLevel; + + // Flag specifing wheter output frequency domain data as csv file + bool m_outputFreqDomainDataToCsv; + + // Flag specifing wheter output time series data as csv file + bool m_outputTimeSeriesToCsv; + + // Flag specifing wheter output calibrated time series data as csv file + bool m_outputCalibratedTimeSeriesToCsv; + + // Parameter Q for notch filter + double m_parameterQForNotchFilter; + + // Parameters for ELOGDual calibration + ParamsForElogCalibration m_paramsForElogDualCalibration; + + // Parameters for ELOG-MT calibration + ParamsForElogCalibration m_paramsForElogMTCalibration; + + // Parameters for the data-segment evaluation prior to the calculation of the response functions + ParamsForDataSegmentEvaluation m_paramsForDataSegmentEvaluation; + + // Parameters for decimation + ParamsForDecimation m_paramsForDecimation; + + // Parameters for the frequency-domain evaluation prior to the calculation of the response functions + ParamsForFreqDomainEvaluation m_paramsForFreqDomainEvaluation; + + // Parameters for the time-domain evaluation prior to the calculation of the response functions + ParamsForTimeDomainEvaluation m_paramsForTimeDomainEvaluation; + + // Parameters for square coherence criteria + ParamsForSquareCoherenceCriteria m_paramsForSquareCoherenceCriteria; + + // Parameters for square coherence criteria with random sampling + ParamsForSquareCoherenceCriteriaWithRandomSampling m_paramsForSquareCoherenceCriteriaWithRandomSampling; + + // Parameters for Hampel filter + ParamsForHampelFilter m_paramsForParamsForHampelFilter; + + // Parameters for mean square criteria + ParamsForMeanSquareCriteria m_paramsForMeanSquareCriteria; + + // Parameters for degree of polarizatiton direction criteria + ParamsForDegreeOfMagneticPolarizationCriteria m_paramsForDegreeOfMagneticPolarizationCriteria; + + // Parameters for magnetic polarizatiton direction criteria + ParamsForMagneticPolarizatitonDirectionCriteria m_paramsForMagneticPolarizatitonDirectionCriteria; + + // Parameters for robust calculation of autocovariance matrix + ParamsForRobustAutoCovariance m_paramsForRobustAutoCovariance; + + // Parameters for robust prewhitening + ParamsForPrewhitening m_paramsForPrewhitening; + + // Parameters for robust filter + ParamsForRobustFilter m_paramsForRobustFilter; + + // Parameters for robust multivariate regression + ParamsForRobustMultivariateRegression m_paramsForRobustMultivariateRegression; + + // Parameters for deciding candicates for subsequent frequencies + ParamsForDecidingCandicatesForSubsequentFrequencies m_paramsForDecidingCandicatesForSubsequentFrequencies; + + // Parameters for the treatment of hat matrix + ParamsForTreatmentOfHatMatrix m_paramsForTreatmentOfHatMatrix; + + // Procedure type + int m_procedureType; + + // Ranges of sections for merge + std::vector< std::pair > m_rangeOfSectionsForMerge; + + // Flag specifing whether input file is ATS binary file + bool m_readAtsBinary; + + // Flag specifing whether input file is MTH5 file + bool m_readMTH5; + + // Flag specifing whether ELOG-Dual binary is read + bool m_readElogDualBinary; + + // Flag specifing whether ELOG-MT binary is read + bool m_readElogMTBinary; + + // Timing of denoising based on EOF + int m_timingEOFBasedDenoising; + + // Type of ELOG-Dual + int m_typeOfElogDual; + + // Type of ELOG-MT + int m_typeOfElogMT; + + // Read control parameters from input file + void readParameterFile(); + +}; + +#endif diff --git a/src/DoubleDenseMatrix.cpp b/src/DoubleDenseMatrix.cpp new file mode 100644 index 0000000..9d53212 --- /dev/null +++ b/src/DoubleDenseMatrix.cpp @@ -0,0 +1,188 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "DoubleDenseMatrix.h" +#include "OutputFiles.h" +#include "Util.h" + +#include // For null pointer +#include // For exit +#include +#include + +//Default Constructer +DoubleDenseMatrix::DoubleDenseMatrix(): + m_numRows(0), + m_numColumns(0), + m_numComponents(0), + m_matrix(NULL), + m_factorizedMatrix(NULL), + m_ipiv(NULL) +{} + +// Destructer +DoubleDenseMatrix::~DoubleDenseMatrix(){ + + if( m_matrix != NULL ){ + delete[] m_matrix; + m_matrix = NULL; + } + + if( m_factorizedMatrix != NULL ){ + delete[] m_factorizedMatrix; + m_factorizedMatrix = NULL; + } + + if( m_ipiv != NULL ){ + delete [] m_ipiv; + } + +} + +// Set number of rows and columns +void DoubleDenseMatrix::setNumRowsAndColumns( const int nrows, const int ncols ){ + + // Total number of rows + m_numRows = nrows; + + // Total number of columns + m_numColumns = ncols; + + // Total number of components + m_numComponents = nrows * ncols; + + m_matrix = new double [m_numComponents]; + + // Zero clear + zeroClearMatrix(); + +} + +// Add value to matrix +void DoubleDenseMatrix::addValue( const int row, const int col, const double val ){ + + assert( row <= m_numRows - 1 ); + assert( row >= 0 ); + assert( col <= m_numColumns - 1 ); + assert( col >= 0 ); + + // Column major + const int index = col * m_numRows + row; + m_matrix[index] += val; + +} + +// Multiply a scalar to the matrix +void DoubleDenseMatrix::multiplyScalarToMatrix( const double scalar ){ + + for( int i = 0; i < m_numComponents; ++i ){ + m_matrix[i] *= scalar; + } + +} + +// Set value to matrix +void DoubleDenseMatrix::setValue( const int row, const int col, const double val ){ + + assert( row <= m_numRows - 1 ); + assert( row >= 0 ); + assert( col <= m_numColumns - 1 ); + assert( col >= 0 ); + + // Column major + const int index = col * m_numRows + row; + m_matrix[index] = val; + +} + +//Zero clear matrix +void DoubleDenseMatrix::zeroClearMatrix(){ + + for( int i = 0; i < m_numComponents; ++i ){ + m_matrix[i] = 0.0; // Zero clear + } + + if( m_factorizedMatrix != NULL ){ + delete[] m_factorizedMatrix; + m_factorizedMatrix = NULL; + } + + if( m_ipiv != NULL ){ + delete [] m_ipiv; + m_ipiv = NULL; + } + +} + +// Get total number of rows +int DoubleDenseMatrix::getNumRows() const{ + return m_numRows; +} + +// Get total number of columns +int DoubleDenseMatrix::getNumColumns() const{ + return m_numColumns; +} + +// Get value +double DoubleDenseMatrix::getValue( const int row, const int col ) const{ + + // Column major + const int index = col * m_numRows + row; + return m_matrix[index]; + +} + +// Debug write the matrix componets +void DoubleDenseMatrix::debugWriteMatrix() const{ + + std::cout << "["; + for( int row = 0; row < m_numRows; ++row ){ + for( int col = 0; col < m_numColumns; ++col ){ + std::cout << getValue(row, col) << " "; + } + if( row+1 < m_numRows ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + +} + +//Copy constructer +DoubleDenseMatrix::DoubleDenseMatrix(const DoubleDenseMatrix &matrix ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Copy constructer of the class DoubleDenseMatrix is not implemented"); +} + +// Assignment operator +DoubleDenseMatrix& DoubleDenseMatrix::operator=(const DoubleDenseMatrix& rhs){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Assignment operator of the class DoubleDenseMatrix is not implemented"); + exit(1); +} diff --git a/src/DoubleDenseMatrix.h b/src/DoubleDenseMatrix.h new file mode 100644 index 0000000..049631c --- /dev/null +++ b/src/DoubleDenseMatrix.h @@ -0,0 +1,101 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_DOUBLE_DENSE_MATRIX +#define DBLDEF_DOUBLE_DENSE_MATRIX + +class DoubleDenseMatrix{ + +public: + + //Default Constructer + explicit DoubleDenseMatrix(); + + //Constructer + explicit DoubleDenseMatrix( const int nrows, const int ncols ); + + //Destructer + virtual ~DoubleDenseMatrix(); + + // Set number of rows and columns + virtual void setNumRowsAndColumns( const int nrows, const int ncols ); + + // Add value to matrix + virtual void addValue( const int row, const int col, const double val ); + + // Multiply a scalar to the matrix + void multiplyScalarToMatrix( const double scalar ); + + // Set value to matrix + virtual void setValue( const int row, const int col, const double val ); + + // Zero clear matrix + virtual void zeroClearMatrix(); + + // Get number of rows + int getNumRows() const; + + // Get number of columns + int getNumColumns() const; + + // Get value + virtual double getValue( const int row, const int col ) const; + + //Debug write the matrix componets + void debugWriteMatrix() const; + +protected: + + //Total number of rows + int m_numRows; + + //Total number of columns + int m_numColumns; + + //Total number of components + int m_numComponents; + + //Values of non-zero compnents + double* m_matrix; + + // Factorized matrix + double* m_factorizedMatrix; + + // Array for LAPACK + int* m_ipiv; + +private: + //Copy constructer + DoubleDenseMatrix(const DoubleDenseMatrix &matrix ); + + // Assignment operator + DoubleDenseMatrix& operator=(const DoubleDenseMatrix& rhs); + +}; + +#endif diff --git a/src/DoubleDenseSquareMatrix.cpp b/src/DoubleDenseSquareMatrix.cpp new file mode 100644 index 0000000..5b09238 --- /dev/null +++ b/src/DoubleDenseSquareMatrix.cpp @@ -0,0 +1,118 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "DoubleDenseSquareMatrix.h" +#include "Util.h" +#include "OutputFiles.h" + +#include // For null pointer +#include // For exit +#include +#include + +// Default Constructer +DoubleDenseSquareMatrix::DoubleDenseSquareMatrix(): + DoubleDenseMatrix() +{} + +// Destructer +DoubleDenseSquareMatrix::~DoubleDenseSquareMatrix(){ +} + +// Factorize matrix +void DoubleDenseSquareMatrix::factorizeMatrix(){ + + if( m_factorizedMatrix == NULL ){ + m_factorizedMatrix = new double[m_numRows * m_numColumns]; + } + + if( m_ipiv == NULL ){ + m_ipiv = new int[m_numRows]; + } + + Util::factorizeRealSquareMatrix(m_numRows, m_matrix, m_factorizedMatrix, m_ipiv); + +} + +// Calculate determinant +double DoubleDenseSquareMatrix::calculateDeterminant() const{ + + double* matrix = new double[m_numRows*m_numColumns]; + + // Copy matrix + for( int col = 0; col < m_numColumns; ++col ){ + for( int row = 0; row < m_numRows; ++row ){ + // Column major + const int index = col * m_numRows + row; + matrix[index] = getValue(row, col); + } + } + const double determinant = Util::calculateDeterminantOfMatrix( m_numRows, matrix ); + delete [] matrix; + + return determinant; + +} + +// Set Degree of equation +void DoubleDenseSquareMatrix::setDegreeOfEquation( const int nEq ){ + + assert( nEq > 0 ); + + setNumRowsAndColumns( nEq, nEq ); +} + +// Get Degree of equation +int DoubleDenseSquareMatrix::getDegreeOfEquation() const{ + return m_numRows; +} + +// Solve a linear equation with a right-hand-side vector +void DoubleDenseSquareMatrix::solveLinearEquation( const double* const rhsVector, double* result ) const{ + + if( m_factorizedMatrix == NULL ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Matrix has not been factorized"); + } + + Util::solveLinearEquationRealSquareMatrix( m_numRows, 1, m_ipiv, m_factorizedMatrix, rhsVector, result ); + +} + +// Copy constructer +DoubleDenseSquareMatrix::DoubleDenseSquareMatrix(const DoubleDenseSquareMatrix &matrix ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Copy constructer of the class DoubleDenseSquareMatrix is not implemented"); +} + +// Assignment operator +DoubleDenseSquareMatrix& DoubleDenseSquareMatrix::operator=(const DoubleDenseSquareMatrix& rhs){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Assignment operator of the class DoubleDenseSquareMatrix is not implemented"); + exit(1); +} diff --git a/src/DoubleDenseSquareMatrix.h b/src/DoubleDenseSquareMatrix.h new file mode 100644 index 0000000..af1ee7f --- /dev/null +++ b/src/DoubleDenseSquareMatrix.h @@ -0,0 +1,70 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_DOUBLE_DENSE_SQUARE_MATRIX +#define DBLDEF_DOUBLE_DENSE_SQUARE_MATRIX + +#include "DoubleDenseMatrix.h" + +#include + +class DoubleDenseSquareMatrix : public DoubleDenseMatrix{ + +public: + + // Default Constructer + explicit DoubleDenseSquareMatrix(); + + // Destructer + virtual ~DoubleDenseSquareMatrix(); + + // Factorize matrix + virtual void factorizeMatrix(); + + // Calculate determinant + double calculateDeterminant() const; + + // Set Degree of equation + virtual void setDegreeOfEquation( const int nEq ); + + // Get Degree of equation + int getDegreeOfEquation() const; + + // Solve a linear equation with a right-hand-side vector + virtual void solveLinearEquation( const double* const rhsVector, double* result ) const; + +private: + // Copy constructer + DoubleDenseSquareMatrix(const DoubleDenseSquareMatrix &matrix ); + + // Assignment operator + DoubleDenseSquareMatrix& operator=(const DoubleDenseSquareMatrix& rhs); + +}; + +#endif diff --git a/src/DoubleDenseSquareSymmetricMatrix.cpp b/src/DoubleDenseSquareSymmetricMatrix.cpp new file mode 100644 index 0000000..f05be6c --- /dev/null +++ b/src/DoubleDenseSquareSymmetricMatrix.cpp @@ -0,0 +1,198 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "DoubleDenseSquareSymmetricMatrix.h" +#include "OutputFiles.h" +#include "Util.h" + +#include // For null pointer +#include // For exit +#include +#include + +// Default Constructer +DoubleDenseSquareSymmetricMatrix::DoubleDenseSquareSymmetricMatrix(): + DoubleDenseSquareMatrix() +{} + +// Destructer +DoubleDenseSquareSymmetricMatrix::~DoubleDenseSquareSymmetricMatrix(){ +} + +// Factorize matrix +void DoubleDenseSquareSymmetricMatrix::factorizeMatrix(){ + + if( m_factorizedMatrix == NULL ){ + m_factorizedMatrix = new double[m_numRows * m_numColumns]; + } + + if( m_ipiv == NULL ){ + m_ipiv = new int[m_numRows]; + } + Util::factorizeRealSymmetricMatrix(m_numRows, m_matrix, m_factorizedMatrix, m_ipiv); + +//#ifdef _DEBUG_WRITE +// for( int row = 0; row < m_numRows; ++row ){ +// for( int col = 0; col < m_numColumns; ++col ){ +// // Column major +// const int index = col * m_numRows + row; +// std::cout << "row col val: " << row << " " << col << " " << m_factorizedMatrix[index] << std::endl; +// } +// } +//#endif + +} + +// Factorize and solve a linear equation with a right-hand-side vector +double DoubleDenseSquareSymmetricMatrix::determinant() { + + if (m_factorizedMatrix == NULL) { + m_factorizedMatrix = new double[m_numRows * m_numColumns]; + } + + if (m_ipiv == NULL) { + m_ipiv = new int[m_numRows]; + } + Util::factorizeRealSymmetricMatrix(m_numRows, m_matrix, m_factorizedMatrix, m_ipiv); + + double determinant(1.0); + for( int row = 0; row < m_numRows; ++row ){ + const int index = row * m_numRows + row; + determinant *= m_factorizedMatrix[index]; + } + return determinant; + +} + +// Factorize and solve a linear equation with a right-hand-side vector +void DoubleDenseSquareSymmetricMatrix::factorizeAndSolveLinearEquation( const double* const rhsVector, double* result ) const{ + + Util::factorizeAndSolveLinearEquationRealSymmetricMatrix(m_numRows, 1, m_matrix, rhsVector, result); + +} + +// Set Degree of equation +void DoubleDenseSquareSymmetricMatrix::setDegreeOfEquation( const int nEq ){ + + assert( nEq > 0 ); + + //Total number of rows + m_numRows = nEq; + + //Total number of columns + m_numColumns = nEq; + + // Total number of components + m_numComponents = ( nEq * nEq + nEq ) / 2; + + m_matrix = new double [m_numComponents]; + + // Zero clear + zeroClearMatrix(); + +} + +// Set number of rows and columns +void DoubleDenseSquareSymmetricMatrix::setNumRowsAndColumns( const int nrows, const int ncols ){ + + assert( nrows == ncols ); + setDegreeOfEquation(nrows); + +} + +// Add value to matrix +void DoubleDenseSquareSymmetricMatrix::addValue( const int row, const int col, const double val ){ + + // Allow lower triangle part only + assert( row >= col ); + + // Column major + const int index = m_numColumns * col + ( col - col * col ) / 2 + ( row - col ); + m_matrix[index] += val; + +} + +// Get value +double DoubleDenseSquareSymmetricMatrix::getValue( const int row, const int col ) const{ + + if( row >= col ){ + // Lower triangle part + // Column major + const int index = m_numColumns * col + ( col - col * col ) / 2 + ( row - col ); + return m_matrix[index]; + }else{ + // Upper triangle part + return getValue( col, row ); + } + +} + +// Set value to matrix +void DoubleDenseSquareSymmetricMatrix::setValue( const int row, const int col, const double val ){ + + // Allow lower triangle part only + assert( row >= col ); + + // Column major + const int index = m_numColumns * col + ( col - col * col ) / 2 + ( row - col ); + m_matrix[index] = val; + +} + +// Solve a linear equation with a right-hand-side vector +void DoubleDenseSquareSymmetricMatrix::solveLinearEquation( const double* const rhsVector, double* result ) const{ + + if( m_factorizedMatrix == NULL ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Matrix has not been factorized"); + } + + Util::solveLinearEquationRealSymmetricMatrix( m_numRows, 1, m_ipiv, m_factorizedMatrix, rhsVector, result ); + +} + +// Zero clear matrix +void DoubleDenseSquareSymmetricMatrix::zeroClearMatrix(){ + + DoubleDenseMatrix::zeroClearMatrix(); + +} + +//Copy constructer +DoubleDenseSquareSymmetricMatrix::DoubleDenseSquareSymmetricMatrix(const DoubleDenseSquareSymmetricMatrix &matrix ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Copy constructer of the class DoubleDenseSquareSymmetricMatrix is not implemented"); +} + +// Assignment operator +DoubleDenseSquareSymmetricMatrix& DoubleDenseSquareSymmetricMatrix::operator=(const DoubleDenseSquareSymmetricMatrix& rhs){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Assignment operator of the class DoubleDenseSquareSymmetricMatrix is not implemented"); + exit(1); +} + diff --git a/src/DoubleDenseSquareSymmetricMatrix.h b/src/DoubleDenseSquareSymmetricMatrix.h new file mode 100644 index 0000000..bb7df67 --- /dev/null +++ b/src/DoubleDenseSquareSymmetricMatrix.h @@ -0,0 +1,86 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_DOUBLE_DENSE_SQUARE_SYMMETRIC_MATRIX +#define DBLDEF_DOUBLE_DENSE_SQUARE_SYMMETRIC_MATRIX + +#include "DoubleDenseSquareMatrix.h" + +#include + +class DoubleDenseSquareSymmetricMatrix : public DoubleDenseSquareMatrix { + +public: + + // Default Constructer + explicit DoubleDenseSquareSymmetricMatrix(); + + // Destructer + virtual ~DoubleDenseSquareSymmetricMatrix(); + + // Factorize matrix + virtual void factorizeMatrix(); + + // Factorize and solve a linear equation with a right-hand-side vector + double determinant(); + + // Factorize and solve a linear equation with a right-hand-side vector + virtual void factorizeAndSolveLinearEquation( const double* const rhsVector, double* result ) const; + + // Set Degree of equation + virtual void setDegreeOfEquation( const int nEq ); + + // Set number of rows and columns + virtual void setNumRowsAndColumns( const int nrows, const int ncols ); + + // Add value to matrix + virtual void addValue( const int row, const int col, const double val ); + + // Get value + virtual double getValue( const int row, const int col ) const; + + // Set value to matrix + virtual void setValue( const int row, const int col, const double val ); + + // Solve a linear equation with a right-hand-side vector + virtual void solveLinearEquation( const double* const rhsVector, double* result ) const; + + // Zero clear matrix + virtual void zeroClearMatrix(); + +private: + + // Copy constructer + DoubleDenseSquareSymmetricMatrix(const DoubleDenseSquareSymmetricMatrix &matrix ); + + // Assignment operator + DoubleDenseSquareSymmetricMatrix& operator=(const DoubleDenseSquareSymmetricMatrix& rhs); + +}; + +#endif diff --git a/src/DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp b/src/DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp new file mode 100644 index 0000000..ff905ca --- /dev/null +++ b/src/DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp @@ -0,0 +1,98 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "DoubleDenseSquareSymmetricPositiveDefiniteMatrix.h" +#include "OutputFiles.h" +#include "Util.h" + +#include // For null pointer +#include // For exit +#include +#include + +// Default Constructer +DoubleDenseSquareSymmetricPositiveDefiniteMatrix::DoubleDenseSquareSymmetricPositiveDefiniteMatrix() +{} + +// Destructer +DoubleDenseSquareSymmetricPositiveDefiniteMatrix::~DoubleDenseSquareSymmetricPositiveDefiniteMatrix() +{} + +// Factorize matrix +void DoubleDenseSquareSymmetricPositiveDefiniteMatrix::factorizeMatrix(){ + + if( m_factorizedMatrix == NULL ){ + m_factorizedMatrix = new double[m_numRows * m_numColumns]; + } + + Util::factorizeRealSymmetricPositiveDefiniteMatrix(m_numRows, m_matrix, m_factorizedMatrix); + +#ifdef _DEBUG_WRITE + for( int row = 0; row < m_numRows; ++row ){ + for( int col = 0; col < m_numColumns; ++col ){ + // Column major + const int index = col * m_numRows + row; + std::cout << "row col val: " << row << " " << col << " " << m_factorizedMatrix[index] << std::endl; + } + } +#endif + +} + +// Factorize and solve a linear equation with a right-hand-side vector +void DoubleDenseSquareSymmetricPositiveDefiniteMatrix::factorizeAndSolveLinearEquation( const double* const rhsVector, double* result ) const{ + + Util::factorizeAndSolveLinearEquationRealSymmetricPositiveDefiniteMatrix(m_numRows, 1, m_matrix, rhsVector, result); + +} + +// Solve a linear equation with a right-hand-side vector +void DoubleDenseSquareSymmetricPositiveDefiniteMatrix::solveLinearEquation( const double* const rhsVector, double* result ) const{ + + if( m_factorizedMatrix == NULL ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Matrix has not been factorized"); + } + + Util::solveLinearEquationRealSymmetricPositiveDefiniteMatrix( m_numRows, 1, m_factorizedMatrix, rhsVector, result ); + +} + +//Copy constructer +DoubleDenseSquareSymmetricPositiveDefiniteMatrix::DoubleDenseSquareSymmetricPositiveDefiniteMatrix(const DoubleDenseSquareSymmetricPositiveDefiniteMatrix &matrix ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Copy constructer of the class DoubleDenseSquareSymmetricPositiveDefiniteMatrix is not implemented"); +} + +// Assignment operator +DoubleDenseSquareSymmetricPositiveDefiniteMatrix& DoubleDenseSquareSymmetricPositiveDefiniteMatrix::operator=(const DoubleDenseSquareSymmetricPositiveDefiniteMatrix& rhs){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Assignment operator of the class DoubleDenseSquareSymmetricPositiveDefiniteMatrix is not implemented"); + exit(1); +} + diff --git a/src/DoubleDenseSquareSymmetricPositiveDefiniteMatrix.h b/src/DoubleDenseSquareSymmetricPositiveDefiniteMatrix.h new file mode 100644 index 0000000..9059345 --- /dev/null +++ b/src/DoubleDenseSquareSymmetricPositiveDefiniteMatrix.h @@ -0,0 +1,65 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_DOUBLE_DENSE_SQUARE_SYMMETRIC_POSITIVE_DEFINITE_MATRIX +#define DBLDEF_DOUBLE_DENSE_SQUARE_SYMMETRIC_POSITIVE_DEFINITE_MATRIX + +#include "DoubleDenseSquareSymmetricMatrix.h" + +#include + +class DoubleDenseSquareSymmetricPositiveDefiniteMatrix : public DoubleDenseSquareSymmetricMatrix { + +public: + + // Default Constructer + explicit DoubleDenseSquareSymmetricPositiveDefiniteMatrix(); + + // Destructer + virtual ~DoubleDenseSquareSymmetricPositiveDefiniteMatrix(); + + // Factorize matrix + virtual void factorizeMatrix(); + + // Factorize and solve a linear equation with a right-hand-side vector + virtual void factorizeAndSolveLinearEquation( const double* const rhsVector, double* result ) const; + + // Solve a linear equation with a right-hand-side vector + virtual void solveLinearEquation( const double* const rhsVector, double* result ) const; + +private: + + // Copy constructer + DoubleDenseSquareSymmetricPositiveDefiniteMatrix(const DoubleDenseSquareSymmetricPositiveDefiniteMatrix &matrix ); + + // Assignment operator + DoubleDenseSquareSymmetricPositiveDefiniteMatrix& operator=(const DoubleDenseSquareSymmetricPositiveDefiniteMatrix& rhs); + +}; + +#endif diff --git a/src/ElogDual.cpp b/src/ElogDual.cpp new file mode 100644 index 0000000..f30c864 --- /dev/null +++ b/src/ElogDual.cpp @@ -0,0 +1,488 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "ElogDual.h" +#include "Util.h" +#include "OutputFiles.h" +#include "CommonParameters.h" +#include "Control.h" + +#include +#include +#include +#include +#ifdef _USE_FILESYSTEM +#include +#endif + +// Return the instance of the class +ElogDual* ElogDual::getInstance() { + static ElogDual instance;// The only instance + return &instance; +} + +// Read ELOG-Dual binary file +void ElogDual::readElogBinaryFile(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read Ex and Ey data from " + fileName); + FILE * fp = fopen(fileName.c_str(), "rb"); + if(fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + // Determine file type + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + const int data_size = AD_CH * freq * AD_BYTES; + unsigned char* data = new unsigned char[data_size]; + const double factor = 2500.0 / static_cast(pow(2,23));// Dynamic range +/- 2500 mV + while(1) { + // Read header of each block + recdata_head d; + if(fread(&d, 1, REC_DATALEN_HEAD, fp) < 1){ + break; + } + // Read AD data of each block + if(fread(data, 1, data_size, fp) < 1){ + break; + } + if( counter + freq <= numSkipData ){ + counter += freq; + // Go to next block + continue; + } + // Determine end position prior to the start position because counter can be modified in determing start position + int endPos(freq); + if( numSkipData + numDataPoints > counter && numSkipData + numDataPoints <= counter + freq ){ + // End position locates in this block + endPos = numSkipData + numDataPoints - counter; + } + int startPos(0); + if( numSkipData > counter && numSkipData <= counter + freq ){ + // Start position locates in this block + startPos = numSkipData - counter; + counter = numSkipData; + } + for( int j = startPos; j < endPos; ++j, ++counter ){ + // Ex + const int lbufx = bytesToInt32(&data[j * AD_BYTES * AD_CH]); + ex[counter - numSkipData] = static_cast(lbufx) * factor; + // Ey + const int lbufy = bytesToInt32(&data[j * AD_BYTES * AD_CH + AD_BYTES]); + ey[counter - numSkipData] = static_cast(lbufy) * factor; +#ifdef _DEBUG_WRITE + std::cout << std::setw(10) << counter - numSkipData << std::endl; + std::cout << std::setw(10) << lbufx << std::endl; + std::cout << std::setw(10) << lbufy << std::endl; + std::cout << std::setw(10) << ex[counter - numSkipData] << std::endl; + std::cout << std::setw(10) << ey[counter - numSkipData] << std::endl; +#endif + } + if( counter - numSkipData >= numDataPoints ){ + break; + } + } + + delete [] data; + + fclose(fp); + +} + +// Read ELOG-Dual binary file under a directory +void ElogDual::readElogBinaryFilesUnderADirectory(const std::string& directory, const int numSkipData, const int numDataPoints, double* ex, double* ey) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); +#ifdef _USE_FILESYSTEM + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + std::ostringstream oss; + oss << "_" << freq << "Hz"; + const std::string stringCompared = oss.str(); + if (std::filesystem::is_directory(directory)) { + auto dirItr = std::filesystem::directory_iterator(directory); + int counter(0); + for (auto& p : dirItr) { + const std::string fileName = p.path().string(); + if (fileName.find(stringCompared) != std::string::npos && Util::extractExtensionOfFileName(fileName).find("dat") != std::string::npos) { + readElogBinaryFile(fileName, numSkipData, numDataPoints, counter, ex, ey); + if (counter >= numSkipData + numDataPoints){ + break; + } + } + } + } + else + { + ptrOutputFiles->writeErrorMessage("There is no directory of ELOG data."); + } +#else + ptrOutputFiles->writeErrorMessage("Multiple inputs of ELOG data under a directory is not supported by this version."); +#endif +} + +// Get calibration file name +std::string ElogDual::getCalibrationFileName(const int channelIndex) const { + + std::ostringstream fileName; + fileName << "channel" << channelIndex << ".cal"; + + return fileName.str(); + +} + +// Make calibration file +void ElogDual::makeCalibrationFile( const std::string& fileName, const double unitGroupDelay, const int channelIndexX, const int channelIndexY, + const double dipoleLengthX, const double dipoleLengthY, const std::vector& freq) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + const int numFreq = static_cast(freq.size()); + if( numFreq < 1 ){ + ptrOutputFiles->writeErrorMessage( "Number of the frequencies for which calibrations are estimated is less than 1 : " + Util::toString(numFreq) ); + } + + const std::string outputFileNameX = getCalibrationFileName(channelIndexX); + std::ofstream ofsX; + ofsX.open( outputFileNameX.c_str(), std::ios::out ); + if( ofsX.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + outputFileNameX ); + } + const double dipoleLengthXkm = dipoleLengthX / -1000.0;// [m] -> [km] and invert sign + ofsX << std::setw(20) << std::scientific << std::setprecision(9) << 1.0/dipoleLengthXkm << std::endl; + ofsX << std::setw(10) << numFreq << std::endl; + + const std::string outputFileNameY = getCalibrationFileName(channelIndexY); + std::ofstream ofsY; + ofsY.open( outputFileNameY.c_str(), std::ios::out ); + if( ofsY.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + outputFileNameY ); + } + const double dipoleLengthYkm = dipoleLengthY / -1000.0;// [m] -> [km] and invert sign + ofsY << std::setw(20) << std::scientific << std::setprecision(9) << 1.0/dipoleLengthYkm << std::endl; + ofsY << std::setw(10) << numFreq << std::endl; + + const Control* const ptrControl = Control::getInstance(); + for( int iFreq = 0; iFreq < numFreq; ++iFreq ){ + std::complex calElogX(1.0,0.0); + std::complex calElogY(1.0,0.0); + calculateCalibrationFunctionForAnalogFilter(fileName, freq[iFreq], calElogX, calElogY); +#ifdef _DEBUG_WRITE + std::cout << "elog analog filter" << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogX); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogX.imag(),calElogX.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogY); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogY.imag(),calElogY.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; +#endif + { + //------- 1st fir filer from measured calibration table + std::string path = ""; + if (!ptrControl->getDirectoryOfLoggerCalibrationFiles().empty()) { +#ifdef _LINUX + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\/"; +#else + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\\"; +#endif + } + std::string fileName = "firh.txt"; + if (ptrControl->getTypeOfElogDual() == Control::ELOGDUAL_ADU_MODE) { + fileName = "firh_adu.txt"; + } + else if (ptrControl->getTypeOfElogDual() == Control::ELOGDUAL_PHX_MODE) { + fileName = "firh_phx.txt"; + } + const std::complex firh = Util::calculateCalibrationForFIRFilterType1(path + fileName, 9, 14336.0, freq[iFreq], true); + calElogX *= firh; + calElogY *= firh; +#ifdef _DEBUG_WRITE + std::cout << "elog firh" << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogX); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogX.imag(),calElogX.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogY); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogY.imag(),calElogY.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; +#endif + } + { + //------ 2nd fir filter --- + // 4900 is described in elog cal file (4.9 Vpp input) + calElogX /= 4900.0; + calElogY /= 4900.0; +#ifdef _DEBUG_WRITE + std::cout << "elog 2nd fir filter" << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogX); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogX.imag(),calElogX.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogY); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogY.imag(),calElogY.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; +#endif + } + { + //------ Gain correction --- + const double tsGroupDelay = 1.0 / 14336.0 * unitGroupDelay; + const double angle = 2.0 * CommonParameters::PI * freq[iFreq] * tsGroupDelay; + const std::complex groupDelay = std::complex(cos(angle), sin(angle)); + calElogX /= groupDelay; + calElogY /= groupDelay; +#ifdef _DEBUG_WRITE + std::cout << "elog gain correction" << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogX); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogX.imag(),calElogX.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogY); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogY.imag(),calElogY.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; +#endif + } + if( fabs(ptrControl->getSamplingFrequencyOrg() - 32.0) < CommonParameters::EPS ) { + //------ Group delay correction --- + std::string path = ""; + if (!ptrControl->getDirectoryOfLoggerCalibrationFiles().empty()) { +#ifdef _LINUX + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\/"; +#else + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\\"; +#endif + } + std::string fileName = "firl.txt"; + if (ptrControl->getTypeOfElogDual() == Control::ELOGDUAL_ADU_MODE) { + fileName = "firl_adu.txt"; + } + else if (ptrControl->getTypeOfElogDual() == Control::ELOGDUAL_PHX_MODE) { + fileName = "firl_phx.txt"; + } + const std::complex firl = Util::calculateCalibrationForFIRFilterType2(path + fileName, 9, 1024.0, freq[iFreq], -361, 0); + calElogX *= firl; + calElogY *= firl; +#ifdef _DEBUG_WRITE + std::cout << "elog roup delay correction" << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogX); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogX.imag(),calElogX.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calElogY); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calElogY.imag(),calElogY.real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; +#endif + } + const std::complex invCalX = 1.0 / calElogX; + ofsX << std::setw(20) << std::scientific << std::setprecision(9) << freq[iFreq]; + ofsX << std::setw(20) << std::scientific << std::setprecision(9) << invCalX.real(); + ofsX << std::setw(20) << std::scientific << std::setprecision(9) << invCalX.imag() << std::endl; + const std::complex invCalY = 1.0 / calElogY; + ofsY << std::setw(20) << std::scientific << std::setprecision(9) << freq[iFreq]; + ofsY << std::setw(20) << std::scientific << std::setprecision(9) << invCalY.real(); + ofsY << std::setw(20) << std::scientific << std::setprecision(9) << invCalY.imag() << std::endl; + } + + ofsX.close(); + ofsY.close(); + +} + +// Calculate calibration function for analog filter +void ElogDual::calculateCalibrationFunctionForAnalogFilter(const std::string& fileName, const double freq, + std::complex& calElogX, std::complex& calElogY) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error: " + fileName ); + } + + std::string line; + std::getline(ifs, line); + std::vector dataLines; + while(std::getline(ifs, line)){ + dataLines.push_back(line); + } + ifs.close(); + + const int numFreqsInCalFile = static_cast(dataLines.size()); + //ptrOutputFiles->writeLogMessage("Number of frequencies in the ELOG cal-file: " + Util::toString(numFreqsInCalFile)); + + double* freqsTemp = new double[numFreqsInCalFile]; + double* ampX = new double[numFreqsInCalFile]; + double* ampY = new double[numFreqsInCalFile]; + double* phsX = new double[numFreqsInCalFile]; + double* phsY = new double[numFreqsInCalFile]; + + int iFreq(0); + for( std::vector::const_iterator itr = dataLines.begin(); itr != dataLines.end(); ++itr, ++iFreq ){ + std::istringstream iss(*itr); + std::string sbuf; + double dbuf(0.0); + {// Freq(Hz) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + freqsTemp[iFreq] = dbuf; + } + {// CH1 Amp(Vpp) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + ampX[iFreq] = dbuf; + } + {// CH2 Amp(Vpp) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + ampY[iFreq] = dbuf; + } + {// CH1 Phase(deg) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + phsX[iFreq] = dbuf * CommonParameters::DEG2RAD; + } + {// CH2 Phase(deg) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + phsY[iFreq] = dbuf * CommonParameters::DEG2RAD; + } + } + + // Arrange the data in ascending order + int* ids = new int[numFreqsInCalFile]; + for( int iFreq = 0; iFreq < numFreqsInCalFile; ++iFreq ){ + ids[iFreq] = iFreq; + } + Util::quickSort(numFreqsInCalFile, ids, freqsTemp); + double* freqsInCalFile = new double[numFreqsInCalFile]; + std::complex* calX = new std::complex[numFreqsInCalFile]; + std::complex* calY = new std::complex[numFreqsInCalFile]; + for( int iFreq = 0; iFreq < numFreqsInCalFile; ++iFreq ){ + const int index = ids[iFreq]; + if( iFreq >= 1 ){ + const int indexPre = ids[iFreq-1]; + assert( freqsTemp[index] > freqsTemp[indexPre] ); + } + freqsInCalFile[iFreq] = freqsTemp[index]; + calX[iFreq] = ampX[index] * std::complex(cos(phsX[index]), sin(phsX[index])); + calY[iFreq] = ampY[index] * std::complex(cos(phsY[index]), sin(phsY[index])); +#ifdef _DEBUG_WRITE + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freqsInCalFile[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calX[iFreq]); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calX[iFreq].imag(),calX[iFreq].real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; + std::cout << std::setw(20) << std::setprecision(12) << 1.0/freqsInCalFile[iFreq]; + std::cout << std::setw(20) << std::setprecision(12) << std::abs(calY[iFreq]); + std::cout << std::setw(20) << std::setprecision(12) << atan2(calY[iFreq].imag(),calY[iFreq].real()) * CommonParameters::RAD2DEG; + std::cout << std::endl; +#endif + } + delete [] ids; + delete [] freqsTemp; + delete [] ampX; + delete [] ampY; + delete [] phsX; + delete [] phsY; + + if( freq < freqsInCalFile[0] ){ +#ifdef _DEBUG_WRITE + std::cout << "cho-shuuki" << std::endl; + std::cout << freq << " " << freqsInCalFile[0] << " " << freqsInCalFile[numFreqsInCalFile-1] << std::endl; +#endif + const double rdDelay = -156.7 * 1.e-6 * freq; + calElogX = std::abs(calX[0]) * std::complex(cos(rdDelay),sin(rdDelay)); + calElogY = std::abs(calY[0]) * std::complex(cos(rdDelay),sin(rdDelay)); + } + else if( freq > freqsInCalFile[numFreqsInCalFile-1] ){ +#ifdef _DEBUG_WRITE + std::cout << "tan-shuuki" << std::endl; + std::cout << freq << " " << freqsInCalFile[0] << " " << freqsInCalFile[numFreqsInCalFile-1] << std::endl; +#endif + calElogX = calX[numFreqsInCalFile-1]; + calElogY = calY[numFreqsInCalFile-1]; + } + else{ +#ifdef _DEBUG_WRITE + std::cout << "aida" << std::endl; + std::cout << freq << " " << freqsInCalFile[0] << " " << freqsInCalFile[numFreqsInCalFile-1] << std::endl; +#endif + for( int iFreq = 0; iFreq < numFreqsInCalFile - 1; ++iFreq ){ + if( freq >= freqsInCalFile[iFreq] && freq <= freqsInCalFile[iFreq+1] ){ +#ifdef _DEBUG_WRITE + std::cout << "haitta" << std::endl; + std::cout << freq << " " << freqsInCalFile[iFreq] << " " << freqsInCalFile[iFreq+1] << std::endl; + std::cout << calX[iFreq] << " " << calY[iFreq] << std::endl; + std::cout << calX[iFreq+1] << " " << calY[iFreq+1] << std::endl; +#endif + const double factor = (freq - freqsInCalFile[iFreq]) / (freqsInCalFile[iFreq+1] - freqsInCalFile[iFreq]); + calElogX = calX[iFreq] + (calX[iFreq+1] - calX[iFreq]) * factor; + calElogY = calY[iFreq] + (calY[iFreq+1] - calY[iFreq]) * factor; + } + } + } + + delete [] freqsInCalFile; + delete [] calX; + delete [] calY; + +} + +int ElogDual::bytesToInt32(unsigned char* ptr) const { + + union { + unsigned char c[4]; + int i; + } tmp; + + tmp.c[0] = *ptr++; + tmp.c[1] = *ptr++; + tmp.c[2] = *ptr; + + if (*ptr & 0x80) {// 0x80 <-> 1000 0000 + // Sign bit is 1 => negative value + tmp.c[3] = 0xFF;// 0xFF <-> 1111 1111 + } + else { + // Sign bit is 0 => positive value + tmp.c[3] = 0x00; + } + + return tmp.i; + +} \ No newline at end of file diff --git a/src/ElogDual.h b/src/ElogDual.h new file mode 100644 index 0000000..6061efd --- /dev/null +++ b/src/ElogDual.h @@ -0,0 +1,78 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ELOGDual +#define DBLDEF_ELOGDual + +#include +#include +#include +#include +#include + +// Class of ELOG-Dual +class ElogDual { + +public: + + struct recdata_head{ + uint8_t hour; + uint8_t min; + uint8_t sec; + }; + + const static int AD_CH = 2; + const static int AD_BYTES = 3; + const static int REC_DATALEN_HEAD = sizeof(recdata_head); + + // Return the the instance of the class + static ElogDual* getInstance(); + + // Read elog binary file + void readElogBinaryFile( const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey) const; + + // Read elog binary file under a directory + void readElogBinaryFilesUnderADirectory(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey) const; + + // Get calibration file name + std::string getCalibrationFileName( const int channelIndex ) const; + + // Make calibration file + void makeCalibrationFile( const std::string& fileName, const double unitGroupDelay, const int channelIndexX, const int channelIndexY, + const double dipoleLengthX, const double dipoleLengthY, const std::vector& freq ) const; + +private: + + // Calculate calibration function for analog filter + void calculateCalibrationFunctionForAnalogFilter( const std::string& fileName, const double freq, + std::complex& calElogX, std::complex& calElogY ) const; + + int bytesToInt32(unsigned char* ptr) const; + +}; +#endif diff --git a/src/ElogMT.cpp b/src/ElogMT.cpp new file mode 100644 index 0000000..5d9e010 --- /dev/null +++ b/src/ElogMT.cpp @@ -0,0 +1,821 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "ElogMT.h" +#include "Util.h" +#include "OutputFiles.h" +#include "CommonParameters.h" +#include "Control.h" + +#include +#include +#include +#include +#ifdef _USE_FILESYSTEM +#include +#endif + +const static double MV_LSB_E = 2500. / 8388608.; +const static double MV_LSB_H = 10000. / 8388608.; + +// Return the instance of the class +ElogMT* ElogMT::getInstance(){ + static ElogMT instance;// The only instance + return &instance; +} + +// Read ELOG-MT binary file +void ElogMT::readElogBinaryFile(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey, double* hz, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read Ex, Ey, Hz, Hx, and Hy data from " + fileName); + + FILE* fp = fopen(fileName.c_str(), "rb"); + if (fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + // Determine file type + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + + const int data_size = AD_CH * freq * AD_BYTES; + unsigned char* data = new unsigned char[data_size]; + + while (1) { + // Read header of each block + recdata_head d; + if (fread(&d, 1, REC_DATALEN_HEAD, fp) < 1) { + break; + } + // Read AD data of each block + if (fread(data, 1, data_size, fp) < 1) { + break; + } + if (counter + freq <= numSkipData) { + counter += freq; + // Go to next block + continue; + } + // Determine end position prior to the start position because counter can be modified in determing start position + int endPos(freq); + if (numSkipData + numDataPoints > counter && numSkipData + numDataPoints <= counter + freq) { + // End position locates in this block + endPos = numSkipData + numDataPoints - counter; + } + int startPos(0); + if (numSkipData > counter && numSkipData <= counter + freq) { + // Start position locates in this block + startPos = numSkipData - counter; + counter = numSkipData; + } + for (int j = startPos; j < endPos; ++j, ++counter) { + long lbuf(0); + // Ex + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH]); + ex[counter - numSkipData] = lbuf * MV_LSB_E; + // Ey + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES]); + ey[counter - numSkipData] = lbuf * MV_LSB_E; + // Hx + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 2]); + hx[counter - numSkipData] = lbuf * MV_LSB_H; + // Hy + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 3]); + hy[counter - numSkipData] = lbuf * MV_LSB_H; + // Hz + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 4]); + hz[counter - numSkipData] = lbuf * MV_LSB_H; + } + if (counter - numSkipData >= numDataPoints) { + break; + } + } + + delete[] data; + + fclose(fp); + +} + +// Read ELOG-MT binary file under a directory +void ElogMT::readElogBinaryFilesUnderADirectory(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey, double* hz, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); +#ifdef _USE_FILESYSTEM + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + std::ostringstream oss; + oss << "_" << freq << "Hz"; + const std::string stringCompared = oss.str(); + if (std::filesystem::is_directory(directoryName)) { + auto dirItr = std::filesystem::directory_iterator(directoryName); + int counter(0); + for (auto& p : dirItr) { + const std::string fileName = p.path().string(); + if (fileName.find(stringCompared) != std::string::npos && Util::extractExtensionOfFileName(fileName).find("dat") != std::string::npos ) { + readElogBinaryFile(fileName, numSkipData, numDataPoints, counter, ex, ey, hz, hx, hy); + if (counter >= numSkipData + numDataPoints) { + break; + } + } + } + }else{ + ptrOutputFiles->writeErrorMessage("There is no directory of ELOG-MT data."); + } +#else + ptrOutputFiles->writeErrorMessage("Multiple inputs of ELOG data under a directory is not supported by this version."); +#endif + +} + +// Read ELOG-MT binary file (Ex and Ey) +void ElogMT::readElogBinaryFileExEyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read Ex and Ey data from "+fileName); + + FILE * fp = fopen(fileName.c_str(), "rb"); + if(fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + // Determine file type + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + const int data_size = AD_CH * freq * AD_BYTES; + unsigned char* data = new unsigned char[data_size]; + + while(1) { + // Read header of each block + recdata_head d; + if(fread(&d, 1, REC_DATALEN_HEAD, fp) < 1){ + break; + } + // Read AD data of each block + if(fread(data, 1, data_size, fp) < 1){ + break; + } + if( counter + freq <= numSkipData ){ + counter += freq; + // Go to next block + continue; + } + // Determine end position prior to the start position because counter can be modified in determing start position + int endPos(freq); + if( numSkipData + numDataPoints > counter && numSkipData + numDataPoints <= counter + freq ){ + // End position locates in this block + endPos = numSkipData + numDataPoints - counter; + } + int startPos(0); + if( numSkipData > counter && numSkipData <= counter + freq ){ + // Start position locates in this block + startPos = numSkipData - counter; + counter = numSkipData; + } + for( int j = startPos; j < endPos; ++j, ++counter ){ + // Ex + long lbufx = b3_to_long32( &data[j*AD_BYTES*AD_CH] ); + ex[counter - numSkipData] = lbufx * MV_LSB_E; + // Ey + long lbufy = b3_to_long32( &data[j*AD_BYTES*AD_CH + AD_BYTES] ); + ey[counter - numSkipData] = lbufy * MV_LSB_E; + } + if( counter - numSkipData >= numDataPoints ){ + break; + } + } + + delete [] data; + + fclose(fp); + +} + +// Read ELOG-MT binary file under a directory (two electric field data only) +void ElogMT::readElogBinaryFilesUnderADirectoryExEyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); +#ifdef _USE_FILESYSTEM + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + std::ostringstream oss; + oss << "_" << freq << "Hz"; + const std::string stringCompared = oss.str(); + if (std::filesystem::is_directory(directoryName)) { + auto dirItr = std::filesystem::directory_iterator(directoryName); + int counter(0); + for (auto& p : dirItr) { + const std::string fileName = p.path().string(); + if (fileName.find(stringCompared) != std::string::npos && Util::extractExtensionOfFileName(fileName).find("dat") != std::string::npos) { + readElogBinaryFileExEyOnly(fileName, numSkipData, numDataPoints, counter, ex, ey); + if (counter >= numSkipData + numDataPoints) { + break; + } + } + } + } else { + ptrOutputFiles->writeErrorMessage("There is no directory of ELOG-MT data."); + } +#else + ptrOutputFiles->writeErrorMessage("Multiple inputs of ELOG data under a directory is not supported by this version."); +#endif + +} + +// Read ELOG-MT binary file (Hx and Hy) +void ElogMT::readElogBinaryFileHxHyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read Hx and Hy data from " + fileName); + + FILE* fp = fopen(fileName.c_str(), "rb"); + if (fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + // Determine file type + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + + const int data_size = AD_CH * freq * AD_BYTES; + unsigned char* data = new unsigned char[data_size]; + + while (1) { + // Read header of each block + recdata_head d; + if (fread(&d, 1, REC_DATALEN_HEAD, fp) < 1) { + break; + } + // Read AD data of each block + if (fread(data, 1, data_size, fp) < 1) { + break; + } + if (counter + freq <= numSkipData) { + counter += freq; + // Go to next block + continue; + } + // Determine end position prior to the start position because counter can be modified in determing start position + int endPos(freq); + if (numSkipData + numDataPoints > counter && numSkipData + numDataPoints <= counter + freq) { + // End position locates in this block + endPos = numSkipData + numDataPoints - counter; + } + int startPos(0); + if (numSkipData > counter && numSkipData <= counter + freq) { + // Start position locates in this block + startPos = numSkipData - counter; + counter = numSkipData; + } + for (int j = startPos; j < endPos; ++j, ++counter) { + long lbuf(0); + // Hx + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 2]); + hx[counter - numSkipData] = lbuf * MV_LSB_H; + // Hy + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 3]); + hy[counter - numSkipData] = lbuf * MV_LSB_H; + } + if (counter - numSkipData >= numDataPoints) { + break; + } + } + + delete[] data; + + fclose(fp); + +} + +// Read ELOG-MT binary file under a directory(two horizontal magnetic field data only) +void ElogMT::readElogBinaryFilesUnderADirectoryHxHyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); +#ifdef _USE_FILESYSTEM + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + std::ostringstream oss; + oss << "_" << freq << "Hz"; + const std::string stringCompared = oss.str(); + if (std::filesystem::is_directory(directoryName)) { + auto dirItr = std::filesystem::directory_iterator(directoryName); + int counter(0); + for (auto& p : dirItr) { + const std::string fileName = p.path().string(); + if (fileName.find(stringCompared) != std::string::npos && Util::extractExtensionOfFileName(fileName).find("dat") != std::string::npos) { + readElogBinaryFileHxHyOnly(fileName, numSkipData, numDataPoints, counter, hx, hy); + if (counter >= numSkipData + numDataPoints) { + break; + } + } + } + } else { + ptrOutputFiles->writeErrorMessage("There is no directory of ELOG-MT data."); + } +#else + ptrOutputFiles->writeErrorMessage("Multiple inputs of ELOG data under a directory is not supported by this version."); +#endif + +} + +// Read ELOG-MT binary file (Ex, Ey, Hx, and Hy only) +void ElogMT::readElogBinaryFileExEyHxHyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read Ex, Ey, Hx, and Hy data from " + fileName); + + FILE* fp = fopen(fileName.c_str(), "rb"); + if (fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + // Determine file type + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + + const int data_size = AD_CH * freq * AD_BYTES; + unsigned char* data = new unsigned char[data_size]; + + while (1) { + // Read header of each block + recdata_head d; + if (fread(&d, 1, REC_DATALEN_HEAD, fp) < 1) { + break; + } + // Read AD data of each block + if (fread(data, 1, data_size, fp) < 1) { + break; + } + if (counter + freq <= numSkipData) { + counter += freq; + // Go to next block + continue; + } + // Determine end position prior to the start position because counter can be modified in determing start position + int endPos(freq); + if (numSkipData + numDataPoints > counter && numSkipData + numDataPoints <= counter + freq) { + // End position locates in this block + endPos = numSkipData + numDataPoints - counter; + } + int startPos(0); + if (numSkipData > counter && numSkipData <= counter + freq) { + // Start position locates in this block + startPos = numSkipData - counter; + counter = numSkipData; + } + for (int j = startPos; j < endPos; ++j, ++counter) { + long lbuf(0); + // Ex + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH]); + ex[counter - numSkipData] = lbuf * MV_LSB_E; + // Ey + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES]); + ey[counter - numSkipData] = lbuf * MV_LSB_E; + // Hx + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 2]); + hx[counter - numSkipData] = lbuf * MV_LSB_H; + // Hy + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 3]); + hy[counter - numSkipData] = lbuf * MV_LSB_H; + } + if (counter - numSkipData >= numDataPoints) { + break; + } + } + + delete[] data; + + fclose(fp); + +} + +// Read ELOG-MT binary file under a directory (Ex, Ey, Hx, and Hy only) +void ElogMT::readElogBinaryFilesUnderADirectoryExEyHxHyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); +#ifdef _USE_FILESYSTEM + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + std::ostringstream oss; + oss << "_" << freq << "Hz"; + const std::string stringCompared = oss.str(); + if (std::filesystem::is_directory(directoryName)) { + auto dirItr = std::filesystem::directory_iterator(directoryName); + int counter(0); + for (auto& p : dirItr) { + const std::string fileName = p.path().string(); + if (fileName.find(stringCompared) != std::string::npos && Util::extractExtensionOfFileName(fileName).find("dat") != std::string::npos) { + readElogBinaryFileExEyHxHyOnly(fileName, numSkipData, numDataPoints, counter, ex, ey, hx, hy); + if (counter >= numSkipData + numDataPoints) { + break; + } + } + } + } else { + ptrOutputFiles->writeErrorMessage("There is no directory of ELOG-MT data."); + } +#else + ptrOutputFiles->writeErrorMessage("Multiple inputs of ELOG data under a directory is not supported by this version."); +#endif + +} + +// Read ELOG-MT binary file (Hz, Hx, and Hy only) +void ElogMT::readElogBinaryFileHzHxHyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* hz, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read Hz, Hx, and Hy data from " + fileName); + + FILE* fp = fopen(fileName.c_str(), "rb"); + if (fp == NULL) { + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + // Determine file type + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + + const int data_size = AD_CH * freq * AD_BYTES; + unsigned char* data = new unsigned char[data_size]; + + while (1) { + // Read header of each block + recdata_head d; + if (fread(&d, 1, REC_DATALEN_HEAD, fp) < 1) { + break; + } + // Read AD data of each block + if (fread(data, 1, data_size, fp) < 1) { + break; + } + if (counter + freq <= numSkipData) { + counter += freq; + // Go to next block + continue; + } + // Determine end position prior to the start position because counter can be modified in determing start position + int endPos(freq); + if (numSkipData + numDataPoints > counter && numSkipData + numDataPoints <= counter + freq) { + // End position locates in this block + endPos = numSkipData + numDataPoints - counter; + } + int startPos(0); + if (numSkipData > counter && numSkipData <= counter + freq) { + // Start position locates in this block + startPos = numSkipData - counter; + counter = numSkipData; + } + for (int j = startPos; j < endPos; ++j, ++counter) { + long lbuf(0); + // Hx + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 2]); + hx[counter - numSkipData] = lbuf * MV_LSB_H; + // Hy + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 3]); + hy[counter - numSkipData] = lbuf * MV_LSB_H; + // Hz + lbuf = b3_to_long32(&data[j * AD_BYTES * AD_CH + AD_BYTES * 4]); + hz[counter - numSkipData] = lbuf * MV_LSB_H; + } + if (counter - numSkipData >= numDataPoints) { + break; + } + } + + delete[] data; + + fclose(fp); + +} + +// Read ELOG-MT binary file under a directory (Hz, Hx, and Hy only) +void ElogMT::readElogBinaryFilesUnderADirectoryHzHxHyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* hz, double* hx, double* hy) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); +#ifdef _USE_FILESYSTEM + const Control* const ptrControl = Control::getInstance(); + const int freq = static_cast(ptrControl->getSamplingFrequency()); + std::ostringstream oss; + oss << "_" << freq << "Hz"; + const std::string stringCompared = oss.str(); + if (std::filesystem::is_directory(directoryName)) { + auto dirItr = std::filesystem::directory_iterator(directoryName); + int counter(0); + for (auto& p : dirItr) { + const std::string fileName = p.path().string(); + if (fileName.find(stringCompared) != std::string::npos && Util::extractExtensionOfFileName(fileName).find("dat") != std::string::npos) { + readElogBinaryFileHzHxHyOnly(fileName, numSkipData, numDataPoints, counter, hz, hx, hy); + if (counter >= numSkipData + numDataPoints) { + break; + } + } + } + } + else { + ptrOutputFiles->writeErrorMessage("There is no directory of ELOG-MT data."); + } +#else + ptrOutputFiles->writeErrorMessage("Multiple inputs of ELOG data under a directory is not supported by this version."); +#endif + +} + +// Get calibration file name +std::string ElogMT::getCalibrationFileName( const int channelIndex ) const{ + + std::ostringstream fileName; + fileName << "channel" << channelIndex << ".cal"; + + return fileName.str(); + +} + +// Make calibration file +void ElogMT::makeCalibrationFile( const std::string& fileName, const double unitGroupDelay, const std::vector& channelIndexes, + const double dipoleLengthX, const double dipoleLengthY, const std::vector& freq ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + const int numFreq = static_cast(freq.size()); + if( numFreq < 1 ){ + ptrOutputFiles->writeErrorMessage( "Number of the frequencies for which calibrations are estimated is less than 1 : " + Util::toString(numFreq) ); + } + + std::ofstream ofs[AD_CH]; + for( std::vector::const_iterator itr = channelIndexes.begin(); itr != channelIndexes.end(); ++itr ){ + const int iCh = *itr; + const std::string outputFileName = getCalibrationFileName(iCh); + ofs[iCh].open( outputFileName.c_str(), std::ios::out ); + if( ofs[iCh].fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error : " + outputFileName ); + } + if( iCh == 0 ){ + const double dipoleLength = dipoleLengthX / -1000.0;// [m] -> [km] and invert sign + ofs[iCh] << std::setw(20) << std::scientific << std::setprecision(9) << 1.0/dipoleLength << std::endl; + }else if( iCh == 1 ){ + const double dipoleLength = dipoleLengthY / -1000.0;// [m] -> [km] and invert sign + ofs[iCh] << std::setw(20) << std::scientific << std::setprecision(9) << 1.0/dipoleLength << std::endl; + }else{ + ofs[iCh] << std::setw(20) << std::scientific << std::setprecision(9) << 1.0 << std::endl; + } + ofs[iCh] << std::setw(10) << numFreq << std::endl; + } + + const Control* const ptrControl = Control::getInstance(); + for( int iFreq = 0; iFreq < numFreq; ++iFreq ){ + std::complex calElog[AD_CH]; + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] = std::complex(1.0, 0.0); + } + calculateCalibrationFunctionForAnalogFilter(fileName, freq[iFreq], calElog); + { + //------- 1st fir filer from measured calibration table + std::string path = ""; + if (!ptrControl->getDirectoryOfLoggerCalibrationFiles().empty()) { +#ifdef _LINUX + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\/"; +#else + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\\"; +#endif + } + std::string fileName = "firh.txt"; + if (ptrControl->getTypeOfElogMT() == Control::ELOGMT_ADU_MODE) { + fileName = "firh_adu.txt"; + } + else if (ptrControl->getTypeOfElogMT() == Control::ELOGMT_PHX_MODE) { + fileName = "firh_phx.txt"; + } + const std::complex firh = Util::calculateCalibrationForFIRFilterType1(path + fileName, 9, 14336.0, freq[iFreq], true); + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] *= firh; + } + } + { + //------ 2nd fir filter --- + // 4900 is described in elog cal file (4.9 Vpp input) + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] /= 4900.0; + } + } + { + //------ Gain correction --- + const double tsGroupDelay = 1.0 / 14336.0 * unitGroupDelay; + const double angle = 2.0 * CommonParameters::PI * freq[iFreq] * tsGroupDelay; + const std::complex groupDelay = std::complex(cos(angle), sin(angle)); + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] /= groupDelay; + } + } + if( fabs(ptrControl->getSamplingFrequencyOrg() - 32.0) < CommonParameters::EPS ) { + //------ Group delay correction --- + std::string path = ""; + if (!ptrControl->getDirectoryOfLoggerCalibrationFiles().empty()) { +#ifdef _LINUX + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\/"; +#else + path = ptrControl->getDirectoryOfLoggerCalibrationFiles() + "\\"; +#endif + } + std::string fileName = "firl.txt"; + if (ptrControl->getTypeOfElogMT() == Control::ELOGMT_ADU_MODE) { + fileName = "firl_adu.txt"; + } + else if (ptrControl->getTypeOfElogMT() == Control::ELOGMT_PHX_MODE) { + fileName = "firl_phx.txt"; + } + const std::complex firl = Util::calculateCalibrationForFIRFilterType2(path + fileName, 9, 1024.0, freq[iFreq], -396, 0); + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] *= firl; + } + } + for( std::vector::const_iterator itr = channelIndexes.begin(); itr != channelIndexes.end(); ++itr ){ + const int iCh = *itr; + const std::complex invCal = 1.0 / calElog[iCh]; + ofs[iCh] << std::setw(20) << std::scientific << std::setprecision(9) << freq[iFreq]; + ofs[iCh] << std::setw(20) << std::scientific << std::setprecision(9) << invCal.real(); + ofs[iCh] << std::setw(20) << std::scientific << std::setprecision(9) << invCal.imag() << std::endl; + } + } + + for( std::vector::const_iterator itr = channelIndexes.begin(); itr != channelIndexes.end(); ++itr ){ + const int iCh = * itr; + ofs[iCh].close(); + } + +} + +// Calculate calibration function for analog filter +void ElogMT::calculateCalibrationFunctionForAnalogFilter( const std::string& fileName, const double freq, std::complex* calElog ) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage( "File open error: " + fileName ); + } + + std::string line; + std::getline(ifs, line); + std::vector dataLines; + while(std::getline(ifs, line)){ + dataLines.push_back(line); + } + ifs.close(); + + const int numFreqsInCalFile = static_cast(dataLines.size()); + + double* freqsTemp = new double[numFreqsInCalFile]; + double** amp = new double*[AD_CH]; + double** phs = new double*[AD_CH]; + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + amp[iCh] = new double[numFreqsInCalFile]; + phs[iCh] = new double[numFreqsInCalFile]; + for( int i = 0; i < numFreqsInCalFile; ++i ){ + amp[iCh][i] = 0.0; + phs[iCh][i] = 0.0; + } + } + + int iFreq(0); + for( std::vector::const_iterator itr = dataLines.begin(); itr != dataLines.end(); ++itr, ++iFreq ){ + std::istringstream iss(*itr); + std::string sbuf; + double dbuf(0.0); + {// Freq(Hz) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + freqsTemp[iFreq] = dbuf; + } + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + {// Amp(Vpp) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + amp[iCh][iFreq] = dbuf; + } + {// Phase(deg) + std::getline(iss, sbuf, ','); + std::istringstream iss(sbuf); + iss >> dbuf; + phs[iCh][iFreq] = dbuf * CommonParameters::DEG2RAD; + } + } + } + + // Arrange the data in ascending order + int* ids = new int[numFreqsInCalFile]; + for( int iFreq = 0; iFreq < numFreqsInCalFile; ++iFreq ){ + ids[iFreq] = iFreq; + } + Util::quickSort(numFreqsInCalFile, ids, freqsTemp); + double* freqsInCalFile = new double[numFreqsInCalFile]; + std::complex** cal = new std::complex*[AD_CH]; + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + cal[iCh] = new std::complex[numFreqsInCalFile]; + } + for( int iFreq = 0; iFreq < numFreqsInCalFile; ++iFreq ){ + const int index = ids[iFreq]; + if( iFreq >= 1 ){ + const int indexPre = ids[iFreq-1]; + assert( freqsTemp[index] > freqsTemp[indexPre] ); + } + freqsInCalFile[iFreq] = freqsTemp[index]; + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + cal[iCh][iFreq] = amp[iCh][index] * std::complex(cos(phs[iCh][index]), sin(phs[iCh][index])); + } + } + delete [] ids; + delete [] freqsTemp; + for( int i = 0; i < AD_CH; ++i ){ + delete [] amp[i]; + delete [] phs[i]; + } + delete [] amp ; + delete [] phs; + + if( freq < freqsInCalFile[0] ){ + const double rdDelay = -156.7 * 1.e-6 * freq; + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] = std::abs(cal[iCh][0]) * std::complex(cos(rdDelay),sin(rdDelay)); + } + } + else if( freq > freqsInCalFile[numFreqsInCalFile-1] ){ + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] = cal[iCh][numFreqsInCalFile-1]; + } + } + else{ + for( int iFreq = 0; iFreq < numFreqsInCalFile - 1; ++iFreq ){ + if( freq >= freqsInCalFile[iFreq] && freq <= freqsInCalFile[iFreq+1] ){ + const double factor = (freq - freqsInCalFile[iFreq]) / (freqsInCalFile[iFreq+1] - freqsInCalFile[iFreq]); + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + calElog[iCh] = cal[iCh][iFreq] + (cal[iCh][iFreq+1] - cal[iCh][iFreq]) * factor; + } + } + } + } + + delete [] freqsInCalFile; + for( int iCh = 0; iCh < AD_CH; ++iCh ){ + delete [] cal[iCh]; + } + delete [] cal; + +} + +int32_t ElogMT::b3_to_long32( unsigned char *ptr ) const{ + + union { + unsigned char c[4]; + int32_t i; + } tmp; + + tmp.c[0] = *ptr++; + tmp.c[1] = *ptr++; + tmp.c[2] = *ptr; + + if(*ptr & 0x80){// 0x80 <-> 1000 0000 + // Sign bit is 1 => negative value + tmp.c[3] = 0xFF;// 0xFF <-> 1111 1111 + }else { + // Sign bit is 0 => positive value + tmp.c[3] = 0; + } + +#ifdef _DEBUG_WRITE + printf("tmp.i : 0x%08X\n", tmp.i); + for( int i = 0; i < 4; i++){ + printf("tmp.c[%d] : 0x%02X\n", i, tmp.c[i]); + } + std::cout << tmp.i << std::endl; +#endif + return tmp.i; + +} diff --git a/src/ElogMT.h b/src/ElogMT.h new file mode 100644 index 0000000..6f81977 --- /dev/null +++ b/src/ElogMT.h @@ -0,0 +1,102 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ElogMT +#define DBLDEF_ElogMT + +#include +#include +#include +#include +#include + +// Class of ELOG-MT mode +class ElogMT{ + +public: + + struct recdata_head{ + uint8_t hour; + uint8_t min; + uint8_t sec; + }; + + // Return the the instance of the class + static ElogMT* getInstance(); + + static const int AD_CH = 5; + static const int AD_BYTES = 3; + static const int REC_DATALEN_HEAD = sizeof(recdata_head); + + // Read ELOG-MT binary file + void readElogBinaryFile(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey, double* hz, double* hx, double* hy) const; + + // Read ELOG-MT binary file under a directory + void readElogBinaryFilesUnderADirectory(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey, double* hz, double* hx, double* hy) const; + + // Read ELOG-MT binary file (Ex and Ey only) + void readElogBinaryFileExEyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey) const; + + // Read ELOG-MT binary file under a directory (Ex and Ey only) + void readElogBinaryFilesUnderADirectoryExEyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey) const; + + // Read ELOG-MT binary file (Hx and Hy only) + void readElogBinaryFileHxHyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* hx, double* hy) const; + + // Read ELOG-MT binary file under a directory (Hx and Hy only) + void readElogBinaryFilesUnderADirectoryHxHyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* hx, double* hy) const; + + // Read ELOG-MT binary file (Ex, Ey, Hx, and Hy only) + void readElogBinaryFileExEyHxHyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* ex, double* ey, double* hx, double* hy) const; + + // Read ELOG-MT binary file under a directory (Ex, Ey, Hx, and Hy only) + void readElogBinaryFilesUnderADirectoryExEyHxHyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* ex, double* ey, double* hx, double* hy) const; + + // Read ELOG-MT binary file (Hz, Hx, and Hy only) + void readElogBinaryFileHzHxHyOnly(const std::string& fileName, const int numSkipData, const int numDataPoints, int& counter, double* hz, double* hx, double* hy) const; + + // Read ELOG-MT binary file under a directory (Hz, Hx, and Hy only) + void readElogBinaryFilesUnderADirectoryHzHxHyOnly(const std::string& directoryName, const int numSkipData, const int numDataPoints, double* hz, double* hx, double* hy) const; + + // Get calibration file name + std::string getCalibrationFileName( const int channelIndex ) const; + + // Make calibration file + void makeCalibrationFile( const std::string& fileName, const double unitGroupDelay, const std::vector& channelIndexes, + const double dipoleLengthX, const double dipoleLengthY, const std::vector& freq ) const; + +private: + + // Calculate calibration function for analog filter + void calculateCalibrationFunctionForAnalogFilter( const std::string& fileName, const double freq, std::complex* calElog ) const; + + int32_t b3_to_long32( unsigned char *ptr ) const; + +}; + +#endif diff --git a/src/LapackInterface.cpp b/src/LapackInterface.cpp new file mode 100644 index 0000000..f480070 --- /dev/null +++ b/src/LapackInterface.cpp @@ -0,0 +1,278 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "LapackInterface.h" +#include "OutputFiles.h" +#include "Util.h" + +extern "C" +{ +#include "f2c.h" +#include "clapack.h" +} + +// Calcualte all eigenvalues and eigenvectors of a real symmetric matrix +// @note Matrix and vectors are overwritten +void LapackInterface::calculateEigenValuesAndVectorsOfRealSymmetricMatrix( const int dimension, double* matrix, double* vectors ){ + + integer n = static_cast(dimension); + integer lda = n; + integer dum1 = 1; + integer dum2 = -1; + integer nb = ilaenv_(&dum1, "DSYTRD", "L", &n, &dum2, &dum2, &dum2); + integer lwork = (nb + 2) * n; + double* work = new double[lwork]; + integer info = 0; + dsyev_("V", "L", &n, matrix, &lda, vectors, work, &lwork, &info); + delete[] work; + + if (info < 0) { + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info=" + Util::toString(info)); + } + else if (info > 0) { + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Eigenvalue calculation is not converged : info=" + Util::toString(info)); + } + +} + +// Factrize and solve linear equation with real coefficents matrix +// @note Matrix and vectors are overwritten +void LapackInterface::factorizeAndSolveLinearEquationRealMatrix( const int dimension, const int nRhs, double* matrix, double* vectors ){ + + integer n = static_cast( dimension ); + integer nb = static_cast( nRhs ); + integer lda = n; + integer* ipiv = new integer[dimension]; + integer ldb = n; + integer info(0); + + dgesv_(&n, &nb, matrix, &lda, ipiv, vectors, &ldb, &info); + delete [] ipiv; + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + }else if( info > 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Singular matrix : info="+Util::toString(info) ); + } + +} + +// Factrize and solve linear equation with real symmetric matrix +// @note Matrix and vectors are overwritten +void LapackInterface::factorizeAndSolveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, double* matrix, double* vectors ){ + + integer n = static_cast( dimension ); + integer nb = static_cast( nRhs ); + integer lda = n; + integer* ipiv = new integer[dimension]; + integer ldb = n; + integer lwork = n * nb; + double* work = new double[lwork]; + integer info(0); + + dsysv_("L", &n, &nb, matrix, &lda, ipiv, vectors, &ldb, work, &lwork, &info); + delete [] ipiv; + delete [] work; + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + }else if( info > 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("D(i,i) is exactly zero : info="+Util::toString(info) ); + } + +} + +// Factrize and solve linear equation with real symmetric positive definite matrix +// @note Matrix and vectors are overwritten +void LapackInterface::factorizeAndSolveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, double* matrix, double* vectors ){ + + integer n = static_cast( dimension ); + integer nb = static_cast( nRhs ); + integer lda = n; + integer ldb = n; + integer info(0); + + dposv_("L", &n, &nb, matrix, &lda, vectors, &ldb, &info); + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + }else if( info > 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("D(i,i) is exactly zero : info="+Util::toString(info) ); + } + +} + +// Factorize a real square matrix +// @note Matrix and vectors are overwritten +void LapackInterface::factorizeRealSquareMatrix( const int dimension, double* matrix, int* ipivInt ){ + + integer n = static_cast(dimension); + integer m = n; + integer lda = m; + integer info(0); + integer* ipiv = new integer[dimension]; + + dgetrf_( &m, &n, matrix, &lda, ipiv, &info ); + for( int i = 0; i < dimension; ++i ){ + ipivInt[i] = ipiv[i]; + } + delete [] ipiv; + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + }else if( info > 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage(" D(i,i) is exactly zero : info="+Util::toString(info) ); + } + +} + +// Factorize a real symmetric matrix +// @note Matrix and vectors are overwritten +void LapackInterface::factorizeRealSymmetricMatrix( const int dimension, double* matrix, int* ipivInt ){ + + integer n = static_cast(dimension); + integer dum1 = 1; + integer dum2 = -1; + integer nb = ilaenv_( &dum1, "DSYTRF", "L", &n, &dum2, &dum2, &dum2 ); + integer lda = n; + integer* ipiv = new integer[dimension]; + integer lwork = n * nb; + double* work = new double[lwork]; + integer info(0); + + dsytrf_("L", &n, matrix, &lda, ipiv, work, &lwork, &info); + for( int i = 0; i < dimension; ++i ){ + ipivInt[i] = ipiv[i]; + } + delete [] ipiv; + delete [] work; + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + }else if( info > 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage(" D(i,i) is exactly zero : info="+Util::toString(info) ); + } + +} + +// Factorize a real symmetric positive definite matrix +// @note Matrix and vectors are overwritten +void LapackInterface::factorizeRealSymmetricPositiveDefiniteMatrix( const int dimension, double* matrix ){ + + integer n = static_cast(dimension); + integer lda = n; + integer info(0); + + dpotrf_("L", &n, matrix, &lda, &info); + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + }else if( info > 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage(" D(i,i) is exactly zero : info="+Util::toString(info) ); + } + +} + +// Solve a linear equation with real square matrix +void LapackInterface::solveLinearEquationRealSquareMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, double* vectors ){ + + integer n = static_cast(dimension); + integer nb = static_cast(nRhs); + integer lda = n; + integer* ipiv = new integer[dimension]; + for( int i = 0; i < dimension; ++i ){ + ipiv[i] = ipivInt[i]; + } + integer ldb = n; + integer info(0); + + dgetrs_("N", &n, &nb, factorizedMatrix, &lda, ipiv, vectors, &ldb, &info); + delete [] ipiv; + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + } + +} + +// Solve a linear equation with real symmetric matrix +void LapackInterface::solveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, double* vectors ){ + + integer n = static_cast(dimension); + integer nb = static_cast(nRhs); + integer lda = n; + integer* ipiv = new integer[dimension]; + for( int i = 0; i < dimension; ++i ){ + ipiv[i] = ipivInt[i]; + } + integer ldb = n; + integer info(0); + + dsytrs_("L", &n, &nb, factorizedMatrix, &lda, ipiv, vectors, &ldb, &info); + delete [] ipiv; + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + } + +} + +// Solve a linear equation with real symmetric positive definite matrix +void LapackInterface::solveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, double* factorizedMatrix, double* vectors ){ + + integer n = static_cast(dimension); + integer nb = static_cast(nRhs); + integer lda = n; + integer* ipiv = new integer[dimension]; + integer ldb = n; + integer info(0); + + dpotrs_("L", &n, &nb, factorizedMatrix, &lda, vectors, &ldb, &info); + + if( info < 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("An argument had an illegal value : info="+Util::toString(info) ); + } + +} diff --git a/src/LapackInterface.h b/src/LapackInterface.h new file mode 100644 index 0000000..72f21da --- /dev/null +++ b/src/LapackInterface.h @@ -0,0 +1,74 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_LAPACK_INTERFACE +#define DBLDEF_LAPACK_INTERFACE + +namespace LapackInterface +{ + +// Calcualte all eigenvalues and eigenvectors of a real symmetric matrix +// @note Matrix and vectors are overwritten +void calculateEigenValuesAndVectorsOfRealSymmetricMatrix( const int dimension, double* matrix, double* vectors ); + +// Factorize and solve a linear equation with real coefficents matrix +// @note Matrix and vectors are overwritten +void factorizeAndSolveLinearEquationRealMatrix( const int dimension, const int nRhs, double* matrix, double* vectors ); + +// Factorize and solve a linear equation with real symmetric matrix +// @note Matrix and vectors are overwritten +void factorizeAndSolveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, double* matrix, double* vectors ); + +// Factorize and solve a linear equation with real symmetric positive definite matrix +// @note Matrix and vectors are overwritten +void factorizeAndSolveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, double* matrix, double* vectors ); + +// Factorize a real square matrix +// @note Matrix and vectors are overwritten +void factorizeRealSquareMatrix( const int dimension, double* matrix, int* ipivInt ); + +// Factorize a real symmetric matrix +// @note Matrix and vectors are overwritten +void factorizeRealSymmetricMatrix( const int dimension, double* matrix, int* ipivInt ); + +// Factorize a real symmetric positive definite matrix +// @note Matrix and vectors are overwritten +void factorizeRealSymmetricPositiveDefiniteMatrix( const int dimension, double* matrix ); + +// Solve a linear equation with real square matrix +void solveLinearEquationRealSquareMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, double* vectors ); + +// Solve a linear equation with real symmetric matrix +void solveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, double* vectors ); + +// Solve a linear equation with real symmetric positive definite matrix +void solveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, double* factorizedMatrix, double* vectors ); + +} + +#endif diff --git a/src/MTH5.cpp b/src/MTH5.cpp new file mode 100644 index 0000000..86aebcd --- /dev/null +++ b/src/MTH5.cpp @@ -0,0 +1,79 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "MTH5.h" +#include "Util.h" +#include "OutputFiles.h" + +#include + +// Default constructer +MTH5::MTH5() +{ +} + +// Destructer +MTH5::~MTH5(){ +} + +// Return the instance of the class +MTH5* MTH5::getInstance(){ + static MTH5 instance;// The only instance + return &instance; +} + +// Read MTH5 file +void MTH5::readMTH5File(const std::string& fileName, const std::string groupName, const int numSkipData, const int numDataPoints, double* data) const{ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeLogMessage("Read data from " + groupName + " of " + fileName); + + hid_t file_id = H5Fopen(fileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + hid_t dataset_id = H5Dopen(file_id, groupName.c_str(), H5P_DEFAULT); + hid_t filespace_id = H5Dget_space(dataset_id); + int ndims = H5Sget_simple_extent_ndims(filespace_id); + if (ndims < 1) { + ptrOutputFiles->writeErrorMessage("Number of dimensions is less than one (" + Util::toString(ndims) + ")"); + } + hsize_t* dims = new hsize_t[ndims]; + H5Sget_simple_extent_dims(filespace_id, dims, NULL); + const int numDataInGroup = dims[0]; + delete[] dims; + if (numDataInGroup < numDataPoints) + { + ptrOutputFiles->writeErrorMessage("Number of data in this group (" + Util::toString(numDataInGroup) + ") is smaller than " + Util::toString(numDataPoints)); + } + hid_t type = H5Dget_type(dataset_id); + hsize_t dimsmr[1] = { numDataPoints }; + hid_t memspace_id = H5Screate_simple(1, dimsmr, NULL); + hsize_t roffset[1] = { numSkipData }; + hsize_t rcount[1] = { numDataPoints }; + H5Sselect_hyperslab(filespace_id, H5S_SELECT_SET, roffset, NULL, rcount, NULL); + H5Dread(dataset_id, H5T_NATIVE_DOUBLE, memspace_id, filespace_id, H5P_DEFAULT, data); + +} diff --git a/src/MTH5.h b/src/MTH5.h new file mode 100644 index 0000000..a544a0f --- /dev/null +++ b/src/MTH5.h @@ -0,0 +1,61 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_MTH5 +#define DBLDEF_MTH5 + +#include + +// Class of MTH5 file +class MTH5{ + +public: + + // Return the the instance of the class + static MTH5* getInstance(); + + // Read MTH5 file + void readMTH5File( const std::string& fileName, const std::string groupName, const int numSkipData, const int numDataPoints, double* data ) const; + +private: + + // Constructer + MTH5(); + + // Destructer + ~MTH5(); + + // Copy constructer + MTH5(const MTH5& rhs); + + // Assignment operator + MTH5& operator=(const MTH5& rhs); + +}; + +#endif diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..586030d --- /dev/null +++ b/src/Makefile @@ -0,0 +1,47 @@ +CXX = icpc +CC = icpc +CXXFLAGS = -O3 \ + -qopenmp \ + -DNDEBUG \ + -D_USE_OMP \ + -D_LINUX \ + -D_MERSENNE_TWISTER_ORIGINAL \ + -I./include +DEST = ./ +LIB_DIR = ./lib +LDFLAGS = -L${LIB_DIR} +LIBS = ${LIB_DIR}/lapack_LINUX.a ${LIB_DIR}/blas_LINUX.a ${LIB_DIR}/libf2c.a +OBJS = Analysis.cpp \ + AnalysisMultivariateRegression.cpp \ + AnalysisTwoStage.cpp \ + AnalysisOrdinaryRemoteReference.cpp \ + AnalysisTest.cpp \ + AnalysisRepeatedMedian.cpp \ + Ats.cpp \ + CalibrationFunction.cpp \ + Control.cpp \ + DoubleDenseMatrix.cpp \ + DoubleDenseSquareMatrix.cpp \ + DoubleDenseSquareSymmetricMatrix.cpp \ + DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp \ + ElogDual.cpp \ + ElogMT.cpp \ + LapackInterface.cpp \ + OutputFiles.cpp \ + RobustPrewhitening.cpp \ + RobustWeight.cpp \ + RobustWeightHuber.cpp \ + RobustWeightThomson.cpp \ + RobustWeightTukeysBiweights.cpp \ + Util.cpp \ + UtilRobust.cpp \ + main.cpp \ + mt19937-64.cpp +PROGRAM = TRACMT + +all: $(PROGRAM) + +$(PROGRAM): $(OBJS) + $(CXX) $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM) + +clean:; rm -f *.o *~ $(PROGRAM) diff --git a/src/Makefile_C++11 b/src/Makefile_C++11 new file mode 100644 index 0000000..fb20797 --- /dev/null +++ b/src/Makefile_C++11 @@ -0,0 +1,45 @@ +CXX = icpc +CC = icpc +CXXFLAGS = -O3 \ + -qopenmp \ + -DNDEBUG \ + -D_USE_OMP \ + -D_LINUX \ + -I./include +DEST = ./ +LIB_DIR = ./lib +LDFLAGS = -L${LIB_DIR} +LIBS = ${LIB_DIR}/lapack_LINUX.a ${LIB_DIR}/blas_LINUX.a ${LIB_DIR}/libf2c.a +OBJS = Analysis.cpp \ + AnalysisMultivariateRegression.cpp \ + AnalysisTwoStage.cpp \ + AnalysisOrdinaryRemoteReference.cpp \ + AnalysisTest.cpp \ + AnalysisRepeatedMedian.cpp \ + Ats.cpp \ + CalibrationFunction.cpp \ + Control.cpp \ + DoubleDenseMatrix.cpp \ + DoubleDenseSquareMatrix.cpp \ + DoubleDenseSquareSymmetricMatrix.cpp \ + DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp \ + ElogDual.cpp \ + ElogMT.cpp \ + LapackInterface.cpp \ + OutputFiles.cpp \ + RobustPrewhitening.cpp \ + RobustWeight.cpp \ + RobustWeightHuber.cpp \ + RobustWeightThomson.cpp \ + RobustWeightTukeysBiweights.cpp \ + Util.cpp \ + UtilRobust.cpp \ + main.cpp +PROGRAM = TRACMT + +all: $(PROGRAM) + +$(PROGRAM): $(OBJS) + $(CXX) $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM) + +clean:; rm -f *.o *~ $(PROGRAM) diff --git a/src/Makefile_C++11_MTH5 b/src/Makefile_C++11_MTH5 new file mode 100644 index 0000000..3718497 --- /dev/null +++ b/src/Makefile_C++11_MTH5 @@ -0,0 +1,49 @@ +CXX = icpc +CC = icpc +CXXFLAGS = -O3 \ + -qopenmp \ + -DNDEBUG \ + -D_USE_OMP \ + -D_LINUX \ + -D_MTH5 \ + -I./include \ + -I/usr/local/hdf5-1.10.5/include +DEST = ./ +LIB_DIR = ./lib +LIB_MTH5_DIR = /usr/local/hdf5-1.10.5/lib +LDFLAGS = -L${LIB_DIR} -L${LIB_MTH5_DIR} +LIBS = ${LIB_DIR}/lapack_LINUX.a ${LIB_DIR}/blas_LINUX.a ${LIB_DIR}/libf2c.a -lhdf5 +OBJS = Analysis.cpp \ + AnalysisMultivariateRegression.cpp \ + AnalysisTwoStage.cpp \ + AnalysisOrdinaryRemoteReference.cpp \ + AnalysisTest.cpp \ + AnalysisRepeatedMedian.cpp \ + Ats.cpp \ + CalibrationFunction.cpp \ + Control.cpp \ + DoubleDenseMatrix.cpp \ + DoubleDenseSquareMatrix.cpp \ + DoubleDenseSquareSymmetricMatrix.cpp \ + DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp \ + ElogDual.cpp \ + ElogMT.cpp \ + LapackInterface.cpp \ + OutputFiles.cpp \ + RobustPrewhitening.cpp \ + RobustWeight.cpp \ + RobustWeightHuber.cpp \ + RobustWeightThomson.cpp \ + RobustWeightTukeysBiweights.cpp \ + Util.cpp \ + UtilRobust.cpp \ + MTH5.cpp \ + main.cpp +PROGRAM = TRACMT + +all: $(PROGRAM) + +$(PROGRAM): $(OBJS) + $(CXX) $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM) + +clean:; rm -f *.o *~ $(PROGRAM) diff --git a/src/Makefile_MTH5 b/src/Makefile_MTH5 new file mode 100644 index 0000000..4b4a71f --- /dev/null +++ b/src/Makefile_MTH5 @@ -0,0 +1,50 @@ +CXX = icpc +CC = icpc +CXXFLAGS = -O3 \ + -qopenmp \ + -DNDEBUG \ + -D_USE_OMP \ + -D_LINUX \ + -D_MERSENNE_TWISTER_ORIGINAL \ + -D_MTH5 \ + -I./include \ + -I/usr/local/hdf5-1.10.5/include +DEST = ./ +LIB_DIR = ./lib +LIB_MTH5_DIR = /usr/local/hdf5-1.10.5/lib +LDFLAGS = -L${LIB_DIR} -L${LIB_MTH5_DIR} +LIBS = ${LIB_DIR}/lapack_LINUX.a ${LIB_DIR}/blas_LINUX.a ${LIB_DIR}/libf2c.a -lhdf5 +OBJS = Analysis.cpp \ + AnalysisMultivariateRegression.cpp \ + AnalysisTwoStage.cpp \ + AnalysisOrdinaryRemoteReference.cpp \ + AnalysisTest.cpp \ + AnalysisRepeatedMedian.cpp \ + Ats.cpp \ + CalibrationFunction.cpp \ + Control.cpp \ + DoubleDenseMatrix.cpp \ + DoubleDenseSquareMatrix.cpp \ + DoubleDenseSquareSymmetricMatrix.cpp \ + DoubleDenseSquareSymmetricPositiveDefiniteMatrix.cpp \ + ElogDual.cpp \ + ElogMT.cpp \ + LapackInterface.cpp \ + OutputFiles.cpp \ + RobustPrewhitening.cpp \ + RobustWeight.cpp \ + RobustWeightHuber.cpp \ + RobustWeightThomson.cpp \ + RobustWeightTukeysBiweights.cpp \ + Util.cpp \ + UtilRobust.cpp \ + main.cpp \ + mt19937-64.cpp +PROGRAM = TRACMT + +all: $(PROGRAM) + +$(PROGRAM): $(OBJS) + $(CXX) $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM) + +clean:; rm -f *.o *~ $(PROGRAM) diff --git a/src/OutputFiles.cpp b/src/OutputFiles.cpp new file mode 100644 index 0000000..b5e606a --- /dev/null +++ b/src/OutputFiles.cpp @@ -0,0 +1,201 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include +#include +#include + +#include "CommonParameters.h" +#include "OutputFiles.h" + +// Return the the instance of the class +OutputFiles* OutputFiles::getInstance(){ + static OutputFiles instance;// The only instance + return &instance; +} + +// Restart to write cvg message +void OutputFiles::restartToWriteCvgMessage(){ + m_isWritingCvgMessageStopped = false; +} + +// Restart to write log message +void OutputFiles::restartToWriteLogMessage(){ + m_isWritingLogMessageStopped = false; +} + +// Restart to write warning essage +void OutputFiles::restartToWriteWarningMessage(){ + m_isWritingWarningMessageStopped = false; +} + +// Set flag specifing whether messages are shown to console +void OutputFiles::setOutputToConsole(const bool outputToConsole) { + m_outputToConsole = outputToConsole; +} + +// Stop to write cvg message +void OutputFiles::stopToWriteCvgMessage(){ + m_isWritingCvgMessageStopped = true; +} + +// Stop to write log message +void OutputFiles::stopToWriteLogMessage(){ + m_isWritingLogMessageStopped = true; +} + +// Stop to write warning essage +void OutputFiles::stopToWriteWarningMessage(){ + m_isWritingWarningMessageStopped = true; +} + +// Write to cvg message +void OutputFiles::writeCvgMessage( const std::string& msg ){ + if(m_isWritingCvgMessageStopped){ + return; + } + m_cvgFile << msg << std::endl; +} + +// Write to cvg message +void OutputFiles::writeCvgAndLogMessage( const std::string& msg, const bool withElapsedTime ){ + writeLogMessage(msg, withElapsedTime); + writeCvgMessage(msg); +} + +// Write log message +void OutputFiles::writeLogMessage( const std::string& msg, const bool withElapsedTime ){ + if(m_isWritingLogMessageStopped){ + return; + } + if( withElapsedTime ){ + m_logFile << msg << " " << outputElapsedTime() << std::endl; + }else{ + m_logFile << msg << std::endl; + } + if (m_outputToConsole) { + if (withElapsedTime) { + std::cout << msg << " " << outputElapsedTime() << std::endl; + } + else { + std::cout << msg << std::endl; + } + } +} + +// Write error message +void OutputFiles::writeErrorMessage( const std::string& msg ){ + m_logFile << "[Error] " << msg << std::endl; + if (m_outputToConsole) { + std::cout << "[Error] " << msg << std::endl; + } + exit(1); +} + +// Write warning message +void OutputFiles::writeWarningMessage( const std::string& msg ){ + if(m_isWritingWarningMessageStopped){ + return; + } + m_logFile << "[Warning] " << msg << std::endl; + if (m_outputToConsole) { + std::cout << "[Warning] " << msg << std::endl; + } +} + +// Constructer +OutputFiles::OutputFiles(): + m_isWritingCvgMessageStopped(false), + m_isWritingLogMessageStopped(false), + m_isWritingWarningMessageStopped(false), + m_outputToConsole(false), + m_startTime(NULL) +{ + + // Open cvg file + std::ostringstream cvgFileName; + cvgFileName << CommonParameters::programName <<".cvg"; + m_cvgFile.open( cvgFileName.str().c_str(), std::ios::out ); + if( m_cvgFile.fail() ){ + std::cerr << "File open error !! : " << cvgFileName.str() << std::endl; + exit(1); + } + + // Open log file + std::ostringstream logFileName; + logFileName << CommonParameters::programName <<".log"; + m_logFile.open( logFileName.str().c_str(), std::ios::out ); + if( m_logFile.fail() ){ + std::cerr << "File open error !! : " << logFileName.str() << std::endl; + exit(1); + } + + // Measure the start time + time(&m_startTime); + + OutputFiles::m_logFile << "Start " << CommonParameters::programName << " Version " << CommonParameters::version << std::endl; + +} + +// Destructer +OutputFiles::~OutputFiles(){ + + if( m_cvgFile.is_open() ){ + m_cvgFile.close(); + } + + if( m_logFile.is_open() ){ + m_logFile.close(); + } + +} + +// Copy constructer +OutputFiles::OutputFiles(const OutputFiles& rhs){ + std::cerr << "Error : Copy constructer of the class LogFile is not implemented." << std::endl; + exit(1); +} + +// Copy assignment operator +OutputFiles& OutputFiles::operator=(const OutputFiles& rhs){ + std::cerr << "Error : Copy assignment operator of the class LogFile is not implemented." << std::endl; + exit(1); +} + +// Calculate elapsed time +std::string OutputFiles::outputElapsedTime() const{ + + time_t curTime(NULL); + time(&curTime); + + std::ostringstream output; + output << "( " << difftime(curTime, m_startTime) << " sec )"; + + return output.str(); + +} diff --git a/src/OutputFiles.h b/src/OutputFiles.h new file mode 100644 index 0000000..71c2a48 --- /dev/null +++ b/src/OutputFiles.h @@ -0,0 +1,120 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_OUTPUT_FILES +#define DBLDEF_OUTPUT_FILES + +#include +#include +#include +#include +#include + +// Class of output files +class OutputFiles{ + +public: + // Return the the instance of the class + static OutputFiles* getInstance(); + + // Restart to write cvg message + void restartToWriteCvgMessage(); + + // Restart to write log message + void restartToWriteLogMessage(); + + // Restart to write warning essage + void restartToWriteWarningMessage(); + + // Set flag specifing whether messages are shown to console + void setOutputToConsole(const bool outputToConsole); + + // Stop to write cvg message + void stopToWriteCvgMessage(); + + // Stop to write log message + void stopToWriteLogMessage(); + + // Stop to write warning essage + void stopToWriteWarningMessage(); + + // Write to cvg message + void writeCvgMessage( const std::string& msg ); + + // Write to cvg message + void writeCvgAndLogMessage( const std::string& msg, const bool withElapsedTime = true ); + + // Write log message + void writeLogMessage( const std::string& msg, const bool withElapsedTime = true ); + + // Write error message + void writeErrorMessage( const std::string& msg ); + + // Write warning message + void writeWarningMessage( const std::string& msg ); + +private: + // Conrvergence file + std::ofstream m_cvgFile; + + // Log file + std::ofstream m_logFile; + + // Flag specifing whether writing cvg message is stopped + bool m_isWritingCvgMessageStopped; + + // Flag specifing whether writing log message is stopped + bool m_isWritingLogMessageStopped; + + // Flag specifing whether writing warning message is stopped + bool m_isWritingWarningMessageStopped; + + // Flag specifing whether messages are shown to console + bool m_outputToConsole; + + // The time the class instanced + time_t m_startTime; + + // Constructer + OutputFiles(); + + // Destructer + ~OutputFiles(); + + // Copy constructer + OutputFiles(const OutputFiles& rhs); + + // Assignment operator + OutputFiles& operator=(const OutputFiles& rhs); + + // Calculate and output elapsed time + std::string outputElapsedTime() const; + +}; + +#endif diff --git a/src/RobustPrewhitening.cpp b/src/RobustPrewhitening.cpp new file mode 100644 index 0000000..81aa9de --- /dev/null +++ b/src/RobustPrewhitening.cpp @@ -0,0 +1,840 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "RobustPrewhitening.h" +#include "OutputFiles.h" +#include "Control.h" +#include "Util.h" +#include "UtilRobust.h" +#include "DoubleDenseSquareSymmetricPositiveDefiniteMatrix.h" + +#include +#include +#include + +// Default constructer +RobustPrewhitening::RobustPrewhitening() +{ +} + +// Destructer +RobustPrewhitening::~RobustPrewhitening() +{ +} + +// Return the instance of the class +RobustPrewhitening* RobustPrewhitening::getInstance(){ + static RobustPrewhitening instance;// The only instance + return &instance; +} + +// Perform robust prewhitening +void RobustPrewhitening::robustPrewhitening( std::vector& dataFileSets, std::vector* coeffsAROutput ) const{ + + const Control* const ptrControl = Control::getInstance(); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + const Control::ParamsForPrewhitening params = ptrControl->getParamsForPrewhitening(); + const int maxDegreesOfAR = params.maxDegreeOfARModel; + const Control::ParamsForRobustFilter paramsForFilter = ptrControl->getParamsForRobustFilter(); + + int numDataPointsAll(0); + int iSection(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSection ){ + numDataPointsAll += itr->numDataPoints; + } + const int numSections = iSection; + + // Calculate candidates + const int numCandidates = params.numCandidatesOfPartialAutocorrelationFunction; + if( numCandidates % 2 == 0 ){ + ptrOutputFiles->writeErrorMessage("Numbef of candidates of partial autocorrelation function should be an odd number"); + } + double* candidates = new double[numCandidates]; + for( int iCan = 0; iCan < numCandidates; ++iCan ){ + const int index = iCan % 2 == 1 ? iCan / 2 + 1 : -(iCan / 2); + candidates[iCan] = static_cast(index) / static_cast(numCandidates - 1) * 2.0; +#ifdef _DEBUG_WRITE + std::cout << candidates[iCan] << std::endl; +#endif + } + + const int numChannels = ptrControl->getNumberOfChannels(); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ptrOutputFiles->writeLogMessage("Perform prewhitening for channel " + Util::toString(iChan)); + double* coeffsAR= new double[maxDegreesOfAR]; + for( int iDeg = 0; iDeg < maxDegreesOfAR; ++iDeg ){ + coeffsAR[iDeg] = 0.0; + } + // Copy data to temporal arrays + const int numOfDataSets = static_cast(dataFileSets.size()); + int* numOfData = new int[numOfDataSets];; + double** dataOrg = new double*[numOfDataSets]; + double** dataMod = new double*[numOfDataSets]; + int iSet(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + numOfData[iSet] = numData; + dataOrg[iSet] = new double[numData]; + dataMod[iSet] = new double[numData]; + for( int iData = 0; iData < numData; ++iData ){ + dataOrg[iSet][iData] = itr->dataFile[iChan].data[iData]; + dataMod[iSet][iData] = dataOrg[iSet][iData]; + } + } + DoubleDenseSquareSymmetricMatrix autoCovarianceMatrixMaxDegreesOfAR; + if(paramsForFilter.applyRobustFilter){ + // Calculate auto-covariance matrix + ptrOutputFiles->writeCvgAndLogMessage("Calculate auto-covariance matrix of channel " + Util::toString(iChan)); + calculateRobustAutoCovarianceMatrix( maxDegreesOfAR, numOfDataSets, numOfData, dataOrg, autoCovarianceMatrixMaxDegreesOfAR ); + } + assert( iSet == numOfDataSets ); + double squredSigma(0.0); + if (params.typeOfEstimator == Control::USE_LEAST_SQUARE_ESTIMATOR_FOR_PREWHITENING) { + int numOfDataAll(0); + for (int iSet = 0; iSet < numOfDataSets; ++iSet) { + const int numData = numOfData[iSet]; + numOfDataAll += numData; + for (int iData = 0; iData < numData; ++iData) { + squredSigma += dataMod[iSet][iData] * dataMod[iSet][iData]; + } + } + squredSigma /= static_cast(numOfDataAll); + } + double minAIC(1.0e20); + int iDegAROfMinAIC(-1); + double scaleOfMinAIC(-1.0); + double* coeffsAROfMinAIC = new double[maxDegreesOfAR]; + for( int iDegAR = 1; iDegAR <= maxDegreesOfAR; ++iDegAR ){ + const int numDataForSEstimator = numDataPointsAll - iDegAR * numSections; + // Calculate forward MMSE prediction residual and backward MMSE prediction residual + double* forwardMMSEResidual = new double[numDataForSEstimator]; + double* backwardMMSEResidual = new double[numDataForSEstimator]; + int icount(0); + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + const int numData = numOfData[iSet]; + for( int iData = iDegAR; iData < numData; ++iData ){ + forwardMMSEResidual[icount] = dataMod[iSet][iData]; + for( int i = 0; i < iDegAR - 1; ++i ){ + const int index = iData - 1 - i; + forwardMMSEResidual[icount] -= coeffsAR[i] * dataMod[iSet][index]; + } + backwardMMSEResidual[icount] = dataMod[iSet][iData - iDegAR]; + for( int i = 0; i < iDegAR - 1; ++i ){ + const int index = iData - iDegAR + 1 + i; + backwardMMSEResidual[icount] -= coeffsAR[i] * dataMod[iSet][index]; + } + ++icount; + } + } + assert(icount == numDataForSEstimator); + // Calculate AR coefficients + double scale(0.0); + double partialAutocorrelationFunction(0.0); + double AIC(0.0); + if( params.typeOfEstimator == Control::USE_S_ESTIMATOR_FOR_PREWHITENING ){ + UtilRobust::computeSEstimatorForUnivariateLinearRegression( numDataForSEstimator, numCandidates, + forwardMMSEResidual, backwardMMSEResidual, candidates, -1.0, 1.0, scale, partialAutocorrelationFunction, AIC ); + ptrOutputFiles->writeLogMessage("Degree of AR model: " + Util::toString(iDegAR) + ", Sigma: " + Util::toString(scale) + + ", AICS: " + Util::toString(AIC)); + }else if( params.typeOfEstimator == Control::USE_LEAST_SQUARE_ESTIMATOR_FOR_PREWHITENING ){ + UtilRobust::computeLSEstimatorForUnivariateLinearRegression( numDataForSEstimator, forwardMMSEResidual, backwardMMSEResidual, + -1.0, 1.0, scale, partialAutocorrelationFunction ); + squredSigma *= (1.0 - partialAutocorrelationFunction * partialAutocorrelationFunction); + double sigma = sqrt(squredSigma); + if (sigma < CommonParameters::EPS) + { + sigma = CommonParameters::EPS; + } + AIC = 2.0 * static_cast(numDataForSEstimator) * log(sigma) + 2.0 * (static_cast(iDegAR) + 1.0) + + static_cast(numDataForSEstimator) + static_cast(numDataForSEstimator) * log(2.0 * CommonParameters::PI); + ptrOutputFiles->writeLogMessage("Degree of AR model: " + Util::toString(iDegAR) + ", Sigma: " + Util::toString(sigma) + + ", AIC: " + Util::toString(AIC)); + }else{ + ptrOutputFiles->writeErrorMessage("Wrong type of estimator for prewhitening: " + Util::toString(params.typeOfEstimator)); + } + delete [] forwardMMSEResidual; + delete [] backwardMMSEResidual; + coeffsAR[iDegAR - 1] = partialAutocorrelationFunction; + if( iDegAR > 1 ){ + double* coeffsARPre = new double[iDegAR - 1]; + for( int i = 0; i < iDegAR - 1; ++i ){ + coeffsARPre[i] = coeffsAR[i]; + } + for( int i = 0; i < iDegAR - 1; ++i ){ + const int index = iDegAR - 2 - i; + coeffsAR[i] -= partialAutocorrelationFunction * coeffsARPre[index]; + } +#ifdef _DEBUG_WRITE + for( int i = 0; i < iDegAR - 1; ++i ){ + std::cout << "AR old new: " << coeffsARPre[i] << " " << coeffsAR[i] << std::endl; + } +#endif + delete [] coeffsARPre; + } +#ifdef _DEBUG_WRITE + for( int i = 0; i < iDegAR; ++i ){ + std::cout << "AR coeffs: " << coeffsAR[i] << std::endl; + } +#endif + if( AIC < minAIC ){ + minAIC = AIC; + iDegAROfMinAIC = iDegAR; + scaleOfMinAIC = scale; + for( int i = 0; i < iDegAR; ++i ){ + coeffsAROfMinAIC[i] = coeffsAR[i]; + } + for( int i = iDegAR; i < maxDegreesOfAR; ++i ){ + coeffsAROfMinAIC[i] = 0.0; + } + } + if(paramsForFilter.applyRobustFilter){ + // Calculate robust-filtered value + double* autoCovariance = new double[iDegAR * iDegAR]; + // Copy matrix + icount = 0; + for( int col = 0; col < iDegAR; ++col ){ + for( int row = 0; row < iDegAR; ++row ){ + // Column major + autoCovariance[icount] = autoCovarianceMatrixMaxDegreesOfAR.getValue(row, col); + ++icount; + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(iDegAR, iDegAR, autoCovariance); +#endif + int iSet(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + calculateRobustFilteredValue( iChan, numData, iDegAR, coeffsAR, scale, dataOrg[iSet], autoCovariance, dataMod[iSet] ); + } + delete [] autoCovariance; + }else{ + int iSet = 0; + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + for( int iData = 0; iData < numData; ++iData ){ + dataMod[iSet][iData] = dataOrg[iSet][iData]; + } + } + } + } + delete [] coeffsAR; + if( params.typeOfEstimator == Control::USE_S_ESTIMATOR_FOR_PREWHITENING ){ + ptrOutputFiles->writeLogMessage("The AR model of " + Util::toString(iDegAROfMinAIC) + " degress gives the minimum AICS (" + Util::toString(minAIC) + ")"); + }else if( params.typeOfEstimator == Control::USE_LEAST_SQUARE_ESTIMATOR_FOR_PREWHITENING ){ + ptrOutputFiles->writeLogMessage("The AR model of " + Util::toString(iDegAROfMinAIC) + " degress gives the minimum AIC (" + Util::toString(minAIC) + ")"); + } + for( int i = 0; i < iDegAROfMinAIC; ++i ){ + coeffsAROutput[iChan].push_back(coeffsAROfMinAIC[i]); + } + std::ostringstream msg; + msg << "AR coefficients: "; + for( int i = 0; i < iDegAROfMinAIC; ++i ){ + msg << coeffsAROfMinAIC[i] << " "; + } + ptrOutputFiles->writeLogMessage(msg.str()); + if( paramsForFilter.applyRobustFilter && paramsForFilter.replaceTimeSeriesWithFilteredValues ){ + ptrOutputFiles->writeLogMessage("Replace observed time-series with filtered values"); + double* autoCovariance = new double[iDegAROfMinAIC * iDegAROfMinAIC]; + // Copy matrix + int icount = 0; + for( int col = 0; col < iDegAROfMinAIC; ++col ){ + for( int row = 0; row < iDegAROfMinAIC; ++row ){ + // Column major + autoCovariance[icount] = autoCovarianceMatrixMaxDegreesOfAR.getValue(row, col); + ++icount; + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(iDegAROfMinAIC, iDegAROfMinAIC, autoCovariance); +#endif + // Calculate robust-filtered value + int iSet = 0; + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + // Calculate robust-filtered value + calculateRobustFilteredValue( iChan, numData, iDegAROfMinAIC, coeffsAROfMinAIC, scaleOfMinAIC, dataOrg[iSet], autoCovariance, dataMod[iSet] ); + // Output robust-filtered time serieas + if( ptrControl->doesOutputTimeSeriesToCsv() ){ + std::ostringstream oss; + oss << "time_series_robust_filtered_sect_" << iSet << "_chan_" << iChan << ".csv"; + std::ofstream ofs; + ofs.open( oss.str().c_str(), std::ios::out ); + if( ofs.fail() ){ + ptrOutputFiles->writeLogMessage("File open error !! : " + oss.str()); + } + for( int iData = 0; iData < numData; ++iData ){ + ofs << std::setprecision(12) << std::scientific << dataMod[iSet][iData] << std::endl; + } + ofs.close(); + } + } + delete [] autoCovariance; + }else{ + int iSet = 0; + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + for( int iData = 0; iData < numData; ++iData ){ + dataMod[iSet][iData] = dataOrg[iSet][iData]; + } + } + } + // Prewhitening + iSet = 0; + for( std::vector::iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + // Replace observed time-series with filtered values + for( int iData = 0; iData < iDegAROfMinAIC; ++iData ){ + itr->dataFile[iChan].data[iData] = 0.0; + } + for( int iData = iDegAROfMinAIC; iData < numData; ++iData ){ + double work = dataMod[iSet][iData]; + for( int iAR = 0; iAR < iDegAROfMinAIC; ++iAR ){ + const int index = iData - iAR - 1; + work -= coeffsAROfMinAIC[iAR] * dataMod[iSet][index]; + } + itr->dataFile[iChan].data[iData] = work; + } + } + // Release memory + delete [] coeffsAROfMinAIC; + delete [] numOfData; + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + delete [] dataOrg[iSet]; + delete [] dataMod[iSet]; + } + delete [] dataOrg; + delete [] dataMod; + } + + delete [] candidates; + +} + +// Perform prewhitening using user-defined AR coefficients +void RobustPrewhitening::prewhiteningUsingUserDefinedARCoeffs( std::vector& dataFileSets, std::vector* coeffsAROutput ) const{ + + const Control* const ptrControl = Control::getInstance(); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + const std::string fileName = "AR_coefficients.dat"; + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + + const int numChannels = ptrControl->getNumberOfChannels(); + for( int iChan = 0; iChan < numChannels; ++iChan ){ + ptrOutputFiles->writeLogMessage("Perform prewhitening for channel " + Util::toString(iChan)); + // Copy data to temporal arrays + const int numOfDataSets = static_cast(dataFileSets.size()); + double** dataOrg = new double*[numOfDataSets]; + int iSet(0); + for( std::vector::const_iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + dataOrg[iSet] = new double[numData]; + for( int iData = 0; iData < numData; ++iData ){ + dataOrg[iSet][iData] = itr->dataFile[iChan].data[iData]; + } + } + int numCoeffs(0); + ifs >> numCoeffs; + for( int i = 0; i < numCoeffs; ++i ){ + double dbuf(0.0); + ifs >> dbuf; + coeffsAROutput[iChan].push_back(dbuf); + } + std::ostringstream msg; + msg << "AR coefficients: "; + for( int i = 0; i < numCoeffs; ++i ){ + msg << coeffsAROutput[iChan][i] << " "; + } + ptrOutputFiles->writeLogMessage(msg.str()); + // Prewhitening + iSet = 0; + for( std::vector::iterator itr = dataFileSets.begin(); itr != dataFileSets.end(); ++itr, ++iSet ){ + const int numData = itr->numDataPoints; + // Replace observed time-series with filtered values + for( int iData = 0; iData < numCoeffs; ++iData ){ + itr->dataFile[iChan].data[iData] = 0.0; + } + for( int iData = numCoeffs; iData < numData; ++iData ){ + double work = dataOrg[iSet][iData]; + for( int iAR = 0; iAR < numCoeffs; ++iAR ){ + const int index = iData - iAR - 1; + work -= coeffsAROutput[iChan][iAR] * dataOrg[iSet][index]; + } + itr->dataFile[iChan].data[iData] = work; + } + } + // Release memory + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + delete [] dataOrg[iSet]; + } + delete [] dataOrg; + } + + ifs.close(); + +} + +// Calculate robust-filtered value +void RobustPrewhitening::calculateRobustFilteredValue( const int iChan, const int numOfData, const int degreesOfAR, const double* const coeffsOfAR, + double sigma, const double* const yOrg, const double* const autoCovariance, double* yMod ) const{ + + const Control* const ptrControl = Control::getInstance(); + const Control::ParamsForRobustFilter params = ptrControl->getParamsForRobustFilter(); + + const int maxNumOfConsecutiveReplacements = params.thresholds[iChan].maxNumOfConsecutiveReplacements; + const double paramA = params.thresholds[iChan].firstThresholdFactor; + const double paramB = params.thresholds[iChan].secondThresholdFactor; + const bool doesGackToPreviousData = maxNumOfConsecutiveReplacements > 0; + + // Initial values of state vector and covariance matrix + const double median = Util::calculateMedian( degreesOfAR, yOrg ); + double* xHat = new double[degreesOfAR]; + double* xHatPre = new double[degreesOfAR]; + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + xHat[iDeg] = median; + xHatPre[iDeg] = xHat[iDeg]; + } + double* covP = new double[degreesOfAR * degreesOfAR]; + double* covPPre = new double[degreesOfAR * degreesOfAR]; + for( int i = 0; i < degreesOfAR * degreesOfAR; ++i ){ + covP[i] = autoCovariance[i]; + covPPre[i] = covP[i]; + } + + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + yMod[iDeg] = yOrg[iDeg]; + } + double* xTilde = new double[degreesOfAR]; + double* covM = new double[degreesOfAR*degreesOfAR]; + double* workVector = new double[degreesOfAR]; + int numOfConsecutiveReplacements(0); + int iDataPre = degreesOfAR - 1; + bool residualAssumedToBeZero(false); + for( int iData = degreesOfAR; iData < numOfData; ++iData ){ + // x_tilde = phi * x_hat + xTilde[0] = 0.0; + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + xTilde[0] += coeffsOfAR[iDeg] * xHat[iDeg]; + } + for( int iDeg = 1; iDeg < degreesOfAR; ++iDeg ){ + xTilde[iDeg] = xHat[iDeg-1]; + } +#ifdef _DEBUG_WRITE + std::cout << "["; + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + std::cout << coeffsOfAR[iDeg] << " "; + } + std::cout << "; "; + for( int row = 1; row < degreesOfAR; ++row ){ + for( int col = 0; col < degreesOfAR; ++col ){ + const double value = row - 1 == col ? 1.0 : 0.0; + std::cout << value << " "; + } + std::cout << "; "; + } + std::cout << "]" << std::endl; + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + std::cout << "iDeg xHat: " << iDeg << " " << xHat[iDeg] << std::endl; + } + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + std::cout << "iDeg xTilde: " << iDeg << " " << xTilde[iDeg] << std::endl; + } + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covP); +#endif + for( int col = 0; col < degreesOfAR; ++col ){ + double work(0.0); + for( int row = 0; row < degreesOfAR; ++row ){ + // P matrix is column major + const int index = col * degreesOfAR + row; + work += coeffsOfAR[row] * covP[index]; + } + workVector[col] = work; + } +#ifdef _DEBUG_WRITE + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + std::cout << "iDeg workVector: " << iDeg << " " << workVector[iDeg] << std::endl; + } +#endif + // Zero clear + for( int col = 0; col < degreesOfAR; ++col ){ + for( int row = 0; row < degreesOfAR; ++row ){ + const int index = col * degreesOfAR + row; + covM[index] = 0.0;// Zero clear + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covM); +#endif + // The (1.1) component of M_t+1 matrix + covM[0] = 0.0;// Zero clear + for( int i = 0; i < degreesOfAR; ++i ){ + covM[0] += workVector[i] * coeffsOfAR[i]; + } + if( covM[0] < 0.0 ){ + covM[0] = 0.0; // Zero clear + // Add (1.1) component of Q matrix + covM[0] += pow(sigma, 2); + }else{ + // Add (1.1) component of Q matrix + covM[0] += pow(sigma, 2); +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covM); +#endif + // The first column of M_t+1 matrix except (1.1) component + for( int row = 1; row < degreesOfAR; ++row ){ + covM[row] = workVector[row - 1]; + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covM); +#endif + // The first row of M_t+1 matrix except (1.1) component + for( int col = 1; col < degreesOfAR; ++col ){ + const int index = col * degreesOfAR; + covM[index] = workVector[col - 1]; + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covM); +#endif + // The remaing components of M_t+1 matrix + for( int col = 1; col < degreesOfAR; ++col ){ + for( int row = 1; row < degreesOfAR; ++row ){ + const int indexM = col * degreesOfAR + row; + const int indexP = (col - 1) * degreesOfAR + (row - 1); + covM[indexM] = covP[indexP]; + } + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covM); +#endif + const double mt = std::max( covM[0], 1.0e-20 ); + const double normalizedResidual = ( yOrg[iData] - xTilde[0] ) / sqrt(mt); + const double weightForStateVector = calculateWeightForStateVectorOfRobustFilter( normalizedResidual, paramA, paramB, residualAssumedToBeZero ); + for( int i = 0; i < degreesOfAR; ++i ){ + // M_t matrix is column major + xHat[i] = xTilde[i] + covM[i] / sqrt(mt) * weightForStateVector; + } + yMod[iData] = xHat[0]; + const double weightForCovariance = calculateWeightForCovarianceMatrixOfRobustFilter( normalizedResidual, paramA, paramB, false ); + // P_t = M_t - chi * m_t * m_t^T / m_t + // First, copy M_t matrx to P_t matrx + for( int col = 0; col < degreesOfAR; ++col ){ + for( int row = 0; row < degreesOfAR; ++row ){ + // Column major + const int index = col * degreesOfAR + row; + covP[index] = covM[index]; + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covP); +#endif + for( int col = 0; col < degreesOfAR; ++col ){ + for( int row = 0; row < degreesOfAR; ++row ){ + // Column major + const double work = covM[col] * covM[row] / mt * weightForCovariance; + const int index = col * degreesOfAR + row; + covP[index] -= work; + } + } +#ifdef _DEBUG_WRITE + Util::debugWriteRealMatrix(degreesOfAR, degreesOfAR, covP); +#endif + if( Util::calculateDeterminantOfMatrix( degreesOfAR, covP ) <= 0.0 ){ + for( int col = 0; col < degreesOfAR; ++col ){ + for( int row = 0; row < degreesOfAR; ++row ){ + // Column major + const int index = col * degreesOfAR + row; + covP[index] = 0.0; + } + } + } + // Check the number of consecutive replacements + if( !residualAssumedToBeZero && fabs(yMod[iData] - yOrg[iData]) / std::max(fabs(yOrg[iData]), CommonParameters::EPS) > 1.0e-3 ){ +#ifdef _DEBUG_WRITE + std::cout << "org mod: " << yOrg[iData] << " " << yMod[iData] << std::endl; +#endif + ++numOfConsecutiveReplacements; + }else{ + numOfConsecutiveReplacements = 0; + iDataPre = iData; + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + xHatPre[iDeg] = xHat[iDeg]; + } + for( int i = 0; i < degreesOfAR * degreesOfAR; ++i ){ + covPPre[i] = covP[i]; + } + } + residualAssumedToBeZero = false; + if( doesGackToPreviousData && numOfConsecutiveReplacements >= maxNumOfConsecutiveReplacements ){ + // Restore state vector and covariance matrix + for( int iDeg = 0; iDeg < degreesOfAR; ++iDeg ){ + xHat[iDeg] = xHatPre[iDeg]; + } + for( int i = 0; i < degreesOfAR * degreesOfAR; ++i ){ + covP[i] = covPPre[i]; + } + numOfConsecutiveReplacements = 0; + residualAssumedToBeZero = true; + iData = iDataPre; + // Go back to previous data + } + } + + delete [] xHat; + delete [] xHatPre; + delete [] xTilde; + delete [] covP; + delete [] covPPre; + delete [] covM; + delete [] workVector; + +} + +// Calculate robust auto-covariance matrix +void RobustPrewhitening::calculateRobustAutoCovarianceMatrix( const int degreesOfAR, const int numOfDataSets, + const int* const numOfData, double** data, DoubleDenseSquareSymmetricMatrix& covarianceMatrix ) const{ + + const Control* const ptrControl = Control::getInstance(); + const Control::ParamsForRobustAutoCovariance params = ptrControl->getParamsForRobustAutoCovariance(); + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + int numOfDataAll = 0; + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + numOfDataAll += numOfData[iSet]; + } + + const int numOfSamples = numOfDataAll - degreesOfAR * numOfDataSets; + covarianceMatrix.setDegreeOfEquation(degreesOfAR + 1); + + // Add to matrix + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + const int numData = numOfData[iSet]; + for( int iData = degreesOfAR; iData < numData; ++iData ){ + for( int iDiff = 0; iDiff < degreesOfAR + 1; ++iDiff ){ + const double value = data[iSet][iData] * data[iSet][iData - iDiff]; + for( int iCol = 0; iCol < degreesOfAR + 1; ++iCol ){ + const int iRow = iCol + iDiff; + if( iRow < degreesOfAR + 1 ){ + covarianceMatrix.addValue(iRow, iCol, value); + } + } + } + } + } +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif + // Add small number to the diagonals for making the matrix positive-definite + for( int iCol = 0; iCol < degreesOfAR + 1; ++iCol ){ + const double value = covarianceMatrix.getValue(iCol, iCol) * params.percentageOfSmallNumberAddedToDiagonals / 100.0; + covarianceMatrix.addValue(iCol, iCol, value); + } + covarianceMatrix.multiplyScalarToMatrix( 1.0/static_cast(numOfSamples) ); +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif + + const double determinant = covarianceMatrix.calculateDeterminant(); + // Force det(C) to 1 + covarianceMatrix.multiplyScalarToMatrix( pow(1.0/fabs(determinant), 1.0/static_cast(degreesOfAR+1)) ); + +#ifdef _DEBUG_WRITE + std::cout << "det: " << covarianceMatrix.calculateDeterminant() << std::endl; + covarianceMatrix.debugWriteMatrix(); +#endif + + double paramB(0.0); + double paramC(0.0); + RobustWeightTukeysBiweights::calculateParams(degreesOfAR + 1, numOfSamples, paramB, paramC); + + double* MD = new double[numOfSamples]; + calculateMD(degreesOfAR, numOfDataSets, numOfData, data, covarianceMatrix, MD); + // Initial estimation of scale + double scale = Util::calculateMedian(numOfSamples, MD); + scale = RobustWeightTukeysBiweights::calculateRobustScale(numOfSamples, MD, scale, paramB, paramC); +#ifdef _DEBUG_WRITE + std::cout << "scale: " << scale << std::endl; +#endif + ptrOutputFiles->writeCvgMessage("Number of data = " + Util::toString(numOfSamples) + + ", Initial scale = " + Util::toString(scale) + ", Determinant = " + Util::toString(determinant)); + + double scalePre = scale; + for( int iter = 0; iter < params.maxNumOfIterations; ++iter ){ + covarianceMatrix.zeroClearMatrix(); +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif + // Add to matrix + double sumOfWeights(0.0); + double denominator(0.0); + int icount(0); + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + const int numData = numOfData[iSet]; + for( int iData = degreesOfAR; iData < numData; ++iData ){ + const double weight = RobustWeightTukeysBiweights::calculateWeights(MD[icount] / scale, paramC); + for( int iDiff = 0; iDiff < degreesOfAR + 1; ++iDiff ){ + const double value = data[iSet][iData] * data[iSet][iData - iDiff] * weight; + for( int iCol = 0; iCol < degreesOfAR + 1; ++iCol ){ + const int iRow = iCol + iDiff; + if( iRow < degreesOfAR + 1 ){ + covarianceMatrix.addValue(iRow, iCol, value); + } + } + } + sumOfWeights += weight; + denominator += RobustWeightTukeysBiweights::calculateTermInDenominatorOfRobustCovariance(MD[icount] / scale, paramC); + ++icount; + } + } + // Add small number to the diagonals for making the matrix positive-definite + for( int iCol = 0; iCol < degreesOfAR + 1; ++iCol ){ + const double value = covarianceMatrix.getValue(iCol, iCol) * params.percentageOfSmallNumberAddedToDiagonals / 100.0; + covarianceMatrix.addValue(iCol, iCol, value); + } + if( denominator < CommonParameters::EPS ){ + ptrOutputFiles->writeWarningMessage("Denominator of robust covariance is too small (" + Util::toString(denominator) + ")"); + } + const double factor = static_cast(degreesOfAR + 1) / std::max(denominator, CommonParameters::EPS); + //covarianceMatrix.multiplyScalarToMatrix( 1.0/sumOfWeights ); + covarianceMatrix.multiplyScalarToMatrix(factor); +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif + const double determinant = covarianceMatrix.calculateDeterminant(); + // Force det(C) to 1 + covarianceMatrix.multiplyScalarToMatrix( pow(1.0/fabs(determinant), 1.0/static_cast(degreesOfAR+1)) ); +#ifdef _DEBUG_WRITE + std::cout << "det: " << covarianceMatrix.calculateDeterminant() << std::endl; + covarianceMatrix.debugWriteMatrix(); +#endif + calculateMD(degreesOfAR, numOfDataSets, numOfData, data, covarianceMatrix, MD); + scale = RobustWeightTukeysBiweights::calculateRobustScale(numOfSamples, MD, scale, paramB, paramC); + ptrOutputFiles->writeCvgMessage("Iteration number = " + Util::toString(iter) + ", Sum of weights = " + Util::toString(sumOfWeights) + + ", Scale = " + Util::toString(scale) + ", Determinant = " + Util::toString(determinant)); + if( fabs(scale-scalePre)/fabs(scalePre) < params.convergenceCriteria ){ + break; + } + scalePre = scale; + } + + covarianceMatrix.multiplyScalarToMatrix( pow(scale,2) ); +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif + + delete [] MD; + +} + +// Calculate Mahalanobis distances +// @note covariance matrix is factorized in this function +void RobustPrewhitening::calculateMD( const int degreesOfAR, const int numOfDataSets, const int* const numOfData, double** data, + DoubleDenseSquareSymmetricMatrix& covarianceMatrix, double* MD ) const{ + + double* residualVector = new double[degreesOfAR + 1]; + double* workVector = new double[degreesOfAR + 1]; + covarianceMatrix.factorizeMatrix(); +#ifdef _DEBUG_WRITE + covarianceMatrix.debugWriteMatrix(); +#endif + + int icount(0); + for( int iSet = 0; iSet < numOfDataSets; ++iSet ){ + const int numData = numOfData[iSet]; + for( int iData = degreesOfAR; iData < numData; ++iData ){ + for( int iDiff = 0; iDiff < degreesOfAR + 1; ++iDiff ){ + residualVector[iDiff] = data[iSet][iData - iDiff]; + } + covarianceMatrix.solveLinearEquation(residualVector, workVector); + double mahalanobisDistances(0.0); + for( int iDiff = 0; iDiff < degreesOfAR + 1; ++iDiff ){ + mahalanobisDistances += residualVector[iDiff] * workVector[iDiff]; + } + MD[icount] = sqrt(fabs(mahalanobisDistances)); +//#ifdef _DEBUG_WRITE +// for( int iDiff = 0; iDiff < degreesOfAR + 1; ++iDiff ){ +// std::cout << "residualVector:" << residualVector[iDiff] << std::endl; +// } +// for( int iDiff = 0; iDiff < degreesOfAR + 1; ++iDiff ){ +// std::cout << "workVector:" << workVector[iDiff] << std::endl; +// } +// std::cout << "mahalanobisDistances:" << mahalanobisDistances << std::endl; +//#endif + ++icount; + } + } + + delete [] residualVector; + delete [] workVector; + +} + +// Calculate weight for state vector in robust filter +double RobustPrewhitening::calculateWeightForStateVectorOfRobustFilter( const double val, const double paramA, const double paramB, const bool residualAssumedToBeZero ) const{ + + assert( paramA < paramB ); + + if( residualAssumedToBeZero || fabs(val) <= paramA ){ + return val; + } + else if( val > paramA && val <= paramB ){ + return paramA * (paramB - val) / (paramB - paramA); + } + else if( val >= -paramB && val < -paramA ){ + return - paramA * (paramB + val) / (paramB - paramA); + } + else{ + return 0.0; + } + +} + +// Calculate weight for covariance matrix in robust filter +double RobustPrewhitening::calculateWeightForCovarianceMatrixOfRobustFilter( const double val, const double paramA, const double paramB, const bool residualAssumedToBeZero ) const{ + + assert( paramA < paramB ); + + if( residualAssumedToBeZero || fabs(val) <= paramA ){ + return 1.0; + } + else if( val > paramA && val <= paramB ){ + return paramA * (paramB / val - 1.0) / (paramB - paramA); + } + else if( val >= -paramB && val < -paramA ){ + return - paramA * (paramB / val + 1.0) / (paramB - paramA); + } + else{ + return 0.0; + } + +} diff --git a/src/RobustPrewhitening.h b/src/RobustPrewhitening.h new file mode 100644 index 0000000..f7c43d6 --- /dev/null +++ b/src/RobustPrewhitening.h @@ -0,0 +1,88 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ROBUST_PREWHITENING +#define DBLDEF_ROBUST_PREWHITENING + +#include "CommonParameters.h" +#include "DoubleDenseSquareSymmetricPositiveDefiniteMatrix.h" + +#include + +// Class of robust prewhitening +class RobustPrewhitening{ + +public: + + // Default constructer + RobustPrewhitening(); + + // Destructer + ~RobustPrewhitening(); + + // Return the the instance of the class + static RobustPrewhitening* getInstance(); + + // Perform robust prewhitening + void robustPrewhitening( std::vector& dataFileSets, std::vector* coeffsAROutput ) const; + + // Perform prewhitening using user-defined AR coefficients + void prewhiteningUsingUserDefinedARCoeffs( std::vector& dataFileSets, std::vector* coeffsAROutput ) const; + +private: + + // Copy constructer + RobustPrewhitening(const RobustPrewhitening& rhs); + + // Assignment operator + RobustPrewhitening& operator=(const RobustPrewhitening& rhs); + + // Calculate robust-filtered value + void calculateRobustFilteredValue( const int iChan, const int numOfData, const int degreesOfAR, const double* const coeffsOfAR, + const double sigma, const double* const yOrg, const double* const autoCovariance, double* yMod ) const; + + // Calculate robust auto-covariance matrix + void calculateRobustAutoCovarianceMatrix( const int degreesOfAR, const int numOfDataSets, const int* const numOfData, + double** data, DoubleDenseSquareSymmetricMatrix& covarianceMatrix ) const; + + // Calculate Mahalanobis distances + // @note covariance matrix is factorized in this function + //void calculateMD( const int degreesOfAR, const int numOfDataAll, const double* const dataAll, + // DoubleDenseSquareSymmetricMatrix& covarianceMatrix, double* residualVector, double* MD ) const; + void calculateMD( const int degreesOfAR, const int numOfDataSets, const int* const numOfData, double** data, + DoubleDenseSquareSymmetricMatrix& covarianceMatrix, double* MD ) const; + + // Calculate weight for state vector in robust filter + double calculateWeightForStateVectorOfRobustFilter( const double val, const double paramA, const double paramB, const bool residualAssumedToBeZero ) const; + + // Calculate weight for covariance matrix in robust filter + double calculateWeightForCovarianceMatrixOfRobustFilter( const double val, const double paramA, const double paramB, const bool residualAssumedToBeZero ) const; +}; + + +#endif diff --git a/src/RobustWeight.cpp b/src/RobustWeight.cpp new file mode 100644 index 0000000..3fabe1e --- /dev/null +++ b/src/RobustWeight.cpp @@ -0,0 +1,93 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "RobustWeight.h" +#include "OutputFiles.h" +#include "Util.h" + +// Default constructer +RobustWeight::RobustWeight(): + m_convergenceCriteria(0.01), + m_name("no name"), + m_numIterationMax(10) +{ +} + +// Destructer +RobustWeight::~RobustWeight() +{ +} + +// Get convergence criteria +double RobustWeight::getConvergenceCriteria() const{ + return m_convergenceCriteria; +} + +// Get name of M-estimator +std::string RobustWeight::getNameOfRobustWeight() const{ + return m_name; +} + +// Get maximum number of iteration +int RobustWeight::getNumIterationMax() const{ + return m_numIterationMax; +} + +// Set convergence criteria +void RobustWeight::setConvergenceCriteria( const double criteria ){ + m_convergenceCriteria = criteria; +} + +// Set name of M-estimator +void RobustWeight::setNameOfRobustWeight( const std::string& name ){ + m_name = name; +} + +// Set maximum number of iteration +void RobustWeight::setNumIterationMax( const int numIterMax ){ + m_numIterationMax = numIterMax; +} + +// Calculate scale of absolute values of complex residuals by MADN +double RobustWeight::calculateScaleByMADN(const int numSegments, const std::complex* const residuals) { + + std::vector absoluteResiduals; + for( int iSeg = 0; iSeg < numSegments; ++iSeg ){ + absoluteResiduals.push_back(std::abs(residuals[iSeg])); + } + + const double sigmaMAD = Util::calculateMAD(absoluteResiduals); + + return sigmaMAD / 0.448453; + +} + +// Calculate scale of absolute values of complex residuals +double RobustWeight::calculateScale(const int numSegments, const std::complex* const residuals, const double scalePre) const{ + return calculateScaleByMADN(numSegments, residuals); +} diff --git a/src/RobustWeight.h b/src/RobustWeight.h new file mode 100644 index 0000000..37a30c9 --- /dev/null +++ b/src/RobustWeight.h @@ -0,0 +1,91 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ROBUST_WEIGHT +#define DBLDEF_ROBUST_WEIGHT + +#include "CommonParameters.h" +#include + +// Class of Robust estimator +class RobustWeight{ + +public: + + // Default constructer + RobustWeight(); + + // Destructer + virtual ~RobustWeight(); + + // Calculate sum of the second order derivative of loss function + virtual double calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const = 0; + + // Calculate scale of absolute values of complex residuals by MADN + static double calculateScaleByMADN(const int numSegments, const std::complex* const residuals); + + // Calculate scale of absolute values of complex residuals + virtual double calculateScale(const int numSegments, const std::complex* const residuals, const double scalePre) const; + + // Calculate weights + virtual double calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, const double* const weightsPrior, + double* weights) const = 0; + + // Get convergence criteria + double getConvergenceCriteria() const; + + // Get name of M-estimator + std::string getNameOfRobustWeight() const; + + // Get maximum number of iteration + int getNumIterationMax() const; + + // Set convergence criteria + void setConvergenceCriteria( const double criteria ); + + // Set name of M-estimator + void setNameOfRobustWeight( const std::string& name ); + + // Set maximum number of iteration + void setNumIterationMax( const int numIterMax ); + +protected: + +private: + // Convergence criteria + double m_convergenceCriteria; + + // Name of M-estimator + std::string m_name; + + // Maximum number of iteration + int m_numIterationMax; + +}; + +#endif diff --git a/src/RobustWeightHuber.cpp b/src/RobustWeightHuber.cpp new file mode 100644 index 0000000..f21204c --- /dev/null +++ b/src/RobustWeightHuber.cpp @@ -0,0 +1,106 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "RobustWeightHuber.h" +#include "OutputFiles.h" +#include "Util.h" + +#include + +// Default constructer +RobustWeightHuber::RobustWeightHuber(): + m_threshould(3.0) +{ + setNameOfRobustWeight("Huber"); +} + +//// Copy constructer +//RobustWeightHuber::RobustWeightHuber(const RobustWeightHuber& obj){ +// m_threshould = obj.m_threshould; +//} + +// Destructer +RobustWeightHuber::~RobustWeightHuber() +{ +} + +// Calculate sum of the second order derivative of loss function +double RobustWeightHuber::calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const { + + const double threshould = getThreshould(); + double sumOfDerivatives(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + const double x = std::abs(residuals[iSeg]) / scale; + if (x <= threshould) { + sumOfDerivatives += 1.0; + } + } + return sumOfDerivatives; + +} + +// Calculate weights +double RobustWeightHuber::calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, + const double* const weightsPrior, double* weights) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage(" Scale factor: " + Util::toString(scale)); +#ifdef _DEBUG_WRITE + std::cout << "scaleFactor: " << scale << std::endl; +#endif + const double threshould = getThreshould(); + double sumOfWeights(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + weights[iSeg] = weightsPrior[iSeg]; + const double x = std::abs(residuals[iSeg]) / scale; + if (x <= threshould) { + // Huber weight is unity + } + else { + weights[iSeg] *= threshould / x; + } + sumOfWeights += weights[iSeg]; +#ifdef _DEBUG_WRITE + std::cout << "iSeg absres x weightsPrior weights: " + << iSeg << " " << std::abs(residuals[iSeg]) << " " << x << " " << weightsPrior[iSeg] << " " << weights[iSeg] << std::endl; +#endif + } + + return sumOfWeights; + +} + +// Get threshould value for downweighting +double RobustWeightHuber::getThreshould() const{ + return m_threshould; +} + +// Set threshould value for downweighting +void RobustWeightHuber::setThreshould( const double threshould ){ + m_threshould = threshould; +} diff --git a/src/RobustWeightHuber.h b/src/RobustWeightHuber.h new file mode 100644 index 0000000..71e3b08 --- /dev/null +++ b/src/RobustWeightHuber.h @@ -0,0 +1,69 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ROBUST_WEIGHT_HUBER +#define DBLDEF_ROBUST_WEIGHT_HUBER + +#include "RobustWeight.h" +#include "CommonParameters.h" +#include + +// Class of M-estimator using Huber weights +class RobustWeightHuber : public RobustWeight{ + +public: + + // Default constructer + RobustWeightHuber(); + + // Destructer + virtual ~RobustWeightHuber(); + + // Calculate sum of the second order derivative of loss function + virtual double calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const; + + // Calculate weights + virtual double calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, const double* const weightsPrior, + double* weights) const; + + // Get threshould value for downweighting + double getThreshould() const; + + // Set threshould value for downweighting + void setThreshould( const double threshould ); + +protected: + +private: + + // Threshould value for downweighting + double m_threshould; + +}; + +#endif diff --git a/src/RobustWeightThomson.cpp b/src/RobustWeightThomson.cpp new file mode 100644 index 0000000..e47994b --- /dev/null +++ b/src/RobustWeightThomson.cpp @@ -0,0 +1,98 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "RobustWeightThomson.h" +#include "OutputFiles.h" +#include "Util.h" + +#include + +// Default constructer +RobustWeightThomson::RobustWeightThomson(): + m_parameterForDetermingProbability(0.0) +{ + setNameOfRobustWeight("Thomson"); +} + +// Destructer +RobustWeightThomson::~RobustWeightThomson() +{ +} + +// Calculate sum of the second order derivative of loss function +double RobustWeightThomson::calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Parametric error estimation cannot be used for Thomson weight"); + return -1; + +} + +// Calculate weights +double RobustWeightThomson::calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, + const double* const weightsPrior, double* weights) const { + + const double param = getParameterForDetermingProbability(); + double probability = (static_cast(numSegments) - param - 0.5) / static_cast(numSegments); + if (param < 0.0 - CommonParameters::EPS) { + probability = -param; + } + const double Q = sqrt(-2.0 * log(1.0 - probability)); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage(" Probability for determining the point at which downweighting starts: " + Util::toString(probability)); + ptrOutputFiles->writeCvgMessage(" Scale factor: " + Util::toString(scale)); +#ifdef _DEBUG_WRITE + std::cout << "probability: " << probability << std::endl; + std::cout << "Q: " << Q << std::endl; + std::cout << "scaleFactor: " << scale << std::endl; +#endif + double sumOfWeights(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + weights[iSeg] = weightsPrior[iSeg]; + const double x = std::abs(residuals[iSeg]) / scale; + weights[iSeg] *= exp(exp(-Q * Q)) * exp(-exp(Q * (fabs(x) - Q))); + sumOfWeights += weights[iSeg]; +#ifdef _DEBUG_WRITE + std::cout << "iSeg absres x weightsPrior weights: " + << iSeg << " " << std::abs(residuals[iSeg]) << " " << x << " " << weightsPrior[iSeg] << " " << weights[iSeg] << std::endl; +#endif + } + + return sumOfWeights; + +} + +// Get parameter for determing the probability used for outlier rejection +double RobustWeightThomson::getParameterForDetermingProbability() const{ + return m_parameterForDetermingProbability; +} + +// Set parameter for determing the probability used for outlier rejection +void RobustWeightThomson::setParameterForDetermingProbability( const double prob ){ + m_parameterForDetermingProbability = prob; +} diff --git a/src/RobustWeightThomson.h b/src/RobustWeightThomson.h new file mode 100644 index 0000000..be98767 --- /dev/null +++ b/src/RobustWeightThomson.h @@ -0,0 +1,69 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ROBUST_WEIGHT_THOMSON +#define DBLDEF_ROBUST_WEIGHT_THOMSON + +#include "RobustWeight.h" +#include "CommonParameters.h" +#include + +// Class of M-estimator using Thomson weights +class RobustWeightThomson : public RobustWeight{ + +public: + + // Default constructer + RobustWeightThomson(); + + // Destructer + virtual ~RobustWeightThomson(); + + // Calculate sum of the second order derivative of loss function + virtual double calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const; + + // Calculate weights + virtual double calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, const double* const weightsPrior, + double* weights) const; + + // Get parameter for determing the probability used for outlier rejection + double getParameterForDetermingProbability() const; + + // Set parameter for determing the probability used for outlier rejection + void setParameterForDetermingProbability( const double prob ); + +protected: + +private: + + // Parameter for determing the probability used for outlier rejection + double m_parameterForDetermingProbability; + +}; + +#endif diff --git a/src/RobustWeightTukeysBiweights.cpp b/src/RobustWeightTukeysBiweights.cpp new file mode 100644 index 0000000..79d8939 --- /dev/null +++ b/src/RobustWeightTukeysBiweights.cpp @@ -0,0 +1,282 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "RobustWeightTukeysBiweights.h" +#include "OutputFiles.h" +#include "Util.h" +#include "TableOfTukeysBiweightParameters.h" + +#include + +// Default constructer +RobustWeightTukeysBiweights::RobustWeightTukeysBiweights(): + m_degreesOfFreedom(2) +{ + setNameOfRobustWeight("Tukey's biweights"); +} + +// Calculate sum of the second order derivative of loss function +double RobustWeightTukeysBiweights::calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const { + + double paramB(0.0); + double paramC(0.0); + calculateParams(getDegreesOfFreedom(), numSegments, paramB, paramC); + + double sumOfDerivatives(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg){ + const double x = std::abs(residuals[iSeg]) / scale; + sumOfDerivatives += calculateSecondDerivativeOfLossFunction(x, paramC); + } + return sumOfDerivatives; + +} + +// Calculate weights +double RobustWeightTukeysBiweights::calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, + const double* const weightsPrior, double* weights) const { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeCvgMessage(" Scale factor: " + Util::toString(scale)); + double paramB(0.0); + double paramC(0.0); + calculateParams(getDegreesOfFreedom(), numSegments, paramB, paramC); + ptrOutputFiles->writeCvgMessage(" Parameter c: " + Util::toString(paramC)); + double sumOfWeights(0.0); + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + weights[iSeg] = weightsPrior[iSeg]; + const double x = std::abs(residuals[iSeg]) / scale; + weights[iSeg] *= calculateWeights(x, paramC); + sumOfWeights += weights[iSeg]; + } + + return sumOfWeights; + +} +// Destructer +RobustWeightTukeysBiweights::~RobustWeightTukeysBiweights() +{ +} + +// Calculate scale of absolute values of complex residuals +double RobustWeightTukeysBiweights::calculateScale(const int numSegments, const std::complex* const residuals, const double scalePre) const { + + double paramB(0.0); + double paramC(0.0); + calculateParams(getDegreesOfFreedom(), numSegments, paramB, paramC); + + double* realResiduals = new double[numSegments]; + for (int iSeg = 0; iSeg < numSegments; ++iSeg) { + realResiduals[iSeg] = std::abs(residuals[iSeg]); + } + const double scaleNew = calculateRobustScale(numSegments, realResiduals, scalePre, paramB, paramC); + delete[] realResiduals; + + return scaleNew; + +} + +// Get degrees of freedom +int RobustWeightTukeysBiweights::getDegreesOfFreedom() const{ + return m_degreesOfFreedom; +} + +// Set degrees of freedom +void RobustWeightTukeysBiweights::setDegreesOfFreedom( const int dof ){ + m_degreesOfFreedom = dof; +} + +// Calculate derivative of the loss function of Tukey's biweights +double RobustWeightTukeysBiweights::calculateDerivativeOfLossFunction(const double val, const double c) { + + assert(c > 0.0); + if (fabs(val) > c) { + return 0.0; + } + else { + const double temp = 1.0 - pow(val / c, 2); + return val * pow(temp, 2); + } + +} + +// Calculate loss function of Tukey's biweight function +double RobustWeightTukeysBiweights::calculateLossFunction(const double val, const double c) { + + assert(c > 0.0); + if (fabs(val) > c) { + // c^2 / 6 + return pow(c, 2) / 6; + } + else { + // x^2 / 2 - x^4 / c^2 / 2 + x^6 / c^4 / 6 + return pow(val, 2) / 2.0 - pow(val, 4) / pow(c, 2) / 2.0 + pow(val, 6) / pow(c, 4) / 6.0; + } + +} + +// Calculate expectation of Tukey's biweight function +double RobustWeightTukeysBiweights::calculateExpectation(const int dimension, const double c) { + + assert(dimension > 0); + + double* arguments = new double[dimension]; + double* factors = new double[dimension]; + double sum(0.0); + calculateExpectationAux(dimension, c, 0, arguments, factors, sum); + delete[] arguments; + delete[] factors; + return sum / pow(sqrt(2.0 * CommonParameters::PI), dimension); + +} + +// Auxiliary function for calculating the expectation of Tukey's biweight function +void RobustWeightTukeysBiweights::calculateExpectationAux(const int dimension, const double c, const int idim, + double* arguments, double* factors, double& sum) { + + const double lowerLimit = -5.0; + const double upperLimit = 5.0; + const int numInterval = 20; + const double interval = (upperLimit - lowerLimit) / static_cast(numInterval); + for (int iInterval = 0; iInterval < numInterval + 1; ++iInterval) { + arguments[idim] = lowerLimit + static_cast(iInterval) * interval; + if (iInterval == 0 || iInterval == numInterval) { + factors[idim] = 0.5 * interval; + } + else { + factors[idim] = interval; + } + if (idim == dimension - 1) { + double squareSumOfArguments(0.0); + for (int i = 0; i < dimension; ++i) { + squareSumOfArguments += pow(arguments[i], 2); + } + double temp = calculateLossFunction(sqrt(squareSumOfArguments), c) * exp(-0.5 * squareSumOfArguments); + for (int i = 0; i < dimension; ++i) { + temp *= factors[i]; + } + sum += temp; + } + else { + // Go to next inner loop + calculateExpectationAux(dimension, c, idim + 1, arguments, factors, sum); + } + } + +} + +// Calculate parameters of Tukey's biweight function +void RobustWeightTukeysBiweights::calculateParams(const int dimension, const int numOfData, double& paramB, double& paramC) { + + assert(dimension > 0); + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + if (dimension > TableOfTukeysBiweightParameters::numDimensions) { + ptrOutputFiles->writeErrorMessage("Number of dimensions for Tukey's biweight function exceeds the upper limit (" + + Util::toString(TableOfTukeysBiweightParameters::numDimensions) + ")"); + } + + const int idim = dimension - 1; + + const double rhs = 0.5 * (1.0 - static_cast(dimension) / static_cast(numOfData));// (n-p)/2n + for (int ic = 1; ic < TableOfTukeysBiweightParameters::numOfParamCs; ++ic) { + const double c0 = TableOfTukeysBiweightParameters::paramCsOfTukeyBiweight[ic - 1]; + const double b0 = TableOfTukeysBiweightParameters::paramBsOfTukeyBiweight[idim][ic - 1]; + const double lhs0 = ic == 1 ? 1.0 : 6.0 * b0 / pow(c0, 2);// b / (c^2/6) + const double diff0 = lhs0 - rhs; + const double c1 = TableOfTukeysBiweightParameters::paramCsOfTukeyBiweight[ic]; + const double b1 = TableOfTukeysBiweightParameters::paramBsOfTukeyBiweight[idim][ic]; + const double lhs1 = 6.0 * b1 / pow(c1, 2);// b / (c^2/6) + const double diff1 = lhs1 - rhs; + // lhs monotonically decreases + if (diff0 >= 0.0 && diff1 <= 0.0) { + const double weight = fabs(diff0) / fabs(lhs1 - lhs0); + paramC = (1.0 - weight) * c0 + weight * c1; + paramB = (1.0 - weight) * b0 + weight * b1; + return; + } + } + + ptrOutputFiles->writeErrorMessage("Parameters of Tukey's biweight function was not able to be determined"); + +} + +// Calculate robust scale with Tukey's biweights +double RobustWeightTukeysBiweights::calculateRobustScale(const int numOfData, const double* residuals, const double scalePre, + const double paramb, const double paramc) { + + double squareScale(0.0); + for (int iData = 0; iData < numOfData; ++iData) { + const double val = residuals[iData] / scalePre; + if (fabs(val) < CommonParameters::EPS) { + // rho''(0) / 2 = 1 / 2 + squareScale += 0.5 * pow(residuals[iData], 2); + } + else { + squareScale += calculateLossFunction(val, paramc) * pow(scalePre, 2); + } + } + squareScale /= static_cast(numOfData); + squareScale /= paramb; + return sqrt(squareScale); + +} + +// Calculate second order derivative of the loss function of Tukey's biweights +double RobustWeightTukeysBiweights::calculateSecondDerivativeOfLossFunction(const double val, const double c) { + + assert(c > 0.0); + if (fabs(val) > c) { + return 0.0; + } + else { + // 1 - 6 * x^2 / c^2 + 5 * x^4 / c^4 + return 1.0 - 6.0 * pow(val / c, 2) + 5.0 * pow(val / c, 4); + } + +} + +// Calculate the term in the denominator of robust covariance matrix using Tukey's biweights +double RobustWeightTukeysBiweights::calculateTermInDenominatorOfRobustCovariance(const double val, const double c) { + + return calculateWeights(val, c) * pow(val, 2); + +} + +// Calculate Tukey's biweights +double RobustWeightTukeysBiweights::calculateWeights(const double val, const double c) { + + assert(c > 0.0); + if (fabs(val) > c) { + return 0.0; + } + else { + // 1 - 2 * x^2 / c^2 + x^4 / c^4 + return 1.0 - 2.0 * pow(val / c, 2) + pow(val / c, 4); + } + +} \ No newline at end of file diff --git a/src/RobustWeightTukeysBiweights.h b/src/RobustWeightTukeysBiweights.h new file mode 100644 index 0000000..02f193d --- /dev/null +++ b/src/RobustWeightTukeysBiweights.h @@ -0,0 +1,101 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_ROBUST_TUKEYS_BIWEIGHTS +#define DBLDEF_ROBUST_TUKEYS_BIWEIGHTS + +#include "RobustWeight.h" +#include "CommonParameters.h" +#include + +// Class of M-estimator using Tukey's biweights +class RobustWeightTukeysBiweights : public RobustWeight{ + +public: + + // Default constructer + RobustWeightTukeysBiweights(); + + // Destructer + virtual ~RobustWeightTukeysBiweights(); + + // Calculate sum of the second order derivative of loss function + virtual double calculateSumOf2ndOrderDerivativeOfLossFunction(const int numSegments, const std::complex* const residuals, const double scale) const; + + // Calculate weights + virtual double calculateWeights(const int numSegments, const std::complex* const residuals, const double scale, const double* const weightsPrior, + double* weights) const; + + // Calculate scale of absolute values of complex residuals + virtual double calculateScale(const int numSegments, const std::complex* const residuals, const double scalePre) const; + + // Get degrees of freedom + int getDegreesOfFreedom() const; + + // Set degrees of freedom + void setDegreesOfFreedom( const int dof ); + + // Calculate derivative of the loss function of Tukey's biweights + static double calculateDerivativeOfLossFunction(const double val, const double c); + + // Calculate the expectation of Tukey's biweight function + static double calculateExpectation(const int dimension, const double c); + + // Auxiliary function for calculating the expectation of Tukey's biweight function + static void calculateExpectationAux(const int dimension, const double c, const int idim, + double* arguments, double* factors, double& sum); + + // Calculate loss function of Tukey's biweight function + static double calculateLossFunction(const double val, const double c); + + // Calculate parameters of Tukey's biweight function + static void calculateParams(const int dimension, const int numOfData, double& paramB, double& paramC); + + // Calculate robust scale with Tukey's biweights + static double calculateRobustScale(const int numOfData, const double* residuals, const double scalePre, + const double paramb, const double paramc); + + // Calculate second order derivative of the loss function of Tukey's biweights + static double calculateSecondDerivativeOfLossFunction(const double val, const double c); + + // Calculate the term in the denominator of robust covariance matrix using Tukey's biweights + static double calculateTermInDenominatorOfRobustCovariance(const double val, const double c); + + // Calculate Tukey's biweights + static double calculateWeights(const double val, const double c); + +protected: + +private: + + // Degrees of freedom + int m_degreesOfFreedom; + +}; + +#endif diff --git a/src/TableOfTukeysBiweightParameters.h b/src/TableOfTukeysBiweightParameters.h new file mode 100644 index 0000000..b568686 --- /dev/null +++ b/src/TableOfTukeysBiweightParameters.h @@ -0,0 +1,102354 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_TABLE_OF_TUKEYS_BIWEIGHT_PARAMETERS +#define DBLDEF_TABLE_OF_TUKEYS_BIWEIGHT_PARAMETERS + +namespace TableOfTukeysBiweightParameters +{ + // Number of dimension + static int numDimensions = 101; + + // Number of parameter c's + static int numOfParamCs = 1001; + + // Table of the parameter c's of Tukey's biweight function + static const double paramCsOfTukeyBiweight[1001] = { + 0.0, + 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, + 64.9, + 65.0, + 65.1, + 65.2, + 65.3, + 65.4, + 65.5, + 65.6, + 65.7, + 65.8, + 65.9, + 66.0, + 66.1, + 66.2, + 66.3, + 66.4, + 66.5, + 66.6, + 66.7, + 66.8, + 66.9, + 67.0, + 67.1, + 67.2, + 67.3, + 67.4, + 67.5, + 67.6, + 67.7, + 67.8, + 67.9, + 68.0, + 68.1, + 68.2, + 68.3, + 68.4, + 68.5, + 68.6, + 68.7, + 68.8, + 68.9, + 69.0, + 69.1, + 69.2, + 69.3, + 69.4, + 69.5, + 69.6, + 69.7, + 69.8, + 69.9, + 70.0, + 70.1, + 70.2, + 70.3, + 70.4, + 70.5, + 70.6, + 70.7, + 70.8, + 70.9, + 71.0, + 71.1, + 71.2, + 71.3, + 71.4, + 71.5, + 71.6, + 71.7, + 71.8, + 71.9, + 72.0, + 72.1, + 72.2, + 72.3, + 72.4, + 72.5, + 72.6, + 72.7, + 72.8, + 72.9, + 73.0, + 73.1, + 73.2, + 73.3, + 73.4, + 73.5, + 73.6, + 73.7, + 73.8, + 73.9, + 74.0, + 74.1, + 74.2, + 74.3, + 74.4, + 74.5, + 74.6, + 74.7, + 74.8, + 74.9, + 75.0, + 75.1, + 75.2, + 75.3, + 75.4, + 75.5, + 75.6, + 75.7, + 75.8, + 75.9, + 76.0, + 76.1, + 76.2, + 76.3, + 76.4, + 76.5, + 76.6, + 76.7, + 76.8, + 76.9, + 77.0, + 77.1, + 77.2, + 77.3, + 77.4, + 77.5, + 77.6, + 77.7, + 77.8, + 77.9, + 78.0, + 78.1, + 78.2, + 78.3, + 78.4, + 78.5, + 78.6, + 78.7, + 78.8, + 78.9, + 79.0, + 79.1, + 79.2, + 79.3, + 79.4, + 79.5, + 79.6, + 79.7, + 79.8, + 79.9, + 80.0, + 80.1, + 80.2, + 80.3, + 80.4, + 80.5, + 80.6, + 80.7, + 80.8, + 80.9, + 81.0, + 81.1, + 81.2, + 81.3, + 81.4, + 81.5, + 81.6, + 81.7, + 81.8, + 81.9, + 82.0, + 82.1, + 82.2, + 82.3, + 82.4, + 82.5, + 82.6, + 82.7, + 82.8, + 82.9, + 83.0, + 83.1, + 83.2, + 83.3, + 83.4, + 83.5, + 83.6, + 83.7, + 83.8, + 83.9, + 84.0, + 84.1, + 84.2, + 84.3, + 84.4, + 84.5, + 84.6, + 84.7, + 84.8, + 84.9, + 85.0, + 85.1, + 85.2, + 85.3, + 85.4, + 85.5, + 85.6, + 85.7, + 85.8, + 85.9, + 86.0, + 86.1, + 86.2, + 86.3, + 86.4, + 86.5, + 86.6, + 86.7, + 86.8, + 86.9, + 87.0, + 87.1, + 87.2, + 87.3, + 87.4, + 87.5, + 87.6, + 87.7, + 87.8, + 87.9, + 88.0, + 88.1, + 88.2, + 88.3, + 88.4, + 88.5, + 88.6, + 88.7, + 88.8, + 88.9, + 89.0, + 89.1, + 89.2, + 89.3, + 89.4, + 89.5, + 89.6, + 89.7, + 89.8, + 89.9, + 90.0, + 90.1, + 90.2, + 90.3, + 90.4, + 90.5, + 90.6, + 90.7, + 90.8, + 90.9, + 91.0, + 91.1, + 91.2, + 91.3, + 91.4, + 91.5, + 91.6, + 91.7, + 91.8, + 91.9, + 92.0, + 92.1, + 92.2, + 92.3, + 92.4, + 92.5, + 92.6, + 92.7, + 92.8, + 92.9, + 93.0, + 93.1, + 93.2, + 93.3, + 93.4, + 93.5, + 93.6, + 93.7, + 93.8, + 93.9, + 94.0, + 94.1, + 94.2, + 94.3, + 94.4, + 94.5, + 94.6, + 94.7, + 94.8, + 94.9, + 95.0, + 95.1, + 95.2, + 95.3, + 95.4, + 95.5, + 95.6, + 95.7, + 95.8, + 95.9, + 96.0, + 96.1, + 96.2, + 96.3, + 96.4, + 96.5, + 96.6, + 96.7, + 96.8, + 96.9, + 97.0, + 97.1, + 97.2, + 97.3, + 97.4, + 97.5, + 97.6, + 97.7, + 97.8, + 97.9, + 98.0, + 98.1, + 98.2, + 98.3, + 98.4, + 98.5, + 98.6, + 98.7, + 98.8, + 98.9, + 99.0, + 99.1, + 99.2, + 99.3, + 99.4, + 99.5, + 99.6, + 99.7, + 99.8, + 99.9, + 100.0, + }; + + // Tables of the expectations of Tukey's biweight function (parameter b's) + static const double paramBsOfTukeyBiweight[101][1001] = { + {// The expectations for dimension = 1 + 0.000000, + 0.001606, + 0.006181, + 0.013367, + 0.022810, + 0.034172, + 0.047125, + 0.061365, + 0.076602, + 0.092573, + 0.109036, + 0.125776, + 0.142602, + 0.159345, + 0.175866, + 0.192043, + 0.207779, + 0.222998, + 0.237641, + 0.251665, + 0.265042, + 0.277758, + 0.289808, + 0.301197, + 0.311937, + 0.322045, + 0.331544, + 0.340459, + 0.348817, + 0.356648, + 0.363981, + 0.370846, + 0.377271, + 0.383285, + 0.388916, + 0.394190, + 0.399131, + 0.403762, + 0.408107, + 0.412184, + 0.416014, + 0.419614, + 0.423000, + 0.426187, + 0.429191, + 0.432022, + 0.434695, + 0.437219, + 0.439605, + 0.441863, + 0.444000, + 0.446025, + 0.447946, + 0.449769, + 0.451500, + 0.453145, + 0.454710, + 0.456200, + 0.457619, + 0.458972, + 0.460262, + 0.461494, + 0.462670, + 0.463794, + 0.464869, + 0.465898, + 0.466882, + 0.467826, + 0.468730, + 0.469597, + 0.470429, + 0.471228, + 0.471995, + 0.472732, + 0.473441, + 0.474123, + 0.474780, + 0.475412, + 0.476021, + 0.476607, + 0.477173, + 0.477718, + 0.478245, + 0.478753, + 0.479244, + 0.479718, + 0.480176, + 0.480619, + 0.481047, + 0.481461, + 0.481863, + 0.482251, + 0.482627, + 0.482991, + 0.483344, + 0.483686, + 0.484018, + 0.484340, + 0.484653, + 0.484956, + 0.485250, + 0.485536, + 0.485813, + 0.486083, + 0.486345, + 0.486600, + 0.486848, + 0.487089, + 0.487324, + 0.487552, + 0.487774, + 0.487990, + 0.488201, + 0.488406, + 0.488606, + 0.488801, + 0.488991, + 0.489176, + 0.489356, + 0.489532, + 0.489704, + 0.489871, + 0.490035, + 0.490194, + 0.490350, + 0.490502, + 0.490651, + 0.490796, + 0.490938, + 0.491076, + 0.491212, + 0.491344, + 0.491474, + 0.491600, + 0.491724, + 0.491845, + 0.491963, + 0.492079, + 0.492192, + 0.492303, + 0.492412, + 0.492518, + 0.492622, + 0.492724, + 0.492824, + 0.492922, + 0.493018, + 0.493112, + 0.493204, + 0.493294, + 0.493383, + 0.493469, + 0.493554, + 0.493638, + 0.493720, + 0.493800, + 0.493879, + 0.493956, + 0.494031, + 0.494106, + 0.494179, + 0.494250, + 0.494321, + 0.494390, + 0.494458, + 0.494524, + 0.494589, + 0.494654, + 0.494717, + 0.494779, + 0.494840, + 0.494899, + 0.494958, + 0.495016, + 0.495073, + 0.495129, + 0.495184, + 0.495238, + 0.495291, + 0.495343, + 0.495394, + 0.495445, + 0.495494, + 0.495543, + 0.495591, + 0.495639, + 0.495685, + 0.495731, + 0.495776, + 0.495820, + 0.495864, + 0.495907, + 0.495949, + 0.495991, + 0.496032, + 0.496073, + 0.496112, + 0.496152, + 0.496190, + 0.496228, + 0.496266, + 0.496303, + 0.496339, + 0.496375, + 0.496410, + 0.496445, + 0.496479, + 0.496513, + 0.496546, + 0.496579, + 0.496611, + 0.496643, + 0.496675, + 0.496706, + 0.496737, + 0.496767, + 0.496796, + 0.496826, + 0.496855, + 0.496883, + 0.496911, + 0.496939, + 0.496967, + 0.496994, + 0.497020, + 0.497047, + 0.497073, + 0.497098, + 0.497124, + 0.497149, + 0.497173, + 0.497198, + 0.497222, + 0.497245, + 0.497269, + 0.497292, + 0.497315, + 0.497337, + 0.497360, + 0.497382, + 0.497403, + 0.497425, + 0.497446, + 0.497467, + 0.497488, + 0.497508, + 0.497528, + 0.497548, + 0.497568, + 0.497587, + 0.497606, + 0.497625, + 0.497644, + 0.497663, + 0.497681, + 0.497699, + 0.497717, + 0.497735, + 0.497752, + 0.497769, + 0.497787, + 0.497803, + 0.497820, + 0.497837, + 0.497853, + 0.497869, + 0.497885, + 0.497901, + 0.497916, + 0.497932, + 0.497947, + 0.497962, + 0.497977, + 0.497992, + 0.498006, + 0.498021, + 0.498035, + 0.498049, + 0.498063, + 0.498077, + 0.498091, + 0.498104, + 0.498118, + 0.498131, + 0.498144, + 0.498157, + 0.498170, + 0.498183, + 0.498195, + 0.498208, + 0.498220, + 0.498232, + 0.498244, + 0.498256, + 0.498268, + 0.498280, + 0.498291, + 0.498303, + 0.498314, + 0.498325, + 0.498336, + 0.498347, + 0.498358, + 0.498369, + 0.498380, + 0.498390, + 0.498401, + 0.498411, + 0.498422, + 0.498432, + 0.498442, + 0.498452, + 0.498462, + 0.498472, + 0.498481, + 0.498491, + 0.498500, + 0.498510, + 0.498519, + 0.498528, + 0.498538, + 0.498547, + 0.498556, + 0.498565, + 0.498573, + 0.498582, + 0.498591, + 0.498599, + 0.498608, + 0.498616, + 0.498625, + 0.498633, + 0.498641, + 0.498649, + 0.498657, + 0.498665, + 0.498673, + 0.498681, + 0.498689, + 0.498697, + 0.498704, + 0.498712, + 0.498719, + 0.498727, + 0.498734, + 0.498742, + 0.498749, + 0.498756, + 0.498763, + 0.498770, + 0.498777, + 0.498784, + 0.498791, + 0.498798, + 0.498805, + 0.498811, + 0.498818, + 0.498825, + 0.498831, + 0.498838, + 0.498844, + 0.498850, + 0.498857, + 0.498863, + 0.498869, + 0.498875, + 0.498882, + 0.498888, + 0.498894, + 0.498900, + 0.498906, + 0.498912, + 0.498917, + 0.498923, + 0.498929, + 0.498935, + 0.498940, + 0.498946, + 0.498951, + 0.498957, + 0.498962, + 0.498968, + 0.498973, + 0.498979, + 0.498984, + 0.498989, + 0.498994, + 0.499000, + 0.499005, + 0.499010, + 0.499015, + 0.499020, + 0.499025, + 0.499030, + 0.499035, + 0.499040, + 0.499044, + 0.499049, + 0.499054, + 0.499059, + 0.499063, + 0.499068, + 0.499073, + 0.499077, + 0.499082, + 0.499086, + 0.499091, + 0.499095, + 0.499100, + 0.499104, + 0.499109, + 0.499113, + 0.499117, + 0.499121, + 0.499126, + 0.499130, + 0.499134, + 0.499138, + 0.499142, + 0.499146, + 0.499150, + 0.499154, + 0.499158, + 0.499162, + 0.499166, + 0.499170, + 0.499174, + 0.499178, + 0.499182, + 0.499186, + 0.499189, + 0.499193, + 0.499197, + 0.499201, + 0.499204, + 0.499208, + 0.499212, + 0.499215, + 0.499219, + 0.499222, + 0.499226, + 0.499229, + 0.499233, + 0.499236, + 0.499240, + 0.499243, + 0.499247, + 0.499250, + 0.499253, + 0.499257, + 0.499260, + 0.499263, + 0.499266, + 0.499270, + 0.499273, + 0.499276, + 0.499279, + 0.499282, + 0.499285, + 0.499289, + 0.499292, + 0.499295, + 0.499298, + 0.499301, + 0.499304, + 0.499307, + 0.499310, + 0.499313, + 0.499316, + 0.499319, + 0.499321, + 0.499324, + 0.499327, + 0.499330, + 0.499333, + 0.499336, + 0.499338, + 0.499341, + 0.499344, + 0.499347, + 0.499349, + 0.499352, + 0.499355, + 0.499357, + 0.499360, + 0.499363, + 0.499365, + 0.499368, + 0.499371, + 0.499373, + 0.499376, + 0.499378, + 0.499381, + 0.499383, + 0.499386, + 0.499388, + 0.499391, + 0.499393, + 0.499396, + 0.499398, + 0.499400, + 0.499403, + 0.499405, + 0.499408, + 0.499410, + 0.499412, + 0.499415, + 0.499417, + 0.499419, + 0.499421, + 0.499424, + 0.499426, + 0.499428, + 0.499430, + 0.499433, + 0.499435, + 0.499437, + 0.499439, + 0.499441, + 0.499443, + 0.499446, + 0.499448, + 0.499450, + 0.499452, + 0.499454, + 0.499456, + 0.499458, + 0.499460, + 0.499462, + 0.499464, + 0.499466, + 0.499468, + 0.499470, + 0.499472, + 0.499474, + 0.499476, + 0.499478, + 0.499480, + 0.499482, + 0.499484, + 0.499486, + 0.499488, + 0.499490, + 0.499492, + 0.499493, + 0.499495, + 0.499497, + 0.499499, + 0.499501, + 0.499503, + 0.499504, + 0.499506, + 0.499508, + 0.499510, + 0.499512, + 0.499513, + 0.499515, + 0.499517, + 0.499519, + 0.499520, + 0.499522, + 0.499524, + 0.499525, + 0.499527, + 0.499529, + 0.499530, + 0.499532, + 0.499534, + 0.499535, + 0.499537, + 0.499539, + 0.499540, + 0.499542, + 0.499543, + 0.499545, + 0.499547, + 0.499548, + 0.499550, + 0.499551, + 0.499553, + 0.499554, + 0.499556, + 0.499557, + 0.499559, + 0.499560, + 0.499562, + 0.499563, + 0.499565, + 0.499566, + 0.499568, + 0.499569, + 0.499571, + 0.499572, + 0.499574, + 0.499575, + 0.499577, + 0.499578, + 0.499579, + 0.499581, + 0.499582, + 0.499584, + 0.499585, + 0.499586, + 0.499588, + 0.499589, + 0.499590, + 0.499592, + 0.499593, + 0.499594, + 0.499596, + 0.499597, + 0.499598, + 0.499600, + 0.499601, + 0.499602, + 0.499604, + 0.499605, + 0.499606, + 0.499607, + 0.499609, + 0.499610, + 0.499611, + 0.499612, + 0.499614, + 0.499615, + 0.499616, + 0.499617, + 0.499619, + 0.499620, + 0.499621, + 0.499622, + 0.499623, + 0.499625, + 0.499626, + 0.499627, + 0.499628, + 0.499629, + 0.499630, + 0.499632, + 0.499633, + 0.499634, + 0.499635, + 0.499636, + 0.499637, + 0.499638, + 0.499640, + 0.499641, + 0.499642, + 0.499643, + 0.499644, + 0.499645, + 0.499646, + 0.499647, + 0.499648, + 0.499649, + 0.499651, + 0.499652, + 0.499653, + 0.499654, + 0.499655, + 0.499656, + 0.499657, + 0.499658, + 0.499659, + 0.499660, + 0.499661, + 0.499662, + 0.499663, + 0.499664, + 0.499665, + 0.499666, + 0.499667, + 0.499668, + 0.499669, + 0.499670, + 0.499671, + 0.499672, + 0.499673, + 0.499674, + 0.499675, + 0.499676, + 0.499677, + 0.499678, + 0.499679, + 0.499680, + 0.499680, + 0.499681, + 0.499682, + 0.499683, + 0.499684, + 0.499685, + 0.499686, + 0.499687, + 0.499688, + 0.499689, + 0.499690, + 0.499690, + 0.499691, + 0.499692, + 0.499693, + 0.499694, + 0.499695, + 0.499696, + 0.499697, + 0.499697, + 0.499698, + 0.499699, + 0.499700, + 0.499701, + 0.499702, + 0.499703, + 0.499703, + 0.499704, + 0.499705, + 0.499706, + 0.499707, + 0.499708, + 0.499708, + 0.499709, + 0.499710, + 0.499711, + 0.499712, + 0.499712, + 0.499713, + 0.499714, + 0.499715, + 0.499716, + 0.499716, + 0.499717, + 0.499718, + 0.499719, + 0.499719, + 0.499720, + 0.499721, + 0.499722, + 0.499722, + 0.499723, + 0.499724, + 0.499725, + 0.499725, + 0.499726, + 0.499727, + 0.499728, + 0.499728, + 0.499729, + 0.499730, + 0.499731, + 0.499731, + 0.499732, + 0.499733, + 0.499733, + 0.499734, + 0.499735, + 0.499736, + 0.499736, + 0.499737, + 0.499738, + 0.499738, + 0.499739, + 0.499740, + 0.499740, + 0.499741, + 0.499742, + 0.499742, + 0.499743, + 0.499744, + 0.499744, + 0.499745, + 0.499746, + 0.499746, + 0.499747, + 0.499748, + 0.499748, + 0.499749, + 0.499750, + 0.499750, + 0.499751, + 0.499752, + 0.499752, + 0.499753, + 0.499754, + 0.499754, + 0.499755, + 0.499755, + 0.499756, + 0.499757, + 0.499757, + 0.499758, + 0.499758, + 0.499759, + 0.499760, + 0.499760, + 0.499761, + 0.499762, + 0.499762, + 0.499763, + 0.499763, + 0.499764, + 0.499765, + 0.499765, + 0.499766, + 0.499766, + 0.499767, + 0.499767, + 0.499768, + 0.499769, + 0.499769, + 0.499770, + 0.499770, + 0.499771, + 0.499771, + 0.499772, + 0.499773, + 0.499773, + 0.499774, + 0.499774, + 0.499775, + 0.499775, + 0.499776, + 0.499776, + 0.499777, + 0.499778, + 0.499778, + 0.499779, + 0.499779, + 0.499780, + 0.499780, + 0.499781, + 0.499781, + 0.499782, + 0.499782, + 0.499783, + 0.499783, + 0.499784, + 0.499784, + 0.499785, + 0.499785, + 0.499786, + 0.499786, + 0.499787, + 0.499787, + 0.499788, + 0.499788, + 0.499789, + 0.499789, + 0.499790, + 0.499790, + 0.499791, + 0.499791, + 0.499792, + 0.499792, + 0.499793, + 0.499793, + 0.499794, + 0.499794, + 0.499795, + 0.499795, + 0.499796, + 0.499796, + 0.499797, + 0.499797, + 0.499798, + 0.499798, + 0.499799, + 0.499799, + 0.499800, + 0.499800, + 0.499800, + 0.499801, + 0.499801, + 0.499802, + 0.499802, + 0.499803, + 0.499803, + 0.499804, + 0.499804, + 0.499805, + 0.499805, + 0.499805, + 0.499806, + 0.499806, + 0.499807, + 0.499807, + 0.499808, + 0.499808, + 0.499809, + 0.499809, + 0.499809, + 0.499810, + 0.499810, + 0.499811, + 0.499811, + 0.499812, + 0.499812, + 0.499812, + 0.499813, + 0.499813, + 0.499814, + 0.499814, + 0.499814, + 0.499815, + 0.499815, + 0.499816, + 0.499816, + 0.499816, + 0.499817, + 0.499817, + 0.499818, + 0.499818, + 0.499819, + 0.499819, + 0.499819, + 0.499820, + 0.499820, + 0.499820, + 0.499821, + 0.499821, + 0.499822, + 0.499822, + 0.499822, + 0.499823, + 0.499823, + 0.499824, + 0.499824, + 0.499824, + 0.499825, + 0.499825, + 0.499825, + 0.499826, + 0.499826, + 0.499827, + 0.499827, + 0.499827, + 0.499828, + 0.499828, + 0.499828, + 0.499829, + 0.499829, + 0.499830, + 0.499830, + 0.499830, + 0.499831, + 0.499831, + 0.499831, + 0.499832, + 0.499832, + 0.499832, + 0.499833, + 0.499833, + 0.499833, + 0.499834, + 0.499834, + 0.499835, + 0.499835, + 0.499835, + 0.499836, + 0.499836, + 0.499836, + 0.499837, + 0.499837, + 0.499837, + 0.499838, + 0.499838, + 0.499838, + 0.499839, + 0.499839, + 0.499839, + 0.499840, + 0.499840, + 0.499840, + 0.499841, + 0.499841, + 0.499841, + 0.499842, + 0.499842, + 0.499842, + 0.499843, + 0.499843, + 0.499843, + 0.499844, + 0.499844, + 0.499844, + 0.499844, + 0.499845, + 0.499845, + 0.499845, + 0.499846, + 0.499846, + 0.499846, + 0.499847, + 0.499847, + 0.499847, + 0.499848, + 0.499848, + 0.499848, + 0.499849, + 0.499849, + 0.499849, + 0.499849, + 0.499850, + 0.499850, + }, + {// The expectations for dimension = 2 + 0.000000, + 0.001665, + 0.006633, + 0.014833, + 0.026142, + 0.040396, + 0.057394, + 0.076900, + 0.098652, + 0.122368, + 0.147755, + 0.174513, + 0.202345, + 0.230959, + 0.260077, + 0.289438, + 0.318802, + 0.347952, + 0.376697, + 0.404870, + 0.432332, + 0.458970, + 0.484693, + 0.509434, + 0.533147, + 0.555802, + 0.577387, + 0.597905, + 0.617368, + 0.635797, + 0.653224, + 0.669683, + 0.685213, + 0.699857, + 0.713660, + 0.726664, + 0.738915, + 0.750456, + 0.761330, + 0.771578, + 0.781240, + 0.790351, + 0.798948, + 0.807065, + 0.814731, + 0.821978, + 0.828831, + 0.835317, + 0.841459, + 0.847280, + 0.852800, + 0.858038, + 0.863012, + 0.867739, + 0.872234, + 0.876511, + 0.880584, + 0.884464, + 0.888163, + 0.891693, + 0.895062, + 0.898280, + 0.901356, + 0.904297, + 0.907112, + 0.909807, + 0.912389, + 0.914863, + 0.917236, + 0.919513, + 0.921699, + 0.923799, + 0.925816, + 0.927756, + 0.929622, + 0.931417, + 0.933146, + 0.934811, + 0.936415, + 0.937962, + 0.939453, + 0.940892, + 0.942281, + 0.943622, + 0.944917, + 0.946169, + 0.947379, + 0.948549, + 0.949681, + 0.950776, + 0.951837, + 0.952863, + 0.953858, + 0.954821, + 0.955755, + 0.956661, + 0.957539, + 0.958391, + 0.959218, + 0.960021, + 0.960800, + 0.961557, + 0.962292, + 0.963007, + 0.963702, + 0.964377, + 0.965034, + 0.965673, + 0.966294, + 0.966900, + 0.967489, + 0.968062, + 0.968621, + 0.969165, + 0.969695, + 0.970212, + 0.970715, + 0.971206, + 0.971685, + 0.972152, + 0.972608, + 0.973053, + 0.973487, + 0.973910, + 0.974324, + 0.974728, + 0.975122, + 0.975507, + 0.975884, + 0.976252, + 0.976611, + 0.976963, + 0.977307, + 0.977643, + 0.977971, + 0.978293, + 0.978608, + 0.978915, + 0.979217, + 0.979511, + 0.979800, + 0.980083, + 0.980359, + 0.980630, + 0.980896, + 0.981156, + 0.981411, + 0.981661, + 0.981905, + 0.982145, + 0.982380, + 0.982611, + 0.982837, + 0.983059, + 0.983276, + 0.983489, + 0.983699, + 0.983904, + 0.984105, + 0.984303, + 0.984497, + 0.984688, + 0.984875, + 0.985058, + 0.985238, + 0.985416, + 0.985589, + 0.985760, + 0.985928, + 0.986093, + 0.986255, + 0.986414, + 0.986571, + 0.986724, + 0.986875, + 0.987024, + 0.987170, + 0.987314, + 0.987455, + 0.987594, + 0.987731, + 0.987865, + 0.987997, + 0.988127, + 0.988255, + 0.988381, + 0.988505, + 0.988627, + 0.988747, + 0.988865, + 0.988981, + 0.989095, + 0.989208, + 0.989319, + 0.989428, + 0.989536, + 0.989642, + 0.989746, + 0.989849, + 0.989950, + 0.990050, + 0.990148, + 0.990245, + 0.990340, + 0.990435, + 0.990527, + 0.990618, + 0.990708, + 0.990797, + 0.990885, + 0.990971, + 0.991056, + 0.991140, + 0.991222, + 0.991304, + 0.991384, + 0.991463, + 0.991542, + 0.991619, + 0.991695, + 0.991770, + 0.991844, + 0.991917, + 0.991989, + 0.992060, + 0.992130, + 0.992199, + 0.992268, + 0.992335, + 0.992401, + 0.992467, + 0.992532, + 0.992596, + 0.992659, + 0.992722, + 0.992783, + 0.992844, + 0.992904, + 0.992963, + 0.993022, + 0.993080, + 0.993137, + 0.993193, + 0.993249, + 0.993304, + 0.993358, + 0.993412, + 0.993465, + 0.993518, + 0.993569, + 0.993620, + 0.993671, + 0.993721, + 0.993770, + 0.993819, + 0.993867, + 0.993915, + 0.993962, + 0.994009, + 0.994055, + 0.994100, + 0.994145, + 0.994190, + 0.994234, + 0.994277, + 0.994320, + 0.994363, + 0.994405, + 0.994446, + 0.994487, + 0.994528, + 0.994568, + 0.994608, + 0.994647, + 0.994686, + 0.994725, + 0.994763, + 0.994800, + 0.994838, + 0.994875, + 0.994911, + 0.994947, + 0.994983, + 0.995018, + 0.995053, + 0.995088, + 0.995122, + 0.995156, + 0.995189, + 0.995222, + 0.995255, + 0.995288, + 0.995320, + 0.995352, + 0.995383, + 0.995414, + 0.995445, + 0.995476, + 0.995506, + 0.995536, + 0.995565, + 0.995595, + 0.995624, + 0.995653, + 0.995681, + 0.995709, + 0.995737, + 0.995765, + 0.995792, + 0.995819, + 0.995846, + 0.995873, + 0.995899, + 0.995925, + 0.995951, + 0.995977, + 0.996002, + 0.996027, + 0.996052, + 0.996077, + 0.996101, + 0.996126, + 0.996150, + 0.996173, + 0.996197, + 0.996220, + 0.996243, + 0.996266, + 0.996289, + 0.996311, + 0.996334, + 0.996356, + 0.996378, + 0.996399, + 0.996421, + 0.996442, + 0.996463, + 0.996484, + 0.996505, + 0.996525, + 0.996546, + 0.996566, + 0.996586, + 0.996606, + 0.996626, + 0.996645, + 0.996664, + 0.996684, + 0.996703, + 0.996721, + 0.996740, + 0.996759, + 0.996777, + 0.996795, + 0.996813, + 0.996831, + 0.996849, + 0.996866, + 0.996884, + 0.996901, + 0.996918, + 0.996935, + 0.996952, + 0.996969, + 0.996986, + 0.997002, + 0.997018, + 0.997035, + 0.997051, + 0.997067, + 0.997082, + 0.997098, + 0.997114, + 0.997129, + 0.997144, + 0.997160, + 0.997175, + 0.997190, + 0.997204, + 0.997219, + 0.997234, + 0.997248, + 0.997263, + 0.997277, + 0.997291, + 0.997305, + 0.997319, + 0.997333, + 0.997346, + 0.997360, + 0.997374, + 0.997387, + 0.997400, + 0.997414, + 0.997427, + 0.997440, + 0.997452, + 0.997465, + 0.997478, + 0.997491, + 0.997503, + 0.997516, + 0.997528, + 0.997540, + 0.997552, + 0.997564, + 0.997576, + 0.997588, + 0.997600, + 0.997612, + 0.997623, + 0.997635, + 0.997646, + 0.997658, + 0.997669, + 0.997680, + 0.997691, + 0.997702, + 0.997713, + 0.997724, + 0.997735, + 0.997746, + 0.997756, + 0.997767, + 0.997777, + 0.997788, + 0.997798, + 0.997809, + 0.997819, + 0.997829, + 0.997839, + 0.997849, + 0.997859, + 0.997869, + 0.997879, + 0.997888, + 0.997898, + 0.997908, + 0.997917, + 0.997927, + 0.997936, + 0.997945, + 0.997955, + 0.997964, + 0.997973, + 0.997982, + 0.997991, + 0.998000, + 0.998009, + 0.998018, + 0.998027, + 0.998035, + 0.998044, + 0.998053, + 0.998061, + 0.998070, + 0.998078, + 0.998087, + 0.998095, + 0.998103, + 0.998111, + 0.998120, + 0.998128, + 0.998136, + 0.998144, + 0.998152, + 0.998160, + 0.998168, + 0.998175, + 0.998183, + 0.998191, + 0.998199, + 0.998206, + 0.998214, + 0.998221, + 0.998229, + 0.998236, + 0.998244, + 0.998251, + 0.998258, + 0.998265, + 0.998273, + 0.998280, + 0.998287, + 0.998294, + 0.998301, + 0.998308, + 0.998315, + 0.998322, + 0.998329, + 0.998335, + 0.998342, + 0.998349, + 0.998356, + 0.998362, + 0.998369, + 0.998375, + 0.998382, + 0.998388, + 0.998395, + 0.998401, + 0.998408, + 0.998414, + 0.998420, + 0.998427, + 0.998433, + 0.998439, + 0.998445, + 0.998451, + 0.998457, + 0.998463, + 0.998469, + 0.998475, + 0.998481, + 0.998487, + 0.998493, + 0.998499, + 0.998505, + 0.998510, + 0.998516, + 0.998522, + 0.998527, + 0.998533, + 0.998539, + 0.998544, + 0.998550, + 0.998555, + 0.998561, + 0.998566, + 0.998572, + 0.998577, + 0.998582, + 0.998588, + 0.998593, + 0.998598, + 0.998603, + 0.998609, + 0.998614, + 0.998619, + 0.998624, + 0.998629, + 0.998634, + 0.998639, + 0.998644, + 0.998649, + 0.998654, + 0.998659, + 0.998664, + 0.998669, + 0.998674, + 0.998679, + 0.998683, + 0.998688, + 0.998693, + 0.998698, + 0.998702, + 0.998707, + 0.998712, + 0.998716, + 0.998721, + 0.998725, + 0.998730, + 0.998734, + 0.998739, + 0.998743, + 0.998748, + 0.998752, + 0.998757, + 0.998761, + 0.998765, + 0.998770, + 0.998774, + 0.998778, + 0.998782, + 0.998787, + 0.998791, + 0.998795, + 0.998799, + 0.998803, + 0.998808, + 0.998812, + 0.998816, + 0.998820, + 0.998824, + 0.998828, + 0.998832, + 0.998836, + 0.998840, + 0.998844, + 0.998848, + 0.998852, + 0.998855, + 0.998859, + 0.998863, + 0.998867, + 0.998871, + 0.998875, + 0.998878, + 0.998882, + 0.998886, + 0.998890, + 0.998893, + 0.998897, + 0.998901, + 0.998904, + 0.998908, + 0.998911, + 0.998915, + 0.998919, + 0.998922, + 0.998926, + 0.998929, + 0.998933, + 0.998936, + 0.998940, + 0.998943, + 0.998946, + 0.998950, + 0.998953, + 0.998957, + 0.998960, + 0.998963, + 0.998967, + 0.998970, + 0.998973, + 0.998977, + 0.998980, + 0.998983, + 0.998986, + 0.998989, + 0.998993, + 0.998996, + 0.998999, + 0.999002, + 0.999005, + 0.999008, + 0.999012, + 0.999015, + 0.999018, + 0.999021, + 0.999024, + 0.999027, + 0.999030, + 0.999033, + 0.999036, + 0.999039, + 0.999042, + 0.999045, + 0.999048, + 0.999051, + 0.999054, + 0.999057, + 0.999059, + 0.999062, + 0.999065, + 0.999068, + 0.999071, + 0.999074, + 0.999077, + 0.999079, + 0.999082, + 0.999085, + 0.999088, + 0.999090, + 0.999093, + 0.999096, + 0.999099, + 0.999101, + 0.999104, + 0.999107, + 0.999109, + 0.999112, + 0.999115, + 0.999117, + 0.999120, + 0.999122, + 0.999125, + 0.999128, + 0.999130, + 0.999133, + 0.999135, + 0.999138, + 0.999140, + 0.999143, + 0.999145, + 0.999148, + 0.999150, + 0.999153, + 0.999155, + 0.999158, + 0.999160, + 0.999163, + 0.999165, + 0.999167, + 0.999170, + 0.999172, + 0.999175, + 0.999177, + 0.999179, + 0.999182, + 0.999184, + 0.999186, + 0.999189, + 0.999191, + 0.999193, + 0.999196, + 0.999198, + 0.999200, + 0.999202, + 0.999205, + 0.999207, + 0.999209, + 0.999211, + 0.999213, + 0.999216, + 0.999218, + 0.999220, + 0.999222, + 0.999224, + 0.999227, + 0.999229, + 0.999231, + 0.999233, + 0.999235, + 0.999237, + 0.999239, + 0.999241, + 0.999243, + 0.999246, + 0.999248, + 0.999250, + 0.999252, + 0.999254, + 0.999256, + 0.999258, + 0.999260, + 0.999262, + 0.999264, + 0.999266, + 0.999268, + 0.999270, + 0.999272, + 0.999274, + 0.999276, + 0.999278, + 0.999280, + 0.999282, + 0.999283, + 0.999285, + 0.999287, + 0.999289, + 0.999291, + 0.999293, + 0.999295, + 0.999297, + 0.999299, + 0.999300, + 0.999302, + 0.999304, + 0.999306, + 0.999308, + 0.999310, + 0.999311, + 0.999313, + 0.999315, + 0.999317, + 0.999319, + 0.999320, + 0.999322, + 0.999324, + 0.999326, + 0.999327, + 0.999329, + 0.999331, + 0.999333, + 0.999334, + 0.999336, + 0.999338, + 0.999339, + 0.999341, + 0.999343, + 0.999344, + 0.999346, + 0.999348, + 0.999349, + 0.999351, + 0.999353, + 0.999354, + 0.999356, + 0.999358, + 0.999359, + 0.999361, + 0.999363, + 0.999364, + 0.999366, + 0.999367, + 0.999369, + 0.999370, + 0.999372, + 0.999374, + 0.999375, + 0.999377, + 0.999378, + 0.999380, + 0.999381, + 0.999383, + 0.999384, + 0.999386, + 0.999388, + 0.999389, + 0.999391, + 0.999392, + 0.999394, + 0.999395, + 0.999396, + 0.999398, + 0.999399, + 0.999401, + 0.999402, + 0.999404, + 0.999405, + 0.999407, + 0.999408, + 0.999410, + 0.999411, + 0.999412, + 0.999414, + 0.999415, + 0.999417, + 0.999418, + 0.999420, + 0.999421, + 0.999422, + 0.999424, + 0.999425, + 0.999426, + 0.999428, + 0.999429, + 0.999431, + 0.999432, + 0.999433, + 0.999435, + 0.999436, + 0.999437, + 0.999439, + 0.999440, + 0.999441, + 0.999443, + 0.999444, + 0.999445, + 0.999447, + 0.999448, + 0.999449, + 0.999450, + 0.999452, + 0.999453, + 0.999454, + 0.999456, + 0.999457, + 0.999458, + 0.999459, + 0.999461, + 0.999462, + 0.999463, + 0.999464, + 0.999466, + 0.999467, + 0.999468, + 0.999469, + 0.999470, + 0.999472, + 0.999473, + 0.999474, + 0.999475, + 0.999476, + 0.999478, + 0.999479, + 0.999480, + 0.999481, + 0.999482, + 0.999484, + 0.999485, + 0.999486, + 0.999487, + 0.999488, + 0.999489, + 0.999491, + 0.999492, + 0.999493, + 0.999494, + 0.999495, + 0.999496, + 0.999497, + 0.999499, + 0.999500, + 0.999501, + 0.999502, + 0.999503, + 0.999504, + 0.999505, + 0.999506, + 0.999507, + 0.999508, + 0.999510, + 0.999511, + 0.999512, + 0.999513, + 0.999514, + 0.999515, + 0.999516, + 0.999517, + 0.999518, + 0.999519, + 0.999520, + 0.999521, + 0.999522, + 0.999523, + 0.999524, + 0.999525, + 0.999526, + 0.999528, + 0.999529, + 0.999530, + 0.999531, + 0.999532, + 0.999533, + 0.999534, + 0.999535, + 0.999536, + 0.999537, + 0.999538, + 0.999539, + 0.999540, + 0.999541, + 0.999542, + 0.999543, + 0.999544, + 0.999545, + 0.999545, + 0.999546, + 0.999547, + 0.999548, + 0.999549, + 0.999550, + 0.999551, + 0.999552, + 0.999553, + 0.999554, + 0.999555, + 0.999556, + 0.999557, + 0.999558, + 0.999559, + 0.999560, + 0.999561, + 0.999562, + 0.999562, + 0.999563, + 0.999564, + 0.999565, + 0.999566, + 0.999567, + 0.999568, + 0.999569, + 0.999570, + 0.999571, + 0.999571, + 0.999572, + 0.999573, + 0.999574, + 0.999575, + 0.999576, + 0.999577, + 0.999578, + 0.999578, + 0.999579, + 0.999580, + 0.999581, + 0.999582, + 0.999583, + 0.999584, + 0.999584, + 0.999585, + 0.999586, + 0.999587, + 0.999588, + 0.999589, + 0.999589, + 0.999590, + 0.999591, + 0.999592, + 0.999593, + 0.999594, + 0.999594, + 0.999595, + 0.999596, + 0.999597, + 0.999598, + 0.999598, + 0.999599, + 0.999600, + }, + {// The expectations for dimension = 3 + 0.000000, + 0.001667, + 0.006665, + 0.014984, + 0.026599, + 0.041463, + 0.059500, + 0.080604, + 0.104635, + 0.131420, + 0.160751, + 0.192393, + 0.226083, + 0.261539, + 0.298465, + 0.336558, + 0.375512, + 0.415029, + 0.454820, + 0.494615, + 0.534161, + 0.573231, + 0.611626, + 0.649169, + 0.685716, + 0.721148, + 0.755371, + 0.788317, + 0.819940, + 0.850214, + 0.879130, + 0.906694, + 0.932926, + 0.957855, + 0.981517, + 1.003956, + 1.025221, + 1.045362, + 1.064431, + 1.082482, + 1.099569, + 1.115742, + 1.131054, + 1.145554, + 1.159288, + 1.172303, + 1.184640, + 1.196342, + 1.207445, + 1.217986, + 1.228000, + 1.237517, + 1.246568, + 1.255180, + 1.263379, + 1.271190, + 1.278636, + 1.285738, + 1.292515, + 1.298987, + 1.305170, + 1.311080, + 1.316734, + 1.322145, + 1.327325, + 1.332289, + 1.337046, + 1.341609, + 1.345987, + 1.350191, + 1.354227, + 1.358107, + 1.361836, + 1.365423, + 1.368875, + 1.372198, + 1.375398, + 1.378481, + 1.381454, + 1.384320, + 1.387085, + 1.389754, + 1.392330, + 1.394818, + 1.397222, + 1.399546, + 1.401793, + 1.403966, + 1.406069, + 1.408104, + 1.410075, + 1.411983, + 1.413832, + 1.415624, + 1.417361, + 1.419046, + 1.420680, + 1.422266, + 1.423805, + 1.425299, + 1.426750, + 1.428160, + 1.429529, + 1.430860, + 1.432154, + 1.433413, + 1.434636, + 1.435827, + 1.436986, + 1.438114, + 1.439212, + 1.440281, + 1.441323, + 1.442337, + 1.443326, + 1.444290, + 1.445229, + 1.446145, + 1.447039, + 1.447910, + 1.448761, + 1.449590, + 1.450400, + 1.451191, + 1.451963, + 1.452717, + 1.453453, + 1.454173, + 1.454876, + 1.455563, + 1.456234, + 1.456890, + 1.457532, + 1.458160, + 1.458774, + 1.459375, + 1.459962, + 1.460537, + 1.461100, + 1.461651, + 1.462190, + 1.462718, + 1.463235, + 1.463742, + 1.464238, + 1.464724, + 1.465200, + 1.465667, + 1.466124, + 1.466573, + 1.467012, + 1.467443, + 1.467866, + 1.468280, + 1.468687, + 1.469086, + 1.469477, + 1.469861, + 1.470238, + 1.470607, + 1.470970, + 1.471326, + 1.471676, + 1.472020, + 1.472357, + 1.472688, + 1.473013, + 1.473333, + 1.473647, + 1.473955, + 1.474258, + 1.474556, + 1.474848, + 1.475136, + 1.475419, + 1.475697, + 1.475970, + 1.476239, + 1.476503, + 1.476763, + 1.477019, + 1.477270, + 1.477517, + 1.477761, + 1.478000, + 1.478236, + 1.478467, + 1.478696, + 1.478920, + 1.479141, + 1.479359, + 1.479573, + 1.479784, + 1.479991, + 1.480196, + 1.480397, + 1.480595, + 1.480791, + 1.480983, + 1.481173, + 1.481359, + 1.481543, + 1.481725, + 1.481903, + 1.482079, + 1.482253, + 1.482424, + 1.482592, + 1.482758, + 1.482922, + 1.483083, + 1.483242, + 1.483399, + 1.483554, + 1.483706, + 1.483857, + 1.484005, + 1.484152, + 1.484296, + 1.484438, + 1.484579, + 1.484717, + 1.484854, + 1.484989, + 1.485122, + 1.485253, + 1.485383, + 1.485511, + 1.485637, + 1.485762, + 1.485885, + 1.486006, + 1.486126, + 1.486244, + 1.486361, + 1.486477, + 1.486590, + 1.486703, + 1.486814, + 1.486924, + 1.487032, + 1.487139, + 1.487245, + 1.487349, + 1.487452, + 1.487554, + 1.487654, + 1.487754, + 1.487852, + 1.487949, + 1.488045, + 1.488140, + 1.488233, + 1.488326, + 1.488417, + 1.488507, + 1.488597, + 1.488685, + 1.488772, + 1.488858, + 1.488944, + 1.489028, + 1.489111, + 1.489194, + 1.489275, + 1.489356, + 1.489435, + 1.489514, + 1.489592, + 1.489669, + 1.489745, + 1.489820, + 1.489895, + 1.489968, + 1.490041, + 1.490113, + 1.490185, + 1.490255, + 1.490325, + 1.490394, + 1.490462, + 1.490530, + 1.490597, + 1.490663, + 1.490728, + 1.490793, + 1.490857, + 1.490920, + 1.490983, + 1.491045, + 1.491107, + 1.491168, + 1.491228, + 1.491287, + 1.491346, + 1.491405, + 1.491463, + 1.491520, + 1.491577, + 1.491633, + 1.491688, + 1.491743, + 1.491798, + 1.491852, + 1.491905, + 1.491958, + 1.492010, + 1.492062, + 1.492113, + 1.492164, + 1.492215, + 1.492264, + 1.492314, + 1.492363, + 1.492411, + 1.492459, + 1.492507, + 1.492554, + 1.492600, + 1.492647, + 1.492692, + 1.492738, + 1.492783, + 1.492827, + 1.492871, + 1.492915, + 1.492958, + 1.493001, + 1.493044, + 1.493086, + 1.493128, + 1.493169, + 1.493210, + 1.493251, + 1.493291, + 1.493331, + 1.493370, + 1.493410, + 1.493449, + 1.493487, + 1.493525, + 1.493563, + 1.493601, + 1.493638, + 1.493675, + 1.493711, + 1.493747, + 1.493783, + 1.493819, + 1.493854, + 1.493889, + 1.493924, + 1.493958, + 1.493992, + 1.494026, + 1.494060, + 1.494093, + 1.494126, + 1.494159, + 1.494191, + 1.494223, + 1.494255, + 1.494287, + 1.494318, + 1.494349, + 1.494380, + 1.494411, + 1.494441, + 1.494471, + 1.494501, + 1.494531, + 1.494560, + 1.494589, + 1.494618, + 1.494647, + 1.494676, + 1.494704, + 1.494732, + 1.494760, + 1.494787, + 1.494814, + 1.494842, + 1.494869, + 1.494895, + 1.494922, + 1.494948, + 1.494974, + 1.495000, + 1.495026, + 1.495051, + 1.495077, + 1.495102, + 1.495127, + 1.495151, + 1.495176, + 1.495200, + 1.495224, + 1.495248, + 1.495272, + 1.495296, + 1.495319, + 1.495343, + 1.495366, + 1.495389, + 1.495411, + 1.495434, + 1.495456, + 1.495479, + 1.495501, + 1.495523, + 1.495545, + 1.495566, + 1.495588, + 1.495609, + 1.495630, + 1.495651, + 1.495672, + 1.495693, + 1.495713, + 1.495734, + 1.495754, + 1.495774, + 1.495794, + 1.495814, + 1.495834, + 1.495853, + 1.495873, + 1.495892, + 1.495911, + 1.495930, + 1.495949, + 1.495968, + 1.495986, + 1.496005, + 1.496023, + 1.496041, + 1.496059, + 1.496077, + 1.496095, + 1.496113, + 1.496131, + 1.496148, + 1.496166, + 1.496183, + 1.496200, + 1.496217, + 1.496234, + 1.496251, + 1.496267, + 1.496284, + 1.496301, + 1.496317, + 1.496333, + 1.496349, + 1.496365, + 1.496381, + 1.496397, + 1.496413, + 1.496429, + 1.496444, + 1.496459, + 1.496475, + 1.496490, + 1.496505, + 1.496520, + 1.496535, + 1.496550, + 1.496565, + 1.496579, + 1.496594, + 1.496608, + 1.496623, + 1.496637, + 1.496651, + 1.496665, + 1.496679, + 1.496693, + 1.496707, + 1.496721, + 1.496735, + 1.496748, + 1.496762, + 1.496775, + 1.496788, + 1.496802, + 1.496815, + 1.496828, + 1.496841, + 1.496854, + 1.496867, + 1.496879, + 1.496892, + 1.496905, + 1.496917, + 1.496930, + 1.496942, + 1.496954, + 1.496967, + 1.496979, + 1.496991, + 1.497003, + 1.497015, + 1.497027, + 1.497038, + 1.497050, + 1.497062, + 1.497073, + 1.497085, + 1.497096, + 1.497108, + 1.497119, + 1.497130, + 1.497142, + 1.497153, + 1.497164, + 1.497175, + 1.497186, + 1.497196, + 1.497207, + 1.497218, + 1.497229, + 1.497239, + 1.497250, + 1.497260, + 1.497271, + 1.497281, + 1.497292, + 1.497302, + 1.497312, + 1.497322, + 1.497332, + 1.497342, + 1.497352, + 1.497362, + 1.497372, + 1.497382, + 1.497392, + 1.497401, + 1.497411, + 1.497421, + 1.497430, + 1.497440, + 1.497449, + 1.497458, + 1.497468, + 1.497477, + 1.497486, + 1.497495, + 1.497504, + 1.497514, + 1.497523, + 1.497532, + 1.497540, + 1.497549, + 1.497558, + 1.497567, + 1.497576, + 1.497584, + 1.497593, + 1.497602, + 1.497610, + 1.497619, + 1.497627, + 1.497636, + 1.497644, + 1.497652, + 1.497661, + 1.497669, + 1.497677, + 1.497685, + 1.497693, + 1.497701, + 1.497709, + 1.497717, + 1.497725, + 1.497733, + 1.497741, + 1.497749, + 1.497757, + 1.497764, + 1.497772, + 1.497780, + 1.497787, + 1.497795, + 1.497802, + 1.497810, + 1.497817, + 1.497825, + 1.497832, + 1.497840, + 1.497847, + 1.497854, + 1.497861, + 1.497869, + 1.497876, + 1.497883, + 1.497890, + 1.497897, + 1.497904, + 1.497911, + 1.497918, + 1.497925, + 1.497932, + 1.497939, + 1.497945, + 1.497952, + 1.497959, + 1.497966, + 1.497972, + 1.497979, + 1.497986, + 1.497992, + 1.497999, + 1.498005, + 1.498012, + 1.498018, + 1.498025, + 1.498031, + 1.498037, + 1.498044, + 1.498050, + 1.498056, + 1.498063, + 1.498069, + 1.498075, + 1.498081, + 1.498087, + 1.498093, + 1.498099, + 1.498105, + 1.498111, + 1.498117, + 1.498123, + 1.498129, + 1.498135, + 1.498141, + 1.498147, + 1.498153, + 1.498159, + 1.498164, + 1.498170, + 1.498176, + 1.498181, + 1.498187, + 1.498193, + 1.498198, + 1.498204, + 1.498209, + 1.498215, + 1.498220, + 1.498226, + 1.498231, + 1.498237, + 1.498242, + 1.498247, + 1.498253, + 1.498258, + 1.498263, + 1.498269, + 1.498274, + 1.498279, + 1.498284, + 1.498290, + 1.498295, + 1.498300, + 1.498305, + 1.498310, + 1.498315, + 1.498320, + 1.498325, + 1.498330, + 1.498335, + 1.498340, + 1.498345, + 1.498350, + 1.498355, + 1.498360, + 1.498364, + 1.498369, + 1.498374, + 1.498379, + 1.498384, + 1.498388, + 1.498393, + 1.498398, + 1.498402, + 1.498407, + 1.498412, + 1.498416, + 1.498421, + 1.498425, + 1.498430, + 1.498435, + 1.498439, + 1.498444, + 1.498448, + 1.498452, + 1.498457, + 1.498461, + 1.498466, + 1.498470, + 1.498474, + 1.498479, + 1.498483, + 1.498487, + 1.498492, + 1.498496, + 1.498500, + 1.498504, + 1.498509, + 1.498513, + 1.498517, + 1.498521, + 1.498525, + 1.498529, + 1.498534, + 1.498538, + 1.498542, + 1.498546, + 1.498550, + 1.498554, + 1.498558, + 1.498562, + 1.498566, + 1.498570, + 1.498574, + 1.498578, + 1.498582, + 1.498585, + 1.498589, + 1.498593, + 1.498597, + 1.498601, + 1.498605, + 1.498609, + 1.498612, + 1.498616, + 1.498620, + 1.498624, + 1.498627, + 1.498631, + 1.498635, + 1.498638, + 1.498642, + 1.498646, + 1.498649, + 1.498653, + 1.498656, + 1.498660, + 1.498664, + 1.498667, + 1.498671, + 1.498674, + 1.498678, + 1.498681, + 1.498685, + 1.498688, + 1.498692, + 1.498695, + 1.498699, + 1.498702, + 1.498705, + 1.498709, + 1.498712, + 1.498716, + 1.498719, + 1.498722, + 1.498726, + 1.498729, + 1.498732, + 1.498736, + 1.498739, + 1.498742, + 1.498745, + 1.498749, + 1.498752, + 1.498755, + 1.498758, + 1.498761, + 1.498765, + 1.498768, + 1.498771, + 1.498774, + 1.498777, + 1.498780, + 1.498783, + 1.498786, + 1.498790, + 1.498793, + 1.498796, + 1.498799, + 1.498802, + 1.498805, + 1.498808, + 1.498811, + 1.498814, + 1.498817, + 1.498820, + 1.498823, + 1.498826, + 1.498829, + 1.498831, + 1.498834, + 1.498837, + 1.498840, + 1.498843, + 1.498846, + 1.498849, + 1.498852, + 1.498854, + 1.498857, + 1.498860, + 1.498863, + 1.498866, + 1.498868, + 1.498871, + 1.498874, + 1.498877, + 1.498880, + 1.498882, + 1.498885, + 1.498888, + 1.498890, + 1.498893, + 1.498896, + 1.498898, + 1.498901, + 1.498904, + 1.498906, + 1.498909, + 1.498912, + 1.498914, + 1.498917, + 1.498919, + 1.498922, + 1.498925, + 1.498927, + 1.498930, + 1.498932, + 1.498935, + 1.498937, + 1.498940, + 1.498942, + 1.498945, + 1.498947, + 1.498950, + 1.498952, + 1.498955, + 1.498957, + 1.498960, + 1.498962, + 1.498965, + 1.498967, + 1.498970, + 1.498972, + 1.498974, + 1.498977, + 1.498979, + 1.498982, + 1.498984, + 1.498986, + 1.498989, + 1.498991, + 1.498993, + 1.498996, + 1.498998, + 1.499000, + 1.499003, + 1.499005, + 1.499007, + 1.499009, + 1.499012, + 1.499014, + 1.499016, + 1.499018, + 1.499021, + 1.499023, + 1.499025, + 1.499027, + 1.499030, + 1.499032, + 1.499034, + 1.499036, + 1.499038, + 1.499041, + 1.499043, + 1.499045, + 1.499047, + 1.499049, + 1.499051, + 1.499053, + 1.499056, + 1.499058, + 1.499060, + 1.499062, + 1.499064, + 1.499066, + 1.499068, + 1.499070, + 1.499072, + 1.499074, + 1.499076, + 1.499078, + 1.499080, + 1.499083, + 1.499085, + 1.499087, + 1.499089, + 1.499091, + 1.499093, + 1.499095, + 1.499097, + 1.499099, + 1.499101, + 1.499102, + 1.499104, + 1.499106, + 1.499108, + 1.499110, + 1.499112, + 1.499114, + 1.499116, + 1.499118, + 1.499120, + 1.499122, + 1.499124, + 1.499126, + 1.499127, + 1.499129, + 1.499131, + 1.499133, + 1.499135, + 1.499137, + 1.499139, + 1.499140, + 1.499142, + 1.499144, + 1.499146, + 1.499148, + 1.499150, + 1.499151, + 1.499153, + 1.499155, + 1.499157, + 1.499159, + 1.499160, + 1.499162, + 1.499164, + 1.499166, + 1.499167, + 1.499169, + 1.499171, + 1.499173, + 1.499174, + 1.499176, + 1.499178, + 1.499180, + 1.499181, + 1.499183, + 1.499185, + 1.499186, + 1.499188, + 1.499190, + 1.499191, + 1.499193, + 1.499195, + 1.499196, + 1.499198, + 1.499200, + 1.499201, + 1.499203, + 1.499205, + 1.499206, + 1.499208, + 1.499210, + 1.499211, + 1.499213, + 1.499214, + 1.499216, + 1.499218, + 1.499219, + 1.499221, + 1.499222, + 1.499224, + 1.499226, + 1.499227, + 1.499229, + 1.499230, + 1.499232, + 1.499233, + 1.499235, + 1.499236, + 1.499238, + 1.499240, + 1.499241, + 1.499243, + 1.499244, + 1.499246, + 1.499247, + 1.499249, + 1.499250, + }, + {// The expectations for dimension = 4 + 0.000000, + 0.001667, + 0.006667, + 0.014999, + 0.026658, + 0.041635, + 0.059908, + 0.081441, + 0.106175, + 0.134030, + 0.164896, + 0.198633, + 0.235067, + 0.273995, + 0.315183, + 0.358370, + 0.403275, + 0.449600, + 0.497035, + 0.545269, + 0.593994, + 0.642909, + 0.691730, + 0.740190, + 0.788048, + 0.835087, + 0.881119, + 0.925985, + 0.969552, + 1.011717, + 1.052402, + 1.091555, + 1.129143, + 1.165153, + 1.199590, + 1.232472, + 1.263828, + 1.293698, + 1.322127, + 1.349168, + 1.374874, + 1.399304, + 1.422517, + 1.444571, + 1.465524, + 1.485433, + 1.504355, + 1.522342, + 1.539446, + 1.555716, + 1.571199, + 1.585939, + 1.599979, + 1.613357, + 1.626111, + 1.638276, + 1.649885, + 1.660970, + 1.671559, + 1.681680, + 1.691358, + 1.700618, + 1.709481, + 1.717970, + 1.726105, + 1.733903, + 1.741382, + 1.748560, + 1.755451, + 1.762069, + 1.768430, + 1.774545, + 1.780426, + 1.786085, + 1.791533, + 1.796780, + 1.801835, + 1.806708, + 1.811406, + 1.815939, + 1.820312, + 1.824535, + 1.828613, + 1.832552, + 1.836359, + 1.840040, + 1.843600, + 1.847044, + 1.850377, + 1.853604, + 1.856729, + 1.859756, + 1.862690, + 1.865533, + 1.868291, + 1.870965, + 1.873559, + 1.876077, + 1.878521, + 1.880895, + 1.883200, + 1.885440, + 1.887616, + 1.889732, + 1.891789, + 1.893789, + 1.895735, + 1.897629, + 1.899471, + 1.901265, + 1.903012, + 1.904713, + 1.906370, + 1.907985, + 1.909559, + 1.911092, + 1.912588, + 1.914046, + 1.915468, + 1.916856, + 1.918210, + 1.919531, + 1.920821, + 1.922080, + 1.923310, + 1.924511, + 1.925684, + 1.926830, + 1.927950, + 1.929045, + 1.930114, + 1.931161, + 1.932184, + 1.933184, + 1.934162, + 1.935120, + 1.936057, + 1.936973, + 1.937870, + 1.938749, + 1.939608, + 1.940450, + 1.941275, + 1.942083, + 1.942874, + 1.943649, + 1.944409, + 1.945153, + 1.945882, + 1.946598, + 1.947299, + 1.947986, + 1.948660, + 1.949322, + 1.949970, + 1.950606, + 1.951231, + 1.951843, + 1.952444, + 1.953034, + 1.953613, + 1.954182, + 1.954740, + 1.955288, + 1.955826, + 1.956355, + 1.956874, + 1.957384, + 1.957885, + 1.958377, + 1.958861, + 1.959336, + 1.959803, + 1.960262, + 1.960714, + 1.961158, + 1.961594, + 1.962023, + 1.962445, + 1.962860, + 1.963268, + 1.963669, + 1.964064, + 1.964453, + 1.964835, + 1.965211, + 1.965581, + 1.965946, + 1.966304, + 1.966657, + 1.967005, + 1.967347, + 1.967683, + 1.968015, + 1.968342, + 1.968663, + 1.968980, + 1.969292, + 1.969599, + 1.969902, + 1.970200, + 1.970494, + 1.970783, + 1.971069, + 1.971350, + 1.971627, + 1.971900, + 1.972169, + 1.972434, + 1.972696, + 1.972954, + 1.973208, + 1.973459, + 1.973706, + 1.973949, + 1.974190, + 1.974427, + 1.974661, + 1.974891, + 1.975119, + 1.975343, + 1.975565, + 1.975783, + 1.975999, + 1.976211, + 1.976421, + 1.976628, + 1.976833, + 1.977034, + 1.977234, + 1.977430, + 1.977624, + 1.977816, + 1.978005, + 1.978191, + 1.978376, + 1.978558, + 1.978737, + 1.978915, + 1.979090, + 1.979263, + 1.979434, + 1.979603, + 1.979770, + 1.979934, + 1.980097, + 1.980258, + 1.980417, + 1.980574, + 1.980729, + 1.980882, + 1.981033, + 1.981183, + 1.981331, + 1.981477, + 1.981621, + 1.981764, + 1.981905, + 1.982044, + 1.982182, + 1.982319, + 1.982453, + 1.982586, + 1.982718, + 1.982848, + 1.982977, + 1.983104, + 1.983230, + 1.983355, + 1.983478, + 1.983599, + 1.983720, + 1.983839, + 1.983956, + 1.984073, + 1.984188, + 1.984302, + 1.984415, + 1.984526, + 1.984637, + 1.984746, + 1.984854, + 1.984961, + 1.985067, + 1.985171, + 1.985275, + 1.985377, + 1.985479, + 1.985579, + 1.985678, + 1.985777, + 1.985874, + 1.985970, + 1.986065, + 1.986160, + 1.986253, + 1.986346, + 1.986437, + 1.986528, + 1.986617, + 1.986706, + 1.986794, + 1.986881, + 1.986967, + 1.987053, + 1.987137, + 1.987221, + 1.987304, + 1.987386, + 1.987467, + 1.987548, + 1.987627, + 1.987706, + 1.987785, + 1.987862, + 1.987939, + 1.988015, + 1.988090, + 1.988165, + 1.988239, + 1.988312, + 1.988384, + 1.988456, + 1.988527, + 1.988598, + 1.988668, + 1.988737, + 1.988806, + 1.988874, + 1.988941, + 1.989008, + 1.989074, + 1.989139, + 1.989204, + 1.989269, + 1.989333, + 1.989396, + 1.989459, + 1.989521, + 1.989582, + 1.989643, + 1.989704, + 1.989764, + 1.989823, + 1.989882, + 1.989941, + 1.989999, + 1.990056, + 1.990113, + 1.990169, + 1.990225, + 1.990281, + 1.990336, + 1.990390, + 1.990445, + 1.990498, + 1.990551, + 1.990604, + 1.990656, + 1.990708, + 1.990760, + 1.990811, + 1.990861, + 1.990912, + 1.990961, + 1.991011, + 1.991060, + 1.991108, + 1.991156, + 1.991204, + 1.991252, + 1.991299, + 1.991345, + 1.991391, + 1.991437, + 1.991483, + 1.991528, + 1.991573, + 1.991617, + 1.991661, + 1.991705, + 1.991749, + 1.991792, + 1.991834, + 1.991877, + 1.991919, + 1.991961, + 1.992002, + 1.992043, + 1.992084, + 1.992124, + 1.992164, + 1.992204, + 1.992244, + 1.992283, + 1.992322, + 1.992361, + 1.992399, + 1.992437, + 1.992475, + 1.992512, + 1.992550, + 1.992587, + 1.992623, + 1.992660, + 1.992696, + 1.992732, + 1.992767, + 1.992803, + 1.992838, + 1.992873, + 1.992907, + 1.992942, + 1.992976, + 1.993010, + 1.993043, + 1.993077, + 1.993110, + 1.993143, + 1.993175, + 1.993208, + 1.993240, + 1.993272, + 1.993303, + 1.993335, + 1.993366, + 1.993397, + 1.993428, + 1.993459, + 1.993489, + 1.993519, + 1.993549, + 1.993579, + 1.993609, + 1.993638, + 1.993667, + 1.993696, + 1.993725, + 1.993754, + 1.993782, + 1.993810, + 1.993838, + 1.993866, + 1.993894, + 1.993921, + 1.993948, + 1.993975, + 1.994002, + 1.994029, + 1.994056, + 1.994082, + 1.994108, + 1.994134, + 1.994160, + 1.994186, + 1.994211, + 1.994236, + 1.994262, + 1.994287, + 1.994311, + 1.994336, + 1.994361, + 1.994385, + 1.994409, + 1.994433, + 1.994457, + 1.994481, + 1.994504, + 1.994528, + 1.994551, + 1.994574, + 1.994597, + 1.994620, + 1.994643, + 1.994665, + 1.994688, + 1.994710, + 1.994732, + 1.994754, + 1.994776, + 1.994798, + 1.994819, + 1.994841, + 1.994862, + 1.994883, + 1.994904, + 1.994925, + 1.994946, + 1.994967, + 1.994987, + 1.995008, + 1.995028, + 1.995048, + 1.995068, + 1.995088, + 1.995108, + 1.995128, + 1.995147, + 1.995167, + 1.995186, + 1.995205, + 1.995224, + 1.995243, + 1.995262, + 1.995281, + 1.995299, + 1.995318, + 1.995336, + 1.995355, + 1.995373, + 1.995391, + 1.995409, + 1.995427, + 1.995445, + 1.995463, + 1.995480, + 1.995498, + 1.995515, + 1.995532, + 1.995549, + 1.995567, + 1.995583, + 1.995600, + 1.995617, + 1.995634, + 1.995650, + 1.995667, + 1.995683, + 1.995700, + 1.995716, + 1.995732, + 1.995748, + 1.995764, + 1.995780, + 1.995796, + 1.995811, + 1.995827, + 1.995843, + 1.995858, + 1.995873, + 1.995889, + 1.995904, + 1.995919, + 1.995934, + 1.995949, + 1.995964, + 1.995978, + 1.995993, + 1.996008, + 1.996022, + 1.996037, + 1.996051, + 1.996065, + 1.996079, + 1.996094, + 1.996108, + 1.996122, + 1.996135, + 1.996149, + 1.996163, + 1.996177, + 1.996190, + 1.996204, + 1.996217, + 1.996231, + 1.996244, + 1.996257, + 1.996270, + 1.996284, + 1.996297, + 1.996310, + 1.996322, + 1.996335, + 1.996348, + 1.996361, + 1.996373, + 1.996386, + 1.996399, + 1.996411, + 1.996423, + 1.996436, + 1.996448, + 1.996460, + 1.996472, + 1.996484, + 1.996496, + 1.996508, + 1.996520, + 1.996532, + 1.996544, + 1.996555, + 1.996567, + 1.996579, + 1.996590, + 1.996602, + 1.996613, + 1.996624, + 1.996636, + 1.996647, + 1.996658, + 1.996669, + 1.996680, + 1.996691, + 1.996702, + 1.996713, + 1.996724, + 1.996735, + 1.996745, + 1.996756, + 1.996767, + 1.996777, + 1.996788, + 1.996798, + 1.996809, + 1.996819, + 1.996830, + 1.996840, + 1.996850, + 1.996860, + 1.996870, + 1.996880, + 1.996890, + 1.996900, + 1.996910, + 1.996920, + 1.996930, + 1.996940, + 1.996950, + 1.996959, + 1.996969, + 1.996979, + 1.996988, + 1.996998, + 1.997007, + 1.997017, + 1.997026, + 1.997035, + 1.997045, + 1.997054, + 1.997063, + 1.997072, + 1.997081, + 1.997090, + 1.997099, + 1.997108, + 1.997117, + 1.997126, + 1.997135, + 1.997144, + 1.997153, + 1.997162, + 1.997170, + 1.997179, + 1.997188, + 1.997196, + 1.997205, + 1.997213, + 1.997222, + 1.997230, + 1.997239, + 1.997247, + 1.997255, + 1.997263, + 1.997272, + 1.997280, + 1.997288, + 1.997296, + 1.997304, + 1.997312, + 1.997320, + 1.997328, + 1.997336, + 1.997344, + 1.997352, + 1.997360, + 1.997368, + 1.997376, + 1.997383, + 1.997391, + 1.997399, + 1.997406, + 1.997414, + 1.997422, + 1.997429, + 1.997437, + 1.997444, + 1.997451, + 1.997459, + 1.997466, + 1.997474, + 1.997481, + 1.997488, + 1.997495, + 1.997503, + 1.997510, + 1.997517, + 1.997524, + 1.997531, + 1.997538, + 1.997545, + 1.997552, + 1.997559, + 1.997566, + 1.997573, + 1.997580, + 1.997587, + 1.997594, + 1.997601, + 1.997607, + 1.997614, + 1.997621, + 1.997627, + 1.997634, + 1.997641, + 1.997647, + 1.997654, + 1.997660, + 1.997667, + 1.997673, + 1.997680, + 1.997686, + 1.997693, + 1.997699, + 1.997706, + 1.997712, + 1.997718, + 1.997724, + 1.997731, + 1.997737, + 1.997743, + 1.997749, + 1.997755, + 1.997762, + 1.997768, + 1.997774, + 1.997780, + 1.997786, + 1.997792, + 1.997798, + 1.997804, + 1.997810, + 1.997816, + 1.997821, + 1.997827, + 1.997833, + 1.997839, + 1.997845, + 1.997851, + 1.997856, + 1.997862, + 1.997868, + 1.997873, + 1.997879, + 1.997885, + 1.997890, + 1.997896, + 1.997901, + 1.997907, + 1.997912, + 1.997918, + 1.997923, + 1.997929, + 1.997934, + 1.997940, + 1.997945, + 1.997950, + 1.997956, + 1.997961, + 1.997966, + 1.997972, + 1.997977, + 1.997982, + 1.997987, + 1.997993, + 1.997998, + 1.998003, + 1.998008, + 1.998013, + 1.998018, + 1.998023, + 1.998028, + 1.998034, + 1.998039, + 1.998044, + 1.998049, + 1.998054, + 1.998058, + 1.998063, + 1.998068, + 1.998073, + 1.998078, + 1.998083, + 1.998088, + 1.998093, + 1.998097, + 1.998102, + 1.998107, + 1.998112, + 1.998116, + 1.998121, + 1.998126, + 1.998130, + 1.998135, + 1.998140, + 1.998144, + 1.998149, + 1.998154, + 1.998158, + 1.998163, + 1.998167, + 1.998172, + 1.998176, + 1.998181, + 1.998185, + 1.998190, + 1.998194, + 1.998199, + 1.998203, + 1.998207, + 1.998212, + 1.998216, + 1.998220, + 1.998225, + 1.998229, + 1.998233, + 1.998238, + 1.998242, + 1.998246, + 1.998250, + 1.998255, + 1.998259, + 1.998263, + 1.998267, + 1.998271, + 1.998275, + 1.998280, + 1.998284, + 1.998288, + 1.998292, + 1.998296, + 1.998300, + 1.998304, + 1.998308, + 1.998312, + 1.998316, + 1.998320, + 1.998324, + 1.998328, + 1.998332, + 1.998336, + 1.998340, + 1.998344, + 1.998347, + 1.998351, + 1.998355, + 1.998359, + 1.998363, + 1.998367, + 1.998371, + 1.998374, + 1.998378, + 1.998382, + 1.998386, + 1.998389, + 1.998393, + 1.998397, + 1.998400, + 1.998404, + 1.998408, + 1.998411, + 1.998415, + 1.998419, + 1.998422, + 1.998426, + 1.998430, + 1.998433, + 1.998437, + 1.998440, + 1.998444, + 1.998447, + 1.998451, + 1.998454, + 1.998458, + 1.998461, + 1.998465, + 1.998468, + 1.998472, + 1.998475, + 1.998479, + 1.998482, + 1.998486, + 1.998489, + 1.998492, + 1.998496, + 1.998499, + 1.998502, + 1.998506, + 1.998509, + 1.998512, + 1.998516, + 1.998519, + 1.998522, + 1.998526, + 1.998529, + 1.998532, + 1.998535, + 1.998539, + 1.998542, + 1.998545, + 1.998548, + 1.998551, + 1.998555, + 1.998558, + 1.998561, + 1.998564, + 1.998567, + 1.998570, + 1.998573, + 1.998576, + 1.998580, + 1.998583, + 1.998586, + 1.998589, + 1.998592, + 1.998595, + 1.998598, + 1.998601, + 1.998604, + 1.998607, + 1.998610, + 1.998613, + 1.998616, + 1.998619, + 1.998622, + 1.998625, + 1.998628, + 1.998631, + 1.998634, + 1.998637, + 1.998639, + 1.998642, + 1.998645, + 1.998648, + 1.998651, + 1.998654, + 1.998657, + 1.998659, + 1.998662, + 1.998665, + 1.998668, + 1.998671, + 1.998674, + 1.998676, + 1.998679, + 1.998682, + 1.998685, + 1.998687, + 1.998690, + 1.998693, + 1.998696, + 1.998698, + 1.998701, + 1.998704, + 1.998706, + 1.998709, + 1.998712, + 1.998714, + 1.998717, + 1.998720, + 1.998722, + 1.998725, + 1.998728, + 1.998730, + 1.998733, + 1.998735, + 1.998738, + 1.998741, + 1.998743, + 1.998746, + 1.998748, + 1.998751, + 1.998753, + 1.998756, + 1.998758, + 1.998761, + 1.998764, + 1.998766, + 1.998769, + 1.998771, + 1.998773, + 1.998776, + 1.998778, + 1.998781, + 1.998783, + 1.998786, + 1.998788, + 1.998791, + 1.998793, + 1.998796, + 1.998798, + 1.998800, + }, + {// The expectations for dimension = 5 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026666, + 0.041662, + 0.059984, + 0.081621, + 0.106553, + 0.134748, + 0.166158, + 0.200713, + 0.238318, + 0.278852, + 0.322160, + 0.368059, + 0.416335, + 0.466743, + 0.519015, + 0.572860, + 0.627973, + 0.684040, + 0.740742, + 0.797765, + 0.854805, + 0.911574, + 0.967803, + 1.023247, + 1.077689, + 1.130939, + 1.182837, + 1.233252, + 1.282082, + 1.329251, + 1.374705, + 1.418416, + 1.460373, + 1.500584, + 1.539068, + 1.575858, + 1.610997, + 1.644533, + 1.676522, + 1.707022, + 1.736094, + 1.763800, + 1.790203, + 1.815364, + 1.839344, + 1.862203, + 1.883998, + 1.904783, + 1.924613, + 1.943538, + 1.961605, + 1.978861, + 1.995348, + 2.011107, + 2.026178, + 2.040597, + 2.054398, + 2.067614, + 2.080275, + 2.092410, + 2.104046, + 2.115210, + 2.125924, + 2.136211, + 2.146094, + 2.155591, + 2.164723, + 2.173506, + 2.181959, + 2.190095, + 2.197932, + 2.205481, + 2.212759, + 2.219775, + 2.226544, + 2.233075, + 2.239380, + 2.245468, + 2.251350, + 2.257034, + 2.262529, + 2.267843, + 2.272983, + 2.277958, + 2.282773, + 2.287436, + 2.291952, + 2.296329, + 2.300570, + 2.304683, + 2.308671, + 2.312540, + 2.316294, + 2.319938, + 2.323476, + 2.326912, + 2.330250, + 2.333493, + 2.336646, + 2.339710, + 2.342690, + 2.345589, + 2.348409, + 2.351153, + 2.353825, + 2.356425, + 2.358958, + 2.361424, + 2.363828, + 2.366169, + 2.368452, + 2.370677, + 2.372846, + 2.374962, + 2.377026, + 2.379039, + 2.381004, + 2.382922, + 2.384794, + 2.386622, + 2.388407, + 2.390150, + 2.391854, + 2.393518, + 2.395144, + 2.396734, + 2.398288, + 2.399807, + 2.401293, + 2.402746, + 2.404168, + 2.405559, + 2.406920, + 2.408251, + 2.409555, + 2.410831, + 2.412081, + 2.413305, + 2.414503, + 2.415677, + 2.416827, + 2.417953, + 2.419057, + 2.420140, + 2.421200, + 2.422240, + 2.423259, + 2.424259, + 2.425239, + 2.426200, + 2.427144, + 2.428069, + 2.428977, + 2.429867, + 2.430741, + 2.431599, + 2.432442, + 2.433269, + 2.434080, + 2.434877, + 2.435660, + 2.436429, + 2.437184, + 2.437926, + 2.438655, + 2.439371, + 2.440075, + 2.440767, + 2.441446, + 2.442114, + 2.442771, + 2.443417, + 2.444052, + 2.444676, + 2.445290, + 2.445894, + 2.446488, + 2.447072, + 2.447647, + 2.448212, + 2.448769, + 2.449316, + 2.449855, + 2.450385, + 2.450907, + 2.451421, + 2.451926, + 2.452424, + 2.452915, + 2.453397, + 2.453873, + 2.454341, + 2.454802, + 2.455256, + 2.455703, + 2.456144, + 2.456578, + 2.457006, + 2.457427, + 2.457843, + 2.458252, + 2.458655, + 2.459053, + 2.459445, + 2.459831, + 2.460212, + 2.460587, + 2.460958, + 2.461323, + 2.461682, + 2.462037, + 2.462387, + 2.462733, + 2.463073, + 2.463409, + 2.463740, + 2.464067, + 2.464390, + 2.464708, + 2.465022, + 2.465331, + 2.465637, + 2.465939, + 2.466236, + 2.466530, + 2.466820, + 2.467106, + 2.467389, + 2.467668, + 2.467943, + 2.468215, + 2.468484, + 2.468749, + 2.469010, + 2.469269, + 2.469524, + 2.469776, + 2.470025, + 2.470271, + 2.470514, + 2.470754, + 2.470991, + 2.471225, + 2.471457, + 2.471685, + 2.471911, + 2.472134, + 2.472355, + 2.472573, + 2.472788, + 2.473001, + 2.473211, + 2.473419, + 2.473625, + 2.473828, + 2.474029, + 2.474227, + 2.474424, + 2.474618, + 2.474809, + 2.474999, + 2.475187, + 2.475372, + 2.475555, + 2.475737, + 2.475916, + 2.476093, + 2.476269, + 2.476442, + 2.476614, + 2.476783, + 2.476951, + 2.477117, + 2.477282, + 2.477444, + 2.477605, + 2.477764, + 2.477921, + 2.478077, + 2.478231, + 2.478384, + 2.478534, + 2.478684, + 2.478832, + 2.478978, + 2.479122, + 2.479266, + 2.479407, + 2.479548, + 2.479687, + 2.479824, + 2.479960, + 2.480095, + 2.480228, + 2.480360, + 2.480491, + 2.480620, + 2.480748, + 2.480875, + 2.481001, + 2.481125, + 2.481249, + 2.481370, + 2.481491, + 2.481611, + 2.481729, + 2.481847, + 2.481963, + 2.482078, + 2.482192, + 2.482305, + 2.482417, + 2.482527, + 2.482637, + 2.482746, + 2.482854, + 2.482960, + 2.483066, + 2.483171, + 2.483274, + 2.483377, + 2.483479, + 2.483580, + 2.483680, + 2.483779, + 2.483877, + 2.483974, + 2.484071, + 2.484166, + 2.484261, + 2.484355, + 2.484448, + 2.484540, + 2.484632, + 2.484722, + 2.484812, + 2.484901, + 2.484989, + 2.485077, + 2.485163, + 2.485249, + 2.485334, + 2.485419, + 2.485502, + 2.485585, + 2.485668, + 2.485749, + 2.485830, + 2.485910, + 2.485990, + 2.486069, + 2.486147, + 2.486224, + 2.486301, + 2.486378, + 2.486453, + 2.486528, + 2.486603, + 2.486676, + 2.486749, + 2.486822, + 2.486894, + 2.486965, + 2.487036, + 2.487106, + 2.487176, + 2.487245, + 2.487313, + 2.487381, + 2.487449, + 2.487516, + 2.487582, + 2.487648, + 2.487713, + 2.487778, + 2.487842, + 2.487906, + 2.487969, + 2.488032, + 2.488094, + 2.488156, + 2.488218, + 2.488278, + 2.488339, + 2.488399, + 2.488458, + 2.488517, + 2.488576, + 2.488634, + 2.488691, + 2.488749, + 2.488805, + 2.488862, + 2.488918, + 2.488973, + 2.489028, + 2.489083, + 2.489137, + 2.489191, + 2.489245, + 2.489298, + 2.489350, + 2.489403, + 2.489455, + 2.489506, + 2.489557, + 2.489608, + 2.489659, + 2.489709, + 2.489758, + 2.489808, + 2.489857, + 2.489905, + 2.489953, + 2.490001, + 2.490049, + 2.490096, + 2.490143, + 2.490190, + 2.490236, + 2.490282, + 2.490328, + 2.490373, + 2.490418, + 2.490462, + 2.490507, + 2.490551, + 2.490595, + 2.490638, + 2.490681, + 2.490724, + 2.490766, + 2.490809, + 2.490851, + 2.490892, + 2.490934, + 2.490975, + 2.491016, + 2.491056, + 2.491096, + 2.491136, + 2.491176, + 2.491216, + 2.491255, + 2.491294, + 2.491332, + 2.491371, + 2.491409, + 2.491447, + 2.491485, + 2.491522, + 2.491559, + 2.491596, + 2.491633, + 2.491669, + 2.491705, + 2.491741, + 2.491777, + 2.491813, + 2.491848, + 2.491883, + 2.491918, + 2.491952, + 2.491987, + 2.492021, + 2.492055, + 2.492089, + 2.492122, + 2.492155, + 2.492189, + 2.492221, + 2.492254, + 2.492287, + 2.492319, + 2.492351, + 2.492383, + 2.492414, + 2.492446, + 2.492477, + 2.492508, + 2.492539, + 2.492570, + 2.492600, + 2.492631, + 2.492661, + 2.492691, + 2.492720, + 2.492750, + 2.492779, + 2.492809, + 2.492838, + 2.492867, + 2.492895, + 2.492924, + 2.492952, + 2.492980, + 2.493008, + 2.493036, + 2.493064, + 2.493091, + 2.493119, + 2.493146, + 2.493173, + 2.493200, + 2.493227, + 2.493253, + 2.493280, + 2.493306, + 2.493332, + 2.493358, + 2.493384, + 2.493409, + 2.493435, + 2.493460, + 2.493485, + 2.493510, + 2.493535, + 2.493560, + 2.493585, + 2.493609, + 2.493634, + 2.493658, + 2.493682, + 2.493706, + 2.493729, + 2.493753, + 2.493777, + 2.493800, + 2.493823, + 2.493846, + 2.493869, + 2.493892, + 2.493915, + 2.493938, + 2.493960, + 2.493983, + 2.494005, + 2.494027, + 2.494049, + 2.494071, + 2.494093, + 2.494114, + 2.494136, + 2.494157, + 2.494178, + 2.494200, + 2.494221, + 2.494242, + 2.494262, + 2.494283, + 2.494304, + 2.494324, + 2.494345, + 2.494365, + 2.494385, + 2.494405, + 2.494425, + 2.494445, + 2.494465, + 2.494484, + 2.494504, + 2.494523, + 2.494542, + 2.494562, + 2.494581, + 2.494600, + 2.494619, + 2.494638, + 2.494656, + 2.494675, + 2.494693, + 2.494712, + 2.494730, + 2.494748, + 2.494767, + 2.494785, + 2.494802, + 2.494820, + 2.494838, + 2.494856, + 2.494873, + 2.494891, + 2.494908, + 2.494926, + 2.494943, + 2.494960, + 2.494977, + 2.494994, + 2.495011, + 2.495028, + 2.495044, + 2.495061, + 2.495078, + 2.495094, + 2.495110, + 2.495127, + 2.495143, + 2.495159, + 2.495175, + 2.495191, + 2.495207, + 2.495223, + 2.495239, + 2.495254, + 2.495270, + 2.495285, + 2.495301, + 2.495316, + 2.495331, + 2.495347, + 2.495362, + 2.495377, + 2.495392, + 2.495407, + 2.495422, + 2.495436, + 2.495451, + 2.495466, + 2.495480, + 2.495495, + 2.495509, + 2.495523, + 2.495538, + 2.495552, + 2.495566, + 2.495580, + 2.495594, + 2.495608, + 2.495622, + 2.495636, + 2.495650, + 2.495663, + 2.495677, + 2.495690, + 2.495704, + 2.495717, + 2.495731, + 2.495744, + 2.495757, + 2.495770, + 2.495784, + 2.495797, + 2.495810, + 2.495822, + 2.495835, + 2.495848, + 2.495861, + 2.495874, + 2.495886, + 2.495899, + 2.495911, + 2.495924, + 2.495936, + 2.495949, + 2.495961, + 2.495973, + 2.495985, + 2.495997, + 2.496010, + 2.496022, + 2.496034, + 2.496045, + 2.496057, + 2.496069, + 2.496081, + 2.496093, + 2.496104, + 2.496116, + 2.496127, + 2.496139, + 2.496150, + 2.496162, + 2.496173, + 2.496184, + 2.496196, + 2.496207, + 2.496218, + 2.496229, + 2.496240, + 2.496251, + 2.496262, + 2.496273, + 2.496284, + 2.496294, + 2.496305, + 2.496316, + 2.496327, + 2.496337, + 2.496348, + 2.496358, + 2.496369, + 2.496379, + 2.496390, + 2.496400, + 2.496410, + 2.496421, + 2.496431, + 2.496441, + 2.496451, + 2.496461, + 2.496471, + 2.496481, + 2.496491, + 2.496501, + 2.496511, + 2.496521, + 2.496531, + 2.496540, + 2.496550, + 2.496560, + 2.496569, + 2.496579, + 2.496588, + 2.496598, + 2.496607, + 2.496617, + 2.496626, + 2.496636, + 2.496645, + 2.496654, + 2.496663, + 2.496673, + 2.496682, + 2.496691, + 2.496700, + 2.496709, + 2.496718, + 2.496727, + 2.496736, + 2.496745, + 2.496754, + 2.496762, + 2.496771, + 2.496780, + 2.496789, + 2.496797, + 2.496806, + 2.496815, + 2.496823, + 2.496832, + 2.496840, + 2.496849, + 2.496857, + 2.496866, + 2.496874, + 2.496882, + 2.496891, + 2.496899, + 2.496907, + 2.496915, + 2.496923, + 2.496932, + 2.496940, + 2.496948, + 2.496956, + 2.496964, + 2.496972, + 2.496980, + 2.496988, + 2.496996, + 2.497003, + 2.497011, + 2.497019, + 2.497027, + 2.497035, + 2.497042, + 2.497050, + 2.497058, + 2.497065, + 2.497073, + 2.497080, + 2.497088, + 2.497095, + 2.497103, + 2.497110, + 2.497118, + 2.497125, + 2.497132, + 2.497140, + 2.497147, + 2.497154, + 2.497162, + 2.497169, + 2.497176, + 2.497183, + 2.497190, + 2.497197, + 2.497204, + 2.497211, + 2.497218, + 2.497225, + 2.497232, + 2.497239, + 2.497246, + 2.497253, + 2.497260, + 2.497267, + 2.497274, + 2.497281, + 2.497287, + 2.497294, + 2.497301, + 2.497307, + 2.497314, + 2.497321, + 2.497327, + 2.497334, + 2.497341, + 2.497347, + 2.497354, + 2.497360, + 2.497367, + 2.497373, + 2.497379, + 2.497386, + 2.497392, + 2.497399, + 2.497405, + 2.497411, + 2.497417, + 2.497424, + 2.497430, + 2.497436, + 2.497442, + 2.497449, + 2.497455, + 2.497461, + 2.497467, + 2.497473, + 2.497479, + 2.497485, + 2.497491, + 2.497497, + 2.497503, + 2.497509, + 2.497515, + 2.497521, + 2.497527, + 2.497533, + 2.497539, + 2.497544, + 2.497550, + 2.497556, + 2.497562, + 2.497567, + 2.497573, + 2.497579, + 2.497585, + 2.497590, + 2.497596, + 2.497601, + 2.497607, + 2.497613, + 2.497618, + 2.497624, + 2.497629, + 2.497635, + 2.497640, + 2.497646, + 2.497651, + 2.497657, + 2.497662, + 2.497667, + 2.497673, + 2.497678, + 2.497684, + 2.497689, + 2.497694, + 2.497699, + 2.497705, + 2.497710, + 2.497715, + 2.497720, + 2.497726, + 2.497731, + 2.497736, + 2.497741, + 2.497746, + 2.497751, + 2.497756, + 2.497761, + 2.497767, + 2.497772, + 2.497777, + 2.497782, + 2.497787, + 2.497792, + 2.497796, + 2.497801, + 2.497806, + 2.497811, + 2.497816, + 2.497821, + 2.497826, + 2.497831, + 2.497836, + 2.497840, + 2.497845, + 2.497850, + 2.497855, + 2.497859, + 2.497864, + 2.497869, + 2.497874, + 2.497878, + 2.497883, + 2.497887, + 2.497892, + 2.497897, + 2.497901, + 2.497906, + 2.497911, + 2.497915, + 2.497920, + 2.497924, + 2.497929, + 2.497933, + 2.497938, + 2.497942, + 2.497947, + 2.497951, + 2.497955, + 2.497960, + 2.497964, + 2.497969, + 2.497973, + 2.497977, + 2.497982, + 2.497986, + 2.497990, + 2.497995, + 2.497999, + 2.498003, + 2.498007, + 2.498012, + 2.498016, + 2.498020, + 2.498024, + 2.498029, + 2.498033, + 2.498037, + 2.498041, + 2.498045, + 2.498049, + 2.498053, + 2.498058, + 2.498062, + 2.498066, + 2.498070, + 2.498074, + 2.498078, + 2.498082, + 2.498086, + 2.498090, + 2.498094, + 2.498098, + 2.498102, + 2.498106, + 2.498110, + 2.498114, + 2.498117, + 2.498121, + 2.498125, + 2.498129, + 2.498133, + 2.498137, + 2.498141, + 2.498144, + 2.498148, + 2.498152, + 2.498156, + 2.498160, + 2.498163, + 2.498167, + 2.498171, + 2.498175, + 2.498178, + 2.498182, + 2.498186, + 2.498190, + 2.498193, + 2.498197, + 2.498201, + 2.498204, + 2.498208, + 2.498211, + 2.498215, + 2.498219, + 2.498222, + 2.498226, + 2.498229, + 2.498233, + 2.498236, + 2.498240, + 2.498244, + 2.498247, + 2.498251, + }, + {// The expectations for dimension = 6 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041666, + 0.059997, + 0.081658, + 0.106641, + 0.134937, + 0.166526, + 0.201378, + 0.239447, + 0.280670, + 0.324959, + 0.372200, + 0.422251, + 0.474939, + 0.530062, + 0.587384, + 0.646647, + 0.707566, + 0.769839, + 0.833150, + 0.897178, + 0.961602, + 1.026105, + 1.090386, + 1.154159, + 1.217162, + 1.279157, + 1.339936, + 1.399317, + 1.457150, + 1.513314, + 1.567717, + 1.620290, + 1.670990, + 1.719795, + 1.766702, + 1.811724, + 1.854888, + 1.896231, + 1.935798, + 1.973645, + 2.009827, + 2.044408, + 2.077451, + 2.109019, + 2.139179, + 2.167993, + 2.195526, + 2.221839, + 2.246990, + 2.271038, + 2.294037, + 2.316040, + 2.337097, + 2.357257, + 2.376564, + 2.395062, + 2.412791, + 2.429791, + 2.446098, + 2.461746, + 2.476769, + 2.491197, + 2.505060, + 2.518385, + 2.531198, + 2.543524, + 2.555386, + 2.566806, + 2.577805, + 2.588402, + 2.598617, + 2.608467, + 2.617968, + 2.627136, + 2.635985, + 2.644531, + 2.652787, + 2.660764, + 2.668475, + 2.675932, + 2.683146, + 2.690125, + 2.696881, + 2.703423, + 2.709759, + 2.715897, + 2.721846, + 2.727613, + 2.733206, + 2.738630, + 2.743894, + 2.749002, + 2.753962, + 2.758777, + 2.763455, + 2.768000, + 2.772417, + 2.776710, + 2.780885, + 2.784945, + 2.788895, + 2.792738, + 2.796478, + 2.800119, + 2.803664, + 2.807117, + 2.810480, + 2.813758, + 2.816951, + 2.820064, + 2.823100, + 2.826059, + 2.828946, + 2.831762, + 2.834510, + 2.837191, + 2.839809, + 2.842364, + 2.844859, + 2.847296, + 2.849677, + 2.852002, + 2.854275, + 2.856496, + 2.858667, + 2.860789, + 2.862864, + 2.864894, + 2.866879, + 2.868821, + 2.870721, + 2.872581, + 2.874401, + 2.876182, + 2.877926, + 2.879633, + 2.881306, + 2.882944, + 2.884548, + 2.886120, + 2.887660, + 2.889169, + 2.890648, + 2.892098, + 2.893520, + 2.894914, + 2.896280, + 2.897621, + 2.898935, + 2.900225, + 2.901490, + 2.902731, + 2.903950, + 2.905145, + 2.906319, + 2.907471, + 2.908602, + 2.909712, + 2.910802, + 2.911873, + 2.912925, + 2.913958, + 2.914973, + 2.915970, + 2.916950, + 2.917913, + 2.918859, + 2.919789, + 2.920703, + 2.921602, + 2.922486, + 2.923354, + 2.924209, + 2.925049, + 2.925875, + 2.926688, + 2.927488, + 2.928274, + 2.929048, + 2.929809, + 2.930559, + 2.931296, + 2.932022, + 2.932736, + 2.933440, + 2.934132, + 2.934813, + 2.935485, + 2.936145, + 2.936796, + 2.937437, + 2.938068, + 2.938690, + 2.939302, + 2.939906, + 2.940500, + 2.941086, + 2.941663, + 2.942231, + 2.942792, + 2.943344, + 2.943888, + 2.944425, + 2.944954, + 2.945475, + 2.945990, + 2.946496, + 2.946996, + 2.947489, + 2.947975, + 2.948454, + 2.948927, + 2.949393, + 2.949853, + 2.950307, + 2.950755, + 2.951196, + 2.951632, + 2.952062, + 2.952486, + 2.952905, + 2.953318, + 2.953726, + 2.954128, + 2.954525, + 2.954917, + 2.955304, + 2.955686, + 2.956064, + 2.956436, + 2.956804, + 2.957167, + 2.957525, + 2.957879, + 2.958229, + 2.958574, + 2.958916, + 2.959252, + 2.959585, + 2.959914, + 2.960239, + 2.960560, + 2.960876, + 2.961190, + 2.961499, + 2.961805, + 2.962107, + 2.962405, + 2.962701, + 2.962992, + 2.963280, + 2.963565, + 2.963847, + 2.964125, + 2.964400, + 2.964672, + 2.964941, + 2.965207, + 2.965470, + 2.965729, + 2.965986, + 2.966240, + 2.966492, + 2.966740, + 2.966986, + 2.967229, + 2.967469, + 2.967707, + 2.967942, + 2.968174, + 2.968404, + 2.968632, + 2.968857, + 2.969080, + 2.969300, + 2.969518, + 2.969734, + 2.969947, + 2.970158, + 2.970367, + 2.970574, + 2.970778, + 2.970981, + 2.971181, + 2.971379, + 2.971576, + 2.971770, + 2.971962, + 2.972152, + 2.972341, + 2.972527, + 2.972712, + 2.972895, + 2.973076, + 2.973255, + 2.973432, + 2.973608, + 2.973782, + 2.973954, + 2.974124, + 2.974293, + 2.974460, + 2.974626, + 2.974790, + 2.974952, + 2.975113, + 2.975272, + 2.975430, + 2.975586, + 2.975741, + 2.975894, + 2.976046, + 2.976196, + 2.976345, + 2.976493, + 2.976639, + 2.976784, + 2.976927, + 2.977069, + 2.977210, + 2.977350, + 2.977488, + 2.977625, + 2.977761, + 2.977896, + 2.978029, + 2.978161, + 2.978292, + 2.978422, + 2.978550, + 2.978678, + 2.978804, + 2.978929, + 2.979054, + 2.979177, + 2.979299, + 2.979420, + 2.979539, + 2.979658, + 2.979776, + 2.979893, + 2.980008, + 2.980123, + 2.980237, + 2.980350, + 2.980461, + 2.980572, + 2.980682, + 2.980791, + 2.980899, + 2.981007, + 2.981113, + 2.981218, + 2.981323, + 2.981426, + 2.981529, + 2.981631, + 2.981732, + 2.981832, + 2.981932, + 2.982030, + 2.982128, + 2.982225, + 2.982322, + 2.982417, + 2.982512, + 2.982606, + 2.982699, + 2.982791, + 2.982883, + 2.982974, + 2.983064, + 2.983154, + 2.983242, + 2.983330, + 2.983418, + 2.983505, + 2.983591, + 2.983676, + 2.983761, + 2.983845, + 2.983928, + 2.984011, + 2.984093, + 2.984175, + 2.984255, + 2.984336, + 2.984415, + 2.984494, + 2.984573, + 2.984651, + 2.984728, + 2.984805, + 2.984881, + 2.984956, + 2.985031, + 2.985106, + 2.985180, + 2.985253, + 2.985326, + 2.985398, + 2.985470, + 2.985541, + 2.985611, + 2.985681, + 2.985751, + 2.985820, + 2.985889, + 2.985957, + 2.986025, + 2.986092, + 2.986158, + 2.986225, + 2.986290, + 2.986355, + 2.986420, + 2.986485, + 2.986548, + 2.986612, + 2.986675, + 2.986737, + 2.986799, + 2.986861, + 2.986922, + 2.986983, + 2.987043, + 2.987103, + 2.987163, + 2.987222, + 2.987281, + 2.987339, + 2.987397, + 2.987454, + 2.987512, + 2.987568, + 2.987625, + 2.987681, + 2.987736, + 2.987791, + 2.987846, + 2.987901, + 2.987955, + 2.988009, + 2.988062, + 2.988115, + 2.988168, + 2.988220, + 2.988272, + 2.988324, + 2.988375, + 2.988426, + 2.988476, + 2.988527, + 2.988577, + 2.988626, + 2.988676, + 2.988725, + 2.988773, + 2.988822, + 2.988870, + 2.988918, + 2.988965, + 2.989012, + 2.989059, + 2.989106, + 2.989152, + 2.989198, + 2.989243, + 2.989289, + 2.989334, + 2.989379, + 2.989423, + 2.989467, + 2.989511, + 2.989555, + 2.989598, + 2.989642, + 2.989684, + 2.989727, + 2.989769, + 2.989811, + 2.989853, + 2.989895, + 2.989936, + 2.989977, + 2.990018, + 2.990059, + 2.990099, + 2.990139, + 2.990179, + 2.990218, + 2.990258, + 2.990297, + 2.990336, + 2.990374, + 2.990413, + 2.990451, + 2.990489, + 2.990527, + 2.990564, + 2.990601, + 2.990639, + 2.990675, + 2.990712, + 2.990748, + 2.990785, + 2.990821, + 2.990856, + 2.990892, + 2.990927, + 2.990962, + 2.990997, + 2.991032, + 2.991067, + 2.991101, + 2.991135, + 2.991169, + 2.991203, + 2.991236, + 2.991270, + 2.991303, + 2.991336, + 2.991369, + 2.991401, + 2.991434, + 2.991466, + 2.991498, + 2.991530, + 2.991562, + 2.991593, + 2.991625, + 2.991656, + 2.991687, + 2.991718, + 2.991748, + 2.991779, + 2.991809, + 2.991839, + 2.991869, + 2.991899, + 2.991929, + 2.991958, + 2.991988, + 2.992017, + 2.992046, + 2.992075, + 2.992104, + 2.992132, + 2.992161, + 2.992189, + 2.992217, + 2.992245, + 2.992273, + 2.992300, + 2.992328, + 2.992355, + 2.992382, + 2.992409, + 2.992436, + 2.992463, + 2.992490, + 2.992516, + 2.992542, + 2.992569, + 2.992595, + 2.992621, + 2.992646, + 2.992672, + 2.992698, + 2.992723, + 2.992748, + 2.992773, + 2.992798, + 2.992823, + 2.992848, + 2.992873, + 2.992897, + 2.992922, + 2.992946, + 2.992970, + 2.992994, + 2.993018, + 2.993042, + 2.993065, + 2.993089, + 2.993112, + 2.993135, + 2.993158, + 2.993181, + 2.993204, + 2.993227, + 2.993250, + 2.993272, + 2.993295, + 2.993317, + 2.993340, + 2.993362, + 2.993384, + 2.993406, + 2.993427, + 2.993449, + 2.993471, + 2.993492, + 2.993513, + 2.993535, + 2.993556, + 2.993577, + 2.993598, + 2.993619, + 2.993640, + 2.993660, + 2.993681, + 2.993701, + 2.993722, + 2.993742, + 2.993762, + 2.993782, + 2.993802, + 2.993822, + 2.993842, + 2.993861, + 2.993881, + 2.993900, + 2.993920, + 2.993939, + 2.993958, + 2.993977, + 2.993996, + 2.994015, + 2.994034, + 2.994053, + 2.994072, + 2.994090, + 2.994109, + 2.994127, + 2.994145, + 2.994164, + 2.994182, + 2.994200, + 2.994218, + 2.994236, + 2.994254, + 2.994271, + 2.994289, + 2.994307, + 2.994324, + 2.994341, + 2.994359, + 2.994376, + 2.994393, + 2.994410, + 2.994427, + 2.994444, + 2.994461, + 2.994478, + 2.994495, + 2.994511, + 2.994528, + 2.994544, + 2.994561, + 2.994577, + 2.994593, + 2.994609, + 2.994626, + 2.994642, + 2.994658, + 2.994673, + 2.994689, + 2.994705, + 2.994721, + 2.994736, + 2.994752, + 2.994767, + 2.994783, + 2.994798, + 2.994813, + 2.994829, + 2.994844, + 2.994859, + 2.994874, + 2.994889, + 2.994904, + 2.994919, + 2.994933, + 2.994948, + 2.994963, + 2.994977, + 2.994992, + 2.995006, + 2.995020, + 2.995035, + 2.995049, + 2.995063, + 2.995077, + 2.995091, + 2.995105, + 2.995119, + 2.995133, + 2.995147, + 2.995161, + 2.995175, + 2.995188, + 2.995202, + 2.995215, + 2.995229, + 2.995242, + 2.995256, + 2.995269, + 2.995282, + 2.995295, + 2.995308, + 2.995322, + 2.995335, + 2.995348, + 2.995360, + 2.995373, + 2.995386, + 2.995399, + 2.995412, + 2.995424, + 2.995437, + 2.995449, + 2.995462, + 2.995474, + 2.995487, + 2.995499, + 2.995511, + 2.995524, + 2.995536, + 2.995548, + 2.995560, + 2.995572, + 2.995584, + 2.995596, + 2.995608, + 2.995620, + 2.995632, + 2.995643, + 2.995655, + 2.995667, + 2.995678, + 2.995690, + 2.995702, + 2.995713, + 2.995724, + 2.995736, + 2.995747, + 2.995758, + 2.995770, + 2.995781, + 2.995792, + 2.995803, + 2.995814, + 2.995825, + 2.995836, + 2.995847, + 2.995858, + 2.995869, + 2.995880, + 2.995891, + 2.995901, + 2.995912, + 2.995923, + 2.995933, + 2.995944, + 2.995954, + 2.995965, + 2.995975, + 2.995986, + 2.995996, + 2.996006, + 2.996017, + 2.996027, + 2.996037, + 2.996047, + 2.996057, + 2.996067, + 2.996078, + 2.996088, + 2.996097, + 2.996107, + 2.996117, + 2.996127, + 2.996137, + 2.996147, + 2.996157, + 2.996166, + 2.996176, + 2.996186, + 2.996195, + 2.996205, + 2.996214, + 2.996224, + 2.996233, + 2.996243, + 2.996252, + 2.996261, + 2.996271, + 2.996280, + 2.996289, + 2.996298, + 2.996308, + 2.996317, + 2.996326, + 2.996335, + 2.996344, + 2.996353, + 2.996362, + 2.996371, + 2.996380, + 2.996389, + 2.996397, + 2.996406, + 2.996415, + 2.996424, + 2.996432, + 2.996441, + 2.996450, + 2.996458, + 2.996467, + 2.996476, + 2.996484, + 2.996493, + 2.996501, + 2.996509, + 2.996518, + 2.996526, + 2.996535, + 2.996543, + 2.996551, + 2.996559, + 2.996568, + 2.996576, + 2.996584, + 2.996592, + 2.996600, + 2.996608, + 2.996616, + 2.996624, + 2.996632, + 2.996640, + 2.996648, + 2.996656, + 2.996664, + 2.996672, + 2.996680, + 2.996688, + 2.996695, + 2.996703, + 2.996711, + 2.996718, + 2.996726, + 2.996734, + 2.996741, + 2.996749, + 2.996756, + 2.996764, + 2.996771, + 2.996779, + 2.996786, + 2.996794, + 2.996801, + 2.996809, + 2.996816, + 2.996823, + 2.996831, + 2.996838, + 2.996845, + 2.996852, + 2.996859, + 2.996867, + 2.996874, + 2.996881, + 2.996888, + 2.996895, + 2.996902, + 2.996909, + 2.996916, + 2.996923, + 2.996930, + 2.996937, + 2.996944, + 2.996951, + 2.996958, + 2.996965, + 2.996971, + 2.996978, + 2.996985, + 2.996992, + 2.996998, + 2.997005, + 2.997012, + 2.997018, + 2.997025, + 2.997032, + 2.997038, + 2.997045, + 2.997051, + 2.997058, + 2.997064, + 2.997071, + 2.997077, + 2.997084, + 2.997090, + 2.997097, + 2.997103, + 2.997109, + 2.997116, + 2.997122, + 2.997128, + 2.997135, + 2.997141, + 2.997147, + 2.997153, + 2.997159, + 2.997166, + 2.997172, + 2.997178, + 2.997184, + 2.997190, + 2.997196, + 2.997202, + 2.997208, + 2.997214, + 2.997220, + 2.997226, + 2.997232, + 2.997238, + 2.997244, + 2.997250, + 2.997256, + 2.997262, + 2.997267, + 2.997273, + 2.997279, + 2.997285, + 2.997291, + 2.997296, + 2.997302, + 2.997308, + 2.997314, + 2.997319, + 2.997325, + 2.997330, + 2.997336, + 2.997342, + 2.997347, + 2.997353, + 2.997358, + 2.997364, + 2.997369, + 2.997375, + 2.997380, + 2.997386, + 2.997391, + 2.997397, + 2.997402, + 2.997408, + 2.997413, + 2.997418, + 2.997424, + 2.997429, + 2.997434, + 2.997440, + 2.997445, + 2.997450, + 2.997455, + 2.997461, + 2.997466, + 2.997471, + 2.997476, + 2.997481, + 2.997487, + 2.997492, + 2.997497, + 2.997502, + 2.997507, + 2.997512, + 2.997517, + 2.997522, + 2.997527, + 2.997532, + 2.997537, + 2.997542, + 2.997547, + 2.997552, + 2.997557, + 2.997562, + 2.997567, + 2.997572, + 2.997577, + 2.997581, + 2.997586, + 2.997591, + 2.997596, + 2.997601, + }, + {// The expectations for dimension = 7 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081665, + 0.106661, + 0.134985, + 0.166629, + 0.201582, + 0.239825, + 0.281325, + 0.326040, + 0.373906, + 0.424837, + 0.478725, + 0.535430, + 0.594785, + 0.656592, + 0.720620, + 0.786616, + 0.854296, + 0.923361, + 0.993495, + 1.064374, + 1.135670, + 1.207064, + 1.278243, + 1.348913, + 1.418800, + 1.487653, + 1.555252, + 1.621402, + 1.685942, + 1.748737, + 1.809682, + 1.868700, + 1.925737, + 1.980764, + 2.033770, + 2.084762, + 2.133761, + 2.180801, + 2.225926, + 2.269186, + 2.310640, + 2.350347, + 2.388374, + 2.424784, + 2.459644, + 2.493021, + 2.524980, + 2.555585, + 2.584897, + 2.612979, + 2.639887, + 2.665678, + 2.690405, + 2.714120, + 2.736872, + 2.758707, + 2.779669, + 2.799800, + 2.819141, + 2.837730, + 2.855602, + 2.872791, + 2.889329, + 2.905248, + 2.920576, + 2.935340, + 2.949566, + 2.963280, + 2.976504, + 2.989260, + 3.001569, + 3.013452, + 3.024927, + 3.036011, + 3.046722, + 3.057075, + 3.067086, + 3.076770, + 3.086140, + 3.095209, + 3.103989, + 3.112493, + 3.120732, + 3.128715, + 3.136454, + 3.143958, + 3.151236, + 3.158297, + 3.165150, + 3.171802, + 3.178261, + 3.184534, + 3.190628, + 3.196550, + 3.202306, + 3.207902, + 3.213344, + 3.218638, + 3.223788, + 3.228800, + 3.233678, + 3.238428, + 3.243053, + 3.247558, + 3.251947, + 3.256224, + 3.260393, + 3.264456, + 3.268418, + 3.272283, + 3.276052, + 3.279729, + 3.283318, + 3.286820, + 3.290239, + 3.293577, + 3.296837, + 3.300021, + 3.303131, + 3.306170, + 3.309139, + 3.312042, + 3.314879, + 3.317653, + 3.320366, + 3.323019, + 3.325614, + 3.328153, + 3.330638, + 3.333069, + 3.335449, + 3.337778, + 3.340059, + 3.342292, + 3.344479, + 3.346622, + 3.348720, + 3.350776, + 3.352791, + 3.354766, + 3.356701, + 3.358598, + 3.360458, + 3.362281, + 3.364070, + 3.365824, + 3.367544, + 3.369232, + 3.370888, + 3.372512, + 3.374107, + 3.375672, + 3.377208, + 3.378716, + 3.380196, + 3.381650, + 3.383077, + 3.384479, + 3.385856, + 3.387208, + 3.388537, + 3.389843, + 3.391126, + 3.392386, + 3.393625, + 3.394843, + 3.396040, + 3.397217, + 3.398374, + 3.399512, + 3.400631, + 3.401731, + 3.402814, + 3.403878, + 3.404925, + 3.405955, + 3.406969, + 3.407967, + 3.408948, + 3.409914, + 3.410865, + 3.411801, + 3.412722, + 3.413629, + 3.414522, + 3.415401, + 3.416266, + 3.417119, + 3.417959, + 3.418786, + 3.419600, + 3.420403, + 3.421193, + 3.421972, + 3.422739, + 3.423495, + 3.424241, + 3.424975, + 3.425699, + 3.426412, + 3.427115, + 3.427808, + 3.428492, + 3.429165, + 3.429830, + 3.430485, + 3.431130, + 3.431767, + 3.432396, + 3.433015, + 3.433626, + 3.434229, + 3.434824, + 3.435410, + 3.435989, + 3.436560, + 3.437124, + 3.437680, + 3.438228, + 3.438770, + 3.439304, + 3.439832, + 3.440352, + 3.440866, + 3.441374, + 3.441875, + 3.442369, + 3.442857, + 3.443339, + 3.443815, + 3.444285, + 3.444749, + 3.445208, + 3.445661, + 3.446108, + 3.446549, + 3.446986, + 3.447417, + 3.447842, + 3.448263, + 3.448679, + 3.449089, + 3.449495, + 3.449896, + 3.450292, + 3.450683, + 3.451070, + 3.451452, + 3.451830, + 3.452204, + 3.452573, + 3.452938, + 3.453299, + 3.453655, + 3.454008, + 3.454356, + 3.454701, + 3.455041, + 3.455378, + 3.455712, + 3.456041, + 3.456367, + 3.456689, + 3.457007, + 3.457323, + 3.457634, + 3.457943, + 3.458247, + 3.458549, + 3.458847, + 3.459143, + 3.459435, + 3.459724, + 3.460009, + 3.460292, + 3.460572, + 3.460849, + 3.461123, + 3.461394, + 3.461662, + 3.461928, + 3.462190, + 3.462451, + 3.462708, + 3.462963, + 3.463215, + 3.463464, + 3.463711, + 3.463956, + 3.464198, + 3.464438, + 3.464675, + 3.464910, + 3.465143, + 3.465373, + 3.465601, + 3.465827, + 3.466050, + 3.466272, + 3.466491, + 3.466708, + 3.466923, + 3.467136, + 3.467347, + 3.467556, + 3.467762, + 3.467967, + 3.468170, + 3.468371, + 3.468570, + 3.468768, + 3.468963, + 3.469157, + 3.469348, + 3.469538, + 3.469727, + 3.469913, + 3.470098, + 3.470281, + 3.470462, + 3.470642, + 3.470820, + 3.470997, + 3.471172, + 3.471345, + 3.471517, + 3.471687, + 3.471856, + 3.472023, + 3.472189, + 3.472353, + 3.472516, + 3.472677, + 3.472837, + 3.472996, + 3.473153, + 3.473309, + 3.473463, + 3.473616, + 3.473768, + 3.473919, + 3.474068, + 3.474216, + 3.474363, + 3.474508, + 3.474652, + 3.474795, + 3.474937, + 3.475078, + 3.475217, + 3.475355, + 3.475492, + 3.475628, + 3.475763, + 3.475897, + 3.476030, + 3.476161, + 3.476291, + 3.476421, + 3.476549, + 3.476676, + 3.476803, + 3.476928, + 3.477052, + 3.477175, + 3.477298, + 3.477419, + 3.477539, + 3.477658, + 3.477777, + 3.477894, + 3.478011, + 3.478126, + 3.478241, + 3.478355, + 3.478468, + 3.478580, + 3.478691, + 3.478801, + 3.478911, + 3.479019, + 3.479127, + 3.479234, + 3.479340, + 3.479445, + 3.479550, + 3.479653, + 3.479756, + 3.479858, + 3.479960, + 3.480060, + 3.480160, + 3.480259, + 3.480358, + 3.480455, + 3.480552, + 3.480648, + 3.480744, + 3.480839, + 3.480933, + 3.481026, + 3.481119, + 3.481211, + 3.481302, + 3.481393, + 3.481483, + 3.481572, + 3.481661, + 3.481749, + 3.481836, + 3.481923, + 3.482009, + 3.482095, + 3.482180, + 3.482264, + 3.482348, + 3.482431, + 3.482514, + 3.482596, + 3.482677, + 3.482758, + 3.482839, + 3.482918, + 3.482998, + 3.483076, + 3.483154, + 3.483232, + 3.483309, + 3.483385, + 3.483461, + 3.483537, + 3.483612, + 3.483686, + 3.483760, + 3.483834, + 3.483907, + 3.483979, + 3.484051, + 3.484122, + 3.484193, + 3.484264, + 3.484334, + 3.484403, + 3.484473, + 3.484541, + 3.484609, + 3.484677, + 3.484745, + 3.484811, + 3.484878, + 3.484944, + 3.485009, + 3.485075, + 3.485139, + 3.485204, + 3.485267, + 3.485331, + 3.485394, + 3.485457, + 3.485519, + 3.485581, + 3.485642, + 3.485703, + 3.485764, + 3.485824, + 3.485884, + 3.485944, + 3.486003, + 3.486061, + 3.486120, + 3.486178, + 3.486236, + 3.486293, + 3.486350, + 3.486406, + 3.486463, + 3.486519, + 3.486574, + 3.486629, + 3.486684, + 3.486739, + 3.486793, + 3.486847, + 3.486901, + 3.486954, + 3.487007, + 3.487059, + 3.487111, + 3.487163, + 3.487215, + 3.487266, + 3.487317, + 3.487368, + 3.487418, + 3.487469, + 3.487518, + 3.487568, + 3.487617, + 3.487666, + 3.487715, + 3.487763, + 3.487811, + 3.487859, + 3.487906, + 3.487954, + 3.488001, + 3.488047, + 3.488094, + 3.488140, + 3.488186, + 3.488231, + 3.488277, + 3.488322, + 3.488366, + 3.488411, + 3.488455, + 3.488499, + 3.488543, + 3.488587, + 3.488630, + 3.488673, + 3.488716, + 3.488758, + 3.488801, + 3.488843, + 3.488885, + 3.488926, + 3.488968, + 3.489009, + 3.489050, + 3.489090, + 3.489131, + 3.489171, + 3.489211, + 3.489251, + 3.489290, + 3.489330, + 3.489369, + 3.489408, + 3.489447, + 3.489485, + 3.489523, + 3.489562, + 3.489599, + 3.489637, + 3.489675, + 3.489712, + 3.489749, + 3.489786, + 3.489822, + 3.489859, + 3.489895, + 3.489931, + 3.489967, + 3.490003, + 3.490038, + 3.490074, + 3.490109, + 3.490144, + 3.490178, + 3.490213, + 3.490247, + 3.490282, + 3.490316, + 3.490350, + 3.490383, + 3.490417, + 3.490450, + 3.490483, + 3.490516, + 3.490549, + 3.490582, + 3.490614, + 3.490646, + 3.490678, + 3.490710, + 3.490742, + 3.490774, + 3.490805, + 3.490837, + 3.490868, + 3.490899, + 3.490930, + 3.490960, + 3.490991, + 3.491021, + 3.491052, + 3.491082, + 3.491112, + 3.491141, + 3.491171, + 3.491200, + 3.491230, + 3.491259, + 3.491288, + 3.491317, + 3.491346, + 3.491374, + 3.491403, + 3.491431, + 3.491459, + 3.491487, + 3.491515, + 3.491543, + 3.491571, + 3.491598, + 3.491625, + 3.491653, + 3.491680, + 3.491707, + 3.491733, + 3.491760, + 3.491787, + 3.491813, + 3.491840, + 3.491866, + 3.491892, + 3.491918, + 3.491944, + 3.491969, + 3.491995, + 3.492020, + 3.492046, + 3.492071, + 3.492096, + 3.492121, + 3.492146, + 3.492170, + 3.492195, + 3.492220, + 3.492244, + 3.492268, + 3.492292, + 3.492316, + 3.492340, + 3.492364, + 3.492388, + 3.492412, + 3.492435, + 3.492458, + 3.492482, + 3.492505, + 3.492528, + 3.492551, + 3.492574, + 3.492596, + 3.492619, + 3.492642, + 3.492664, + 3.492686, + 3.492709, + 3.492731, + 3.492753, + 3.492775, + 3.492797, + 3.492818, + 3.492840, + 3.492861, + 3.492883, + 3.492904, + 3.492925, + 3.492947, + 3.492968, + 3.492989, + 3.493009, + 3.493030, + 3.493051, + 3.493071, + 3.493092, + 3.493112, + 3.493133, + 3.493153, + 3.493173, + 3.493193, + 3.493213, + 3.493233, + 3.493253, + 3.493272, + 3.493292, + 3.493312, + 3.493331, + 3.493350, + 3.493370, + 3.493389, + 3.493408, + 3.493427, + 3.493446, + 3.493465, + 3.493484, + 3.493502, + 3.493521, + 3.493539, + 3.493558, + 3.493576, + 3.493595, + 3.493613, + 3.493631, + 3.493649, + 3.493667, + 3.493685, + 3.493703, + 3.493720, + 3.493738, + 3.493756, + 3.493773, + 3.493791, + 3.493808, + 3.493826, + 3.493843, + 3.493860, + 3.493877, + 3.493894, + 3.493911, + 3.493928, + 3.493945, + 3.493961, + 3.493978, + 3.493995, + 3.494011, + 3.494028, + 3.494044, + 3.494061, + 3.494077, + 3.494093, + 3.494109, + 3.494125, + 3.494141, + 3.494157, + 3.494173, + 3.494189, + 3.494205, + 3.494220, + 3.494236, + 3.494251, + 3.494267, + 3.494282, + 3.494298, + 3.494313, + 3.494328, + 3.494344, + 3.494359, + 3.494374, + 3.494389, + 3.494404, + 3.494419, + 3.494433, + 3.494448, + 3.494463, + 3.494477, + 3.494492, + 3.494507, + 3.494521, + 3.494535, + 3.494550, + 3.494564, + 3.494578, + 3.494593, + 3.494607, + 3.494621, + 3.494635, + 3.494649, + 3.494663, + 3.494677, + 3.494690, + 3.494704, + 3.494718, + 3.494732, + 3.494745, + 3.494759, + 3.494772, + 3.494786, + 3.494799, + 3.494812, + 3.494826, + 3.494839, + 3.494852, + 3.494865, + 3.494878, + 3.494891, + 3.494904, + 3.494917, + 3.494930, + 3.494943, + 3.494956, + 3.494968, + 3.494981, + 3.494994, + 3.495006, + 3.495019, + 3.495031, + 3.495044, + 3.495056, + 3.495069, + 3.495081, + 3.495093, + 3.495105, + 3.495118, + 3.495130, + 3.495142, + 3.495154, + 3.495166, + 3.495178, + 3.495190, + 3.495202, + 3.495213, + 3.495225, + 3.495237, + 3.495249, + 3.495260, + 3.495272, + 3.495283, + 3.495295, + 3.495306, + 3.495318, + 3.495329, + 3.495341, + 3.495352, + 3.495363, + 3.495374, + 3.495386, + 3.495397, + 3.495408, + 3.495419, + 3.495430, + 3.495441, + 3.495452, + 3.495463, + 3.495474, + 3.495484, + 3.495495, + 3.495506, + 3.495517, + 3.495527, + 3.495538, + 3.495549, + 3.495559, + 3.495570, + 3.495580, + 3.495591, + 3.495601, + 3.495611, + 3.495622, + 3.495632, + 3.495642, + 3.495653, + 3.495663, + 3.495673, + 3.495683, + 3.495693, + 3.495703, + 3.495713, + 3.495723, + 3.495733, + 3.495743, + 3.495753, + 3.495763, + 3.495773, + 3.495782, + 3.495792, + 3.495802, + 3.495811, + 3.495821, + 3.495831, + 3.495840, + 3.495850, + 3.495859, + 3.495869, + 3.495878, + 3.495888, + 3.495897, + 3.495906, + 3.495916, + 3.495925, + 3.495934, + 3.495943, + 3.495953, + 3.495962, + 3.495971, + 3.495980, + 3.495989, + 3.495998, + 3.496007, + 3.496016, + 3.496025, + 3.496034, + 3.496043, + 3.496052, + 3.496061, + 3.496069, + 3.496078, + 3.496087, + 3.496096, + 3.496104, + 3.496113, + 3.496121, + 3.496130, + 3.496139, + 3.496147, + 3.496156, + 3.496164, + 3.496173, + 3.496181, + 3.496189, + 3.496198, + 3.496206, + 3.496214, + 3.496223, + 3.496231, + 3.496239, + 3.496247, + 3.496256, + 3.496264, + 3.496272, + 3.496280, + 3.496288, + 3.496296, + 3.496304, + 3.496312, + 3.496320, + 3.496328, + 3.496336, + 3.496344, + 3.496352, + 3.496360, + 3.496367, + 3.496375, + 3.496383, + 3.496391, + 3.496398, + 3.496406, + 3.496414, + 3.496421, + 3.496429, + 3.496437, + 3.496444, + 3.496452, + 3.496459, + 3.496467, + 3.496474, + 3.496482, + 3.496489, + 3.496496, + 3.496504, + 3.496511, + 3.496518, + 3.496526, + 3.496533, + 3.496540, + 3.496548, + 3.496555, + 3.496562, + 3.496569, + 3.496576, + 3.496583, + 3.496590, + 3.496598, + 3.496605, + 3.496612, + 3.496619, + 3.496626, + 3.496633, + 3.496640, + 3.496647, + 3.496653, + 3.496660, + 3.496667, + 3.496674, + 3.496681, + 3.496688, + 3.496694, + 3.496701, + 3.496708, + 3.496715, + 3.496721, + 3.496728, + 3.496735, + 3.496741, + 3.496748, + 3.496755, + 3.496761, + 3.496768, + 3.496774, + 3.496781, + 3.496787, + 3.496794, + 3.496800, + 3.496807, + 3.496813, + 3.496819, + 3.496826, + 3.496832, + 3.496839, + 3.496845, + 3.496851, + }, + {// The expectations for dimension = 8 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081666, + 0.106666, + 0.134996, + 0.166657, + 0.201643, + 0.239946, + 0.281554, + 0.326444, + 0.374585, + 0.425931, + 0.480417, + 0.537957, + 0.598441, + 0.661730, + 0.727655, + 0.796019, + 0.866593, + 0.939122, + 1.013323, + 1.088894, + 1.165520, + 1.242873, + 1.320624, + 1.398448, + 1.476028, + 1.553063, + 1.629274, + 1.704405, + 1.778225, + 1.850536, + 1.921166, + 1.989976, + 2.056854, + 2.121715, + 2.184502, + 2.245179, + 2.303731, + 2.360160, + 2.414486, + 2.466738, + 2.516959, + 2.565199, + 2.611513, + 2.655963, + 2.698612, + 2.739526, + 2.778773, + 2.816421, + 2.852535, + 2.887181, + 2.920424, + 2.952325, + 2.982947, + 3.012346, + 3.040578, + 3.067698, + 3.093758, + 3.118805, + 3.142887, + 3.166049, + 3.188333, + 3.209780, + 3.230427, + 3.250312, + 3.269470, + 3.287932, + 3.305732, + 3.322897, + 3.339457, + 3.355438, + 3.370865, + 3.385763, + 3.400155, + 3.414062, + 3.427506, + 3.440505, + 3.453078, + 3.465243, + 3.477018, + 3.488417, + 3.499457, + 3.510151, + 3.520514, + 3.530559, + 3.540299, + 3.549744, + 3.558908, + 3.567800, + 3.576431, + 3.584810, + 3.592948, + 3.600854, + 3.608535, + 3.616000, + 3.623257, + 3.630314, + 3.637177, + 3.643854, + 3.650351, + 3.656675, + 3.662831, + 3.668825, + 3.674663, + 3.680350, + 3.685891, + 3.691291, + 3.696554, + 3.701686, + 3.706691, + 3.711571, + 3.716333, + 3.720979, + 3.725513, + 3.729938, + 3.734259, + 3.738477, + 3.742597, + 3.746622, + 3.750554, + 3.754395, + 3.758150, + 3.761820, + 3.765408, + 3.768916, + 3.772346, + 3.775702, + 3.778984, + 3.782196, + 3.785338, + 3.788414, + 3.791425, + 3.794372, + 3.797257, + 3.800083, + 3.802851, + 3.805562, + 3.808218, + 3.810820, + 3.813370, + 3.815869, + 3.818318, + 3.820720, + 3.823074, + 3.825383, + 3.827647, + 3.829867, + 3.832045, + 3.834182, + 3.836279, + 3.838336, + 3.840355, + 3.842337, + 3.844282, + 3.846191, + 3.848066, + 3.849907, + 3.851715, + 3.853491, + 3.855235, + 3.856948, + 3.858631, + 3.860285, + 3.861910, + 3.863507, + 3.865077, + 3.866620, + 3.868137, + 3.869628, + 3.871094, + 3.872535, + 3.873953, + 3.875347, + 3.876718, + 3.878067, + 3.879394, + 3.880700, + 3.881984, + 3.883248, + 3.884492, + 3.885717, + 3.886921, + 3.888107, + 3.889275, + 3.890424, + 3.891556, + 3.892670, + 3.893768, + 3.894848, + 3.895913, + 3.896961, + 3.897993, + 3.899011, + 3.900013, + 3.901000, + 3.901973, + 3.902931, + 3.903876, + 3.904807, + 3.905725, + 3.906629, + 3.907520, + 3.908399, + 3.909266, + 3.910120, + 3.910962, + 3.911792, + 3.912611, + 3.913419, + 3.914216, + 3.915001, + 3.915776, + 3.916540, + 3.917294, + 3.918038, + 3.918772, + 3.919496, + 3.920211, + 3.920916, + 3.921612, + 3.922299, + 3.922976, + 3.923645, + 3.924306, + 3.924957, + 3.925601, + 3.926236, + 3.926863, + 3.927482, + 3.928094, + 3.928697, + 3.929293, + 3.929882, + 3.930464, + 3.931038, + 3.931605, + 3.932165, + 3.932719, + 3.933265, + 3.933805, + 3.934339, + 3.934866, + 3.935387, + 3.935901, + 3.936410, + 3.936912, + 3.937409, + 3.937899, + 3.938384, + 3.938864, + 3.939337, + 3.939806, + 3.940269, + 3.940726, + 3.941179, + 3.941626, + 3.942068, + 3.942505, + 3.942937, + 3.943365, + 3.943787, + 3.944205, + 3.944618, + 3.945027, + 3.945431, + 3.945831, + 3.946227, + 3.946618, + 3.947005, + 3.947387, + 3.947766, + 3.948140, + 3.948511, + 3.948877, + 3.949240, + 3.949599, + 3.949954, + 3.950305, + 3.950653, + 3.950997, + 3.951337, + 3.951674, + 3.952007, + 3.952337, + 3.952664, + 3.952987, + 3.953307, + 3.953624, + 3.953937, + 3.954247, + 3.954555, + 3.954859, + 3.955160, + 3.955458, + 3.955753, + 3.956045, + 3.956335, + 3.956621, + 3.956905, + 3.957186, + 3.957464, + 3.957739, + 3.958012, + 3.958282, + 3.958550, + 3.958815, + 3.959077, + 3.959337, + 3.959595, + 3.959850, + 3.960103, + 3.960353, + 3.960601, + 3.960847, + 3.961090, + 3.961331, + 3.961570, + 3.961807, + 3.962041, + 3.962274, + 3.962504, + 3.962732, + 3.962958, + 3.963182, + 3.963404, + 3.963624, + 3.963842, + 3.964058, + 3.964272, + 3.964484, + 3.964695, + 3.964903, + 3.965110, + 3.965315, + 3.965518, + 3.965719, + 3.965918, + 3.966116, + 3.966312, + 3.966507, + 3.966699, + 3.966890, + 3.967080, + 3.967267, + 3.967454, + 3.967638, + 3.967821, + 3.968003, + 3.968183, + 3.968361, + 3.968538, + 3.968713, + 3.968887, + 3.969060, + 3.969231, + 3.969401, + 3.969569, + 3.969736, + 3.969902, + 3.970066, + 3.970229, + 3.970390, + 3.970550, + 3.970709, + 3.970867, + 3.971023, + 3.971178, + 3.971332, + 3.971485, + 3.971636, + 3.971787, + 3.971936, + 3.972084, + 3.972230, + 3.972376, + 3.972520, + 3.972664, + 3.972806, + 3.972947, + 3.973087, + 3.973226, + 3.973364, + 3.973500, + 3.973636, + 3.973771, + 3.973904, + 3.974037, + 3.974169, + 3.974299, + 3.974429, + 3.974557, + 3.974685, + 3.974812, + 3.974938, + 3.975062, + 3.975186, + 3.975309, + 3.975431, + 3.975553, + 3.975673, + 3.975792, + 3.975911, + 3.976029, + 3.976145, + 3.976261, + 3.976376, + 3.976491, + 3.976604, + 3.976717, + 3.976829, + 3.976940, + 3.977050, + 3.977159, + 3.977268, + 3.977376, + 3.977483, + 3.977589, + 3.977695, + 3.977800, + 3.977904, + 3.978007, + 3.978110, + 3.978212, + 3.978313, + 3.978413, + 3.978513, + 3.978612, + 3.978711, + 3.978809, + 3.978906, + 3.979002, + 3.979098, + 3.979193, + 3.979288, + 3.979382, + 3.979475, + 3.979567, + 3.979659, + 3.979751, + 3.979841, + 3.979931, + 3.980021, + 3.980110, + 3.980198, + 3.980286, + 3.980373, + 3.980460, + 3.980546, + 3.980631, + 3.980716, + 3.980800, + 3.980884, + 3.980967, + 3.981050, + 3.981132, + 3.981214, + 3.981295, + 3.981375, + 3.981455, + 3.981535, + 3.981614, + 3.981693, + 3.981771, + 3.981848, + 3.981925, + 3.982002, + 3.982078, + 3.982153, + 3.982228, + 3.982303, + 3.982377, + 3.982451, + 3.982524, + 3.982597, + 3.982669, + 3.982741, + 3.982812, + 3.982883, + 3.982954, + 3.983024, + 3.983094, + 3.983163, + 3.983232, + 3.983300, + 3.983368, + 3.983436, + 3.983503, + 3.983569, + 3.983636, + 3.983702, + 3.983767, + 3.983832, + 3.983897, + 3.983962, + 3.984026, + 3.984089, + 3.984152, + 3.984215, + 3.984278, + 3.984340, + 3.984402, + 3.984463, + 3.984524, + 3.984585, + 3.984645, + 3.984705, + 3.984764, + 3.984824, + 3.984883, + 3.984941, + 3.984999, + 3.985057, + 3.985115, + 3.985172, + 3.985229, + 3.985286, + 3.985342, + 3.985398, + 3.985453, + 3.985509, + 3.985564, + 3.985618, + 3.985673, + 3.985727, + 3.985780, + 3.985834, + 3.985887, + 3.985940, + 3.985992, + 3.986045, + 3.986096, + 3.986148, + 3.986199, + 3.986251, + 3.986301, + 3.986352, + 3.986402, + 3.986452, + 3.986502, + 3.986551, + 3.986600, + 3.986649, + 3.986698, + 3.986746, + 3.986794, + 3.986842, + 3.986890, + 3.986937, + 3.986984, + 3.987031, + 3.987077, + 3.987124, + 3.987170, + 3.987216, + 3.987261, + 3.987306, + 3.987352, + 3.987396, + 3.987441, + 3.987485, + 3.987529, + 3.987573, + 3.987617, + 3.987660, + 3.987704, + 3.987747, + 3.987789, + 3.987832, + 3.987874, + 3.987916, + 3.987958, + 3.988000, + 3.988041, + 3.988083, + 3.988124, + 3.988164, + 3.988205, + 3.988245, + 3.988285, + 3.988325, + 3.988365, + 3.988405, + 3.988444, + 3.988483, + 3.988522, + 3.988561, + 3.988600, + 3.988638, + 3.988676, + 3.988714, + 3.988752, + 3.988790, + 3.988827, + 3.988864, + 3.988901, + 3.988938, + 3.988975, + 3.989011, + 3.989048, + 3.989084, + 3.989120, + 3.989155, + 3.989191, + 3.989227, + 3.989262, + 3.989297, + 3.989332, + 3.989366, + 3.989401, + 3.989435, + 3.989470, + 3.989504, + 3.989538, + 3.989571, + 3.989605, + 3.989638, + 3.989672, + 3.989705, + 3.989738, + 3.989770, + 3.989803, + 3.989836, + 3.989868, + 3.989900, + 3.989932, + 3.989964, + 3.989996, + 3.990027, + 3.990059, + 3.990090, + 3.990121, + 3.990152, + 3.990183, + 3.990213, + 3.990244, + 3.990274, + 3.990305, + 3.990335, + 3.990365, + 3.990394, + 3.990424, + 3.990454, + 3.990483, + 3.990512, + 3.990542, + 3.990571, + 3.990599, + 3.990628, + 3.990657, + 3.990685, + 3.990714, + 3.990742, + 3.990770, + 3.990798, + 3.990826, + 3.990853, + 3.990881, + 3.990908, + 3.990936, + 3.990963, + 3.990990, + 3.991017, + 3.991044, + 3.991071, + 3.991097, + 3.991124, + 3.991150, + 3.991176, + 3.991203, + 3.991229, + 3.991254, + 3.991280, + 3.991306, + 3.991332, + 3.991357, + 3.991382, + 3.991408, + 3.991433, + 3.991458, + 3.991483, + 3.991507, + 3.991532, + 3.991557, + 3.991581, + 3.991605, + 3.991630, + 3.991654, + 3.991678, + 3.991702, + 3.991726, + 3.991749, + 3.991773, + 3.991797, + 3.991820, + 3.991843, + 3.991867, + 3.991890, + 3.991913, + 3.991936, + 3.991959, + 3.991981, + 3.992004, + 3.992027, + 3.992049, + 3.992071, + 3.992094, + 3.992116, + 3.992138, + 3.992160, + 3.992182, + 3.992204, + 3.992225, + 3.992247, + 3.992268, + 3.992290, + 3.992311, + 3.992333, + 3.992354, + 3.992375, + 3.992396, + 3.992417, + 3.992438, + 3.992458, + 3.992479, + 3.992500, + 3.992520, + 3.992540, + 3.992561, + 3.992581, + 3.992601, + 3.992621, + 3.992641, + 3.992661, + 3.992681, + 3.992701, + 3.992720, + 3.992740, + 3.992760, + 3.992779, + 3.992798, + 3.992818, + 3.992837, + 3.992856, + 3.992875, + 3.992894, + 3.992913, + 3.992932, + 3.992950, + 3.992969, + 3.992988, + 3.993006, + 3.993025, + 3.993043, + 3.993061, + 3.993080, + 3.993098, + 3.993116, + 3.993134, + 3.993152, + 3.993170, + 3.993188, + 3.993205, + 3.993223, + 3.993241, + 3.993258, + 3.993276, + 3.993293, + 3.993310, + 3.993328, + 3.993345, + 3.993362, + 3.993379, + 3.993396, + 3.993413, + 3.993430, + 3.993447, + 3.993463, + 3.993480, + 3.993497, + 3.993513, + 3.993530, + 3.993546, + 3.993562, + 3.993579, + 3.993595, + 3.993611, + 3.993627, + 3.993643, + 3.993659, + 3.993675, + 3.993691, + 3.993707, + 3.993723, + 3.993738, + 3.993754, + 3.993769, + 3.993785, + 3.993800, + 3.993816, + 3.993831, + 3.993846, + 3.993862, + 3.993877, + 3.993892, + 3.993907, + 3.993922, + 3.993937, + 3.993952, + 3.993967, + 3.993982, + 3.993996, + 3.994011, + 3.994026, + 3.994040, + 3.994055, + 3.994069, + 3.994084, + 3.994098, + 3.994112, + 3.994127, + 3.994141, + 3.994155, + 3.994169, + 3.994183, + 3.994197, + 3.994211, + 3.994225, + 3.994239, + 3.994253, + 3.994266, + 3.994280, + 3.994294, + 3.994307, + 3.994321, + 3.994334, + 3.994348, + 3.994361, + 3.994375, + 3.994388, + 3.994401, + 3.994414, + 3.994427, + 3.994441, + 3.994454, + 3.994467, + 3.994480, + 3.994493, + 3.994506, + 3.994518, + 3.994531, + 3.994544, + 3.994557, + 3.994569, + 3.994582, + 3.994595, + 3.994607, + 3.994620, + 3.994632, + 3.994645, + 3.994657, + 3.994669, + 3.994681, + 3.994694, + 3.994706, + 3.994718, + 3.994730, + 3.994742, + 3.994754, + 3.994766, + 3.994778, + 3.994790, + 3.994802, + 3.994814, + 3.994826, + 3.994837, + 3.994849, + 3.994861, + 3.994872, + 3.994884, + 3.994896, + 3.994907, + 3.994919, + 3.994930, + 3.994941, + 3.994953, + 3.994964, + 3.994975, + 3.994987, + 3.994998, + 3.995009, + 3.995020, + 3.995031, + 3.995042, + 3.995053, + 3.995064, + 3.995075, + 3.995086, + 3.995097, + 3.995108, + 3.995119, + 3.995129, + 3.995140, + 3.995151, + 3.995161, + 3.995172, + 3.995183, + 3.995193, + 3.995204, + 3.995214, + 3.995225, + 3.995235, + 3.995245, + 3.995256, + 3.995266, + 3.995276, + 3.995287, + 3.995297, + 3.995307, + 3.995317, + 3.995327, + 3.995337, + 3.995347, + 3.995357, + 3.995367, + 3.995377, + 3.995387, + 3.995397, + 3.995407, + 3.995417, + 3.995427, + 3.995436, + 3.995446, + 3.995456, + 3.995465, + 3.995475, + 3.995485, + 3.995494, + 3.995504, + 3.995513, + 3.995523, + 3.995532, + 3.995542, + 3.995551, + 3.995560, + 3.995570, + 3.995579, + 3.995588, + 3.995598, + 3.995607, + 3.995616, + 3.995625, + 3.995634, + 3.995643, + 3.995653, + 3.995662, + 3.995671, + 3.995680, + 3.995689, + 3.995698, + 3.995706, + 3.995715, + 3.995724, + 3.995733, + 3.995742, + 3.995751, + 3.995759, + 3.995768, + 3.995777, + 3.995785, + 3.995794, + 3.995803, + 3.995811, + 3.995820, + 3.995828, + 3.995837, + 3.995845, + 3.995854, + 3.995862, + 3.995871, + 3.995879, + 3.995887, + 3.995896, + 3.995904, + 3.995912, + 3.995920, + 3.995929, + 3.995937, + 3.995945, + 3.995953, + 3.995961, + 3.995969, + 3.995978, + 3.995986, + 3.995994, + 3.996002, + }, + {// The expectations for dimension = 9 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106666, + 0.134999, + 0.166664, + 0.201660, + 0.239984, + 0.281630, + 0.326590, + 0.374847, + 0.426379, + 0.481150, + 0.539111, + 0.600194, + 0.664309, + 0.731341, + 0.801148, + 0.873558, + 0.948369, + 1.025349, + 1.104239, + 1.184755, + 1.266591, + 1.349428, + 1.432937, + 1.516787, + 1.600648, + 1.684204, + 1.767150, + 1.849205, + 1.930109, + 2.009631, + 2.087569, + 2.163750, + 2.238031, + 2.310297, + 2.380464, + 2.448470, + 2.514276, + 2.577868, + 2.639244, + 2.698423, + 2.755434, + 2.810316, + 2.863120, + 2.913900, + 2.962717, + 3.009635, + 3.054720, + 3.098040, + 3.139662, + 3.179654, + 3.218082, + 3.255013, + 3.290509, + 3.324632, + 3.357443, + 3.388999, + 3.419356, + 3.448566, + 3.476681, + 3.503750, + 3.529819, + 3.554933, + 3.579134, + 3.602462, + 3.624956, + 3.646653, + 3.667588, + 3.687793, + 3.707300, + 3.726139, + 3.744340, + 3.761928, + 3.778931, + 3.795371, + 3.811274, + 3.826661, + 3.841553, + 3.855970, + 3.869933, + 3.883458, + 3.896564, + 3.909266, + 3.921582, + 3.933526, + 3.945112, + 3.956354, + 3.967265, + 3.977859, + 3.988145, + 3.998137, + 4.007845, + 4.017279, + 4.026450, + 4.035366, + 4.044038, + 4.052473, + 4.060680, + 4.068667, + 4.076442, + 4.084012, + 4.091384, + 4.098564, + 4.105560, + 4.112377, + 4.119021, + 4.125498, + 4.131814, + 4.137973, + 4.143981, + 4.149843, + 4.155562, + 4.161145, + 4.166594, + 4.171915, + 4.177111, + 4.182185, + 4.187143, + 4.191986, + 4.196719, + 4.201345, + 4.205867, + 4.210288, + 4.214611, + 4.218839, + 4.222974, + 4.227020, + 4.230979, + 4.234853, + 4.238645, + 4.242356, + 4.245990, + 4.249548, + 4.253033, + 4.256445, + 4.259789, + 4.263064, + 4.266273, + 4.269418, + 4.272501, + 4.275522, + 4.278485, + 4.281389, + 4.284237, + 4.287030, + 4.289770, + 4.292457, + 4.295094, + 4.297681, + 4.300219, + 4.302711, + 4.305156, + 4.307557, + 4.309914, + 4.312228, + 4.314500, + 4.316731, + 4.318923, + 4.321076, + 4.323191, + 4.325268, + 4.327310, + 4.329316, + 4.331288, + 4.333226, + 4.335131, + 4.337003, + 4.338844, + 4.340654, + 4.342434, + 4.344185, + 4.345906, + 4.347600, + 4.349266, + 4.350904, + 4.352517, + 4.354103, + 4.355664, + 4.357200, + 4.358712, + 4.360200, + 4.361665, + 4.363107, + 4.364527, + 4.365925, + 4.367301, + 4.368656, + 4.369991, + 4.371306, + 4.372601, + 4.373876, + 4.375133, + 4.376371, + 4.377591, + 4.378792, + 4.379977, + 4.381144, + 4.382294, + 4.383428, + 4.384545, + 4.385646, + 4.386732, + 4.387803, + 4.388858, + 4.389899, + 4.390925, + 4.391937, + 4.392935, + 4.393919, + 4.394890, + 4.395847, + 4.396792, + 4.397724, + 4.398643, + 4.399550, + 4.400445, + 4.401328, + 4.402199, + 4.403059, + 4.403908, + 4.404745, + 4.405572, + 4.406388, + 4.407194, + 4.407989, + 4.408774, + 4.409549, + 4.410314, + 4.411070, + 4.411816, + 4.412553, + 4.413281, + 4.413999, + 4.414709, + 4.415410, + 4.416102, + 4.416786, + 4.417462, + 4.418130, + 4.418789, + 4.419441, + 4.420084, + 4.420721, + 4.421349, + 4.421970, + 4.422584, + 4.423191, + 4.423790, + 4.424383, + 4.424968, + 4.425547, + 4.426120, + 4.426685, + 4.427245, + 4.427797, + 4.428344, + 4.428884, + 4.429419, + 4.429947, + 4.430470, + 4.430986, + 4.431497, + 4.432003, + 4.432502, + 4.432997, + 4.433486, + 4.433969, + 4.434447, + 4.434921, + 4.435389, + 4.435852, + 4.436310, + 4.436763, + 4.437211, + 4.437655, + 4.438094, + 4.438528, + 4.438958, + 4.439383, + 4.439804, + 4.440221, + 4.440633, + 4.441041, + 4.441445, + 4.441844, + 4.442240, + 4.442632, + 4.443019, + 4.443403, + 4.443783, + 4.444159, + 4.444531, + 4.444900, + 4.445265, + 4.445626, + 4.445984, + 4.446338, + 4.446689, + 4.447036, + 4.447380, + 4.447721, + 4.448058, + 4.448393, + 4.448723, + 4.449051, + 4.449376, + 4.449697, + 4.450016, + 4.450331, + 4.450644, + 4.450953, + 4.451260, + 4.451564, + 4.451865, + 4.452163, + 4.452458, + 4.452751, + 4.453041, + 4.453328, + 4.453613, + 4.453895, + 4.454175, + 4.454452, + 4.454726, + 4.454998, + 4.455268, + 4.455535, + 4.455800, + 4.456062, + 4.456323, + 4.456580, + 4.456836, + 4.457089, + 4.457340, + 4.457589, + 4.457836, + 4.458081, + 4.458323, + 4.458564, + 4.458802, + 4.459038, + 4.459272, + 4.459505, + 4.459735, + 4.459963, + 4.460189, + 4.460414, + 4.460636, + 4.460857, + 4.461076, + 4.461293, + 4.461508, + 4.461722, + 4.461933, + 4.462143, + 4.462351, + 4.462558, + 4.462763, + 4.462966, + 4.463167, + 4.463367, + 4.463565, + 4.463762, + 4.463957, + 4.464150, + 4.464342, + 4.464532, + 4.464721, + 4.464908, + 4.465094, + 4.465279, + 4.465462, + 4.465643, + 4.465823, + 4.466002, + 4.466179, + 4.466355, + 4.466529, + 4.466702, + 4.466874, + 4.467045, + 4.467214, + 4.467382, + 4.467548, + 4.467714, + 4.467878, + 4.468041, + 4.468202, + 4.468362, + 4.468522, + 4.468680, + 4.468836, + 4.468992, + 4.469146, + 4.469300, + 4.469452, + 4.469603, + 4.469753, + 4.469901, + 4.470049, + 4.470196, + 4.470341, + 4.470486, + 4.470629, + 4.470772, + 4.470913, + 4.471053, + 4.471193, + 4.471331, + 4.471468, + 4.471605, + 4.471740, + 4.471874, + 4.472008, + 4.472140, + 4.472272, + 4.472402, + 4.472532, + 4.472661, + 4.472789, + 4.472916, + 4.473042, + 4.473167, + 4.473292, + 4.473415, + 4.473538, + 4.473659, + 4.473780, + 4.473901, + 4.474020, + 4.474138, + 4.474256, + 4.474373, + 4.474489, + 4.474604, + 4.474719, + 4.474833, + 4.474946, + 4.475058, + 4.475169, + 4.475280, + 4.475390, + 4.475499, + 4.475608, + 4.475716, + 4.475823, + 4.475929, + 4.476035, + 4.476140, + 4.476244, + 4.476348, + 4.476451, + 4.476553, + 4.476655, + 4.476756, + 4.476856, + 4.476956, + 4.477055, + 4.477153, + 4.477251, + 4.477348, + 4.477444, + 4.477540, + 4.477636, + 4.477730, + 4.477824, + 4.477918, + 4.478011, + 4.478103, + 4.478195, + 4.478286, + 4.478377, + 4.478467, + 4.478556, + 4.478645, + 4.478733, + 4.478821, + 4.478908, + 4.478995, + 4.479081, + 4.479167, + 4.479252, + 4.479337, + 4.479421, + 4.479504, + 4.479587, + 4.479670, + 4.479752, + 4.479834, + 4.479915, + 4.479995, + 4.480076, + 4.480155, + 4.480234, + 4.480313, + 4.480391, + 4.480469, + 4.480546, + 4.480623, + 4.480700, + 4.480775, + 4.480851, + 4.480926, + 4.481001, + 4.481075, + 4.481148, + 4.481222, + 4.481295, + 4.481367, + 4.481439, + 4.481511, + 4.481582, + 4.481653, + 4.481723, + 4.481793, + 4.481863, + 4.481932, + 4.482001, + 4.482069, + 4.482137, + 4.482205, + 4.482272, + 4.482339, + 4.482405, + 4.482471, + 4.482537, + 4.482602, + 4.482667, + 4.482732, + 4.482796, + 4.482860, + 4.482924, + 4.482987, + 4.483050, + 4.483112, + 4.483175, + 4.483236, + 4.483298, + 4.483359, + 4.483420, + 4.483480, + 4.483540, + 4.483600, + 4.483660, + 4.483719, + 4.483778, + 4.483836, + 4.483895, + 4.483952, + 4.484010, + 4.484067, + 4.484124, + 4.484181, + 4.484237, + 4.484293, + 4.484349, + 4.484405, + 4.484460, + 4.484515, + 4.484569, + 4.484624, + 4.484678, + 4.484731, + 4.484785, + 4.484838, + 4.484891, + 4.484944, + 4.484996, + 4.485048, + 4.485100, + 4.485151, + 4.485203, + 4.485254, + 4.485304, + 4.485355, + 4.485405, + 4.485455, + 4.485505, + 4.485554, + 4.485603, + 4.485652, + 4.485701, + 4.485749, + 4.485798, + 4.485846, + 4.485893, + 4.485941, + 4.485988, + 4.486035, + 4.486082, + 4.486128, + 4.486175, + 4.486221, + 4.486267, + 4.486312, + 4.486358, + 4.486403, + 4.486448, + 4.486492, + 4.486537, + 4.486581, + 4.486625, + 4.486669, + 4.486713, + 4.486756, + 4.486799, + 4.486842, + 4.486885, + 4.486928, + 4.486970, + 4.487012, + 4.487054, + 4.487096, + 4.487137, + 4.487179, + 4.487220, + 4.487261, + 4.487301, + 4.487342, + 4.487382, + 4.487423, + 4.487463, + 4.487502, + 4.487542, + 4.487581, + 4.487621, + 4.487660, + 4.487698, + 4.487737, + 4.487776, + 4.487814, + 4.487852, + 4.487890, + 4.487928, + 4.487965, + 4.488003, + 4.488040, + 4.488077, + 4.488114, + 4.488151, + 4.488187, + 4.488224, + 4.488260, + 4.488296, + 4.488332, + 4.488368, + 4.488403, + 4.488439, + 4.488474, + 4.488509, + 4.488544, + 4.488579, + 4.488613, + 4.488648, + 4.488682, + 4.488716, + 4.488750, + 4.488784, + 4.488818, + 4.488851, + 4.488884, + 4.488918, + 4.488951, + 4.488984, + 4.489016, + 4.489049, + 4.489082, + 4.489114, + 4.489146, + 4.489178, + 4.489210, + 4.489242, + 4.489274, + 4.489305, + 4.489336, + 4.489368, + 4.489399, + 4.489430, + 4.489460, + 4.489491, + 4.489522, + 4.489552, + 4.489582, + 4.489612, + 4.489643, + 4.489672, + 4.489702, + 4.489732, + 4.489761, + 4.489791, + 4.489820, + 4.489849, + 4.489878, + 4.489907, + 4.489936, + 4.489964, + 4.489993, + 4.490021, + 4.490049, + 4.490078, + 4.490106, + 4.490134, + 4.490161, + 4.490189, + 4.490217, + 4.490244, + 4.490271, + 4.490298, + 4.490326, + 4.490353, + 4.490379, + 4.490406, + 4.490433, + 4.490459, + 4.490486, + 4.490512, + 4.490538, + 4.490564, + 4.490590, + 4.490616, + 4.490642, + 4.490668, + 4.490693, + 4.490719, + 4.490744, + 4.490769, + 4.490795, + 4.490820, + 4.490845, + 4.490869, + 4.490894, + 4.490919, + 4.490943, + 4.490968, + 4.490992, + 4.491016, + 4.491040, + 4.491064, + 4.491088, + 4.491112, + 4.491136, + 4.491160, + 4.491183, + 4.491207, + 4.491230, + 4.491253, + 4.491277, + 4.491300, + 4.491323, + 4.491346, + 4.491369, + 4.491391, + 4.491414, + 4.491436, + 4.491459, + 4.491481, + 4.491504, + 4.491526, + 4.491548, + 4.491570, + 4.491592, + 4.491614, + 4.491636, + 4.491657, + 4.491679, + 4.491700, + 4.491722, + 4.491743, + 4.491765, + 4.491786, + 4.491807, + 4.491828, + 4.491849, + 4.491870, + 4.491890, + 4.491911, + 4.491932, + 4.491952, + 4.491973, + 4.491993, + 4.492014, + 4.492034, + 4.492054, + 4.492074, + 4.492094, + 4.492114, + 4.492134, + 4.492154, + 4.492173, + 4.492193, + 4.492213, + 4.492232, + 4.492252, + 4.492271, + 4.492290, + 4.492309, + 4.492328, + 4.492348, + 4.492367, + 4.492385, + 4.492404, + 4.492423, + 4.492442, + 4.492460, + 4.492479, + 4.492497, + 4.492516, + 4.492534, + 4.492553, + 4.492571, + 4.492589, + 4.492607, + 4.492625, + 4.492643, + 4.492661, + 4.492679, + 4.492697, + 4.492714, + 4.492732, + 4.492749, + 4.492767, + 4.492784, + 4.492802, + 4.492819, + 4.492836, + 4.492854, + 4.492871, + 4.492888, + 4.492905, + 4.492922, + 4.492939, + 4.492956, + 4.492972, + 4.492989, + 4.493006, + 4.493022, + 4.493039, + 4.493055, + 4.493072, + 4.493088, + 4.493104, + 4.493121, + 4.493137, + 4.493153, + 4.493169, + 4.493185, + 4.493201, + 4.493217, + 4.493233, + 4.493248, + 4.493264, + 4.493280, + 4.493296, + 4.493311, + 4.493327, + 4.493342, + 4.493358, + 4.493373, + 4.493388, + 4.493403, + 4.493419, + 4.493434, + 4.493449, + 4.493464, + 4.493479, + 4.493494, + 4.493509, + 4.493524, + 4.493538, + 4.493553, + 4.493568, + 4.493582, + 4.493597, + 4.493612, + 4.493626, + 4.493640, + 4.493655, + 4.493669, + 4.493683, + 4.493698, + 4.493712, + 4.493726, + 4.493740, + 4.493754, + 4.493768, + 4.493782, + 4.493796, + 4.493810, + 4.493824, + 4.493838, + 4.493851, + 4.493865, + 4.493879, + 4.493892, + 4.493906, + 4.493919, + 4.493933, + 4.493946, + 4.493959, + 4.493973, + 4.493986, + 4.493999, + 4.494012, + 4.494026, + 4.494039, + 4.494052, + 4.494065, + 4.494078, + 4.494091, + 4.494104, + 4.494116, + 4.494129, + 4.494142, + 4.494155, + 4.494167, + 4.494180, + 4.494193, + 4.494205, + 4.494218, + 4.494230, + 4.494243, + 4.494255, + 4.494267, + 4.494280, + 4.494292, + 4.494304, + 4.494316, + 4.494329, + 4.494341, + 4.494353, + 4.494365, + 4.494377, + 4.494389, + 4.494401, + 4.494413, + 4.494424, + 4.494436, + 4.494448, + 4.494460, + 4.494471, + 4.494483, + 4.494495, + 4.494506, + 4.494518, + 4.494529, + 4.494541, + 4.494552, + 4.494564, + 4.494575, + 4.494586, + 4.494598, + 4.494609, + 4.494620, + 4.494631, + 4.494643, + 4.494654, + 4.494665, + 4.494676, + 4.494687, + 4.494698, + 4.494709, + 4.494720, + 4.494731, + 4.494742, + 4.494752, + 4.494763, + 4.494774, + 4.494785, + 4.494795, + 4.494806, + 4.494817, + 4.494827, + 4.494838, + 4.494848, + 4.494859, + 4.494869, + 4.494880, + 4.494890, + 4.494900, + 4.494911, + 4.494921, + 4.494931, + 4.494942, + 4.494952, + 4.494962, + 4.494972, + 4.494982, + 4.494992, + 4.495002, + 4.495012, + 4.495022, + 4.495032, + 4.495042, + 4.495052, + }, + {// The expectations for dimension = 10 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166666, + 0.201665, + 0.239995, + 0.281655, + 0.326641, + 0.374945, + 0.426557, + 0.481459, + 0.539623, + 0.601011, + 0.665568, + 0.733221, + 0.803873, + 0.877403, + 0.953662, + 1.032471, + 1.113622, + 1.196876, + 1.281967, + 1.368607, + 1.456485, + 1.545279, + 1.634656, + 1.724284, + 1.813833, + 1.902985, + 1.991436, + 2.078905, + 2.165135, + 2.249895, + 2.332984, + 2.414231, + 2.493494, + 2.570662, + 2.645647, + 2.718390, + 2.788854, + 2.857023, + 2.922896, + 2.986492, + 3.047839, + 3.106977, + 3.163955, + 3.218828, + 3.271657, + 3.322505, + 3.371438, + 3.418525, + 3.463833, + 3.507429, + 3.549382, + 3.589756, + 3.628618, + 3.666028, + 3.702049, + 3.736739, + 3.770154, + 3.802349, + 3.833377, + 3.863287, + 3.892128, + 3.919946, + 3.946783, + 3.972683, + 3.997685, + 4.021827, + 4.045146, + 4.067677, + 4.089452, + 4.110502, + 4.130859, + 4.150551, + 4.169604, + 4.188045, + 4.205899, + 4.223189, + 4.239938, + 4.256167, + 4.271897, + 4.287147, + 4.301936, + 4.316281, + 4.330200, + 4.343709, + 4.356823, + 4.369557, + 4.381925, + 4.393941, + 4.405617, + 4.416966, + 4.428000, + 4.438730, + 4.449166, + 4.459320, + 4.469201, + 4.478818, + 4.488181, + 4.497298, + 4.506178, + 4.514828, + 4.523257, + 4.531471, + 4.539478, + 4.547285, + 4.554898, + 4.562323, + 4.569566, + 4.576634, + 4.583531, + 4.590264, + 4.596836, + 4.603254, + 4.609522, + 4.615644, + 4.621625, + 4.627469, + 4.633180, + 4.638762, + 4.644220, + 4.649556, + 4.654774, + 4.659878, + 4.664870, + 4.669755, + 4.674534, + 4.679212, + 4.683790, + 4.688272, + 4.692661, + 4.696958, + 4.701166, + 4.705288, + 4.709327, + 4.713283, + 4.717160, + 4.720960, + 4.724684, + 4.728334, + 4.731913, + 4.735423, + 4.738864, + 4.742239, + 4.745550, + 4.748798, + 4.751984, + 4.755111, + 4.758179, + 4.761191, + 4.764147, + 4.767049, + 4.769897, + 4.772695, + 4.775442, + 4.778139, + 4.780789, + 4.783392, + 4.785949, + 4.788461, + 4.790930, + 4.793356, + 4.795740, + 4.798083, + 4.800387, + 4.802651, + 4.804878, + 4.807067, + 4.809220, + 4.811337, + 4.813419, + 4.815467, + 4.817482, + 4.819464, + 4.821414, + 4.823333, + 4.825222, + 4.827080, + 4.828909, + 4.830709, + 4.832481, + 4.834226, + 4.835944, + 4.837635, + 4.839300, + 4.840940, + 4.842555, + 4.844146, + 4.845712, + 4.847256, + 4.848776, + 4.850274, + 4.851750, + 4.853204, + 4.854637, + 4.856050, + 4.857441, + 4.858813, + 4.860165, + 4.861498, + 4.862812, + 4.864108, + 4.865385, + 4.866645, + 4.867887, + 4.869111, + 4.870319, + 4.871511, + 4.872685, + 4.873844, + 4.874988, + 4.876116, + 4.877228, + 4.878326, + 4.879409, + 4.880478, + 4.881533, + 4.882574, + 4.883601, + 4.884615, + 4.885616, + 4.886604, + 4.887579, + 4.888542, + 4.889492, + 4.890430, + 4.891357, + 4.892272, + 4.893175, + 4.894067, + 4.894948, + 4.895818, + 4.896677, + 4.897526, + 4.898364, + 4.899193, + 4.900011, + 4.900819, + 4.901617, + 4.902406, + 4.903186, + 4.903956, + 4.904717, + 4.905469, + 4.906212, + 4.906947, + 4.907673, + 4.908390, + 4.909099, + 4.909800, + 4.910493, + 4.911178, + 4.911855, + 4.912525, + 4.913187, + 4.913841, + 4.914488, + 4.915128, + 4.915761, + 4.916386, + 4.917005, + 4.917617, + 4.918222, + 4.918821, + 4.919413, + 4.919999, + 4.920578, + 4.921151, + 4.921718, + 4.922278, + 4.922833, + 4.923382, + 4.923925, + 4.924462, + 4.924994, + 4.925520, + 4.926040, + 4.926556, + 4.927065, + 4.927570, + 4.928069, + 4.928563, + 4.929052, + 4.929536, + 4.930015, + 4.930490, + 4.930959, + 4.931424, + 4.931884, + 4.932340, + 4.932791, + 4.933237, + 4.933679, + 4.934117, + 4.934550, + 4.934979, + 4.935404, + 4.935825, + 4.936241, + 4.936654, + 4.937063, + 4.937467, + 4.937868, + 4.938265, + 4.938658, + 4.939048, + 4.939434, + 4.939816, + 4.940194, + 4.940569, + 4.940941, + 4.941309, + 4.941673, + 4.942034, + 4.942392, + 4.942747, + 4.943098, + 4.943446, + 4.943791, + 4.944133, + 4.944472, + 4.944807, + 4.945140, + 4.945469, + 4.945796, + 4.946120, + 4.946440, + 4.946758, + 4.947073, + 4.947386, + 4.947695, + 4.948002, + 4.948306, + 4.948608, + 4.948907, + 4.949203, + 4.949497, + 4.949788, + 4.950077, + 4.950363, + 4.950647, + 4.950928, + 4.951207, + 4.951484, + 4.951758, + 4.952030, + 4.952299, + 4.952567, + 4.952832, + 4.953095, + 4.953355, + 4.953614, + 4.953870, + 4.954125, + 4.954377, + 4.954627, + 4.954875, + 4.955121, + 4.955365, + 4.955607, + 4.955847, + 4.956086, + 4.956322, + 4.956556, + 4.956789, + 4.957019, + 4.957248, + 4.957475, + 4.957700, + 4.957923, + 4.958145, + 4.958365, + 4.958583, + 4.958799, + 4.959014, + 4.959227, + 4.959439, + 4.959648, + 4.959857, + 4.960063, + 4.960268, + 4.960471, + 4.960673, + 4.960874, + 4.961072, + 4.961270, + 4.961465, + 4.961660, + 4.961852, + 4.962044, + 4.962234, + 4.962422, + 4.962609, + 4.962795, + 4.962979, + 4.963162, + 4.963344, + 4.963524, + 4.963703, + 4.963881, + 4.964057, + 4.964232, + 4.964406, + 4.964579, + 4.964750, + 4.964920, + 4.965089, + 4.965256, + 4.965423, + 4.965588, + 4.965752, + 4.965915, + 4.966076, + 4.966237, + 4.966396, + 4.966555, + 4.966712, + 4.966868, + 4.967023, + 4.967177, + 4.967329, + 4.967481, + 4.967632, + 4.967782, + 4.967930, + 4.968078, + 4.968224, + 4.968370, + 4.968514, + 4.968658, + 4.968801, + 4.968942, + 4.969083, + 4.969223, + 4.969361, + 4.969499, + 4.969636, + 4.969772, + 4.969907, + 4.970041, + 4.970175, + 4.970307, + 4.970439, + 4.970569, + 4.970699, + 4.970828, + 4.970956, + 4.971083, + 4.971210, + 4.971335, + 4.971460, + 4.971584, + 4.971707, + 4.971829, + 4.971951, + 4.972072, + 4.972192, + 4.972311, + 4.972429, + 4.972547, + 4.972664, + 4.972780, + 4.972896, + 4.973010, + 4.973124, + 4.973238, + 4.973350, + 4.973462, + 4.973573, + 4.973684, + 4.973794, + 4.973903, + 4.974011, + 4.974119, + 4.974226, + 4.974332, + 4.974438, + 4.974543, + 4.974648, + 4.974751, + 4.974855, + 4.974957, + 4.975059, + 4.975160, + 4.975261, + 4.975361, + 4.975460, + 4.975559, + 4.975658, + 4.975755, + 4.975852, + 4.975949, + 4.976045, + 4.976140, + 4.976235, + 4.976329, + 4.976423, + 4.976516, + 4.976609, + 4.976701, + 4.976792, + 4.976883, + 4.976973, + 4.977063, + 4.977153, + 4.977241, + 4.977330, + 4.977418, + 4.977505, + 4.977592, + 4.977678, + 4.977764, + 4.977849, + 4.977934, + 4.978018, + 4.978102, + 4.978185, + 4.978268, + 4.978351, + 4.978433, + 4.978514, + 4.978595, + 4.978676, + 4.978756, + 4.978835, + 4.978915, + 4.978993, + 4.979072, + 4.979150, + 4.979227, + 4.979304, + 4.979381, + 4.979457, + 4.979533, + 4.979608, + 4.979683, + 4.979757, + 4.979831, + 4.979905, + 4.979978, + 4.980051, + 4.980124, + 4.980196, + 4.980268, + 4.980339, + 4.980410, + 4.980480, + 4.980551, + 4.980620, + 4.980690, + 4.980759, + 4.980828, + 4.980896, + 4.980964, + 4.981031, + 4.981099, + 4.981165, + 4.981232, + 4.981298, + 4.981364, + 4.981429, + 4.981495, + 4.981559, + 4.981624, + 4.981688, + 4.981752, + 4.981815, + 4.981878, + 4.981941, + 4.982003, + 4.982066, + 4.982127, + 4.982189, + 4.982250, + 4.982311, + 4.982371, + 4.982432, + 4.982492, + 4.982551, + 4.982611, + 4.982670, + 4.982728, + 4.982787, + 4.982845, + 4.982903, + 4.982960, + 4.983017, + 4.983074, + 4.983131, + 4.983187, + 4.983244, + 4.983299, + 4.983355, + 4.983410, + 4.983465, + 4.983520, + 4.983574, + 4.983629, + 4.983682, + 4.983736, + 4.983790, + 4.983843, + 4.983896, + 4.983948, + 4.984000, + 4.984053, + 4.984104, + 4.984156, + 4.984207, + 4.984258, + 4.984309, + 4.984360, + 4.984410, + 4.984460, + 4.984510, + 4.984560, + 4.984609, + 4.984658, + 4.984707, + 4.984756, + 4.984804, + 4.984853, + 4.984901, + 4.984948, + 4.984996, + 4.985043, + 4.985090, + 4.985137, + 4.985184, + 4.985230, + 4.985276, + 4.985322, + 4.985368, + 4.985414, + 4.985459, + 4.985504, + 4.985549, + 4.985594, + 4.985638, + 4.985683, + 4.985727, + 4.985771, + 4.985815, + 4.985858, + 4.985901, + 4.985944, + 4.985987, + 4.986030, + 4.986073, + 4.986115, + 4.986157, + 4.986199, + 4.986241, + 4.986282, + 4.986324, + 4.986365, + 4.986406, + 4.986447, + 4.986487, + 4.986528, + 4.986568, + 4.986608, + 4.986648, + 4.986688, + 4.986727, + 4.986767, + 4.986806, + 4.986845, + 4.986884, + 4.986922, + 4.986961, + 4.986999, + 4.987037, + 4.987075, + 4.987113, + 4.987151, + 4.987188, + 4.987226, + 4.987263, + 4.987300, + 4.987337, + 4.987373, + 4.987410, + 4.987446, + 4.987483, + 4.987519, + 4.987555, + 4.987590, + 4.987626, + 4.987661, + 4.987697, + 4.987732, + 4.987767, + 4.987802, + 4.987836, + 4.987871, + 4.987905, + 4.987940, + 4.987974, + 4.988008, + 4.988041, + 4.988075, + 4.988109, + 4.988142, + 4.988175, + 4.988208, + 4.988241, + 4.988274, + 4.988307, + 4.988339, + 4.988372, + 4.988404, + 4.988436, + 4.988468, + 4.988500, + 4.988532, + 4.988564, + 4.988595, + 4.988627, + 4.988658, + 4.988689, + 4.988720, + 4.988751, + 4.988781, + 4.988812, + 4.988843, + 4.988873, + 4.988903, + 4.988933, + 4.988963, + 4.988993, + 4.989023, + 4.989052, + 4.989082, + 4.989111, + 4.989141, + 4.989170, + 4.989199, + 4.989228, + 4.989256, + 4.989285, + 4.989314, + 4.989342, + 4.989371, + 4.989399, + 4.989427, + 4.989455, + 4.989483, + 4.989511, + 4.989538, + 4.989566, + 4.989593, + 4.989621, + 4.989648, + 4.989675, + 4.989702, + 4.989729, + 4.989756, + 4.989782, + 4.989809, + 4.989836, + 4.989862, + 4.989888, + 4.989914, + 4.989940, + 4.989966, + 4.989992, + 4.990018, + 4.990044, + 4.990069, + 4.990095, + 4.990120, + 4.990146, + 4.990171, + 4.990196, + 4.990221, + 4.990246, + 4.990271, + 4.990295, + 4.990320, + 4.990345, + 4.990369, + 4.990393, + 4.990418, + 4.990442, + 4.990466, + 4.990490, + 4.990514, + 4.990538, + 4.990561, + 4.990585, + 4.990608, + 4.990632, + 4.990655, + 4.990678, + 4.990702, + 4.990725, + 4.990748, + 4.990771, + 4.990794, + 4.990816, + 4.990839, + 4.990862, + 4.990884, + 4.990906, + 4.990929, + 4.990951, + 4.990973, + 4.990995, + 4.991017, + 4.991039, + 4.991061, + 4.991083, + 4.991105, + 4.991126, + 4.991148, + 4.991169, + 4.991191, + 4.991212, + 4.991233, + 4.991254, + 4.991275, + 4.991296, + 4.991317, + 4.991338, + 4.991359, + 4.991380, + 4.991400, + 4.991421, + 4.991441, + 4.991462, + 4.991482, + 4.991502, + 4.991522, + 4.991543, + 4.991563, + 4.991583, + 4.991602, + 4.991622, + 4.991642, + 4.991662, + 4.991681, + 4.991701, + 4.991720, + 4.991740, + 4.991759, + 4.991778, + 4.991798, + 4.991817, + 4.991836, + 4.991855, + 4.991874, + 4.991893, + 4.991911, + 4.991930, + 4.991949, + 4.991967, + 4.991986, + 4.992005, + 4.992023, + 4.992041, + 4.992060, + 4.992078, + 4.992096, + 4.992114, + 4.992132, + 4.992150, + 4.992168, + 4.992186, + 4.992204, + 4.992221, + 4.992239, + 4.992257, + 4.992274, + 4.992292, + 4.992309, + 4.992327, + 4.992344, + 4.992361, + 4.992378, + 4.992396, + 4.992413, + 4.992430, + 4.992447, + 4.992464, + 4.992480, + 4.992497, + 4.992514, + 4.992531, + 4.992547, + 4.992564, + 4.992580, + 4.992597, + 4.992613, + 4.992630, + 4.992646, + 4.992662, + 4.992678, + 4.992695, + 4.992711, + 4.992727, + 4.992743, + 4.992759, + 4.992774, + 4.992790, + 4.992806, + 4.992822, + 4.992837, + 4.992853, + 4.992869, + 4.992884, + 4.992900, + 4.992915, + 4.992930, + 4.992946, + 4.992961, + 4.992976, + 4.992991, + 4.993007, + 4.993022, + 4.993037, + 4.993052, + 4.993067, + 4.993081, + 4.993096, + 4.993111, + 4.993126, + 4.993140, + 4.993155, + 4.993170, + 4.993184, + 4.993199, + 4.993213, + 4.993228, + 4.993242, + 4.993256, + 4.993271, + 4.993285, + 4.993299, + 4.993313, + 4.993327, + 4.993341, + 4.993355, + 4.993369, + 4.993383, + 4.993397, + 4.993411, + 4.993425, + 4.993438, + 4.993452, + 4.993466, + 4.993479, + 4.993493, + 4.993506, + 4.993520, + 4.993533, + 4.993547, + 4.993560, + 4.993573, + 4.993587, + 4.993600, + 4.993613, + 4.993626, + 4.993639, + 4.993652, + 4.993666, + 4.993679, + 4.993691, + 4.993704, + 4.993717, + 4.993730, + 4.993743, + 4.993756, + 4.993768, + 4.993781, + 4.993794, + 4.993806, + 4.993819, + 4.993831, + 4.993844, + 4.993856, + 4.993869, + 4.993881, + 4.993893, + 4.993906, + 4.993918, + 4.993930, + 4.993942, + 4.993955, + 4.993967, + 4.993979, + 4.993991, + 4.994003, + }, + {// The expectations for dimension = 11 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201666, + 0.239999, + 0.281663, + 0.326658, + 0.374981, + 0.426626, + 0.481585, + 0.539844, + 0.601382, + 0.666167, + 0.734155, + 0.805284, + 0.879474, + 0.956620, + 1.036592, + 1.119231, + 1.204349, + 1.291728, + 1.381120, + 1.472253, + 1.564828, + 1.658533, + 1.753038, + 1.848011, + 1.943116, + 2.038024, + 2.132419, + 2.226001, + 2.318491, + 2.409635, + 2.499209, + 2.587016, + 2.672890, + 2.756692, + 2.838315, + 2.917677, + 2.994720, + 3.069410, + 3.141733, + 3.211690, + 3.279300, + 3.344594, + 3.407611, + 3.468401, + 3.527018, + 3.583524, + 3.637982, + 3.690458, + 3.741020, + 3.789736, + 3.836673, + 3.881899, + 3.925480, + 3.967481, + 4.007965, + 4.046994, + 4.084627, + 4.120921, + 4.155932, + 4.189713, + 4.222314, + 4.253785, + 4.284173, + 4.313522, + 4.341877, + 4.369276, + 4.395761, + 4.421369, + 4.446134, + 4.470093, + 4.493276, + 4.515716, + 4.537443, + 4.558484, + 4.578866, + 4.598617, + 4.617759, + 4.636318, + 4.654315, + 4.671773, + 4.688710, + 4.705149, + 4.721106, + 4.736600, + 4.751648, + 4.766267, + 4.780471, + 4.794277, + 4.807699, + 4.820750, + 4.833443, + 4.845792, + 4.857807, + 4.869502, + 4.880886, + 4.891970, + 4.902765, + 4.913280, + 4.923525, + 4.933509, + 4.943240, + 4.952726, + 4.961976, + 4.970998, + 4.979797, + 4.988383, + 4.996761, + 5.004938, + 5.012920, + 5.020713, + 5.028323, + 5.035756, + 5.043017, + 5.050111, + 5.057043, + 5.063819, + 5.070441, + 5.076917, + 5.083248, + 5.089440, + 5.095497, + 5.101422, + 5.107219, + 5.112893, + 5.118445, + 5.123880, + 5.129201, + 5.134411, + 5.139513, + 5.144510, + 5.149405, + 5.154200, + 5.158899, + 5.163503, + 5.168016, + 5.172439, + 5.176775, + 5.181027, + 5.185196, + 5.189284, + 5.193294, + 5.197227, + 5.201086, + 5.204872, + 5.208587, + 5.212233, + 5.215811, + 5.219324, + 5.222772, + 5.226158, + 5.229483, + 5.232747, + 5.235954, + 5.239103, + 5.242197, + 5.245236, + 5.248223, + 5.251157, + 5.254041, + 5.256876, + 5.259661, + 5.262400, + 5.265092, + 5.267739, + 5.270342, + 5.272902, + 5.275419, + 5.277895, + 5.280331, + 5.282727, + 5.285084, + 5.287403, + 5.289685, + 5.291930, + 5.294140, + 5.296316, + 5.298457, + 5.300564, + 5.302639, + 5.304682, + 5.306694, + 5.308675, + 5.310625, + 5.312546, + 5.314438, + 5.316302, + 5.318138, + 5.319947, + 5.321729, + 5.323484, + 5.325214, + 5.326919, + 5.328599, + 5.330255, + 5.331887, + 5.333496, + 5.335082, + 5.336646, + 5.338187, + 5.339707, + 5.341205, + 5.342683, + 5.344140, + 5.345577, + 5.346995, + 5.348393, + 5.349772, + 5.351133, + 5.352475, + 5.353799, + 5.355105, + 5.356394, + 5.357666, + 5.358922, + 5.360160, + 5.361383, + 5.362590, + 5.363781, + 5.364956, + 5.366117, + 5.367263, + 5.368394, + 5.369510, + 5.370613, + 5.371702, + 5.372777, + 5.373839, + 5.374887, + 5.375923, + 5.376946, + 5.377956, + 5.378954, + 5.379939, + 5.380913, + 5.381875, + 5.382826, + 5.383765, + 5.384692, + 5.385609, + 5.386515, + 5.387410, + 5.388295, + 5.389170, + 5.390034, + 5.390888, + 5.391732, + 5.392567, + 5.393391, + 5.394207, + 5.395013, + 5.395810, + 5.396598, + 5.397377, + 5.398148, + 5.398909, + 5.399663, + 5.400407, + 5.401144, + 5.401873, + 5.402593, + 5.403306, + 5.404011, + 5.404708, + 5.405397, + 5.406080, + 5.406754, + 5.407422, + 5.408083, + 5.408736, + 5.409383, + 5.410022, + 5.410655, + 5.411282, + 5.411901, + 5.412515, + 5.413122, + 5.413722, + 5.414317, + 5.414905, + 5.415488, + 5.416064, + 5.416635, + 5.417199, + 5.417758, + 5.418312, + 5.418860, + 5.419402, + 5.419939, + 5.420471, + 5.420997, + 5.421518, + 5.422034, + 5.422545, + 5.423051, + 5.423552, + 5.424048, + 5.424540, + 5.425026, + 5.425508, + 5.425985, + 5.426458, + 5.426926, + 5.427390, + 5.427850, + 5.428305, + 5.428755, + 5.429202, + 5.429644, + 5.430083, + 5.430517, + 5.430947, + 5.431373, + 5.431795, + 5.432214, + 5.432628, + 5.433039, + 5.433446, + 5.433849, + 5.434249, + 5.434645, + 5.435037, + 5.435426, + 5.435812, + 5.436194, + 5.436573, + 5.436948, + 5.437320, + 5.437689, + 5.438054, + 5.438416, + 5.438775, + 5.439131, + 5.439484, + 5.439834, + 5.440181, + 5.440525, + 5.440866, + 5.441204, + 5.441539, + 5.441871, + 5.442200, + 5.442527, + 5.442851, + 5.443172, + 5.443490, + 5.443806, + 5.444119, + 5.444430, + 5.444738, + 5.445043, + 5.445346, + 5.445646, + 5.445944, + 5.446240, + 5.446533, + 5.446823, + 5.447112, + 5.447398, + 5.447681, + 5.447963, + 5.448242, + 5.448519, + 5.448794, + 5.449066, + 5.449336, + 5.449605, + 5.449871, + 5.450135, + 5.450396, + 5.450656, + 5.450914, + 5.451170, + 5.451424, + 5.451675, + 5.451925, + 5.452173, + 5.452419, + 5.452663, + 5.452906, + 5.453146, + 5.453385, + 5.453621, + 5.453856, + 5.454089, + 5.454321, + 5.454551, + 5.454778, + 5.455005, + 5.455229, + 5.455452, + 5.455673, + 5.455893, + 5.456111, + 5.456327, + 5.456542, + 5.456755, + 5.456967, + 5.457177, + 5.457385, + 5.457592, + 5.457798, + 5.458002, + 5.458204, + 5.458405, + 5.458605, + 5.458803, + 5.459000, + 5.459195, + 5.459389, + 5.459582, + 5.459773, + 5.459963, + 5.460152, + 5.460339, + 5.460525, + 5.460709, + 5.460893, + 5.461075, + 5.461256, + 5.461435, + 5.461613, + 5.461790, + 5.461966, + 5.462141, + 5.462314, + 5.462486, + 5.462657, + 5.462827, + 5.462996, + 5.463164, + 5.463330, + 5.463495, + 5.463660, + 5.463823, + 5.463985, + 5.464146, + 5.464305, + 5.464464, + 5.464622, + 5.464779, + 5.464934, + 5.465089, + 5.465242, + 5.465395, + 5.465547, + 5.465697, + 5.465847, + 5.465995, + 5.466143, + 5.466290, + 5.466435, + 5.466580, + 5.466724, + 5.466867, + 5.467009, + 5.467150, + 5.467290, + 5.467430, + 5.467568, + 5.467706, + 5.467842, + 5.467978, + 5.468113, + 5.468247, + 5.468380, + 5.468513, + 5.468644, + 5.468775, + 5.468905, + 5.469034, + 5.469163, + 5.469290, + 5.469417, + 5.469543, + 5.469668, + 5.469793, + 5.469916, + 5.470039, + 5.470161, + 5.470283, + 5.470403, + 5.470523, + 5.470643, + 5.470761, + 5.470879, + 5.470996, + 5.471112, + 5.471228, + 5.471343, + 5.471457, + 5.471571, + 5.471684, + 5.471796, + 5.471908, + 5.472019, + 5.472129, + 5.472238, + 5.472347, + 5.472456, + 5.472563, + 5.472670, + 5.472777, + 5.472883, + 5.472988, + 5.473093, + 5.473197, + 5.473300, + 5.473403, + 5.473505, + 5.473607, + 5.473708, + 5.473808, + 5.473908, + 5.474007, + 5.474106, + 5.474204, + 5.474302, + 5.474399, + 5.474495, + 5.474591, + 5.474687, + 5.474782, + 5.474876, + 5.474970, + 5.475063, + 5.475156, + 5.475248, + 5.475340, + 5.475431, + 5.475522, + 5.475612, + 5.475702, + 5.475791, + 5.475880, + 5.475968, + 5.476056, + 5.476144, + 5.476230, + 5.476317, + 5.476403, + 5.476488, + 5.476573, + 5.476658, + 5.476742, + 5.476825, + 5.476908, + 5.476991, + 5.477073, + 5.477155, + 5.477237, + 5.477318, + 5.477398, + 5.477478, + 5.477558, + 5.477637, + 5.477716, + 5.477794, + 5.477872, + 5.477950, + 5.478027, + 5.478104, + 5.478180, + 5.478256, + 5.478332, + 5.478407, + 5.478482, + 5.478556, + 5.478630, + 5.478704, + 5.478777, + 5.478850, + 5.478923, + 5.478995, + 5.479066, + 5.479138, + 5.479209, + 5.479280, + 5.479350, + 5.479420, + 5.479489, + 5.479559, + 5.479628, + 5.479696, + 5.479764, + 5.479832, + 5.479900, + 5.479967, + 5.480034, + 5.480100, + 5.480166, + 5.480232, + 5.480298, + 5.480363, + 5.480428, + 5.480492, + 5.480557, + 5.480621, + 5.480684, + 5.480748, + 5.480811, + 5.480873, + 5.480936, + 5.480998, + 5.481059, + 5.481121, + 5.481182, + 5.481243, + 5.481304, + 5.481364, + 5.481424, + 5.481483, + 5.481543, + 5.481602, + 5.481661, + 5.481719, + 5.481778, + 5.481836, + 5.481893, + 5.481951, + 5.482008, + 5.482065, + 5.482122, + 5.482178, + 5.482234, + 5.482290, + 5.482346, + 5.482401, + 5.482456, + 5.482511, + 5.482565, + 5.482620, + 5.482674, + 5.482727, + 5.482781, + 5.482834, + 5.482887, + 5.482940, + 5.482993, + 5.483045, + 5.483097, + 5.483149, + 5.483200, + 5.483252, + 5.483303, + 5.483354, + 5.483404, + 5.483455, + 5.483505, + 5.483555, + 5.483605, + 5.483654, + 5.483704, + 5.483753, + 5.483801, + 5.483850, + 5.483898, + 5.483947, + 5.483995, + 5.484042, + 5.484090, + 5.484137, + 5.484184, + 5.484231, + 5.484278, + 5.484324, + 5.484371, + 5.484417, + 5.484463, + 5.484508, + 5.484554, + 5.484599, + 5.484644, + 5.484689, + 5.484734, + 5.484778, + 5.484823, + 5.484867, + 5.484911, + 5.484954, + 5.484998, + 5.485041, + 5.485084, + 5.485127, + 5.485170, + 5.485213, + 5.485255, + 5.485297, + 5.485339, + 5.485381, + 5.485423, + 5.485465, + 5.485506, + 5.485547, + 5.485588, + 5.485629, + 5.485670, + 5.485710, + 5.485750, + 5.485790, + 5.485830, + 5.485870, + 5.485910, + 5.485949, + 5.485989, + 5.486028, + 5.486067, + 5.486105, + 5.486144, + 5.486183, + 5.486221, + 5.486259, + 5.486297, + 5.486335, + 5.486373, + 5.486410, + 5.486447, + 5.486485, + 5.486522, + 5.486559, + 5.486595, + 5.486632, + 5.486669, + 5.486705, + 5.486741, + 5.486777, + 5.486813, + 5.486849, + 5.486884, + 5.486920, + 5.486955, + 5.486990, + 5.487025, + 5.487060, + 5.487095, + 5.487129, + 5.487164, + 5.487198, + 5.487232, + 5.487266, + 5.487300, + 5.487334, + 5.487368, + 5.487401, + 5.487434, + 5.487468, + 5.487501, + 5.487534, + 5.487567, + 5.487599, + 5.487632, + 5.487664, + 5.487697, + 5.487729, + 5.487761, + 5.487793, + 5.487825, + 5.487856, + 5.487888, + 5.487919, + 5.487951, + 5.487982, + 5.488013, + 5.488044, + 5.488075, + 5.488106, + 5.488136, + 5.488167, + 5.488197, + 5.488227, + 5.488258, + 5.488288, + 5.488317, + 5.488347, + 5.488377, + 5.488407, + 5.488436, + 5.488465, + 5.488495, + 5.488524, + 5.488553, + 5.488582, + 5.488610, + 5.488639, + 5.488668, + 5.488696, + 5.488724, + 5.488753, + 5.488781, + 5.488809, + 5.488837, + 5.488865, + 5.488892, + 5.488920, + 5.488948, + 5.488975, + 5.489002, + 5.489030, + 5.489057, + 5.489084, + 5.489111, + 5.489137, + 5.489164, + 5.489191, + 5.489217, + 5.489244, + 5.489270, + 5.489296, + 5.489322, + 5.489348, + 5.489374, + 5.489400, + 5.489426, + 5.489452, + 5.489477, + 5.489503, + 5.489528, + 5.489553, + 5.489579, + 5.489604, + 5.489629, + 5.489654, + 5.489678, + 5.489703, + 5.489728, + 5.489752, + 5.489777, + 5.489801, + 5.489826, + 5.489850, + 5.489874, + 5.489898, + 5.489922, + 5.489946, + 5.489970, + 5.489993, + 5.490017, + 5.490041, + 5.490064, + 5.490087, + 5.490111, + 5.490134, + 5.490157, + 5.490180, + 5.490203, + 5.490226, + 5.490249, + 5.490271, + 5.490294, + 5.490317, + 5.490339, + 5.490362, + 5.490384, + 5.490406, + 5.490428, + 5.490450, + 5.490472, + 5.490494, + 5.490516, + 5.490538, + 5.490560, + 5.490581, + 5.490603, + 5.490625, + 5.490646, + 5.490667, + 5.490689, + 5.490710, + 5.490731, + 5.490752, + 5.490773, + 5.490794, + 5.490815, + 5.490836, + 5.490856, + 5.490877, + 5.490897, + 5.490918, + 5.490938, + 5.490959, + 5.490979, + 5.490999, + 5.491019, + 5.491040, + 5.491060, + 5.491080, + 5.491099, + 5.491119, + 5.491139, + 5.491159, + 5.491178, + 5.491198, + 5.491217, + 5.491237, + 5.491256, + 5.491275, + 5.491295, + 5.491314, + 5.491333, + 5.491352, + 5.491371, + 5.491390, + 5.491409, + 5.491428, + 5.491446, + 5.491465, + 5.491484, + 5.491502, + 5.491521, + 5.491539, + 5.491557, + 5.491576, + 5.491594, + 5.491612, + 5.491630, + 5.491648, + 5.491666, + 5.491684, + 5.491702, + 5.491720, + 5.491738, + 5.491756, + 5.491773, + 5.491791, + 5.491809, + 5.491826, + 5.491843, + 5.491861, + 5.491878, + 5.491895, + 5.491913, + 5.491930, + 5.491947, + 5.491964, + 5.491981, + 5.491998, + 5.492015, + 5.492032, + 5.492049, + 5.492065, + 5.492082, + 5.492099, + 5.492115, + 5.492132, + 5.492148, + 5.492165, + 5.492181, + 5.492197, + 5.492214, + 5.492230, + 5.492246, + 5.492262, + 5.492278, + 5.492294, + 5.492310, + 5.492326, + 5.492342, + 5.492358, + 5.492374, + 5.492389, + 5.492405, + 5.492421, + 5.492436, + 5.492452, + 5.492467, + 5.492483, + 5.492498, + 5.492513, + 5.492529, + 5.492544, + 5.492559, + 5.492574, + 5.492589, + 5.492604, + 5.492619, + 5.492634, + 5.492649, + 5.492664, + 5.492679, + 5.492694, + 5.492709, + 5.492723, + 5.492738, + 5.492753, + 5.492767, + 5.492782, + 5.492796, + 5.492811, + 5.492825, + 5.492839, + 5.492854, + }, + {// The expectations for dimension = 12 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281666, + 0.326664, + 0.374994, + 0.426652, + 0.481635, + 0.539937, + 0.601546, + 0.666445, + 0.734607, + 0.805997, + 0.880563, + 0.958235, + 1.038922, + 1.122511, + 1.208860, + 1.297798, + 1.389124, + 1.482610, + 1.577996, + 1.675002, + 1.773321, + 1.872632, + 1.972606, + 2.072904, + 2.173193, + 2.273145, + 2.372447, + 2.470804, + 2.567943, + 2.663620, + 2.757614, + 2.849738, + 2.939832, + 3.027765, + 3.113436, + 3.196769, + 3.277710, + 3.356231, + 3.432320, + 3.505982, + 3.577238, + 3.646120, + 3.712668, + 3.776933, + 3.838971, + 3.898842, + 3.956610, + 4.012341, + 4.066103, + 4.117962, + 4.167988, + 4.216247, + 4.262806, + 4.307729, + 4.351079, + 4.392919, + 4.433308, + 4.472303, + 4.509961, + 4.546334, + 4.581476, + 4.615434, + 4.648257, + 4.679990, + 4.710678, + 4.740361, + 4.769081, + 4.796875, + 4.823780, + 4.849832, + 4.875063, + 4.899507, + 4.923193, + 4.946151, + 4.968409, + 4.989994, + 5.010931, + 5.031245, + 5.050960, + 5.070097, + 5.088678, + 5.106724, + 5.124255, + 5.141288, + 5.157842, + 5.173935, + 5.189582, + 5.204800, + 5.219603, + 5.234006, + 5.248024, + 5.261668, + 5.274952, + 5.287889, + 5.300489, + 5.312765, + 5.324726, + 5.336384, + 5.347748, + 5.358828, + 5.369633, + 5.380172, + 5.390454, + 5.400486, + 5.410276, + 5.419832, + 5.429162, + 5.438272, + 5.447168, + 5.455858, + 5.464348, + 5.472643, + 5.480750, + 5.488674, + 5.496420, + 5.503994, + 5.511400, + 5.518644, + 5.525730, + 5.532663, + 5.539446, + 5.546085, + 5.552583, + 5.558943, + 5.565171, + 5.571269, + 5.577241, + 5.583090, + 5.588821, + 5.594435, + 5.599936, + 5.605326, + 5.610610, + 5.615790, + 5.620867, + 5.625846, + 5.630728, + 5.635516, + 5.640212, + 5.644819, + 5.649339, + 5.653774, + 5.658126, + 5.662397, + 5.666589, + 5.670704, + 5.674744, + 5.678711, + 5.682606, + 5.686431, + 5.690188, + 5.693879, + 5.697504, + 5.701066, + 5.704566, + 5.708005, + 5.711385, + 5.714706, + 5.717972, + 5.721181, + 5.724337, + 5.727440, + 5.730491, + 5.733491, + 5.736442, + 5.739345, + 5.742200, + 5.745008, + 5.747772, + 5.750491, + 5.753166, + 5.755799, + 5.758390, + 5.760940, + 5.763451, + 5.765922, + 5.768355, + 5.770751, + 5.773109, + 5.775432, + 5.777719, + 5.779972, + 5.782191, + 5.784377, + 5.786530, + 5.788651, + 5.790741, + 5.792800, + 5.794829, + 5.796829, + 5.798799, + 5.800741, + 5.802656, + 5.804543, + 5.806403, + 5.808237, + 5.810045, + 5.811827, + 5.813585, + 5.815319, + 5.817028, + 5.818714, + 5.820377, + 5.822017, + 5.823635, + 5.825231, + 5.826805, + 5.828359, + 5.829891, + 5.831404, + 5.832896, + 5.834369, + 5.835822, + 5.837256, + 5.838672, + 5.840070, + 5.841449, + 5.842811, + 5.844155, + 5.845482, + 5.846793, + 5.848086, + 5.849364, + 5.850625, + 5.851871, + 5.853102, + 5.854317, + 5.855517, + 5.856702, + 5.857873, + 5.859030, + 5.860173, + 5.861302, + 5.862417, + 5.863519, + 5.864608, + 5.865684, + 5.866747, + 5.867797, + 5.868836, + 5.869862, + 5.870876, + 5.871878, + 5.872869, + 5.873849, + 5.874817, + 5.875774, + 5.876720, + 5.877655, + 5.878580, + 5.879495, + 5.880399, + 5.881293, + 5.882177, + 5.883051, + 5.883916, + 5.884771, + 5.885617, + 5.886453, + 5.887280, + 5.888099, + 5.888908, + 5.889709, + 5.890501, + 5.891285, + 5.892060, + 5.892827, + 5.893586, + 5.894337, + 5.895080, + 5.895815, + 5.896543, + 5.897263, + 5.897975, + 5.898680, + 5.899378, + 5.900069, + 5.900752, + 5.901429, + 5.902099, + 5.902762, + 5.903418, + 5.904068, + 5.904711, + 5.905347, + 5.905978, + 5.906602, + 5.907220, + 5.907832, + 5.908437, + 5.909037, + 5.909631, + 5.910219, + 5.910802, + 5.911379, + 5.911950, + 5.912516, + 5.913076, + 5.913631, + 5.914181, + 5.914725, + 5.915265, + 5.915799, + 5.916328, + 5.916852, + 5.917372, + 5.917886, + 5.918396, + 5.918901, + 5.919401, + 5.919897, + 5.920388, + 5.920875, + 5.921357, + 5.921835, + 5.922309, + 5.922778, + 5.923243, + 5.923704, + 5.924160, + 5.924613, + 5.925061, + 5.925506, + 5.925947, + 5.926383, + 5.926816, + 5.927246, + 5.927671, + 5.928093, + 5.928511, + 5.928925, + 5.929336, + 5.929743, + 5.930147, + 5.930547, + 5.930944, + 5.931337, + 5.931727, + 5.932114, + 5.932497, + 5.932878, + 5.933255, + 5.933629, + 5.933999, + 5.934367, + 5.934732, + 5.935093, + 5.935452, + 5.935808, + 5.936160, + 5.936510, + 5.936857, + 5.937201, + 5.937543, + 5.937881, + 5.938217, + 5.938550, + 5.938880, + 5.939208, + 5.939533, + 5.939856, + 5.940176, + 5.940493, + 5.940808, + 5.941121, + 5.941430, + 5.941738, + 5.942043, + 5.942346, + 5.942646, + 5.942944, + 5.943240, + 5.943533, + 5.943824, + 5.944113, + 5.944400, + 5.944685, + 5.944967, + 5.945247, + 5.945525, + 5.945801, + 5.946075, + 5.946347, + 5.946616, + 5.946884, + 5.947150, + 5.947413, + 5.947675, + 5.947935, + 5.948193, + 5.948449, + 5.948703, + 5.948955, + 5.949205, + 5.949454, + 5.949700, + 5.949945, + 5.950188, + 5.950430, + 5.950669, + 5.950907, + 5.951143, + 5.951378, + 5.951610, + 5.951841, + 5.952071, + 5.952299, + 5.952525, + 5.952750, + 5.952973, + 5.953194, + 5.953414, + 5.953632, + 5.953849, + 5.954064, + 5.954278, + 5.954490, + 5.954701, + 5.954910, + 5.955118, + 5.955325, + 5.955530, + 5.955734, + 5.955936, + 5.956137, + 5.956336, + 5.956534, + 5.956731, + 5.956927, + 5.957121, + 5.957314, + 5.957505, + 5.957695, + 5.957884, + 5.958072, + 5.958259, + 5.958444, + 5.958628, + 5.958811, + 5.958992, + 5.959173, + 5.959352, + 5.959530, + 5.959707, + 5.959882, + 5.960057, + 5.960230, + 5.960403, + 5.960574, + 5.960744, + 5.960913, + 5.961081, + 5.961247, + 5.961413, + 5.961578, + 5.961741, + 5.961904, + 5.962066, + 5.962226, + 5.962386, + 5.962544, + 5.962702, + 5.962858, + 5.963014, + 5.963168, + 5.963322, + 5.963474, + 5.963626, + 5.963777, + 5.963927, + 5.964075, + 5.964223, + 5.964370, + 5.964517, + 5.964662, + 5.964806, + 5.964950, + 5.965092, + 5.965234, + 5.965375, + 5.965515, + 5.965654, + 5.965792, + 5.965930, + 5.966067, + 5.966202, + 5.966337, + 5.966472, + 5.966605, + 5.966738, + 5.966870, + 5.967001, + 5.967131, + 5.967260, + 5.967389, + 5.967517, + 5.967644, + 5.967771, + 5.967897, + 5.968022, + 5.968146, + 5.968270, + 5.968392, + 5.968515, + 5.968636, + 5.968757, + 5.968877, + 5.968996, + 5.969115, + 5.969233, + 5.969350, + 5.969467, + 5.969583, + 5.969698, + 5.969813, + 5.969927, + 5.970040, + 5.970153, + 5.970265, + 5.970376, + 5.970487, + 5.970598, + 5.970707, + 5.970816, + 5.970925, + 5.971032, + 5.971140, + 5.971246, + 5.971352, + 5.971458, + 5.971562, + 5.971667, + 5.971770, + 5.971873, + 5.971976, + 5.972078, + 5.972179, + 5.972280, + 5.972381, + 5.972481, + 5.972580, + 5.972679, + 5.972777, + 5.972874, + 5.972972, + 5.973068, + 5.973164, + 5.973260, + 5.973355, + 5.973450, + 5.973544, + 5.973637, + 5.973730, + 5.973823, + 5.973915, + 5.974007, + 5.974098, + 5.974188, + 5.974279, + 5.974368, + 5.974457, + 5.974546, + 5.974635, + 5.974722, + 5.974810, + 5.974897, + 5.974983, + 5.975069, + 5.975155, + 5.975240, + 5.975325, + 5.975409, + 5.975493, + 5.975576, + 5.975659, + 5.975742, + 5.975824, + 5.975906, + 5.975987, + 5.976068, + 5.976149, + 5.976229, + 5.976309, + 5.976388, + 5.976467, + 5.976545, + 5.976623, + 5.976701, + 5.976779, + 5.976856, + 5.976932, + 5.977008, + 5.977084, + 5.977160, + 5.977235, + 5.977309, + 5.977384, + 5.977458, + 5.977531, + 5.977605, + 5.977678, + 5.977750, + 5.977822, + 5.977894, + 5.977966, + 5.978037, + 5.978108, + 5.978178, + 5.978248, + 5.978318, + 5.978387, + 5.978457, + 5.978525, + 5.978594, + 5.978662, + 5.978730, + 5.978797, + 5.978864, + 5.978931, + 5.978998, + 5.979064, + 5.979130, + 5.979196, + 5.979261, + 5.979326, + 5.979390, + 5.979455, + 5.979519, + 5.979583, + 5.979646, + 5.979709, + 5.979772, + 5.979835, + 5.979897, + 5.979959, + 5.980021, + 5.980082, + 5.980143, + 5.980204, + 5.980265, + 5.980325, + 5.980385, + 5.980445, + 5.980505, + 5.980564, + 5.980623, + 5.980681, + 5.980740, + 5.980798, + 5.980856, + 5.980914, + 5.980971, + 5.981028, + 5.981085, + 5.981142, + 5.981198, + 5.981254, + 5.981310, + 5.981365, + 5.981421, + 5.981476, + 5.981531, + 5.981585, + 5.981640, + 5.981694, + 5.981748, + 5.981801, + 5.981855, + 5.981908, + 5.981961, + 5.982014, + 5.982066, + 5.982118, + 5.982171, + 5.982222, + 5.982274, + 5.982325, + 5.982376, + 5.982427, + 5.982478, + 5.982528, + 5.982579, + 5.982629, + 5.982679, + 5.982728, + 5.982778, + 5.982827, + 5.982876, + 5.982925, + 5.982973, + 5.983021, + 5.983070, + 5.983118, + 5.983165, + 5.983213, + 5.983260, + 5.983307, + 5.983354, + 5.983401, + 5.983448, + 5.983494, + 5.983540, + 5.983586, + 5.983632, + 5.983677, + 5.983723, + 5.983768, + 5.983813, + 5.983858, + 5.983902, + 5.983947, + 5.983991, + 5.984035, + 5.984079, + 5.984123, + 5.984166, + 5.984210, + 5.984253, + 5.984296, + 5.984339, + 5.984381, + 5.984424, + 5.984466, + 5.984508, + 5.984550, + 5.984592, + 5.984634, + 5.984675, + 5.984717, + 5.984758, + 5.984799, + 5.984839, + 5.984880, + 5.984921, + 5.984961, + 5.985001, + 5.985041, + 5.985081, + 5.985120, + 5.985160, + 5.985199, + 5.985239, + 5.985278, + 5.985316, + 5.985355, + 5.985394, + 5.985432, + 5.985470, + 5.985509, + 5.985547, + 5.985584, + 5.985622, + 5.985660, + 5.985697, + 5.985734, + 5.985771, + 5.985808, + 5.985845, + 5.985882, + 5.985918, + 5.985955, + 5.985991, + 5.986027, + 5.986063, + 5.986099, + 5.986134, + 5.986170, + 5.986205, + 5.986241, + 5.986276, + 5.986311, + 5.986346, + 5.986380, + 5.986415, + 5.986449, + 5.986484, + 5.986518, + 5.986552, + 5.986586, + 5.986620, + 5.986654, + 5.986687, + 5.986721, + 5.986754, + 5.986787, + 5.986820, + 5.986853, + 5.986886, + 5.986919, + 5.986951, + 5.986984, + 5.987016, + 5.987048, + 5.987080, + 5.987112, + 5.987144, + 5.987176, + 5.987207, + 5.987239, + 5.987270, + 5.987302, + 5.987333, + 5.987364, + 5.987395, + 5.987426, + 5.987456, + 5.987487, + 5.987517, + 5.987548, + 5.987578, + 5.987608, + 5.987638, + 5.987668, + 5.987698, + 5.987728, + 5.987757, + 5.987787, + 5.987816, + 5.987845, + 5.987875, + 5.987904, + 5.987933, + 5.987961, + 5.987990, + 5.988019, + 5.988047, + 5.988076, + 5.988104, + 5.988132, + 5.988161, + 5.988189, + 5.988217, + 5.988244, + 5.988272, + 5.988300, + 5.988327, + 5.988355, + 5.988382, + 5.988410, + 5.988437, + 5.988464, + 5.988491, + 5.988518, + 5.988544, + 5.988571, + 5.988598, + 5.988624, + 5.988651, + 5.988677, + 5.988703, + 5.988729, + 5.988755, + 5.988781, + 5.988807, + 5.988833, + 5.988859, + 5.988884, + 5.988910, + 5.988935, + 5.988961, + 5.988986, + 5.989011, + 5.989036, + 5.989061, + 5.989086, + 5.989111, + 5.989136, + 5.989160, + 5.989185, + 5.989209, + 5.989234, + 5.989258, + 5.989282, + 5.989307, + 5.989331, + 5.989355, + 5.989379, + 5.989402, + 5.989426, + 5.989450, + 5.989473, + 5.989497, + 5.989520, + 5.989544, + 5.989567, + 5.989590, + 5.989613, + 5.989636, + 5.989659, + 5.989682, + 5.989705, + 5.989728, + 5.989751, + 5.989773, + 5.989796, + 5.989818, + 5.989841, + 5.989863, + 5.989885, + 5.989907, + 5.989929, + 5.989951, + 5.989973, + 5.989995, + 5.990017, + 5.990039, + 5.990060, + 5.990082, + 5.990103, + 5.990125, + 5.990146, + 5.990167, + 5.990189, + 5.990210, + 5.990231, + 5.990252, + 5.990273, + 5.990294, + 5.990315, + 5.990335, + 5.990356, + 5.990377, + 5.990397, + 5.990418, + 5.990438, + 5.990459, + 5.990479, + 5.990499, + 5.990519, + 5.990539, + 5.990559, + 5.990579, + 5.990599, + 5.990619, + 5.990639, + 5.990659, + 5.990678, + 5.990698, + 5.990718, + 5.990737, + 5.990756, + 5.990776, + 5.990795, + 5.990814, + 5.990834, + 5.990853, + 5.990872, + 5.990891, + 5.990910, + 5.990929, + 5.990947, + 5.990966, + 5.990985, + 5.991003, + 5.991022, + 5.991041, + 5.991059, + 5.991077, + 5.991096, + 5.991114, + 5.991132, + 5.991151, + 5.991169, + 5.991187, + 5.991205, + 5.991223, + 5.991241, + 5.991259, + 5.991276, + 5.991294, + 5.991312, + 5.991329, + 5.991347, + 5.991365, + 5.991382, + 5.991399, + 5.991417, + 5.991434, + 5.991451, + 5.991469, + 5.991486, + 5.991503, + 5.991520, + 5.991537, + 5.991554, + 5.991571, + 5.991588, + 5.991604, + }, + {// The expectations for dimension = 13 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281666, + 0.326666, + 0.374998, + 0.426661, + 0.481655, + 0.539975, + 0.601617, + 0.666570, + 0.734822, + 0.806349, + 0.881122, + 0.959096, + 1.040212, + 1.124389, + 1.211526, + 1.301496, + 1.394144, + 1.489285, + 1.586705, + 1.686163, + 1.787387, + 1.890085, + 1.993944, + 2.098636, + 2.203827, + 2.309179, + 2.414359, + 2.519043, + 2.622924, + 2.725715, + 2.827150, + 2.926995, + 3.025039, + 3.121104, + 3.215040, + 3.306726, + 3.396069, + 3.482998, + 3.567469, + 3.649458, + 3.728957, + 3.805975, + 3.880537, + 3.952676, + 4.022435, + 4.089865, + 4.155023, + 4.217970, + 4.278768, + 4.337485, + 4.394188, + 4.448944, + 4.501820, + 4.552884, + 4.602202, + 4.649838, + 4.695856, + 4.740317, + 4.783280, + 4.824803, + 4.864943, + 4.903752, + 4.941284, + 4.977587, + 5.012710, + 5.046699, + 5.079599, + 5.111450, + 5.142295, + 5.172172, + 5.201118, + 5.229170, + 5.256361, + 5.282724, + 5.308291, + 5.333091, + 5.357154, + 5.380506, + 5.403175, + 5.425185, + 5.446561, + 5.467325, + 5.487500, + 5.507107, + 5.526167, + 5.544698, + 5.562720, + 5.580250, + 5.597306, + 5.613903, + 5.630058, + 5.645786, + 5.661101, + 5.676017, + 5.690547, + 5.704705, + 5.718502, + 5.731951, + 5.745063, + 5.757848, + 5.770318, + 5.782482, + 5.794349, + 5.805930, + 5.817233, + 5.828268, + 5.839041, + 5.849561, + 5.859836, + 5.869874, + 5.879681, + 5.889264, + 5.898630, + 5.907786, + 5.916737, + 5.925489, + 5.934049, + 5.942421, + 5.950612, + 5.958626, + 5.966467, + 5.974142, + 5.981655, + 5.989009, + 5.996210, + 6.003262, + 6.010168, + 6.016933, + 6.023560, + 6.030054, + 6.036417, + 6.042653, + 6.048765, + 6.054757, + 6.060631, + 6.066391, + 6.072040, + 6.077580, + 6.083015, + 6.088346, + 6.093576, + 6.098708, + 6.103745, + 6.108688, + 6.113540, + 6.118303, + 6.122979, + 6.127571, + 6.132080, + 6.136508, + 6.140858, + 6.145130, + 6.149327, + 6.153451, + 6.157503, + 6.161485, + 6.165398, + 6.169245, + 6.173026, + 6.176743, + 6.180397, + 6.183990, + 6.187524, + 6.190998, + 6.194416, + 6.197777, + 6.201084, + 6.204337, + 6.207538, + 6.210687, + 6.213786, + 6.216836, + 6.219837, + 6.222792, + 6.225700, + 6.228563, + 6.231381, + 6.234156, + 6.236889, + 6.239580, + 6.242230, + 6.244840, + 6.247411, + 6.249943, + 6.252438, + 6.254896, + 6.257317, + 6.259703, + 6.262054, + 6.264371, + 6.266655, + 6.268905, + 6.271124, + 6.273310, + 6.275466, + 6.277591, + 6.279686, + 6.281752, + 6.283790, + 6.285799, + 6.287780, + 6.289734, + 6.291661, + 6.293562, + 6.295437, + 6.297287, + 6.299112, + 6.300912, + 6.302689, + 6.304442, + 6.306171, + 6.307879, + 6.309563, + 6.311226, + 6.312867, + 6.314487, + 6.316086, + 6.317664, + 6.319223, + 6.320761, + 6.322280, + 6.323780, + 6.325261, + 6.326724, + 6.328168, + 6.329594, + 6.331003, + 6.332394, + 6.333769, + 6.335126, + 6.336467, + 6.337792, + 6.339101, + 6.340394, + 6.341672, + 6.342934, + 6.344182, + 6.345414, + 6.346633, + 6.347836, + 6.349026, + 6.350202, + 6.351364, + 6.352513, + 6.353649, + 6.354771, + 6.355881, + 6.356978, + 6.358063, + 6.359135, + 6.360196, + 6.361244, + 6.362281, + 6.363306, + 6.364320, + 6.365323, + 6.366314, + 6.367295, + 6.368265, + 6.369224, + 6.370173, + 6.371112, + 6.372040, + 6.372959, + 6.373868, + 6.374767, + 6.375657, + 6.376537, + 6.377407, + 6.378269, + 6.379122, + 6.379966, + 6.380801, + 6.381627, + 6.382445, + 6.383254, + 6.384055, + 6.384848, + 6.385632, + 6.386409, + 6.387178, + 6.387939, + 6.388693, + 6.389439, + 6.390177, + 6.390908, + 6.391632, + 6.392349, + 6.393058, + 6.393761, + 6.394457, + 6.395146, + 6.395828, + 6.396504, + 6.397173, + 6.397835, + 6.398491, + 6.399141, + 6.399785, + 6.400423, + 6.401054, + 6.401680, + 6.402300, + 6.402913, + 6.403522, + 6.404124, + 6.404721, + 6.405312, + 6.405898, + 6.406478, + 6.407053, + 6.407623, + 6.408188, + 6.408747, + 6.409301, + 6.409850, + 6.410395, + 6.410934, + 6.411469, + 6.411999, + 6.412524, + 6.413044, + 6.413560, + 6.414071, + 6.414577, + 6.415080, + 6.415577, + 6.416071, + 6.416560, + 6.417045, + 6.417526, + 6.418002, + 6.418474, + 6.418943, + 6.419407, + 6.419867, + 6.420324, + 6.420776, + 6.421225, + 6.421670, + 6.422111, + 6.422549, + 6.422982, + 6.423412, + 6.423839, + 6.424262, + 6.424681, + 6.425097, + 6.425510, + 6.425919, + 6.426325, + 6.426728, + 6.427127, + 6.427523, + 6.427916, + 6.428305, + 6.428692, + 6.429075, + 6.429455, + 6.429832, + 6.430207, + 6.430578, + 6.430946, + 6.431311, + 6.431674, + 6.432033, + 6.432390, + 6.432744, + 6.433095, + 6.433444, + 6.433790, + 6.434133, + 6.434473, + 6.434811, + 6.435146, + 6.435479, + 6.435809, + 6.436136, + 6.436461, + 6.436784, + 6.437104, + 6.437422, + 6.437737, + 6.438050, + 6.438360, + 6.438669, + 6.438975, + 6.439278, + 6.439580, + 6.439879, + 6.440176, + 6.440471, + 6.440763, + 6.441054, + 6.441342, + 6.441628, + 6.441912, + 6.442194, + 6.442474, + 6.442752, + 6.443028, + 6.443302, + 6.443574, + 6.443844, + 6.444112, + 6.444379, + 6.444643, + 6.444905, + 6.445166, + 6.445425, + 6.445682, + 6.445937, + 6.446190, + 6.446442, + 6.446691, + 6.446939, + 6.447186, + 6.447430, + 6.447673, + 6.447915, + 6.448154, + 6.448392, + 6.448628, + 6.448863, + 6.449096, + 6.449328, + 6.449557, + 6.449786, + 6.450013, + 6.450238, + 6.450462, + 6.450684, + 6.450905, + 6.451124, + 6.451342, + 6.451558, + 6.451773, + 6.451987, + 6.452199, + 6.452409, + 6.452619, + 6.452827, + 6.453033, + 6.453238, + 6.453442, + 6.453645, + 6.453846, + 6.454046, + 6.454245, + 6.454442, + 6.454638, + 6.454833, + 6.455026, + 6.455219, + 6.455410, + 6.455600, + 6.455788, + 6.455976, + 6.456162, + 6.456347, + 6.456531, + 6.456714, + 6.456895, + 6.457076, + 6.457255, + 6.457433, + 6.457610, + 6.457786, + 6.457961, + 6.458135, + 6.458308, + 6.458480, + 6.458650, + 6.458820, + 6.458988, + 6.459156, + 6.459322, + 6.459488, + 6.459652, + 6.459816, + 6.459978, + 6.460140, + 6.460300, + 6.460460, + 6.460618, + 6.460776, + 6.460933, + 6.461088, + 6.461243, + 6.461397, + 6.461550, + 6.461702, + 6.461853, + 6.462004, + 6.462153, + 6.462302, + 6.462449, + 6.462596, + 6.462742, + 6.462887, + 6.463031, + 6.463175, + 6.463317, + 6.463459, + 6.463600, + 6.463740, + 6.463879, + 6.464018, + 6.464156, + 6.464292, + 6.464429, + 6.464564, + 6.464699, + 6.464832, + 6.464965, + 6.465098, + 6.465229, + 6.465360, + 6.465490, + 6.465620, + 6.465748, + 6.465876, + 6.466003, + 6.466130, + 6.466256, + 6.466381, + 6.466505, + 6.466629, + 6.466752, + 6.466874, + 6.466996, + 6.467117, + 6.467237, + 6.467357, + 6.467476, + 6.467594, + 6.467712, + 6.467829, + 6.467945, + 6.468061, + 6.468176, + 6.468291, + 6.468405, + 6.468518, + 6.468631, + 6.468743, + 6.468855, + 6.468966, + 6.469076, + 6.469186, + 6.469295, + 6.469403, + 6.469511, + 6.469619, + 6.469726, + 6.469832, + 6.469938, + 6.470043, + 6.470148, + 6.470252, + 6.470355, + 6.470458, + 6.470561, + 6.470663, + 6.470764, + 6.470865, + 6.470966, + 6.471065, + 6.471165, + 6.471264, + 6.471362, + 6.471460, + 6.471557, + 6.471654, + 6.471750, + 6.471846, + 6.471942, + 6.472036, + 6.472131, + 6.472225, + 6.472318, + 6.472411, + 6.472504, + 6.472596, + 6.472687, + 6.472778, + 6.472869, + 6.472959, + 6.473049, + 6.473138, + 6.473227, + 6.473316, + 6.473404, + 6.473491, + 6.473578, + 6.473665, + 6.473751, + 6.473837, + 6.473923, + 6.474008, + 6.474092, + 6.474177, + 6.474260, + 6.474344, + 6.474427, + 6.474509, + 6.474591, + 6.474673, + 6.474755, + 6.474836, + 6.474916, + 6.474996, + 6.475076, + 6.475156, + 6.475235, + 6.475313, + 6.475392, + 6.475470, + 6.475547, + 6.475624, + 6.475701, + 6.475778, + 6.475854, + 6.475930, + 6.476005, + 6.476080, + 6.476155, + 6.476229, + 6.476303, + 6.476377, + 6.476450, + 6.476523, + 6.476596, + 6.476668, + 6.476740, + 6.476812, + 6.476883, + 6.476954, + 6.477025, + 6.477095, + 6.477165, + 6.477235, + 6.477304, + 6.477373, + 6.477442, + 6.477510, + 6.477578, + 6.477646, + 6.477714, + 6.477781, + 6.477848, + 6.477914, + 6.477981, + 6.478047, + 6.478112, + 6.478178, + 6.478243, + 6.478308, + 6.478372, + 6.478436, + 6.478500, + 6.478564, + 6.478627, + 6.478691, + 6.478753, + 6.478816, + 6.478878, + 6.478940, + 6.479002, + 6.479063, + 6.479125, + 6.479185, + 6.479246, + 6.479307, + 6.479367, + 6.479427, + 6.479486, + 6.479545, + 6.479605, + 6.479663, + 6.479722, + 6.479780, + 6.479838, + 6.479896, + 6.479954, + 6.480011, + 6.480068, + 6.480125, + 6.480182, + 6.480238, + 6.480294, + 6.480350, + 6.480406, + 6.480461, + 6.480516, + 6.480571, + 6.480626, + 6.480680, + 6.480735, + 6.480789, + 6.480842, + 6.480896, + 6.480949, + 6.481002, + 6.481055, + 6.481108, + 6.481160, + 6.481213, + 6.481265, + 6.481317, + 6.481368, + 6.481419, + 6.481471, + 6.481522, + 6.481572, + 6.481623, + 6.481673, + 6.481723, + 6.481773, + 6.481823, + 6.481872, + 6.481922, + 6.481971, + 6.482020, + 6.482069, + 6.482117, + 6.482165, + 6.482213, + 6.482261, + 6.482309, + 6.482357, + 6.482404, + 6.482451, + 6.482498, + 6.482545, + 6.482592, + 6.482638, + 6.482684, + 6.482730, + 6.482776, + 6.482822, + 6.482867, + 6.482912, + 6.482958, + 6.483003, + 6.483047, + 6.483092, + 6.483136, + 6.483181, + 6.483225, + 6.483269, + 6.483312, + 6.483356, + 6.483399, + 6.483442, + 6.483486, + 6.483528, + 6.483571, + 6.483614, + 6.483656, + 6.483698, + 6.483740, + 6.483782, + 6.483824, + 6.483866, + 6.483907, + 6.483948, + 6.483989, + 6.484030, + 6.484071, + 6.484112, + 6.484152, + 6.484192, + 6.484233, + 6.484273, + 6.484312, + 6.484352, + 6.484392, + 6.484431, + 6.484470, + 6.484509, + 6.484548, + 6.484587, + 6.484626, + 6.484664, + 6.484703, + 6.484741, + 6.484779, + 6.484817, + 6.484855, + 6.484893, + 6.484930, + 6.484967, + 6.485005, + 6.485042, + 6.485079, + 6.485116, + 6.485152, + 6.485189, + 6.485225, + 6.485262, + 6.485298, + 6.485334, + 6.485370, + 6.485405, + 6.485441, + 6.485477, + 6.485512, + 6.485547, + 6.485582, + 6.485617, + 6.485652, + 6.485687, + 6.485721, + 6.485756, + 6.485790, + 6.485825, + 6.485859, + 6.485893, + 6.485926, + 6.485960, + 6.485994, + 6.486027, + 6.486061, + 6.486094, + 6.486127, + 6.486160, + 6.486193, + 6.486226, + 6.486259, + 6.486291, + 6.486324, + 6.486356, + 6.486388, + 6.486420, + 6.486452, + 6.486484, + 6.486516, + 6.486547, + 6.486579, + 6.486610, + 6.486642, + 6.486673, + 6.486704, + 6.486735, + 6.486766, + 6.486797, + 6.486827, + 6.486858, + 6.486888, + 6.486919, + 6.486949, + 6.486979, + 6.487009, + 6.487039, + 6.487069, + 6.487099, + 6.487128, + 6.487158, + 6.487187, + 6.487216, + 6.487246, + 6.487275, + 6.487304, + 6.487333, + 6.487361, + 6.487390, + 6.487419, + 6.487447, + 6.487476, + 6.487504, + 6.487532, + 6.487560, + 6.487589, + 6.487616, + 6.487644, + 6.487672, + 6.487700, + 6.487727, + 6.487755, + 6.487782, + 6.487809, + 6.487837, + 6.487864, + 6.487891, + 6.487918, + 6.487945, + 6.487971, + 6.487998, + 6.488025, + 6.488051, + 6.488078, + 6.488104, + 6.488130, + 6.488156, + 6.488182, + 6.488208, + 6.488234, + 6.488260, + 6.488286, + 6.488311, + 6.488337, + 6.488362, + 6.488388, + 6.488413, + 6.488438, + 6.488463, + 6.488488, + 6.488513, + 6.488538, + 6.488563, + 6.488588, + 6.488612, + 6.488637, + 6.488661, + 6.488686, + 6.488710, + 6.488734, + 6.488759, + 6.488783, + 6.488807, + 6.488831, + 6.488854, + 6.488878, + 6.488902, + 6.488926, + 6.488949, + 6.488973, + 6.488996, + 6.489019, + 6.489043, + 6.489066, + 6.489089, + 6.489112, + 6.489135, + 6.489158, + 6.489181, + 6.489203, + 6.489226, + 6.489249, + 6.489271, + 6.489294, + 6.489316, + 6.489338, + 6.489361, + 6.489383, + 6.489405, + 6.489427, + 6.489449, + 6.489471, + 6.489493, + 6.489515, + 6.489536, + 6.489558, + 6.489580, + 6.489601, + 6.489622, + 6.489644, + 6.489665, + 6.489686, + 6.489708, + 6.489729, + 6.489750, + 6.489771, + 6.489792, + 6.489812, + 6.489833, + 6.489854, + 6.489875, + 6.489895, + 6.489916, + 6.489936, + 6.489957, + 6.489977, + 6.489997, + 6.490018, + 6.490038, + 6.490058, + 6.490078, + 6.490098, + 6.490118, + 6.490138, + 6.490157, + 6.490177, + 6.490197, + 6.490216, + 6.490236, + 6.490256, + }, + {// The expectations for dimension = 14 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326666, + 0.374999, + 0.426665, + 0.481662, + 0.539990, + 0.601646, + 0.666626, + 0.734921, + 0.806519, + 0.881404, + 0.959547, + 1.040910, + 1.125441, + 1.213070, + 1.303705, + 1.397232, + 1.493508, + 1.592363, + 1.693597, + 1.796981, + 1.902259, + 2.009147, + 2.117342, + 2.226522, + 2.336356, + 2.446505, + 2.556632, + 2.666407, + 2.775514, + 2.883651, + 2.990540, + 3.095930, + 3.199594, + 3.301336, + 3.400988, + 3.498412, + 3.593498, + 3.686162, + 3.776342, + 3.864002, + 3.949124, + 4.031705, + 4.111760, + 4.189315, + 4.264408, + 4.337082, + 4.407390, + 4.475391, + 4.541144, + 4.604713, + 4.666166, + 4.725569, + 4.782988, + 4.838492, + 4.892147, + 4.944018, + 4.994169, + 5.042664, + 5.089563, + 5.134927, + 5.178812, + 5.221274, + 5.262368, + 5.302144, + 5.340654, + 5.377944, + 5.414062, + 5.449053, + 5.482957, + 5.515818, + 5.547673, + 5.578561, + 5.608518, + 5.637579, + 5.665776, + 5.693142, + 5.719707, + 5.745501, + 5.770552, + 5.794886, + 5.818529, + 5.841507, + 5.863842, + 5.885557, + 5.906675, + 5.927216, + 5.947200, + 5.966646, + 5.985573, + 6.003999, + 6.021940, + 6.039413, + 6.056433, + 6.073015, + 6.089175, + 6.104925, + 6.120279, + 6.135250, + 6.149850, + 6.164091, + 6.177984, + 6.191541, + 6.204772, + 6.217686, + 6.230294, + 6.242606, + 6.254630, + 6.266374, + 6.277848, + 6.289059, + 6.300016, + 6.310725, + 6.321194, + 6.331430, + 6.341440, + 6.351230, + 6.360807, + 6.370176, + 6.379343, + 6.388315, + 6.397096, + 6.405691, + 6.414107, + 6.422347, + 6.430417, + 6.438321, + 6.446064, + 6.453650, + 6.461082, + 6.468366, + 6.475505, + 6.482503, + 6.489363, + 6.496089, + 6.502684, + 6.509152, + 6.515496, + 6.521719, + 6.527825, + 6.533815, + 6.539693, + 6.545461, + 6.551123, + 6.556681, + 6.562137, + 6.567494, + 6.572754, + 6.577919, + 6.582993, + 6.587976, + 6.592871, + 6.597680, + 6.602405, + 6.607048, + 6.611611, + 6.616095, + 6.620503, + 6.624835, + 6.629095, + 6.633283, + 6.637401, + 6.641451, + 6.645433, + 6.649350, + 6.653203, + 6.656994, + 6.660722, + 6.664391, + 6.668001, + 6.671554, + 6.675050, + 6.678491, + 6.681878, + 6.685212, + 6.688494, + 6.691725, + 6.694907, + 6.698040, + 6.701126, + 6.704164, + 6.707157, + 6.710105, + 6.713008, + 6.715869, + 6.718687, + 6.721464, + 6.724200, + 6.726896, + 6.729553, + 6.732172, + 6.734753, + 6.737297, + 6.739805, + 6.742277, + 6.744714, + 6.747118, + 6.749487, + 6.751824, + 6.754128, + 6.756400, + 6.758641, + 6.760852, + 6.763032, + 6.765183, + 6.767305, + 6.769398, + 6.771464, + 6.773502, + 6.775512, + 6.777497, + 6.779455, + 6.781387, + 6.783295, + 6.785178, + 6.787036, + 6.788870, + 6.790681, + 6.792469, + 6.794234, + 6.795977, + 6.797698, + 6.799397, + 6.801075, + 6.802732, + 6.804368, + 6.805985, + 6.807581, + 6.809158, + 6.810716, + 6.812254, + 6.813774, + 6.815276, + 6.816760, + 6.818226, + 6.819675, + 6.821106, + 6.822520, + 6.823918, + 6.825300, + 6.826665, + 6.828014, + 6.829348, + 6.830666, + 6.831969, + 6.833258, + 6.834531, + 6.835790, + 6.837035, + 6.838265, + 6.839482, + 6.840686, + 6.841875, + 6.843052, + 6.844215, + 6.845366, + 6.846504, + 6.847629, + 6.848743, + 6.849844, + 6.850933, + 6.852010, + 6.853076, + 6.854130, + 6.855173, + 6.856205, + 6.857226, + 6.858236, + 6.859236, + 6.860225, + 6.861203, + 6.862172, + 6.863130, + 6.864078, + 6.865017, + 6.865946, + 6.866865, + 6.867775, + 6.868676, + 6.869568, + 6.870450, + 6.871324, + 6.872189, + 6.873045, + 6.873892, + 6.874732, + 6.875563, + 6.876385, + 6.877200, + 6.878006, + 6.878805, + 6.879596, + 6.880379, + 6.881154, + 6.881922, + 6.882683, + 6.883436, + 6.884182, + 6.884921, + 6.885653, + 6.886378, + 6.887096, + 6.887808, + 6.888512, + 6.889210, + 6.889902, + 6.890587, + 6.891266, + 6.891938, + 6.892605, + 6.893265, + 6.893919, + 6.894567, + 6.895209, + 6.895845, + 6.896476, + 6.897101, + 6.897720, + 6.898334, + 6.898942, + 6.899545, + 6.900142, + 6.900734, + 6.901321, + 6.901903, + 6.902479, + 6.903051, + 6.903617, + 6.904179, + 6.904735, + 6.905287, + 6.905834, + 6.906376, + 6.906914, + 6.907447, + 6.907976, + 6.908500, + 6.909019, + 6.909534, + 6.910045, + 6.910552, + 6.911054, + 6.911552, + 6.912046, + 6.912535, + 6.913021, + 6.913503, + 6.913980, + 6.914454, + 6.914924, + 6.915390, + 6.915852, + 6.916310, + 6.916765, + 6.917216, + 6.917663, + 6.918107, + 6.918547, + 6.918984, + 6.919417, + 6.919846, + 6.920273, + 6.920695, + 6.921115, + 6.921531, + 6.921944, + 6.922354, + 6.922760, + 6.923163, + 6.923563, + 6.923960, + 6.924354, + 6.924745, + 6.925133, + 6.925518, + 6.925900, + 6.926279, + 6.926655, + 6.927028, + 6.927398, + 6.927766, + 6.928131, + 6.928493, + 6.928852, + 6.929209, + 6.929563, + 6.929914, + 6.930262, + 6.930609, + 6.930952, + 6.931293, + 6.931632, + 6.931968, + 6.932301, + 6.932632, + 6.932961, + 6.933287, + 6.933611, + 6.933932, + 6.934252, + 6.934568, + 6.934883, + 6.935195, + 6.935505, + 6.935813, + 6.936119, + 6.936423, + 6.936724, + 6.937023, + 6.937320, + 6.937615, + 6.937908, + 6.938199, + 6.938488, + 6.938775, + 6.939060, + 6.939342, + 6.939623, + 6.939902, + 6.940179, + 6.940454, + 6.940728, + 6.940999, + 6.941268, + 6.941536, + 6.941802, + 6.942066, + 6.942328, + 6.942588, + 6.942847, + 6.943104, + 6.943359, + 6.943613, + 6.943865, + 6.944115, + 6.944363, + 6.944610, + 6.944855, + 6.945099, + 6.945341, + 6.945581, + 6.945820, + 6.946057, + 6.946293, + 6.946527, + 6.946759, + 6.946990, + 6.947220, + 6.947448, + 6.947675, + 6.947900, + 6.948124, + 6.948346, + 6.948567, + 6.948786, + 6.949004, + 6.949221, + 6.949436, + 6.949650, + 6.949862, + 6.950074, + 6.950284, + 6.950492, + 6.950699, + 6.950905, + 6.951110, + 6.951313, + 6.951515, + 6.951716, + 6.951916, + 6.952114, + 6.952312, + 6.952507, + 6.952702, + 6.952896, + 6.953088, + 6.953279, + 6.953469, + 6.953658, + 6.953846, + 6.954033, + 6.954218, + 6.954402, + 6.954586, + 6.954768, + 6.954949, + 6.955129, + 6.955308, + 6.955485, + 6.955662, + 6.955838, + 6.956012, + 6.956186, + 6.956359, + 6.956530, + 6.956701, + 6.956870, + 6.957039, + 6.957207, + 6.957373, + 6.957539, + 6.957704, + 6.957867, + 6.958030, + 6.958192, + 6.958353, + 6.958513, + 6.958672, + 6.958830, + 6.958987, + 6.959144, + 6.959299, + 6.959454, + 6.959607, + 6.959760, + 6.959912, + 6.960063, + 6.960213, + 6.960363, + 6.960511, + 6.960659, + 6.960806, + 6.960952, + 6.961097, + 6.961242, + 6.961385, + 6.961528, + 6.961670, + 6.961812, + 6.961952, + 6.962092, + 6.962231, + 6.962369, + 6.962506, + 6.962643, + 6.962779, + 6.962914, + 6.963049, + 6.963182, + 6.963315, + 6.963448, + 6.963579, + 6.963710, + 6.963840, + 6.963970, + 6.964099, + 6.964227, + 6.964354, + 6.964481, + 6.964607, + 6.964732, + 6.964857, + 6.964981, + 6.965104, + 6.965227, + 6.965349, + 6.965471, + 6.965592, + 6.965712, + 6.965831, + 6.965950, + 6.966069, + 6.966186, + 6.966303, + 6.966420, + 6.966536, + 6.966651, + 6.966766, + 6.966880, + 6.966993, + 6.967106, + 6.967219, + 6.967330, + 6.967442, + 6.967552, + 6.967662, + 6.967772, + 6.967881, + 6.967989, + 6.968097, + 6.968204, + 6.968311, + 6.968417, + 6.968523, + 6.968628, + 6.968733, + 6.968837, + 6.968941, + 6.969044, + 6.969146, + 6.969249, + 6.969350, + 6.969451, + 6.969552, + 6.969652, + 6.969751, + 6.969850, + 6.969949, + 6.970047, + 6.970145, + 6.970242, + 6.970339, + 6.970435, + 6.970531, + 6.970626, + 6.970721, + 6.970815, + 6.970909, + 6.971003, + 6.971096, + 6.971188, + 6.971280, + 6.971372, + 6.971463, + 6.971554, + 6.971644, + 6.971734, + 6.971824, + 6.971913, + 6.972002, + 6.972090, + 6.972178, + 6.972265, + 6.972352, + 6.972439, + 6.972525, + 6.972611, + 6.972696, + 6.972781, + 6.972866, + 6.972950, + 6.973034, + 6.973117, + 6.973200, + 6.973283, + 6.973365, + 6.973447, + 6.973529, + 6.973610, + 6.973691, + 6.973771, + 6.973851, + 6.973931, + 6.974010, + 6.974089, + 6.974168, + 6.974246, + 6.974324, + 6.974401, + 6.974478, + 6.974555, + 6.974632, + 6.974708, + 6.974784, + 6.974859, + 6.974934, + 6.975009, + 6.975083, + 6.975158, + 6.975231, + 6.975305, + 6.975378, + 6.975451, + 6.975523, + 6.975595, + 6.975667, + 6.975739, + 6.975810, + 6.975881, + 6.975951, + 6.976022, + 6.976092, + 6.976161, + 6.976231, + 6.976300, + 6.976369, + 6.976437, + 6.976505, + 6.976573, + 6.976641, + 6.976708, + 6.976775, + 6.976842, + 6.976908, + 6.976974, + 6.977040, + 6.977106, + 6.977171, + 6.977236, + 6.977301, + 6.977365, + 6.977429, + 6.977493, + 6.977557, + 6.977620, + 6.977683, + 6.977746, + 6.977809, + 6.977871, + 6.977933, + 6.977995, + 6.978056, + 6.978118, + 6.978179, + 6.978239, + 6.978300, + 6.978360, + 6.978420, + 6.978480, + 6.978539, + 6.978599, + 6.978658, + 6.978716, + 6.978775, + 6.978833, + 6.978891, + 6.978949, + 6.979007, + 6.979064, + 6.979121, + 6.979178, + 6.979235, + 6.979291, + 6.979347, + 6.979403, + 6.979459, + 6.979514, + 6.979570, + 6.979625, + 6.979679, + 6.979734, + 6.979788, + 6.979843, + 6.979896, + 6.979950, + 6.980004, + 6.980057, + 6.980110, + 6.980163, + 6.980216, + 6.980268, + 6.980320, + 6.980372, + 6.980424, + 6.980476, + 6.980527, + 6.980579, + 6.980630, + 6.980680, + 6.980731, + 6.980781, + 6.980832, + 6.980882, + 6.980932, + 6.980981, + 6.981031, + 6.981080, + 6.981129, + 6.981178, + 6.981226, + 6.981275, + 6.981323, + 6.981371, + 6.981419, + 6.981467, + 6.981515, + 6.981562, + 6.981609, + 6.981656, + 6.981703, + 6.981750, + 6.981796, + 6.981843, + 6.981889, + 6.981935, + 6.981980, + 6.982026, + 6.982071, + 6.982117, + 6.982162, + 6.982207, + 6.982251, + 6.982296, + 6.982340, + 6.982385, + 6.982429, + 6.982473, + 6.982516, + 6.982560, + 6.982603, + 6.982647, + 6.982690, + 6.982733, + 6.982775, + 6.982818, + 6.982861, + 6.982903, + 6.982945, + 6.982987, + 6.983029, + 6.983071, + 6.983112, + 6.983153, + 6.983195, + 6.983236, + 6.983277, + 6.983317, + 6.983358, + 6.983399, + 6.983439, + 6.983479, + 6.983519, + 6.983559, + 6.983599, + 6.983638, + 6.983678, + 6.983717, + 6.983756, + 6.983795, + 6.983834, + 6.983873, + 6.983912, + 6.983950, + 6.983988, + 6.984027, + 6.984065, + 6.984103, + 6.984140, + 6.984178, + 6.984216, + 6.984253, + 6.984290, + 6.984327, + 6.984364, + 6.984401, + 6.984438, + 6.984475, + 6.984511, + 6.984547, + 6.984584, + 6.984620, + 6.984656, + 6.984692, + 6.984727, + 6.984763, + 6.984798, + 6.984834, + 6.984869, + 6.984904, + 6.984939, + 6.984974, + 6.985009, + 6.985043, + 6.985078, + 6.985112, + 6.985146, + 6.985181, + 6.985215, + 6.985248, + 6.985282, + 6.985316, + 6.985349, + 6.985383, + 6.985416, + 6.985449, + 6.985483, + 6.985516, + 6.985548, + 6.985581, + 6.985614, + 6.985646, + 6.985679, + 6.985711, + 6.985743, + 6.985775, + 6.985807, + 6.985839, + 6.985871, + 6.985903, + 6.985934, + 6.985966, + 6.985997, + 6.986028, + 6.986060, + 6.986091, + 6.986122, + 6.986152, + 6.986183, + 6.986214, + 6.986244, + 6.986275, + 6.986305, + 6.986335, + 6.986365, + 6.986395, + 6.986425, + 6.986455, + 6.986485, + 6.986514, + 6.986544, + 6.986573, + 6.986603, + 6.986632, + 6.986661, + 6.986690, + 6.986719, + 6.986748, + 6.986777, + 6.986806, + 6.986834, + 6.986863, + 6.986891, + 6.986919, + 6.986948, + 6.986976, + 6.987004, + 6.987032, + 6.987060, + 6.987087, + 6.987115, + 6.987143, + 6.987170, + 6.987197, + 6.987225, + 6.987252, + 6.987279, + 6.987306, + 6.987333, + 6.987360, + 6.987387, + 6.987414, + 6.987440, + 6.987467, + 6.987493, + 6.987520, + 6.987546, + 6.987572, + 6.987598, + 6.987624, + 6.987650, + 6.987676, + 6.987702, + 6.987728, + 6.987753, + 6.987779, + 6.987804, + 6.987830, + 6.987855, + 6.987880, + 6.987906, + 6.987931, + 6.987956, + 6.987981, + 6.988005, + 6.988030, + 6.988055, + 6.988080, + 6.988104, + 6.988129, + 6.988153, + 6.988177, + 6.988202, + 6.988226, + 6.988250, + 6.988274, + 6.988298, + 6.988322, + 6.988345, + 6.988369, + 6.988393, + 6.988416, + 6.988440, + 6.988463, + 6.988487, + 6.988510, + 6.988533, + 6.988556, + 6.988580, + 6.988603, + 6.988626, + 6.988648, + 6.988671, + 6.988694, + 6.988717, + 6.988739, + 6.988762, + 6.988784, + 6.988807, + }, + {// The expectations for dimension = 15 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426666, + 0.481665, + 0.539996, + 0.601659, + 0.666650, + 0.734965, + 0.806600, + 0.881542, + 0.959777, + 1.041281, + 1.126019, + 1.213947, + 1.305000, + 1.399096, + 1.496131, + 1.595973, + 1.698464, + 1.803417, + 1.910615, + 2.019814, + 2.130740, + 2.243099, + 2.356577, + 2.470844, + 2.585565, + 2.700401, + 2.815017, + 2.929088, + 3.042304, + 3.154376, + 3.265038, + 3.374049, + 3.481198, + 3.586301, + 3.689205, + 3.789784, + 3.887939, + 3.983598, + 4.076709, + 4.167242, + 4.255188, + 4.340549, + 4.423346, + 4.503607, + 4.581373, + 4.656690, + 4.729613, + 4.800199, + 4.868511, + 4.934611, + 4.998567, + 5.060445, + 5.120312, + 5.178234, + 5.234277, + 5.288507, + 5.340987, + 5.391780, + 5.440945, + 5.488543, + 5.534631, + 5.579263, + 5.622494, + 5.664375, + 5.704956, + 5.744286, + 5.782410, + 5.819373, + 5.855218, + 5.889986, + 5.923716, + 5.956448, + 5.988216, + 6.019056, + 6.049002, + 6.078085, + 6.106338, + 6.133788, + 6.160466, + 6.186397, + 6.211610, + 6.236127, + 6.259975, + 6.283175, + 6.305750, + 6.327722, + 6.349110, + 6.369936, + 6.390216, + 6.409971, + 6.429216, + 6.447969, + 6.466247, + 6.484063, + 6.501434, + 6.518374, + 6.534896, + 6.551013, + 6.566739, + 6.582086, + 6.597065, + 6.611687, + 6.625965, + 6.639907, + 6.653525, + 6.666828, + 6.679826, + 6.692527, + 6.704941, + 6.717075, + 6.728939, + 6.740539, + 6.751883, + 6.762980, + 6.773835, + 6.784456, + 6.794849, + 6.805020, + 6.814976, + 6.824723, + 6.834266, + 6.843611, + 6.852763, + 6.861728, + 6.870510, + 6.879114, + 6.887545, + 6.895808, + 6.903907, + 6.911846, + 6.919630, + 6.927261, + 6.934745, + 6.942085, + 6.949284, + 6.956346, + 6.963275, + 6.970074, + 6.976745, + 6.983293, + 6.989719, + 6.996028, + 7.002222, + 7.008303, + 7.014275, + 7.020139, + 7.025899, + 7.031557, + 7.037114, + 7.042575, + 7.047940, + 7.053212, + 7.058394, + 7.063486, + 7.068492, + 7.073412, + 7.078250, + 7.083007, + 7.087684, + 7.092283, + 7.096807, + 7.101256, + 7.105633, + 7.109938, + 7.114174, + 7.118341, + 7.122442, + 7.126478, + 7.130450, + 7.134359, + 7.138207, + 7.141995, + 7.145724, + 7.149396, + 7.153011, + 7.156570, + 7.160076, + 7.163529, + 7.166929, + 7.170279, + 7.173579, + 7.176829, + 7.180032, + 7.183188, + 7.186297, + 7.189361, + 7.192381, + 7.195357, + 7.198290, + 7.201181, + 7.204032, + 7.206842, + 7.209612, + 7.212343, + 7.215036, + 7.217692, + 7.220311, + 7.222894, + 7.225442, + 7.227954, + 7.230433, + 7.232878, + 7.235290, + 7.237669, + 7.240017, + 7.242334, + 7.244620, + 7.246876, + 7.249102, + 7.251299, + 7.253467, + 7.255608, + 7.257720, + 7.259806, + 7.261865, + 7.263897, + 7.265904, + 7.267886, + 7.269842, + 7.271774, + 7.273682, + 7.275566, + 7.277427, + 7.279264, + 7.281080, + 7.282873, + 7.284644, + 7.286394, + 7.288122, + 7.289830, + 7.291517, + 7.293184, + 7.294831, + 7.296459, + 7.298067, + 7.299657, + 7.301228, + 7.302780, + 7.304315, + 7.305831, + 7.307331, + 7.308813, + 7.310278, + 7.311726, + 7.313158, + 7.314573, + 7.315973, + 7.317357, + 7.318725, + 7.320078, + 7.321416, + 7.322739, + 7.324048, + 7.325342, + 7.326622, + 7.327888, + 7.329141, + 7.330379, + 7.331605, + 7.332817, + 7.334016, + 7.335202, + 7.336376, + 7.337537, + 7.338686, + 7.339823, + 7.340948, + 7.342061, + 7.343163, + 7.344253, + 7.345331, + 7.346399, + 7.347456, + 7.348501, + 7.349536, + 7.350561, + 7.351575, + 7.352579, + 7.353573, + 7.354557, + 7.355531, + 7.356495, + 7.357449, + 7.358394, + 7.359330, + 7.360257, + 7.361174, + 7.362083, + 7.362982, + 7.363873, + 7.364755, + 7.365629, + 7.366494, + 7.367351, + 7.368200, + 7.369041, + 7.369873, + 7.370698, + 7.371515, + 7.372324, + 7.373126, + 7.373920, + 7.374707, + 7.375486, + 7.376258, + 7.377023, + 7.377781, + 7.378532, + 7.379276, + 7.380014, + 7.380744, + 7.381468, + 7.382186, + 7.382897, + 7.383601, + 7.384299, + 7.384991, + 7.385677, + 7.386356, + 7.387030, + 7.387698, + 7.388360, + 7.389015, + 7.389666, + 7.390310, + 7.390949, + 7.391582, + 7.392210, + 7.392833, + 7.393450, + 7.394061, + 7.394668, + 7.395269, + 7.395865, + 7.396456, + 7.397043, + 7.397624, + 7.398200, + 7.398771, + 7.399338, + 7.399900, + 7.400457, + 7.401010, + 7.401558, + 7.402101, + 7.402640, + 7.403175, + 7.403705, + 7.404231, + 7.404752, + 7.405269, + 7.405783, + 7.406292, + 7.406796, + 7.407297, + 7.407794, + 7.408287, + 7.408776, + 7.409261, + 7.409742, + 7.410219, + 7.410693, + 7.411162, + 7.411628, + 7.412091, + 7.412550, + 7.413005, + 7.413457, + 7.413905, + 7.414350, + 7.414791, + 7.415229, + 7.415663, + 7.416095, + 7.416523, + 7.416947, + 7.417369, + 7.417787, + 7.418202, + 7.418614, + 7.419023, + 7.419429, + 7.419831, + 7.420231, + 7.420628, + 7.421022, + 7.421413, + 7.421801, + 7.422186, + 7.422568, + 7.422948, + 7.423324, + 7.423698, + 7.424070, + 7.424438, + 7.424804, + 7.425167, + 7.425528, + 7.425886, + 7.426241, + 7.426594, + 7.426944, + 7.427292, + 7.427638, + 7.427981, + 7.428321, + 7.428659, + 7.428995, + 7.429328, + 7.429659, + 7.429988, + 7.430314, + 7.430638, + 7.430960, + 7.431280, + 7.431597, + 7.431913, + 7.432226, + 7.432537, + 7.432845, + 7.433152, + 7.433457, + 7.433759, + 7.434060, + 7.434358, + 7.434654, + 7.434949, + 7.435241, + 7.435532, + 7.435820, + 7.436107, + 7.436391, + 7.436674, + 7.436955, + 7.437234, + 7.437511, + 7.437786, + 7.438060, + 7.438332, + 7.438602, + 7.438870, + 7.439136, + 7.439401, + 7.439664, + 7.439925, + 7.440185, + 7.440443, + 7.440699, + 7.440953, + 7.441206, + 7.441458, + 7.441707, + 7.441956, + 7.442202, + 7.442447, + 7.442690, + 7.442932, + 7.443173, + 7.443412, + 7.443649, + 7.443885, + 7.444119, + 7.444352, + 7.444584, + 7.444814, + 7.445042, + 7.445269, + 7.445495, + 7.445720, + 7.445943, + 7.446164, + 7.446384, + 7.446603, + 7.446821, + 7.447037, + 7.447252, + 7.447466, + 7.447678, + 7.447889, + 7.448099, + 7.448308, + 7.448515, + 7.448721, + 7.448926, + 7.449129, + 7.449332, + 7.449533, + 7.449733, + 7.449931, + 7.450129, + 7.450325, + 7.450521, + 7.450715, + 7.450908, + 7.451100, + 7.451290, + 7.451480, + 7.451669, + 7.451856, + 7.452042, + 7.452228, + 7.452412, + 7.452595, + 7.452777, + 7.452958, + 7.453138, + 7.453317, + 7.453495, + 7.453672, + 7.453848, + 7.454023, + 7.454197, + 7.454370, + 7.454542, + 7.454713, + 7.454883, + 7.455052, + 7.455220, + 7.455387, + 7.455553, + 7.455719, + 7.455883, + 7.456046, + 7.456209, + 7.456371, + 7.456531, + 7.456691, + 7.456850, + 7.457009, + 7.457166, + 7.457322, + 7.457478, + 7.457633, + 7.457786, + 7.457939, + 7.458092, + 7.458243, + 7.458394, + 7.458543, + 7.458692, + 7.458841, + 7.458988, + 7.459134, + 7.459280, + 7.459425, + 7.459569, + 7.459713, + 7.459856, + 7.459998, + 7.460139, + 7.460279, + 7.460419, + 7.460558, + 7.460696, + 7.460834, + 7.460970, + 7.461107, + 7.461242, + 7.461377, + 7.461511, + 7.461644, + 7.461776, + 7.461908, + 7.462040, + 7.462170, + 7.462300, + 7.462429, + 7.462558, + 7.462686, + 7.462813, + 7.462939, + 7.463065, + 7.463191, + 7.463315, + 7.463439, + 7.463563, + 7.463685, + 7.463808, + 7.463929, + 7.464050, + 7.464170, + 7.464290, + 7.464409, + 7.464528, + 7.464646, + 7.464763, + 7.464880, + 7.464996, + 7.465112, + 7.465227, + 7.465341, + 7.465455, + 7.465568, + 7.465681, + 7.465793, + 7.465905, + 7.466016, + 7.466127, + 7.466237, + 7.466346, + 7.466455, + 7.466564, + 7.466672, + 7.466779, + 7.466886, + 7.466992, + 7.467098, + 7.467204, + 7.467309, + 7.467413, + 7.467517, + 7.467620, + 7.467723, + 7.467825, + 7.467927, + 7.468029, + 7.468130, + 7.468230, + 7.468330, + 7.468430, + 7.468529, + 7.468627, + 7.468725, + 7.468823, + 7.468920, + 7.469017, + 7.469113, + 7.469209, + 7.469304, + 7.469399, + 7.469494, + 7.469588, + 7.469682, + 7.469775, + 7.469868, + 7.469960, + 7.470052, + 7.470144, + 7.470235, + 7.470325, + 7.470416, + 7.470505, + 7.470595, + 7.470684, + 7.470773, + 7.470861, + 7.470949, + 7.471036, + 7.471123, + 7.471210, + 7.471296, + 7.471382, + 7.471467, + 7.471553, + 7.471637, + 7.471722, + 7.471806, + 7.471889, + 7.471972, + 7.472055, + 7.472138, + 7.472220, + 7.472302, + 7.472383, + 7.472464, + 7.472545, + 7.472625, + 7.472705, + 7.472785, + 7.472864, + 7.472943, + 7.473022, + 7.473100, + 7.473178, + 7.473256, + 7.473333, + 7.473410, + 7.473486, + 7.473563, + 7.473638, + 7.473714, + 7.473789, + 7.473864, + 7.473939, + 7.474013, + 7.474087, + 7.474161, + 7.474234, + 7.474307, + 7.474380, + 7.474452, + 7.474525, + 7.474596, + 7.474668, + 7.474739, + 7.474810, + 7.474881, + 7.474951, + 7.475021, + 7.475091, + 7.475160, + 7.475229, + 7.475298, + 7.475367, + 7.475435, + 7.475503, + 7.475571, + 7.475638, + 7.475705, + 7.475772, + 7.475839, + 7.475905, + 7.475971, + 7.476037, + 7.476103, + 7.476168, + 7.476233, + 7.476298, + 7.476362, + 7.476426, + 7.476490, + 7.476554, + 7.476617, + 7.476681, + 7.476744, + 7.476806, + 7.476869, + 7.476931, + 7.476993, + 7.477054, + 7.477116, + 7.477177, + 7.477238, + 7.477298, + 7.477359, + 7.477419, + 7.477479, + 7.477539, + 7.477598, + 7.477657, + 7.477716, + 7.477775, + 7.477834, + 7.477892, + 7.477950, + 7.478008, + 7.478066, + 7.478123, + 7.478180, + 7.478237, + 7.478294, + 7.478350, + 7.478407, + 7.478463, + 7.478519, + 7.478574, + 7.478630, + 7.478685, + 7.478740, + 7.478794, + 7.478849, + 7.478903, + 7.478958, + 7.479011, + 7.479065, + 7.479119, + 7.479172, + 7.479225, + 7.479278, + 7.479331, + 7.479383, + 7.479436, + 7.479488, + 7.479540, + 7.479591, + 7.479643, + 7.479694, + 7.479745, + 7.479796, + 7.479847, + 7.479898, + 7.479948, + 7.479998, + 7.480048, + 7.480098, + 7.480147, + 7.480197, + 7.480246, + 7.480295, + 7.480344, + 7.480393, + 7.480441, + 7.480490, + 7.480538, + 7.480586, + 7.480634, + 7.480681, + 7.480729, + 7.480776, + 7.480823, + 7.480870, + 7.480917, + 7.480963, + 7.481010, + 7.481056, + 7.481102, + 7.481148, + 7.481194, + 7.481239, + 7.481285, + 7.481330, + 7.481375, + 7.481420, + 7.481465, + 7.481509, + 7.481554, + 7.481598, + 7.481642, + 7.481686, + 7.481730, + 7.481773, + 7.481817, + 7.481860, + 7.481903, + 7.481946, + 7.481989, + 7.482032, + 7.482075, + 7.482117, + 7.482159, + 7.482201, + 7.482243, + 7.482285, + 7.482327, + 7.482368, + 7.482410, + 7.482451, + 7.482492, + 7.482533, + 7.482574, + 7.482615, + 7.482655, + 7.482695, + 7.482736, + 7.482776, + 7.482816, + 7.482855, + 7.482895, + 7.482935, + 7.482974, + 7.483013, + 7.483052, + 7.483091, + 7.483130, + 7.483169, + 7.483208, + 7.483246, + 7.483284, + 7.483323, + 7.483361, + 7.483399, + 7.483436, + 7.483474, + 7.483512, + 7.483549, + 7.483586, + 7.483624, + 7.483661, + 7.483698, + 7.483734, + 7.483771, + 7.483808, + 7.483844, + 7.483880, + 7.483916, + 7.483952, + 7.483988, + 7.484024, + 7.484060, + 7.484095, + 7.484131, + 7.484166, + 7.484201, + 7.484237, + 7.484272, + 7.484306, + 7.484341, + 7.484376, + 7.484410, + 7.484445, + 7.484479, + 7.484513, + 7.484547, + 7.484581, + 7.484615, + 7.484649, + 7.484682, + 7.484716, + 7.484749, + 7.484783, + 7.484816, + 7.484849, + 7.484882, + 7.484915, + 7.484947, + 7.484980, + 7.485013, + 7.485045, + 7.485077, + 7.485110, + 7.485142, + 7.485174, + 7.485206, + 7.485237, + 7.485269, + 7.485301, + 7.485332, + 7.485364, + 7.485395, + 7.485426, + 7.485457, + 7.485488, + 7.485519, + 7.485550, + 7.485581, + 7.485611, + 7.485642, + 7.485672, + 7.485703, + 7.485733, + 7.485763, + 7.485793, + 7.485823, + 7.485853, + 7.485882, + 7.485912, + 7.485942, + 7.485971, + 7.486001, + 7.486030, + 7.486059, + 7.486088, + 7.486117, + 7.486146, + 7.486175, + 7.486204, + 7.486232, + 7.486261, + 7.486289, + 7.486318, + 7.486346, + 7.486374, + 7.486402, + 7.486430, + 7.486458, + 7.486486, + 7.486514, + 7.486542, + 7.486569, + 7.486597, + 7.486624, + 7.486651, + 7.486679, + 7.486706, + 7.486733, + 7.486760, + 7.486787, + 7.486814, + 7.486841, + 7.486867, + 7.486894, + 7.486920, + 7.486947, + 7.486973, + 7.487000, + 7.487026, + 7.487052, + 7.487078, + 7.487104, + 7.487130, + 7.487156, + 7.487181, + 7.487207, + 7.487233, + 7.487258, + }, + {// The expectations for dimension = 16 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426666, + 0.481666, + 0.539999, + 0.601664, + 0.666660, + 0.734985, + 0.806637, + 0.881609, + 0.959892, + 1.041473, + 1.126331, + 1.214435, + 1.305745, + 1.400202, + 1.497731, + 1.598236, + 1.701597, + 1.807664, + 1.916261, + 2.027184, + 2.140196, + 2.255037, + 2.371420, + 2.489037, + 2.607563, + 2.726666, + 2.846006, + 2.965245, + 3.084053, + 3.202114, + 3.319127, + 3.434815, + 3.548927, + 3.661236, + 3.771546, + 3.879690, + 3.985527, + 4.088947, + 4.189862, + 4.288212, + 4.383955, + 4.477070, + 4.567555, + 4.655418, + 4.740684, + 4.823387, + 4.903569, + 4.981279, + 5.056572, + 5.129508, + 5.200148, + 5.268557, + 5.334801, + 5.398946, + 5.461058, + 5.521203, + 5.579447, + 5.635854, + 5.690487, + 5.743407, + 5.794676, + 5.844351, + 5.892490, + 5.939147, + 5.984375, + 6.028226, + 6.070750, + 6.111994, + 6.152005, + 6.190826, + 6.228502, + 6.265072, + 6.300577, + 6.335055, + 6.368541, + 6.401072, + 6.432681, + 6.463401, + 6.493262, + 6.522295, + 6.550528, + 6.577989, + 6.604705, + 6.630700, + 6.656000, + 6.680628, + 6.704606, + 6.727957, + 6.750700, + 6.772857, + 6.794446, + 6.815486, + 6.835995, + 6.855990, + 6.875487, + 6.894502, + 6.913051, + 6.931147, + 6.948806, + 6.966041, + 6.982865, + 6.999291, + 7.015330, + 7.030995, + 7.046296, + 7.061245, + 7.075852, + 7.090128, + 7.104081, + 7.117722, + 7.131059, + 7.144101, + 7.156857, + 7.169334, + 7.181541, + 7.193486, + 7.205175, + 7.216615, + 7.227815, + 7.238779, + 7.249515, + 7.260029, + 7.270326, + 7.280413, + 7.290296, + 7.299979, + 7.309467, + 7.318767, + 7.327882, + 7.336818, + 7.345579, + 7.354170, + 7.362595, + 7.370858, + 7.378963, + 7.386914, + 7.394716, + 7.402371, + 7.409883, + 7.417256, + 7.424494, + 7.431598, + 7.438574, + 7.445423, + 7.452148, + 7.458754, + 7.465241, + 7.471614, + 7.477875, + 7.484026, + 7.490070, + 7.496010, + 7.501847, + 7.507585, + 7.513224, + 7.518768, + 7.524219, + 7.529579, + 7.534849, + 7.540032, + 7.545129, + 7.550143, + 7.555075, + 7.559927, + 7.564701, + 7.569397, + 7.574019, + 7.578568, + 7.583044, + 7.587451, + 7.591788, + 7.596057, + 7.600261, + 7.604399, + 7.608474, + 7.612487, + 7.616439, + 7.620331, + 7.624165, + 7.627941, + 7.631661, + 7.635326, + 7.638937, + 7.642494, + 7.646000, + 7.649455, + 7.652859, + 7.656215, + 7.659522, + 7.662783, + 7.665996, + 7.669165, + 7.672289, + 7.675369, + 7.678406, + 7.681400, + 7.684354, + 7.687267, + 7.690139, + 7.692973, + 7.695768, + 7.698526, + 7.701246, + 7.703929, + 7.706577, + 7.709190, + 7.711768, + 7.714312, + 7.716823, + 7.719301, + 7.721747, + 7.724161, + 7.726544, + 7.728897, + 7.731219, + 7.733511, + 7.735775, + 7.738010, + 7.740217, + 7.742396, + 7.744548, + 7.746674, + 7.748773, + 7.750846, + 7.752894, + 7.754916, + 7.756914, + 7.758888, + 7.760838, + 7.762764, + 7.764668, + 7.766548, + 7.768407, + 7.770243, + 7.772058, + 7.773851, + 7.775623, + 7.777375, + 7.779106, + 7.780817, + 7.782509, + 7.784181, + 7.785834, + 7.787468, + 7.789083, + 7.790680, + 7.792259, + 7.793821, + 7.795365, + 7.796891, + 7.798401, + 7.799894, + 7.801371, + 7.802831, + 7.804276, + 7.805704, + 7.807117, + 7.808515, + 7.809898, + 7.811265, + 7.812618, + 7.813957, + 7.815282, + 7.816592, + 7.817888, + 7.819171, + 7.820441, + 7.821697, + 7.822940, + 7.824170, + 7.825387, + 7.826592, + 7.827784, + 7.828964, + 7.830133, + 7.831289, + 7.832433, + 7.833566, + 7.834688, + 7.835798, + 7.836897, + 7.837985, + 7.839062, + 7.840129, + 7.841185, + 7.842231, + 7.843266, + 7.844292, + 7.845307, + 7.846312, + 7.847308, + 7.848294, + 7.849271, + 7.850238, + 7.851196, + 7.852144, + 7.853084, + 7.854015, + 7.854937, + 7.855850, + 7.856755, + 7.857651, + 7.858539, + 7.859419, + 7.860291, + 7.861154, + 7.862009, + 7.862857, + 7.863697, + 7.864529, + 7.865354, + 7.866171, + 7.866981, + 7.867783, + 7.868578, + 7.869366, + 7.870147, + 7.870921, + 7.871688, + 7.872449, + 7.873202, + 7.873949, + 7.874690, + 7.875423, + 7.876151, + 7.876872, + 7.877587, + 7.878296, + 7.878998, + 7.879695, + 7.880385, + 7.881070, + 7.881749, + 7.882421, + 7.883089, + 7.883750, + 7.884406, + 7.885057, + 7.885702, + 7.886341, + 7.886976, + 7.887605, + 7.888228, + 7.888847, + 7.889460, + 7.890069, + 7.890672, + 7.891271, + 7.891864, + 7.892453, + 7.893037, + 7.893616, + 7.894191, + 7.894761, + 7.895326, + 7.895887, + 7.896443, + 7.896995, + 7.897542, + 7.898085, + 7.898624, + 7.899159, + 7.899689, + 7.900215, + 7.900737, + 7.901255, + 7.901769, + 7.902279, + 7.902785, + 7.903287, + 7.903786, + 7.904280, + 7.904770, + 7.905257, + 7.905740, + 7.906220, + 7.906696, + 7.907168, + 7.907636, + 7.908101, + 7.908563, + 7.909021, + 7.909476, + 7.909927, + 7.910375, + 7.910820, + 7.911261, + 7.911699, + 7.912134, + 7.912565, + 7.912994, + 7.913419, + 7.913841, + 7.914260, + 7.914676, + 7.915089, + 7.915500, + 7.915907, + 7.916311, + 7.916712, + 7.917110, + 7.917506, + 7.917899, + 7.918289, + 7.918676, + 7.919060, + 7.919442, + 7.919821, + 7.920197, + 7.920571, + 7.920942, + 7.921311, + 7.921677, + 7.922040, + 7.922401, + 7.922759, + 7.923115, + 7.923469, + 7.923820, + 7.924168, + 7.924514, + 7.924858, + 7.925200, + 7.925539, + 7.925876, + 7.926211, + 7.926543, + 7.926873, + 7.927201, + 7.927527, + 7.927850, + 7.928172, + 7.928491, + 7.928808, + 7.929123, + 7.929436, + 7.929747, + 7.930056, + 7.930362, + 7.930667, + 7.930970, + 7.931271, + 7.931570, + 7.931867, + 7.932161, + 7.932455, + 7.932746, + 7.933035, + 7.933322, + 7.933608, + 7.933892, + 7.934174, + 7.934454, + 7.934732, + 7.935009, + 7.935284, + 7.935557, + 7.935828, + 7.936098, + 7.936366, + 7.936632, + 7.936897, + 7.937160, + 7.937421, + 7.937681, + 7.937939, + 7.938195, + 7.938450, + 7.938704, + 7.938956, + 7.939206, + 7.939454, + 7.939702, + 7.939947, + 7.940192, + 7.940434, + 7.940675, + 7.940915, + 7.941154, + 7.941390, + 7.941626, + 7.941860, + 7.942093, + 7.942324, + 7.942554, + 7.942782, + 7.943009, + 7.943235, + 7.943459, + 7.943683, + 7.943904, + 7.944125, + 7.944344, + 7.944562, + 7.944779, + 7.944994, + 7.945208, + 7.945421, + 7.945633, + 7.945843, + 7.946052, + 7.946260, + 7.946467, + 7.946672, + 7.946877, + 7.947080, + 7.947282, + 7.947483, + 7.947683, + 7.947881, + 7.948079, + 7.948275, + 7.948471, + 7.948665, + 7.948858, + 7.949050, + 7.949241, + 7.949431, + 7.949619, + 7.949807, + 7.949994, + 7.950179, + 7.950364, + 7.950548, + 7.950730, + 7.950912, + 7.951092, + 7.951272, + 7.951450, + 7.951628, + 7.951805, + 7.951980, + 7.952155, + 7.952329, + 7.952502, + 7.952673, + 7.952844, + 7.953014, + 7.953184, + 7.953352, + 7.953519, + 7.953685, + 7.953851, + 7.954016, + 7.954179, + 7.954342, + 7.954504, + 7.954665, + 7.954826, + 7.954985, + 7.955144, + 7.955301, + 7.955458, + 7.955614, + 7.955770, + 7.955924, + 7.956078, + 7.956231, + 7.956383, + 7.956534, + 7.956684, + 7.956834, + 7.956983, + 7.957131, + 7.957279, + 7.957425, + 7.957571, + 7.957716, + 7.957861, + 7.958004, + 7.958147, + 7.958290, + 7.958431, + 7.958572, + 7.958712, + 7.958851, + 7.958990, + 7.959128, + 7.959265, + 7.959402, + 7.959537, + 7.959673, + 7.959807, + 7.959941, + 7.960074, + 7.960207, + 7.960338, + 7.960470, + 7.960600, + 7.960730, + 7.960859, + 7.960988, + 7.961116, + 7.961243, + 7.961370, + 7.961496, + 7.961622, + 7.961747, + 7.961871, + 7.961995, + 7.962118, + 7.962240, + 7.962362, + 7.962483, + 7.962604, + 7.962724, + 7.962844, + 7.962963, + 7.963081, + 7.963199, + 7.963316, + 7.963433, + 7.963549, + 7.963665, + 7.963780, + 7.963894, + 7.964008, + 7.964122, + 7.964235, + 7.964347, + 7.964459, + 7.964570, + 7.964681, + 7.964791, + 7.964901, + 7.965010, + 7.965119, + 7.965227, + 7.965335, + 7.965442, + 7.965549, + 7.965655, + 7.965761, + 7.965866, + 7.965971, + 7.966075, + 7.966179, + 7.966282, + 7.966385, + 7.966488, + 7.966590, + 7.966691, + 7.966792, + 7.966893, + 7.966993, + 7.967092, + 7.967192, + 7.967290, + 7.967389, + 7.967486, + 7.967584, + 7.967681, + 7.967777, + 7.967874, + 7.967969, + 7.968064, + 7.968159, + 7.968254, + 7.968348, + 7.968441, + 7.968534, + 7.968627, + 7.968720, + 7.968811, + 7.968903, + 7.968994, + 7.969085, + 7.969175, + 7.969265, + 7.969355, + 7.969444, + 7.969533, + 7.969621, + 7.969709, + 7.969797, + 7.969884, + 7.969971, + 7.970057, + 7.970143, + 7.970229, + 7.970314, + 7.970399, + 7.970484, + 7.970568, + 7.970652, + 7.970736, + 7.970819, + 7.970902, + 7.970984, + 7.971066, + 7.971148, + 7.971230, + 7.971311, + 7.971392, + 7.971472, + 7.971552, + 7.971632, + 7.971711, + 7.971790, + 7.971869, + 7.971948, + 7.972026, + 7.972103, + 7.972181, + 7.972258, + 7.972335, + 7.972411, + 7.972487, + 7.972563, + 7.972639, + 7.972714, + 7.972789, + 7.972864, + 7.972938, + 7.973012, + 7.973086, + 7.973159, + 7.973232, + 7.973305, + 7.973377, + 7.973450, + 7.973521, + 7.973593, + 7.973664, + 7.973735, + 7.973806, + 7.973877, + 7.973947, + 7.974017, + 7.974086, + 7.974156, + 7.974225, + 7.974294, + 7.974362, + 7.974430, + 7.974498, + 7.974566, + 7.974633, + 7.974701, + 7.974767, + 7.974834, + 7.974900, + 7.974967, + 7.975032, + 7.975098, + 7.975163, + 7.975228, + 7.975293, + 7.975358, + 7.975422, + 7.975486, + 7.975550, + 7.975614, + 7.975677, + 7.975740, + 7.975803, + 7.975865, + 7.975928, + 7.975990, + 7.976052, + 7.976113, + 7.976175, + 7.976236, + 7.976297, + 7.976357, + 7.976418, + 7.976478, + 7.976538, + 7.976598, + 7.976657, + 7.976716, + 7.976776, + 7.976834, + 7.976893, + 7.976951, + 7.977010, + 7.977068, + 7.977125, + 7.977183, + 7.977240, + 7.977297, + 7.977354, + 7.977411, + 7.977467, + 7.977523, + 7.977579, + 7.977635, + 7.977691, + 7.977746, + 7.977801, + 7.977856, + 7.977911, + 7.977966, + 7.978020, + 7.978074, + 7.978128, + 7.978182, + 7.978236, + 7.978289, + 7.978342, + 7.978395, + 7.978448, + 7.978501, + 7.978553, + 7.978605, + 7.978657, + 7.978709, + 7.978761, + 7.978812, + 7.978864, + 7.978915, + 7.978966, + 7.979016, + 7.979067, + 7.979117, + 7.979168, + 7.979218, + 7.979267, + 7.979317, + 7.979366, + 7.979416, + 7.979465, + 7.979514, + 7.979563, + 7.979611, + 7.979660, + 7.979708, + 7.979756, + 7.979804, + 7.979851, + 7.979899, + 7.979946, + 7.979994, + 7.980041, + 7.980088, + 7.980134, + 7.980181, + 7.980227, + 7.980274, + 7.980320, + 7.980366, + 7.980411, + 7.980457, + 7.980502, + 7.980548, + 7.980593, + 7.980638, + 7.980682, + 7.980727, + 7.980772, + 7.980816, + 7.980860, + 7.980904, + 7.980948, + 7.980992, + 7.981035, + 7.981079, + 7.981122, + 7.981165, + 7.981208, + 7.981251, + 7.981294, + 7.981336, + 7.981379, + 7.981421, + 7.981463, + 7.981505, + 7.981547, + 7.981589, + 7.981630, + 7.981672, + 7.981713, + 7.981754, + 7.981795, + 7.981836, + 7.981876, + 7.981917, + 7.981958, + 7.981998, + 7.982038, + 7.982078, + 7.982118, + 7.982158, + 7.982197, + 7.982237, + 7.982276, + 7.982315, + 7.982355, + 7.982394, + 7.982432, + 7.982471, + 7.982510, + 7.982548, + 7.982587, + 7.982625, + 7.982663, + 7.982701, + 7.982739, + 7.982776, + 7.982814, + 7.982851, + 7.982889, + 7.982926, + 7.982963, + 7.983000, + 7.983037, + 7.983074, + 7.983110, + 7.983147, + 7.983183, + 7.983220, + 7.983256, + 7.983292, + 7.983328, + 7.983364, + 7.983399, + 7.983435, + 7.983470, + 7.983506, + 7.983541, + 7.983576, + 7.983611, + 7.983646, + 7.983681, + 7.983715, + 7.983750, + 7.983784, + 7.983819, + 7.983853, + 7.983887, + 7.983921, + 7.983955, + 7.983989, + 7.984023, + 7.984056, + 7.984090, + 7.984123, + 7.984156, + 7.984189, + 7.984223, + 7.984255, + 7.984288, + 7.984321, + 7.984354, + 7.984386, + 7.984419, + 7.984451, + 7.984483, + 7.984516, + 7.984548, + 7.984580, + 7.984611, + 7.984643, + 7.984675, + 7.984706, + 7.984738, + 7.984769, + 7.984800, + 7.984832, + 7.984863, + 7.984894, + 7.984925, + 7.984955, + 7.984986, + 7.985017, + 7.985047, + 7.985078, + 7.985108, + 7.985138, + 7.985168, + 7.985198, + 7.985228, + 7.985258, + 7.985288, + 7.985318, + 7.985347, + 7.985377, + 7.985406, + 7.985435, + 7.985465, + 7.985494, + 7.985523, + 7.985552, + 7.985581, + 7.985610, + }, + {// The expectations for dimension = 17 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481666, + 0.540000, + 0.601665, + 0.666664, + 0.734994, + 0.806654, + 0.881640, + 0.959949, + 1.041571, + 1.126496, + 1.214702, + 1.306165, + 1.400845, + 1.498691, + 1.599632, + 1.703580, + 1.810421, + 1.920016, + 2.032199, + 2.146774, + 2.263514, + 2.382169, + 2.502458, + 2.624082, + 2.746720, + 2.870043, + 2.993710, + 3.117385, + 3.240732, + 3.363429, + 3.485169, + 3.605664, + 3.724653, + 3.841898, + 3.957191, + 4.070352, + 4.181229, + 4.289698, + 4.395662, + 4.499047, + 4.599804, + 4.697903, + 4.793330, + 4.886090, + 4.976199, + 5.063685, + 5.148585, + 5.230946, + 5.310818, + 5.388258, + 5.463325, + 5.536083, + 5.606595, + 5.674927, + 5.741144, + 5.805314, + 5.867501, + 5.927769, + 5.986183, + 6.042804, + 6.097694, + 6.150913, + 6.202517, + 6.252563, + 6.301107, + 6.348199, + 6.393892, + 6.438234, + 6.481274, + 6.523057, + 6.563627, + 6.603027, + 6.641298, + 6.678479, + 6.714609, + 6.749723, + 6.783858, + 6.817047, + 6.849322, + 6.880715, + 6.911256, + 6.940974, + 6.969896, + 6.998050, + 7.025461, + 7.052153, + 7.078151, + 7.103477, + 7.128154, + 7.152202, + 7.175642, + 7.198493, + 7.220774, + 7.242504, + 7.263699, + 7.284377, + 7.304554, + 7.324245, + 7.343465, + 7.362228, + 7.380550, + 7.398442, + 7.415918, + 7.432991, + 7.449672, + 7.465973, + 7.481905, + 7.497479, + 7.512705, + 7.527594, + 7.542155, + 7.556397, + 7.570329, + 7.583961, + 7.597300, + 7.610355, + 7.623133, + 7.635642, + 7.647890, + 7.659884, + 7.671630, + 7.683135, + 7.694406, + 7.705448, + 7.716268, + 7.726872, + 7.737265, + 7.747453, + 7.757441, + 7.767234, + 7.776837, + 7.786254, + 7.795492, + 7.804553, + 7.813443, + 7.822165, + 7.830725, + 7.839125, + 7.847369, + 7.855463, + 7.863408, + 7.871209, + 7.878868, + 7.886391, + 7.893779, + 7.901035, + 7.908163, + 7.915167, + 7.922048, + 7.928809, + 7.935453, + 7.941984, + 7.948402, + 7.954712, + 7.960915, + 7.967014, + 7.973010, + 7.978907, + 7.984707, + 7.990411, + 7.996021, + 8.001540, + 8.006970, + 8.012312, + 8.017569, + 8.022742, + 8.027832, + 8.032842, + 8.037774, + 8.042628, + 8.047407, + 8.052112, + 8.056745, + 8.061306, + 8.065798, + 8.070222, + 8.074579, + 8.078871, + 8.083098, + 8.087263, + 8.091365, + 8.095408, + 8.099391, + 8.103316, + 8.107183, + 8.110995, + 8.114752, + 8.118456, + 8.122106, + 8.125705, + 8.129252, + 8.132750, + 8.136199, + 8.139600, + 8.142953, + 8.146261, + 8.149522, + 8.152739, + 8.155913, + 8.159043, + 8.162131, + 8.165177, + 8.168183, + 8.171148, + 8.174074, + 8.176962, + 8.179811, + 8.182623, + 8.185399, + 8.188138, + 8.190842, + 8.193511, + 8.196146, + 8.198747, + 8.201315, + 8.203850, + 8.206354, + 8.208826, + 8.211267, + 8.213677, + 8.216058, + 8.218409, + 8.220732, + 8.223025, + 8.225291, + 8.227529, + 8.229741, + 8.231925, + 8.234083, + 8.236215, + 8.238322, + 8.240404, + 8.242461, + 8.244494, + 8.246503, + 8.248489, + 8.250451, + 8.252391, + 8.254308, + 8.256203, + 8.258076, + 8.259928, + 8.261759, + 8.263569, + 8.265358, + 8.267127, + 8.268877, + 8.270607, + 8.272317, + 8.274009, + 8.275682, + 8.277336, + 8.278973, + 8.280591, + 8.282192, + 8.283775, + 8.285341, + 8.286890, + 8.288423, + 8.289939, + 8.291439, + 8.292923, + 8.294392, + 8.295844, + 8.297282, + 8.298704, + 8.300112, + 8.301505, + 8.302883, + 8.304247, + 8.305597, + 8.306934, + 8.308256, + 8.309565, + 8.310861, + 8.312143, + 8.313413, + 8.314670, + 8.315914, + 8.317146, + 8.318365, + 8.319572, + 8.320768, + 8.321951, + 8.323123, + 8.324284, + 8.325433, + 8.326570, + 8.327697, + 8.328813, + 8.329918, + 8.331013, + 8.332096, + 8.333170, + 8.334233, + 8.335287, + 8.336330, + 8.337363, + 8.338387, + 8.339401, + 8.340405, + 8.341401, + 8.342387, + 8.343363, + 8.344331, + 8.345290, + 8.346240, + 8.347181, + 8.348114, + 8.349038, + 8.349954, + 8.350861, + 8.351761, + 8.352652, + 8.353535, + 8.354411, + 8.355278, + 8.356138, + 8.356990, + 8.357835, + 8.358672, + 8.359502, + 8.360325, + 8.361140, + 8.361948, + 8.362750, + 8.363544, + 8.364332, + 8.365112, + 8.365886, + 8.366654, + 8.367414, + 8.368169, + 8.368917, + 8.369658, + 8.370394, + 8.371123, + 8.371846, + 8.372563, + 8.373274, + 8.373979, + 8.374678, + 8.375371, + 8.376059, + 8.376741, + 8.377417, + 8.378088, + 8.378753, + 8.379413, + 8.380068, + 8.380717, + 8.381361, + 8.382000, + 8.382634, + 8.383263, + 8.383886, + 8.384505, + 8.385118, + 8.385727, + 8.386331, + 8.386930, + 8.387525, + 8.388115, + 8.388700, + 8.389281, + 8.389857, + 8.390429, + 8.390996, + 8.391559, + 8.392117, + 8.392671, + 8.393221, + 8.393767, + 8.394309, + 8.394846, + 8.395379, + 8.395909, + 8.396434, + 8.396955, + 8.397473, + 8.397986, + 8.398496, + 8.399002, + 8.399504, + 8.400003, + 8.400497, + 8.400988, + 8.401476, + 8.401960, + 8.402440, + 8.402917, + 8.403390, + 8.403860, + 8.404326, + 8.404789, + 8.405249, + 8.405705, + 8.406159, + 8.406608, + 8.407055, + 8.407499, + 8.407939, + 8.408376, + 8.408810, + 8.409241, + 8.409669, + 8.410094, + 8.410516, + 8.410935, + 8.411351, + 8.411764, + 8.412174, + 8.412582, + 8.412986, + 8.413388, + 8.413787, + 8.414183, + 8.414577, + 8.414968, + 8.415356, + 8.415741, + 8.416124, + 8.416504, + 8.416882, + 8.417257, + 8.417630, + 8.418000, + 8.418368, + 8.418733, + 8.419096, + 8.419456, + 8.419814, + 8.420169, + 8.420523, + 8.420873, + 8.421222, + 8.421568, + 8.421912, + 8.422254, + 8.422593, + 8.422931, + 8.423266, + 8.423599, + 8.423929, + 8.424258, + 8.424584, + 8.424909, + 8.425231, + 8.425551, + 8.425869, + 8.426185, + 8.426499, + 8.426812, + 8.427122, + 8.427430, + 8.427736, + 8.428040, + 8.428343, + 8.428643, + 8.428942, + 8.429238, + 8.429533, + 8.429826, + 8.430117, + 8.430407, + 8.430694, + 8.430980, + 8.431264, + 8.431547, + 8.431827, + 8.432106, + 8.432383, + 8.432659, + 8.432932, + 8.433205, + 8.433475, + 8.433744, + 8.434011, + 8.434277, + 8.434541, + 8.434803, + 8.435064, + 8.435323, + 8.435581, + 8.435837, + 8.436092, + 8.436345, + 8.436597, + 8.436847, + 8.437095, + 8.437343, + 8.437588, + 8.437833, + 8.438076, + 8.438317, + 8.438557, + 8.438796, + 8.439033, + 8.439269, + 8.439504, + 8.439737, + 8.439969, + 8.440199, + 8.440428, + 8.440656, + 8.440883, + 8.441108, + 8.441332, + 8.441555, + 8.441776, + 8.441996, + 8.442215, + 8.442433, + 8.442650, + 8.442865, + 8.443079, + 8.443292, + 8.443503, + 8.443714, + 8.443923, + 8.444131, + 8.444338, + 8.444544, + 8.444749, + 8.444952, + 8.445155, + 8.445356, + 8.445556, + 8.445756, + 8.445954, + 8.446151, + 8.446347, + 8.446541, + 8.446735, + 8.446928, + 8.447120, + 8.447310, + 8.447500, + 8.447688, + 8.447876, + 8.448062, + 8.448248, + 8.448433, + 8.448616, + 8.448799, + 8.448980, + 8.449161, + 8.449341, + 8.449520, + 8.449697, + 8.449874, + 8.450050, + 8.450225, + 8.450399, + 8.450573, + 8.450745, + 8.450916, + 8.451087, + 8.451257, + 8.451425, + 8.451593, + 8.451760, + 8.451926, + 8.452092, + 8.452256, + 8.452420, + 8.452582, + 8.452744, + 8.452905, + 8.453066, + 8.453225, + 8.453384, + 8.453542, + 8.453699, + 8.453855, + 8.454010, + 8.454165, + 8.454319, + 8.454472, + 8.454624, + 8.454776, + 8.454927, + 8.455077, + 8.455226, + 8.455375, + 8.455523, + 8.455670, + 8.455816, + 8.455962, + 8.456107, + 8.456251, + 8.456394, + 8.456537, + 8.456679, + 8.456821, + 8.456961, + 8.457102, + 8.457241, + 8.457380, + 8.457518, + 8.457655, + 8.457792, + 8.457928, + 8.458063, + 8.458198, + 8.458332, + 8.458465, + 8.458598, + 8.458730, + 8.458862, + 8.458992, + 8.459123, + 8.459252, + 8.459381, + 8.459510, + 8.459638, + 8.459765, + 8.459891, + 8.460017, + 8.460143, + 8.460268, + 8.460392, + 8.460516, + 8.460639, + 8.460761, + 8.460883, + 8.461004, + 8.461125, + 8.461246, + 8.461365, + 8.461484, + 8.461603, + 8.461721, + 8.461838, + 8.461955, + 8.462072, + 8.462188, + 8.462303, + 8.462418, + 8.462532, + 8.462646, + 8.462759, + 8.462872, + 8.462984, + 8.463096, + 8.463207, + 8.463318, + 8.463428, + 8.463538, + 8.463647, + 8.463756, + 8.463864, + 8.463972, + 8.464079, + 8.464186, + 8.464292, + 8.464398, + 8.464504, + 8.464609, + 8.464713, + 8.464817, + 8.464921, + 8.465024, + 8.465126, + 8.465229, + 8.465330, + 8.465432, + 8.465532, + 8.465633, + 8.465733, + 8.465832, + 8.465932, + 8.466030, + 8.466128, + 8.466226, + 8.466324, + 8.466421, + 8.466517, + 8.466613, + 8.466709, + 8.466804, + 8.466899, + 8.466994, + 8.467088, + 8.467182, + 8.467275, + 8.467368, + 8.467460, + 8.467552, + 8.467644, + 8.467735, + 8.467826, + 8.467917, + 8.468007, + 8.468097, + 8.468186, + 8.468275, + 8.468364, + 8.468452, + 8.468540, + 8.468628, + 8.468715, + 8.468802, + 8.468889, + 8.468975, + 8.469060, + 8.469146, + 8.469231, + 8.469316, + 8.469400, + 8.469484, + 8.469568, + 8.469651, + 8.469734, + 8.469817, + 8.469899, + 8.469981, + 8.470062, + 8.470144, + 8.470225, + 8.470305, + 8.470386, + 8.470466, + 8.470545, + 8.470625, + 8.470704, + 8.470782, + 8.470861, + 8.470939, + 8.471017, + 8.471094, + 8.471171, + 8.471248, + 8.471325, + 8.471401, + 8.471477, + 8.471552, + 8.471628, + 8.471703, + 8.471777, + 8.471852, + 8.471926, + 8.472000, + 8.472073, + 8.472147, + 8.472220, + 8.472292, + 8.472365, + 8.472437, + 8.472509, + 8.472580, + 8.472651, + 8.472722, + 8.472793, + 8.472864, + 8.472934, + 8.473004, + 8.473073, + 8.473143, + 8.473212, + 8.473281, + 8.473349, + 8.473417, + 8.473486, + 8.473553, + 8.473621, + 8.473688, + 8.473755, + 8.473822, + 8.473888, + 8.473955, + 8.474021, + 8.474086, + 8.474152, + 8.474217, + 8.474282, + 8.474347, + 8.474411, + 8.474476, + 8.474540, + 8.474603, + 8.474667, + 8.474730, + 8.474793, + 8.474856, + 8.474919, + 8.474981, + 8.475043, + 8.475105, + 8.475167, + 8.475228, + 8.475289, + 8.475350, + 8.475411, + 8.475472, + 8.475532, + 8.475592, + 8.475652, + 8.475712, + 8.475771, + 8.475830, + 8.475889, + 8.475948, + 8.476007, + 8.476065, + 8.476123, + 8.476181, + 8.476239, + 8.476296, + 8.476354, + 8.476411, + 8.476467, + 8.476524, + 8.476581, + 8.476637, + 8.476693, + 8.476749, + 8.476805, + 8.476860, + 8.476915, + 8.476970, + 8.477025, + 8.477080, + 8.477134, + 8.477189, + 8.477243, + 8.477297, + 8.477350, + 8.477404, + 8.477457, + 8.477510, + 8.477563, + 8.477616, + 8.477669, + 8.477721, + 8.477773, + 8.477825, + 8.477877, + 8.477929, + 8.477980, + 8.478032, + 8.478083, + 8.478134, + 8.478185, + 8.478235, + 8.478286, + 8.478336, + 8.478386, + 8.478436, + 8.478486, + 8.478535, + 8.478584, + 8.478634, + 8.478683, + 8.478732, + 8.478780, + 8.478829, + 8.478877, + 8.478925, + 8.478973, + 8.479021, + 8.479069, + 8.479117, + 8.479164, + 8.479211, + 8.479258, + 8.479305, + 8.479352, + 8.479399, + 8.479445, + 8.479491, + 8.479537, + 8.479583, + 8.479629, + 8.479675, + 8.479720, + 8.479766, + 8.479811, + 8.479856, + 8.479901, + 8.479946, + 8.479990, + 8.480035, + 8.480079, + 8.480123, + 8.480167, + 8.480211, + 8.480255, + 8.480298, + 8.480342, + 8.480385, + 8.480428, + 8.480471, + 8.480514, + 8.480557, + 8.480599, + 8.480642, + 8.480684, + 8.480726, + 8.480768, + 8.480810, + 8.480852, + 8.480893, + 8.480935, + 8.480976, + 8.481018, + 8.481059, + 8.481100, + 8.481140, + 8.481181, + 8.481222, + 8.481262, + 8.481302, + 8.481342, + 8.481382, + 8.481422, + 8.481462, + 8.481502, + 8.481541, + 8.481581, + 8.481620, + 8.481659, + 8.481698, + 8.481737, + 8.481776, + 8.481814, + 8.481853, + 8.481891, + 8.481930, + 8.481968, + 8.482006, + 8.482044, + 8.482081, + 8.482119, + 8.482157, + 8.482194, + 8.482231, + 8.482269, + 8.482306, + 8.482343, + 8.482380, + 8.482416, + 8.482453, + 8.482489, + 8.482526, + 8.482562, + 8.482598, + 8.482634, + 8.482670, + 8.482706, + 8.482742, + 8.482777, + 8.482813, + 8.482848, + 8.482884, + 8.482919, + 8.482954, + 8.482989, + 8.483024, + 8.483058, + 8.483093, + 8.483128, + 8.483162, + 8.483196, + 8.483231, + 8.483265, + 8.483299, + 8.483333, + 8.483366, + 8.483400, + 8.483434, + 8.483467, + 8.483501, + 8.483534, + 8.483567, + 8.483600, + 8.483633, + 8.483666, + 8.483699, + 8.483732, + 8.483764, + 8.483797, + 8.483829, + 8.483861, + }, + {// The expectations for dimension = 18 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601666, + 0.666666, + 0.734997, + 0.806661, + 0.881655, + 0.959976, + 1.041621, + 1.126581, + 1.214846, + 1.306398, + 1.401213, + 1.499256, + 1.600478, + 1.704815, + 1.812183, + 1.922476, + 2.035562, + 2.151282, + 2.269450, + 2.389848, + 2.512232, + 2.636331, + 2.761850, + 2.888475, + 3.015879, + 3.143723, + 3.271670, + 3.399382, + 3.526531, + 3.652806, + 3.777912, + 3.901576, + 4.023552, + 4.143622, + 4.261594, + 4.377307, + 4.490624, + 4.601439, + 4.709669, + 4.815254, + 4.918155, + 5.018352, + 5.115841, + 5.210633, + 5.302751, + 5.392226, + 5.479100, + 5.563422, + 5.645244, + 5.724623, + 5.801621, + 5.876301, + 5.948726, + 6.018961, + 6.087073, + 6.153126, + 6.217185, + 6.279314, + 6.339576, + 6.398032, + 6.454742, + 6.509766, + 6.563159, + 6.614979, + 6.665278, + 6.714108, + 6.761521, + 6.807565, + 6.852286, + 6.895732, + 6.937944, + 6.978967, + 7.018840, + 7.057602, + 7.095293, + 7.131948, + 7.167602, + 7.202289, + 7.236041, + 7.268891, + 7.300867, + 7.332000, + 7.362317, + 7.391844, + 7.420608, + 7.448633, + 7.475944, + 7.502563, + 7.528512, + 7.553814, + 7.578488, + 7.602554, + 7.626032, + 7.648939, + 7.671294, + 7.693113, + 7.714413, + 7.735209, + 7.755517, + 7.775352, + 7.794728, + 7.813657, + 7.832155, + 7.850232, + 7.867902, + 7.885177, + 7.902067, + 7.918584, + 7.934739, + 7.950541, + 7.966001, + 7.981128, + 7.995932, + 8.010421, + 8.024604, + 8.038490, + 8.052087, + 8.065402, + 8.078443, + 8.091217, + 8.103731, + 8.115993, + 8.128009, + 8.139785, + 8.151328, + 8.162643, + 8.173737, + 8.184615, + 8.195282, + 8.205745, + 8.216007, + 8.226074, + 8.235951, + 8.245643, + 8.255153, + 8.264488, + 8.273649, + 8.282643, + 8.291473, + 8.300143, + 8.308656, + 8.317017, + 8.325228, + 8.333294, + 8.341218, + 8.349003, + 8.356652, + 8.364168, + 8.371555, + 8.378815, + 8.385952, + 8.392967, + 8.399864, + 8.406645, + 8.413313, + 8.419870, + 8.426319, + 8.432662, + 8.438901, + 8.445039, + 8.451077, + 8.457019, + 8.462865, + 8.468618, + 8.474280, + 8.479853, + 8.485338, + 8.490737, + 8.496053, + 8.501287, + 8.506440, + 8.511514, + 8.516511, + 8.521432, + 8.526279, + 8.531053, + 8.535756, + 8.540390, + 8.544954, + 8.549452, + 8.553883, + 8.558250, + 8.562554, + 8.566795, + 8.570975, + 8.575096, + 8.579158, + 8.583162, + 8.587110, + 8.591002, + 8.594840, + 8.598624, + 8.602356, + 8.606036, + 8.609666, + 8.613246, + 8.616778, + 8.620262, + 8.623698, + 8.627089, + 8.630434, + 8.633734, + 8.636991, + 8.640204, + 8.643376, + 8.646506, + 8.649595, + 8.652644, + 8.655653, + 8.658624, + 8.661557, + 8.664452, + 8.667311, + 8.670133, + 8.672920, + 8.675672, + 8.678389, + 8.681072, + 8.683722, + 8.686340, + 8.688925, + 8.691479, + 8.694001, + 8.696493, + 8.698954, + 8.701386, + 8.703789, + 8.706162, + 8.708508, + 8.710826, + 8.713116, + 8.715379, + 8.717616, + 8.719826, + 8.722011, + 8.724171, + 8.726305, + 8.728415, + 8.730501, + 8.732563, + 8.734601, + 8.736616, + 8.738609, + 8.740579, + 8.742527, + 8.744453, + 8.746358, + 8.748241, + 8.750104, + 8.751946, + 8.753768, + 8.755570, + 8.757353, + 8.759116, + 8.760860, + 8.762585, + 8.764292, + 8.765980, + 8.767650, + 8.769303, + 8.770938, + 8.772556, + 8.774156, + 8.775741, + 8.777308, + 8.778859, + 8.780394, + 8.781913, + 8.783417, + 8.784905, + 8.786378, + 8.787835, + 8.789278, + 8.790707, + 8.792121, + 8.793520, + 8.794906, + 8.796278, + 8.797636, + 8.798980, + 8.800312, + 8.801630, + 8.802935, + 8.804227, + 8.805507, + 8.806774, + 8.808029, + 8.809272, + 8.810503, + 8.811721, + 8.812929, + 8.814124, + 8.815309, + 8.816482, + 8.817644, + 8.818795, + 8.819935, + 8.821064, + 8.822183, + 8.823292, + 8.824390, + 8.825478, + 8.826555, + 8.827623, + 8.828682, + 8.829730, + 8.830769, + 8.831798, + 8.832818, + 8.833829, + 8.834831, + 8.835824, + 8.836808, + 8.837783, + 8.838749, + 8.839707, + 8.840656, + 8.841597, + 8.842529, + 8.843454, + 8.844370, + 8.845278, + 8.846179, + 8.847071, + 8.847956, + 8.848833, + 8.849703, + 8.850565, + 8.851420, + 8.852267, + 8.853108, + 8.853941, + 8.854767, + 8.855586, + 8.856398, + 8.857204, + 8.858002, + 8.858794, + 8.859580, + 8.860359, + 8.861131, + 8.861897, + 8.862657, + 8.863410, + 8.864158, + 8.864899, + 8.865634, + 8.866363, + 8.867086, + 8.867804, + 8.868516, + 8.869221, + 8.869922, + 8.870616, + 8.871306, + 8.871989, + 8.872667, + 8.873340, + 8.874008, + 8.874670, + 8.875327, + 8.875979, + 8.876626, + 8.877268, + 8.877905, + 8.878537, + 8.879164, + 8.879786, + 8.880403, + 8.881016, + 8.881624, + 8.882227, + 8.882826, + 8.883420, + 8.884010, + 8.884595, + 8.885176, + 8.885753, + 8.886325, + 8.886893, + 8.887456, + 8.888016, + 8.888571, + 8.889122, + 8.889669, + 8.890212, + 8.890751, + 8.891286, + 8.891818, + 8.892345, + 8.892868, + 8.893388, + 8.893904, + 8.894416, + 8.894925, + 8.895429, + 8.895931, + 8.896428, + 8.896922, + 8.897413, + 8.897900, + 8.898383, + 8.898864, + 8.899340, + 8.899814, + 8.900284, + 8.900751, + 8.901214, + 8.901674, + 8.902132, + 8.902585, + 8.903036, + 8.903484, + 8.903928, + 8.904370, + 8.904808, + 8.905244, + 8.905676, + 8.906106, + 8.906532, + 8.906956, + 8.907377, + 8.907795, + 8.908210, + 8.908623, + 8.909032, + 8.909439, + 8.909843, + 8.910245, + 8.910643, + 8.911040, + 8.911433, + 8.911824, + 8.912212, + 8.912598, + 8.912981, + 8.913362, + 8.913740, + 8.914116, + 8.914489, + 8.914860, + 8.915229, + 8.915595, + 8.915958, + 8.916320, + 8.916679, + 8.917036, + 8.917390, + 8.917742, + 8.918092, + 8.918440, + 8.918786, + 8.919129, + 8.919470, + 8.919809, + 8.920146, + 8.920481, + 8.920814, + 8.921144, + 8.921473, + 8.921799, + 8.922124, + 8.922446, + 8.922767, + 8.923085, + 8.923402, + 8.923716, + 8.924029, + 8.924339, + 8.924648, + 8.924955, + 8.925260, + 8.925563, + 8.925865, + 8.926164, + 8.926462, + 8.926758, + 8.927052, + 8.927345, + 8.927635, + 8.927924, + 8.928211, + 8.928497, + 8.928780, + 8.929062, + 8.929343, + 8.929622, + 8.929899, + 8.930174, + 8.930448, + 8.930720, + 8.930991, + 8.931260, + 8.931528, + 8.931793, + 8.932058, + 8.932321, + 8.932582, + 8.932842, + 8.933100, + 8.933357, + 8.933612, + 8.933866, + 8.934119, + 8.934370, + 8.934619, + 8.934868, + 8.935114, + 8.935360, + 8.935604, + 8.935846, + 8.936088, + 8.936327, + 8.936566, + 8.936803, + 8.937039, + 8.937274, + 8.937507, + 8.937739, + 8.937969, + 8.938199, + 8.938427, + 8.938654, + 8.938879, + 8.939104, + 8.939327, + 8.939549, + 8.939769, + 8.939989, + 8.940207, + 8.940424, + 8.940640, + 8.940855, + 8.941068, + 8.941281, + 8.941492, + 8.941702, + 8.941911, + 8.942119, + 8.942326, + 8.942532, + 8.942736, + 8.942940, + 8.943142, + 8.943343, + 8.943544, + 8.943743, + 8.943941, + 8.944138, + 8.944334, + 8.944529, + 8.944723, + 8.944916, + 8.945108, + 8.945299, + 8.945489, + 8.945678, + 8.945866, + 8.946054, + 8.946240, + 8.946425, + 8.946609, + 8.946792, + 8.946974, + 8.947156, + 8.947336, + 8.947516, + 8.947694, + 8.947872, + 8.948049, + 8.948225, + 8.948400, + 8.948574, + 8.948747, + 8.948919, + 8.949091, + 8.949261, + 8.949431, + 8.949600, + 8.949768, + 8.949935, + 8.950102, + 8.950267, + 8.950432, + 8.950596, + 8.950759, + 8.950922, + 8.951083, + 8.951244, + 8.951404, + 8.951563, + 8.951721, + 8.951879, + 8.952036, + 8.952192, + 8.952347, + 8.952502, + 8.952655, + 8.952808, + 8.952961, + 8.953112, + 8.953263, + 8.953413, + 8.953563, + 8.953711, + 8.953859, + 8.954007, + 8.954153, + 8.954299, + 8.954444, + 8.954589, + 8.954732, + 8.954875, + 8.955018, + 8.955160, + 8.955301, + 8.955441, + 8.955581, + 8.955720, + 8.955858, + 8.955996, + 8.956133, + 8.956270, + 8.956406, + 8.956541, + 8.956676, + 8.956810, + 8.956943, + 8.957076, + 8.957208, + 8.957339, + 8.957470, + 8.957601, + 8.957730, + 8.957860, + 8.957988, + 8.958116, + 8.958243, + 8.958370, + 8.958497, + 8.958622, + 8.958747, + 8.958872, + 8.958996, + 8.959119, + 8.959242, + 8.959364, + 8.959486, + 8.959607, + 8.959728, + 8.959848, + 8.959967, + 8.960087, + 8.960205, + 8.960323, + 8.960440, + 8.960557, + 8.960674, + 8.960790, + 8.960905, + 8.961020, + 8.961134, + 8.961248, + 8.961362, + 8.961475, + 8.961587, + 8.961699, + 8.961810, + 8.961921, + 8.962032, + 8.962142, + 8.962251, + 8.962360, + 8.962469, + 8.962577, + 8.962684, + 8.962791, + 8.962898, + 8.963004, + 8.963110, + 8.963215, + 8.963320, + 8.963425, + 8.963529, + 8.963632, + 8.963735, + 8.963838, + 8.963940, + 8.964042, + 8.964143, + 8.964244, + 8.964345, + 8.964445, + 8.964544, + 8.964644, + 8.964743, + 8.964841, + 8.964939, + 8.965037, + 8.965134, + 8.965231, + 8.965327, + 8.965423, + 8.965518, + 8.965614, + 8.965708, + 8.965803, + 8.965897, + 8.965990, + 8.966084, + 8.966177, + 8.966269, + 8.966361, + 8.966453, + 8.966544, + 8.966635, + 8.966726, + 8.966816, + 8.966906, + 8.966995, + 8.967085, + 8.967173, + 8.967262, + 8.967350, + 8.967438, + 8.967525, + 8.967612, + 8.967699, + 8.967785, + 8.967871, + 8.967956, + 8.968042, + 8.968127, + 8.968211, + 8.968296, + 8.968379, + 8.968463, + 8.968546, + 8.968629, + 8.968712, + 8.968794, + 8.968876, + 8.968958, + 8.969039, + 8.969120, + 8.969201, + 8.969281, + 8.969361, + 8.969441, + 8.969520, + 8.969599, + 8.969678, + 8.969757, + 8.969835, + 8.969913, + 8.969991, + 8.970068, + 8.970145, + 8.970222, + 8.970298, + 8.970374, + 8.970450, + 8.970525, + 8.970601, + 8.970676, + 8.970750, + 8.970825, + 8.970899, + 8.970973, + 8.971046, + 8.971119, + 8.971192, + 8.971265, + 8.971337, + 8.971410, + 8.971482, + 8.971553, + 8.971625, + 8.971696, + 8.971766, + 8.971837, + 8.971907, + 8.971977, + 8.972047, + 8.972117, + 8.972186, + 8.972255, + 8.972323, + 8.972392, + 8.972460, + 8.972528, + 8.972596, + 8.972663, + 8.972731, + 8.972797, + 8.972864, + 8.972931, + 8.972997, + 8.973063, + 8.973129, + 8.973194, + 8.973259, + 8.973324, + 8.973389, + 8.973454, + 8.973518, + 8.973582, + 8.973646, + 8.973710, + 8.973773, + 8.973836, + 8.973899, + 8.973962, + 8.974024, + 8.974087, + 8.974149, + 8.974211, + 8.974272, + 8.974333, + 8.974395, + 8.974456, + 8.974516, + 8.974577, + 8.974637, + 8.974697, + 8.974757, + 8.974817, + 8.974876, + 8.974935, + 8.974994, + 8.975053, + 8.975112, + 8.975170, + 8.975228, + 8.975286, + 8.975344, + 8.975402, + 8.975459, + 8.975516, + 8.975573, + 8.975630, + 8.975687, + 8.975743, + 8.975799, + 8.975855, + 8.975911, + 8.975967, + 8.976022, + 8.976077, + 8.976132, + 8.976187, + 8.976242, + 8.976296, + 8.976351, + 8.976405, + 8.976459, + 8.976512, + 8.976566, + 8.976619, + 8.976672, + 8.976725, + 8.976778, + 8.976831, + 8.976883, + 8.976936, + 8.976988, + 8.977040, + 8.977091, + 8.977143, + 8.977194, + 8.977246, + 8.977297, + 8.977348, + 8.977398, + 8.977449, + 8.977499, + 8.977549, + 8.977599, + 8.977649, + 8.977699, + 8.977749, + 8.977798, + 8.977847, + 8.977896, + 8.977945, + 8.977994, + 8.978042, + 8.978091, + 8.978139, + 8.978187, + 8.978235, + 8.978283, + 8.978330, + 8.978378, + 8.978425, + 8.978472, + 8.978519, + 8.978566, + 8.978613, + 8.978659, + 8.978706, + 8.978752, + 8.978798, + 8.978844, + 8.978890, + 8.978935, + 8.978981, + 8.979026, + 8.979071, + 8.979116, + 8.979161, + 8.979206, + 8.979251, + 8.979295, + 8.979339, + 8.979384, + 8.979428, + 8.979472, + 8.979515, + 8.979559, + 8.979602, + 8.979646, + 8.979689, + 8.979732, + 8.979775, + 8.979818, + 8.979860, + 8.979903, + 8.979945, + 8.979988, + 8.980030, + 8.980072, + 8.980113, + 8.980155, + 8.980197, + 8.980238, + 8.980280, + 8.980321, + 8.980362, + 8.980403, + 8.980444, + 8.980484, + 8.980525, + 8.980565, + 8.980606, + 8.980646, + 8.980686, + 8.980726, + 8.980766, + 8.980805, + 8.980845, + 8.980884, + 8.980924, + 8.980963, + 8.981002, + 8.981041, + 8.981080, + 8.981118, + 8.981157, + 8.981196, + 8.981234, + 8.981272, + 8.981310, + 8.981348, + 8.981386, + 8.981424, + 8.981462, + 8.981499, + 8.981537, + 8.981574, + 8.981611, + 8.981648, + 8.981685, + 8.981722, + 8.981759, + 8.981796, + 8.981832, + 8.981869, + 8.981905, + 8.981941, + 8.981977, + 8.982013, + }, + {// The expectations for dimension = 19 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666666, + 0.734999, + 0.806664, + 0.881661, + 0.959989, + 1.041645, + 1.126624, + 1.214921, + 1.306525, + 1.401420, + 1.499584, + 1.600983, + 1.705572, + 1.813292, + 1.924062, + 2.037783, + 2.154329, + 2.273548, + 2.395261, + 2.519258, + 2.645302, + 2.773129, + 2.902449, + 3.032954, + 3.164319, + 3.296209, + 3.428284, + 3.560207, + 3.691647, + 3.822286, + 3.951823, + 4.079980, + 4.206501, + 4.331159, + 4.453753, + 4.574111, + 4.692090, + 4.807571, + 4.920463, + 5.030698, + 5.138229, + 5.243028, + 5.345086, + 5.444406, + 5.541006, + 5.634914, + 5.726167, + 5.814809, + 5.900891, + 5.984467, + 6.065596, + 6.144339, + 6.220760, + 6.294923, + 6.366891, + 6.436731, + 6.504506, + 6.570280, + 6.634118, + 6.696079, + 6.756226, + 6.814617, + 6.871310, + 6.926362, + 6.979827, + 7.031758, + 7.082208, + 7.131225, + 7.178858, + 7.225154, + 7.270157, + 7.313911, + 7.356459, + 7.397839, + 7.438093, + 7.477256, + 7.515366, + 7.552457, + 7.588564, + 7.623717, + 7.657950, + 7.691291, + 7.723770, + 7.755415, + 7.786253, + 7.816309, + 7.845608, + 7.874175, + 7.902032, + 7.929202, + 7.955707, + 7.981566, + 8.006801, + 8.031429, + 8.055471, + 8.078943, + 8.101863, + 8.124247, + 8.146112, + 8.167473, + 8.188344, + 8.208740, + 8.228676, + 8.248164, + 8.267217, + 8.285848, + 8.304069, + 8.321892, + 8.339327, + 8.356386, + 8.373079, + 8.389416, + 8.405407, + 8.421062, + 8.436389, + 8.451398, + 8.466097, + 8.480495, + 8.494599, + 8.508417, + 8.521957, + 8.535226, + 8.548231, + 8.560979, + 8.573476, + 8.585730, + 8.597745, + 8.609529, + 8.621086, + 8.632423, + 8.643546, + 8.654458, + 8.665166, + 8.675675, + 8.685989, + 8.696114, + 8.706052, + 8.715810, + 8.725392, + 8.734801, + 8.744041, + 8.753118, + 8.762033, + 8.770792, + 8.779397, + 8.787853, + 8.796162, + 8.804329, + 8.812355, + 8.820245, + 8.828001, + 8.835627, + 8.843125, + 8.850498, + 8.857748, + 8.864879, + 8.871893, + 8.878793, + 8.885581, + 8.892259, + 8.898829, + 8.905295, + 8.911658, + 8.917920, + 8.924083, + 8.930150, + 8.936123, + 8.942003, + 8.947792, + 8.953492, + 8.959105, + 8.964633, + 8.970077, + 8.975439, + 8.980720, + 8.985923, + 8.991049, + 8.996099, + 9.001075, + 9.005978, + 9.010809, + 9.015571, + 9.020264, + 9.024889, + 9.029448, + 9.033943, + 9.038374, + 9.042742, + 9.047049, + 9.051296, + 9.055484, + 9.059613, + 9.063686, + 9.067703, + 9.071665, + 9.075573, + 9.079429, + 9.083232, + 9.086984, + 9.090686, + 9.094339, + 9.097944, + 9.101500, + 9.105010, + 9.108475, + 9.111894, + 9.115269, + 9.118600, + 9.121888, + 9.125134, + 9.128339, + 9.131503, + 9.134627, + 9.137712, + 9.140758, + 9.143766, + 9.146736, + 9.149670, + 9.152567, + 9.155429, + 9.158256, + 9.161048, + 9.163807, + 9.166532, + 9.169224, + 9.171884, + 9.174512, + 9.177108, + 9.179674, + 9.182210, + 9.184716, + 9.187192, + 9.189639, + 9.192058, + 9.194449, + 9.196812, + 9.199148, + 9.201458, + 9.203740, + 9.205997, + 9.208229, + 9.210435, + 9.212616, + 9.214773, + 9.216906, + 9.219015, + 9.221100, + 9.223163, + 9.225203, + 9.227220, + 9.229215, + 9.231189, + 9.233141, + 9.235073, + 9.236983, + 9.238873, + 9.240742, + 9.242592, + 9.244422, + 9.246233, + 9.248024, + 9.249797, + 9.251551, + 9.253287, + 9.255004, + 9.256704, + 9.258387, + 9.260052, + 9.261699, + 9.263331, + 9.264945, + 9.266543, + 9.268125, + 9.269691, + 9.271241, + 9.272775, + 9.274294, + 9.275798, + 9.277287, + 9.278762, + 9.280222, + 9.281667, + 9.283098, + 9.284516, + 9.285919, + 9.287309, + 9.288685, + 9.290049, + 9.291399, + 9.292736, + 9.294060, + 9.295372, + 9.296671, + 9.297958, + 9.299233, + 9.300495, + 9.301746, + 9.302985, + 9.304213, + 9.305429, + 9.306634, + 9.307828, + 9.309011, + 9.310183, + 9.311344, + 9.312495, + 9.313635, + 9.314765, + 9.315885, + 9.316995, + 9.318094, + 9.319184, + 9.320264, + 9.321334, + 9.322395, + 9.323447, + 9.324489, + 9.325522, + 9.326546, + 9.327561, + 9.328567, + 9.329564, + 9.330553, + 9.331533, + 9.332504, + 9.333468, + 9.334423, + 9.335370, + 9.336308, + 9.337239, + 9.338162, + 9.339077, + 9.339985, + 9.340884, + 9.341776, + 9.342661, + 9.343538, + 9.344408, + 9.345271, + 9.346127, + 9.346975, + 9.347817, + 9.348652, + 9.349480, + 9.350301, + 9.351115, + 9.351923, + 9.352724, + 9.353519, + 9.354307, + 9.355089, + 9.355865, + 9.356635, + 9.357398, + 9.358155, + 9.358907, + 9.359652, + 9.360392, + 9.361125, + 9.361853, + 9.362576, + 9.363292, + 9.364003, + 9.364709, + 9.365409, + 9.366103, + 9.366793, + 9.367477, + 9.368155, + 9.368829, + 9.369497, + 9.370161, + 9.370819, + 9.371472, + 9.372121, + 9.372764, + 9.373403, + 9.374037, + 9.374666, + 9.375290, + 9.375910, + 9.376525, + 9.377136, + 9.377742, + 9.378343, + 9.378941, + 9.379534, + 9.380122, + 9.380706, + 9.381286, + 9.381862, + 9.382433, + 9.383001, + 9.383564, + 9.384124, + 9.384679, + 9.385230, + 9.385777, + 9.386321, + 9.386861, + 9.387396, + 9.387928, + 9.388456, + 9.388981, + 9.389502, + 9.390019, + 9.390533, + 9.391042, + 9.391549, + 9.392052, + 9.392551, + 9.393047, + 9.393540, + 9.394029, + 9.394515, + 9.394997, + 9.395476, + 9.395952, + 9.396425, + 9.396894, + 9.397361, + 9.397824, + 9.398284, + 9.398741, + 9.399194, + 9.399645, + 9.400093, + 9.400538, + 9.400980, + 9.401418, + 9.401854, + 9.402288, + 9.402718, + 9.403145, + 9.403570, + 9.403992, + 9.404411, + 9.404827, + 9.405241, + 9.405652, + 9.406060, + 9.406466, + 9.406869, + 9.407269, + 9.407667, + 9.408062, + 9.408455, + 9.408845, + 9.409233, + 9.409618, + 9.410001, + 9.410382, + 9.410760, + 9.411135, + 9.411508, + 9.411879, + 9.412248, + 9.412614, + 9.412978, + 9.413340, + 9.413700, + 9.414057, + 9.414412, + 9.414765, + 9.415115, + 9.415464, + 9.415810, + 9.416155, + 9.416497, + 9.416837, + 9.417175, + 9.417511, + 9.417845, + 9.418177, + 9.418507, + 9.418834, + 9.419160, + 9.419484, + 9.419806, + 9.420127, + 9.420445, + 9.420761, + 9.421075, + 9.421388, + 9.421699, + 9.422008, + 9.422315, + 9.422620, + 9.422923, + 9.423225, + 9.423525, + 9.423823, + 9.424119, + 9.424414, + 9.424707, + 9.424998, + 9.425288, + 9.425576, + 9.425862, + 9.426147, + 9.426430, + 9.426711, + 9.426991, + 9.427269, + 9.427545, + 9.427820, + 9.428094, + 9.428366, + 9.428636, + 9.428905, + 9.429172, + 9.429438, + 9.429702, + 9.429965, + 9.430226, + 9.430486, + 9.430745, + 9.431002, + 9.431257, + 9.431511, + 9.431764, + 9.432016, + 9.432266, + 9.432514, + 9.432761, + 9.433007, + 9.433252, + 9.433495, + 9.433737, + 9.433977, + 9.434217, + 9.434455, + 9.434691, + 9.434927, + 9.435161, + 9.435394, + 9.435625, + 9.435856, + 9.436085, + 9.436313, + 9.436539, + 9.436765, + 9.436989, + 9.437212, + 9.437434, + 9.437655, + 9.437875, + 9.438093, + 9.438310, + 9.438526, + 9.438741, + 9.438955, + 9.439168, + 9.439380, + 9.439590, + 9.439800, + 9.440008, + 9.440215, + 9.440422, + 9.440627, + 9.440831, + 9.441034, + 9.441236, + 9.441437, + 9.441637, + 9.441836, + 9.442034, + 9.442230, + 9.442426, + 9.442621, + 9.442815, + 9.443008, + 9.443200, + 9.443391, + 9.443581, + 9.443770, + 9.443958, + 9.444145, + 9.444332, + 9.444517, + 9.444701, + 9.444885, + 9.445067, + 9.445249, + 9.445430, + 9.445610, + 9.445789, + 9.445967, + 9.446144, + 9.446320, + 9.446496, + 9.446670, + 9.446844, + 9.447017, + 9.447189, + 9.447361, + 9.447531, + 9.447701, + 9.447869, + 9.448037, + 9.448204, + 9.448371, + 9.448536, + 9.448701, + 9.448865, + 9.449028, + 9.449191, + 9.449352, + 9.449513, + 9.449673, + 9.449833, + 9.449991, + 9.450149, + 9.450306, + 9.450462, + 9.450618, + 9.450773, + 9.450927, + 9.451080, + 9.451233, + 9.451385, + 9.451536, + 9.451687, + 9.451837, + 9.451986, + 9.452135, + 9.452282, + 9.452429, + 9.452576, + 9.452722, + 9.452867, + 9.453011, + 9.453155, + 9.453298, + 9.453441, + 9.453582, + 9.453723, + 9.453864, + 9.454004, + 9.454143, + 9.454282, + 9.454420, + 9.454557, + 9.454694, + 9.454830, + 9.454965, + 9.455100, + 9.455235, + 9.455368, + 9.455501, + 9.455634, + 9.455766, + 9.455897, + 9.456028, + 9.456158, + 9.456288, + 9.456417, + 9.456545, + 9.456673, + 9.456800, + 9.456927, + 9.457053, + 9.457179, + 9.457304, + 9.457429, + 9.457553, + 9.457676, + 9.457799, + 9.457921, + 9.458043, + 9.458165, + 9.458285, + 9.458406, + 9.458525, + 9.458645, + 9.458763, + 9.458882, + 9.458999, + 9.459116, + 9.459233, + 9.459349, + 9.459465, + 9.459580, + 9.459695, + 9.459809, + 9.459923, + 9.460036, + 9.460149, + 9.460261, + 9.460373, + 9.460485, + 9.460596, + 9.460706, + 9.460816, + 9.460926, + 9.461035, + 9.461143, + 9.461251, + 9.461359, + 9.461466, + 9.461573, + 9.461679, + 9.461785, + 9.461891, + 9.461996, + 9.462101, + 9.462205, + 9.462308, + 9.462412, + 9.462515, + 9.462617, + 9.462719, + 9.462821, + 9.462922, + 9.463023, + 9.463123, + 9.463223, + 9.463323, + 9.463422, + 9.463521, + 9.463619, + 9.463717, + 9.463815, + 9.463912, + 9.464009, + 9.464105, + 9.464201, + 9.464297, + 9.464392, + 9.464487, + 9.464582, + 9.464676, + 9.464770, + 9.464863, + 9.464956, + 9.465049, + 9.465141, + 9.465233, + 9.465324, + 9.465416, + 9.465506, + 9.465597, + 9.465687, + 9.465777, + 9.465866, + 9.465955, + 9.466044, + 9.466132, + 9.466220, + 9.466308, + 9.466395, + 9.466482, + 9.466569, + 9.466655, + 9.466741, + 9.466827, + 9.466912, + 9.466997, + 9.467082, + 9.467166, + 9.467250, + 9.467334, + 9.467417, + 9.467501, + 9.467583, + 9.467666, + 9.467748, + 9.467830, + 9.467911, + 9.467992, + 9.468073, + 9.468154, + 9.468234, + 9.468314, + 9.468394, + 9.468473, + 9.468552, + 9.468631, + 9.468709, + 9.468788, + 9.468865, + 9.468943, + 9.469020, + 9.469097, + 9.469174, + 9.469251, + 9.469327, + 9.469403, + 9.469478, + 9.469554, + 9.469629, + 9.469703, + 9.469778, + 9.469852, + 9.469926, + 9.470000, + 9.470073, + 9.470146, + 9.470219, + 9.470292, + 9.470364, + 9.470436, + 9.470508, + 9.470579, + 9.470651, + 9.470722, + 9.470792, + 9.470863, + 9.470933, + 9.471003, + 9.471073, + 9.471143, + 9.471212, + 9.471281, + 9.471350, + 9.471418, + 9.471486, + 9.471554, + 9.471622, + 9.471690, + 9.471757, + 9.471824, + 9.471891, + 9.471957, + 9.472024, + 9.472090, + 9.472156, + 9.472221, + 9.472287, + 9.472352, + 9.472417, + 9.472482, + 9.472546, + 9.472610, + 9.472674, + 9.472738, + 9.472802, + 9.472865, + 9.472928, + 9.472991, + 9.473054, + 9.473116, + 9.473179, + 9.473241, + 9.473303, + 9.473364, + 9.473426, + 9.473487, + 9.473548, + 9.473609, + 9.473669, + 9.473730, + 9.473790, + 9.473850, + 9.473909, + 9.473969, + 9.474028, + 9.474087, + 9.474146, + 9.474205, + 9.474264, + 9.474322, + 9.474380, + 9.474438, + 9.474496, + 9.474553, + 9.474611, + 9.474668, + 9.474725, + 9.474782, + 9.474838, + 9.474895, + 9.474951, + 9.475007, + 9.475063, + 9.475118, + 9.475174, + 9.475229, + 9.475284, + 9.475339, + 9.475394, + 9.475448, + 9.475503, + 9.475557, + 9.475611, + 9.475665, + 9.475718, + 9.475772, + 9.475825, + 9.475878, + 9.475931, + 9.475984, + 9.476036, + 9.476089, + 9.476141, + 9.476193, + 9.476245, + 9.476297, + 9.476348, + 9.476400, + 9.476451, + 9.476502, + 9.476553, + 9.476604, + 9.476654, + 9.476705, + 9.476755, + 9.476805, + 9.476855, + 9.476905, + 9.476954, + 9.477004, + 9.477053, + 9.477102, + 9.477151, + 9.477200, + 9.477248, + 9.477297, + 9.477345, + 9.477393, + 9.477442, + 9.477489, + 9.477537, + 9.477585, + 9.477632, + 9.477679, + 9.477727, + 9.477773, + 9.477820, + 9.477867, + 9.477914, + 9.477960, + 9.478006, + 9.478052, + 9.478098, + 9.478144, + 9.478190, + 9.478235, + 9.478281, + 9.478326, + 9.478371, + 9.478416, + 9.478461, + 9.478505, + 9.478550, + 9.478594, + 9.478639, + 9.478683, + 9.478727, + 9.478770, + 9.478814, + 9.478858, + 9.478901, + 9.478945, + 9.478988, + 9.479031, + 9.479074, + 9.479116, + 9.479159, + 9.479202, + 9.479244, + 9.479286, + 9.479328, + 9.479370, + 9.479412, + 9.479454, + 9.479496, + 9.479537, + 9.479578, + 9.479620, + 9.479661, + 9.479702, + 9.479743, + 9.479783, + 9.479824, + 9.479865, + 9.479905, + 9.479945, + 9.479985, + 9.480025, + 9.480065, + }, + {// The expectations for dimension = 20 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806666, + 0.881664, + 0.959995, + 1.041656, + 1.126646, + 1.214961, + 1.306593, + 1.401535, + 1.499771, + 1.601279, + 1.706029, + 1.813978, + 1.925070, + 2.039228, + 2.156358, + 2.276339, + 2.399025, + 2.524244, + 2.651791, + 2.781436, + 2.912921, + 3.045962, + 3.180254, + 3.315477, + 3.451297, + 3.587376, + 3.723374, + 3.858959, + 3.993809, + 4.127618, + 4.260101, + 4.390997, + 4.520069, + 4.647109, + 4.771937, + 4.894400, + 5.014373, + 5.131755, + 5.246472, + 5.358468, + 5.467709, + 5.574180, + 5.677878, + 5.778816, + 5.877018, + 5.972516, + 6.065351, + 6.155572, + 6.243229, + 6.328380, + 6.411083, + 6.491402, + 6.569398, + 6.645136, + 6.718679, + 6.790093, + 6.859440, + 6.926784, + 6.992187, + 7.055711, + 7.117414, + 7.177355, + 7.235591, + 7.292178, + 7.347169, + 7.400618, + 7.452573, + 7.503086, + 7.552202, + 7.599969, + 7.646431, + 7.691631, + 7.735610, + 7.778409, + 7.820065, + 7.860617, + 7.900101, + 7.938551, + 7.976000, + 8.012481, + 8.048025, + 8.082663, + 8.116422, + 8.149331, + 8.181416, + 8.212704, + 8.243220, + 8.272987, + 8.302029, + 8.330367, + 8.358025, + 8.385021, + 8.411378, + 8.437113, + 8.462245, + 8.486793, + 8.510773, + 8.534203, + 8.557099, + 8.579476, + 8.601349, + 8.622733, + 8.643642, + 8.664090, + 8.684089, + 8.703652, + 8.722792, + 8.741520, + 8.759847, + 8.777786, + 8.795346, + 8.812537, + 8.829370, + 8.845855, + 8.862000, + 8.877815, + 8.893309, + 8.908490, + 8.923365, + 8.937944, + 8.952234, + 8.966242, + 8.979975, + 8.993441, + 9.006646, + 9.019597, + 9.032300, + 9.044762, + 9.056988, + 9.068984, + 9.080755, + 9.092308, + 9.103648, + 9.114779, + 9.125707, + 9.136437, + 9.146972, + 9.157319, + 9.167480, + 9.177462, + 9.187267, + 9.196900, + 9.206364, + 9.215664, + 9.224804, + 9.233787, + 9.242616, + 9.251295, + 9.259827, + 9.268216, + 9.276464, + 9.284575, + 9.292552, + 9.300398, + 9.308115, + 9.315707, + 9.323175, + 9.330523, + 9.337753, + 9.344868, + 9.351870, + 9.358761, + 9.365544, + 9.372220, + 9.378793, + 9.385264, + 9.391635, + 9.397909, + 9.404087, + 9.410171, + 9.416163, + 9.422065, + 9.427879, + 9.433606, + 9.439248, + 9.444807, + 9.450284, + 9.455681, + 9.461000, + 9.466242, + 9.471408, + 9.476500, + 9.481519, + 9.486468, + 9.491346, + 9.496155, + 9.500897, + 9.505573, + 9.510184, + 9.514731, + 9.519215, + 9.523638, + 9.528001, + 9.532304, + 9.536549, + 9.540737, + 9.544869, + 9.548945, + 9.552968, + 9.556937, + 9.560854, + 9.564719, + 9.568534, + 9.572299, + 9.576016, + 9.579684, + 9.583306, + 9.586881, + 9.590410, + 9.593895, + 9.597336, + 9.600733, + 9.604088, + 9.607401, + 9.610672, + 9.613903, + 9.617095, + 9.620247, + 9.623360, + 9.626436, + 9.629474, + 9.632476, + 9.635441, + 9.638371, + 9.641266, + 9.644126, + 9.646952, + 9.649745, + 9.652506, + 9.655233, + 9.657929, + 9.660594, + 9.663228, + 9.665831, + 9.668404, + 9.670948, + 9.673463, + 9.675950, + 9.678408, + 9.680838, + 9.683241, + 9.685617, + 9.687967, + 9.690290, + 9.692588, + 9.694860, + 9.697107, + 9.699330, + 9.701528, + 9.703703, + 9.705854, + 9.707981, + 9.710086, + 9.712168, + 9.714228, + 9.716266, + 9.718282, + 9.720277, + 9.722251, + 9.724204, + 9.726137, + 9.728049, + 9.729942, + 9.731815, + 9.733669, + 9.735503, + 9.737319, + 9.739116, + 9.740895, + 9.742656, + 9.744399, + 9.746124, + 9.747832, + 9.749523, + 9.751197, + 9.752854, + 9.754495, + 9.756120, + 9.757728, + 9.759321, + 9.760898, + 9.762460, + 9.764007, + 9.765538, + 9.767055, + 9.768557, + 9.770045, + 9.771518, + 9.772978, + 9.774423, + 9.775855, + 9.777273, + 9.778678, + 9.780069, + 9.781448, + 9.782813, + 9.784166, + 9.785507, + 9.786835, + 9.788150, + 9.789454, + 9.790746, + 9.792025, + 9.793294, + 9.794550, + 9.795795, + 9.797029, + 9.798252, + 9.799464, + 9.800665, + 9.801855, + 9.803035, + 9.804204, + 9.805363, + 9.806511, + 9.807650, + 9.808778, + 9.809897, + 9.811006, + 9.812105, + 9.813194, + 9.814275, + 9.815346, + 9.816407, + 9.817460, + 9.818503, + 9.819538, + 9.820564, + 9.821581, + 9.822590, + 9.823590, + 9.824581, + 9.825565, + 9.826540, + 9.827507, + 9.828465, + 9.829416, + 9.830359, + 9.831295, + 9.832222, + 9.833142, + 9.834055, + 9.834960, + 9.835857, + 9.836748, + 9.837631, + 9.838507, + 9.839376, + 9.840238, + 9.841093, + 9.841941, + 9.842783, + 9.843617, + 9.844446, + 9.845267, + 9.846082, + 9.846891, + 9.847693, + 9.848489, + 9.849279, + 9.850063, + 9.850841, + 9.851612, + 9.852378, + 9.853138, + 9.853892, + 9.854640, + 9.855382, + 9.856119, + 9.856850, + 9.857576, + 9.858296, + 9.859011, + 9.859720, + 9.860424, + 9.861123, + 9.861816, + 9.862504, + 9.863187, + 9.863866, + 9.864539, + 9.865207, + 9.865870, + 9.866528, + 9.867182, + 9.867830, + 9.868474, + 9.869114, + 9.869748, + 9.870378, + 9.871004, + 9.871625, + 9.872241, + 9.872853, + 9.873461, + 9.874065, + 9.874664, + 9.875258, + 9.875849, + 9.876435, + 9.877018, + 9.877596, + 9.878170, + 9.878740, + 9.879306, + 9.879868, + 9.880427, + 9.880981, + 9.881532, + 9.882078, + 9.882621, + 9.883160, + 9.883696, + 9.884228, + 9.884756, + 9.885281, + 9.885802, + 9.886319, + 9.886833, + 9.887344, + 9.887851, + 9.888354, + 9.888855, + 9.889352, + 9.889845, + 9.890336, + 9.890823, + 9.891307, + 9.891787, + 9.892265, + 9.892739, + 9.893210, + 9.893678, + 9.894143, + 9.894605, + 9.895064, + 9.895520, + 9.895973, + 9.896423, + 9.896870, + 9.897315, + 9.897756, + 9.898195, + 9.898631, + 9.899064, + 9.899494, + 9.899921, + 9.900346, + 9.900768, + 9.901187, + 9.901604, + 9.902018, + 9.902430, + 9.902839, + 9.903245, + 9.903649, + 9.904050, + 9.904449, + 9.904845, + 9.905239, + 9.905631, + 9.906020, + 9.906406, + 9.906791, + 9.907172, + 9.907552, + 9.907929, + 9.908304, + 9.908677, + 9.909047, + 9.909415, + 9.909781, + 9.910145, + 9.910506, + 9.910866, + 9.911223, + 9.911578, + 9.911931, + 9.912282, + 9.912630, + 9.912977, + 9.913322, + 9.913664, + 9.914005, + 9.914343, + 9.914680, + 9.915014, + 9.915347, + 9.915677, + 9.916006, + 9.916333, + 9.916658, + 9.916981, + 9.917302, + 9.917621, + 9.917938, + 9.918254, + 9.918568, + 9.918880, + 9.919190, + 9.919498, + 9.919805, + 9.920110, + 9.920413, + 9.920715, + 9.921014, + 9.921312, + 9.921609, + 9.921903, + 9.922196, + 9.922488, + 9.922778, + 9.923066, + 9.923352, + 9.923637, + 9.923921, + 9.924202, + 9.924483, + 9.924761, + 9.925038, + 9.925314, + 9.925588, + 9.925861, + 9.926132, + 9.926401, + 9.926669, + 9.926936, + 9.927201, + 9.927465, + 9.927727, + 9.927988, + 9.928248, + 9.928506, + 9.928763, + 9.929018, + 9.929272, + 9.929525, + 9.929776, + 9.930026, + 9.930275, + 9.930522, + 9.930768, + 9.931012, + 9.931256, + 9.931498, + 9.931739, + 9.931978, + 9.932217, + 9.932454, + 9.932689, + 9.932924, + 9.933157, + 9.933389, + 9.933620, + 9.933850, + 9.934079, + 9.934306, + 9.934532, + 9.934757, + 9.934981, + 9.935204, + 9.935425, + 9.935646, + 9.935865, + 9.936083, + 9.936300, + 9.936516, + 9.936731, + 9.936945, + 9.937158, + 9.937369, + 9.937580, + 9.937789, + 9.937998, + 9.938205, + 9.938412, + 9.938617, + 9.938821, + 9.939025, + 9.939227, + 9.939428, + 9.939629, + 9.939828, + 9.940026, + 9.940224, + 9.940420, + 9.940615, + 9.940810, + 9.941003, + 9.941196, + 9.941387, + 9.941578, + 9.941768, + 9.941957, + 9.942144, + 9.942331, + 9.942518, + 9.942703, + 9.942887, + 9.943070, + 9.943253, + 9.943435, + 9.943615, + 9.943795, + 9.943974, + 9.944153, + 9.944330, + 9.944506, + 9.944682, + 9.944857, + 9.945031, + 9.945204, + 9.945377, + 9.945548, + 9.945719, + 9.945889, + 9.946058, + 9.946226, + 9.946394, + 9.946561, + 9.946727, + 9.946892, + 9.947057, + 9.947220, + 9.947383, + 9.947545, + 9.947707, + 9.947868, + 9.948028, + 9.948187, + 9.948345, + 9.948503, + 9.948660, + 9.948817, + 9.948972, + 9.949127, + 9.949281, + 9.949435, + 9.949588, + 9.949740, + 9.949891, + 9.950042, + 9.950192, + 9.950342, + 9.950490, + 9.950638, + 9.950786, + 9.950933, + 9.951079, + 9.951224, + 9.951369, + 9.951513, + 9.951657, + 9.951799, + 9.951942, + 9.952083, + 9.952224, + 9.952365, + 9.952504, + 9.952644, + 9.952782, + 9.952920, + 9.953057, + 9.953194, + 9.953330, + 9.953466, + 9.953601, + 9.953735, + 9.953869, + 9.954002, + 9.954135, + 9.954267, + 9.954398, + 9.954529, + 9.954659, + 9.954789, + 9.954919, + 9.955047, + 9.955175, + 9.955303, + 9.955430, + 9.955556, + 9.955682, + 9.955808, + 9.955933, + 9.956057, + 9.956181, + 9.956304, + 9.956427, + 9.956549, + 9.956671, + 9.956792, + 9.956913, + 9.957033, + 9.957153, + 9.957272, + 9.957391, + 9.957509, + 9.957627, + 9.957744, + 9.957861, + 9.957978, + 9.958093, + 9.958209, + 9.958324, + 9.958438, + 9.958552, + 9.958665, + 9.958778, + 9.958891, + 9.959003, + 9.959115, + 9.959226, + 9.959337, + 9.959447, + 9.959557, + 9.959666, + 9.959775, + 9.959883, + 9.959991, + 9.960099, + 9.960206, + 9.960313, + 9.960419, + 9.960525, + 9.960631, + 9.960736, + 9.960840, + 9.960945, + 9.961048, + 9.961152, + 9.961255, + 9.961357, + 9.961459, + 9.961561, + 9.961662, + 9.961763, + 9.961864, + 9.961964, + 9.962064, + 9.962163, + 9.962262, + 9.962361, + 9.962459, + 9.962557, + 9.962654, + 9.962751, + 9.962848, + 9.962944, + 9.963040, + 9.963136, + 9.963231, + 9.963326, + 9.963420, + 9.963514, + 9.963608, + 9.963701, + 9.963794, + 9.963887, + 9.963979, + 9.964071, + 9.964163, + 9.964254, + 9.964345, + 9.964436, + 9.964526, + 9.964616, + 9.964705, + 9.964794, + 9.964883, + 9.964972, + 9.965060, + 9.965148, + 9.965235, + 9.965322, + 9.965409, + 9.965496, + 9.965582, + 9.965668, + 9.965754, + 9.965839, + 9.965924, + 9.966008, + 9.966093, + 9.966177, + 9.966260, + 9.966344, + 9.966427, + 9.966509, + 9.966592, + 9.966674, + 9.966756, + 9.966837, + 9.966919, + 9.967000, + 9.967080, + 9.967161, + 9.967241, + 9.967320, + 9.967400, + 9.967479, + 9.967558, + 9.967636, + 9.967715, + 9.967793, + 9.967871, + 9.967948, + 9.968025, + 9.968102, + 9.968179, + 9.968255, + 9.968331, + 9.968407, + 9.968483, + 9.968558, + 9.968633, + 9.968708, + 9.968782, + 9.968856, + 9.968930, + 9.969004, + 9.969077, + 9.969150, + 9.969223, + 9.969296, + 9.969368, + 9.969440, + 9.969512, + 9.969584, + 9.969655, + 9.969726, + 9.969797, + 9.969868, + 9.969938, + 9.970008, + 9.970078, + 9.970148, + 9.970217, + 9.970286, + 9.970355, + 9.970424, + 9.970492, + 9.970561, + 9.970629, + 9.970696, + 9.970764, + 9.970831, + 9.970898, + 9.970965, + 9.971031, + 9.971098, + 9.971164, + 9.971230, + 9.971295, + 9.971361, + 9.971426, + 9.971491, + 9.971556, + 9.971620, + 9.971685, + 9.971749, + 9.971813, + 9.971876, + 9.971940, + 9.972003, + 9.972066, + 9.972129, + 9.972191, + 9.972254, + 9.972316, + 9.972378, + 9.972440, + 9.972501, + 9.972563, + 9.972624, + 9.972685, + 9.972745, + 9.972806, + 9.972866, + 9.972926, + 9.972986, + 9.973046, + 9.973106, + 9.973165, + 9.973224, + 9.973283, + 9.973342, + 9.973400, + 9.973459, + 9.973517, + 9.973575, + 9.973633, + 9.973690, + 9.973748, + 9.973805, + 9.973862, + 9.973919, + 9.973976, + 9.974032, + 9.974088, + 9.974145, + 9.974201, + 9.974256, + 9.974312, + 9.974367, + 9.974422, + 9.974478, + 9.974532, + 9.974587, + 9.974642, + 9.974696, + 9.974750, + 9.974804, + 9.974858, + 9.974912, + 9.974965, + 9.975018, + 9.975071, + 9.975124, + 9.975177, + 9.975230, + 9.975282, + 9.975335, + 9.975387, + 9.975439, + 9.975490, + 9.975542, + 9.975594, + 9.975645, + 9.975696, + 9.975747, + 9.975798, + 9.975849, + 9.975899, + 9.975949, + 9.976000, + 9.976050, + 9.976099, + 9.976149, + 9.976199, + 9.976248, + 9.976297, + 9.976347, + 9.976396, + 9.976444, + 9.976493, + 9.976541, + 9.976590, + 9.976638, + 9.976686, + 9.976734, + 9.976782, + 9.976829, + 9.976877, + 9.976924, + 9.976971, + 9.977018, + 9.977065, + 9.977112, + 9.977159, + 9.977205, + 9.977251, + 9.977298, + 9.977344, + 9.977389, + 9.977435, + 9.977481, + 9.977526, + 9.977572, + 9.977617, + 9.977662, + 9.977707, + 9.977752, + 9.977796, + 9.977841, + 9.977885, + 9.977929, + 9.977974, + 9.978018, + }, + {// The expectations for dimension = 21 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806666, + 0.881666, + 0.959998, + 1.041662, + 1.126657, + 1.214980, + 1.306629, + 1.401597, + 1.499875, + 1.601450, + 1.706300, + 1.814397, + 1.925701, + 2.040156, + 2.157691, + 2.278214, + 2.401609, + 2.527736, + 2.656426, + 2.787482, + 2.920678, + 3.055761, + 3.192453, + 3.330453, + 3.469444, + 3.609093, + 3.749064, + 3.889016, + 4.028616, + 4.167539, + 4.305474, + 4.442133, + 4.577246, + 4.710573, + 4.841897, + 4.971031, + 5.097815, + 5.222116, + 5.343827, + 5.462864, + 5.579168, + 5.692699, + 5.803433, + 5.911364, + 6.016500, + 6.118860, + 6.218473, + 6.315377, + 6.409615, + 6.501239, + 6.590302, + 6.676862, + 6.760980, + 6.842716, + 6.922134, + 6.999297, + 7.074270, + 7.147115, + 7.217895, + 7.286674, + 7.353511, + 7.418468, + 7.481602, + 7.542971, + 7.602632, + 7.660638, + 7.717044, + 7.771899, + 7.825255, + 7.877160, + 7.927660, + 7.976802, + 8.024628, + 8.071182, + 8.116504, + 8.160634, + 8.203611, + 8.245471, + 8.286250, + 8.325982, + 8.364701, + 8.402439, + 8.439226, + 8.475093, + 8.510067, + 8.544178, + 8.577452, + 8.609913, + 8.641589, + 8.672501, + 8.702675, + 8.732131, + 8.760892, + 8.788978, + 8.816410, + 8.843207, + 8.869387, + 8.894969, + 8.919970, + 8.944407, + 8.968296, + 8.991654, + 9.014494, + 9.036832, + 9.058682, + 9.080058, + 9.100972, + 9.121439, + 9.141469, + 9.161076, + 9.180270, + 9.199062, + 9.217465, + 9.235487, + 9.253140, + 9.270432, + 9.287375, + 9.303976, + 9.320244, + 9.336189, + 9.351818, + 9.367140, + 9.382163, + 9.396894, + 9.411340, + 9.425509, + 9.439408, + 9.453042, + 9.466420, + 9.479546, + 9.492428, + 9.505071, + 9.517481, + 9.529664, + 9.541624, + 9.553368, + 9.564900, + 9.576225, + 9.587349, + 9.598275, + 9.609009, + 9.619555, + 9.629917, + 9.640100, + 9.650106, + 9.659942, + 9.669609, + 9.679113, + 9.688456, + 9.697642, + 9.706675, + 9.715558, + 9.724294, + 9.732886, + 9.741338, + 9.749653, + 9.757833, + 9.765881, + 9.773801, + 9.781594, + 9.789264, + 9.796812, + 9.804242, + 9.811556, + 9.818757, + 9.825846, + 9.832826, + 9.839699, + 9.846468, + 9.853133, + 9.859699, + 9.866165, + 9.872535, + 9.878810, + 9.884992, + 9.891084, + 9.897086, + 9.903000, + 9.908828, + 9.914572, + 9.920234, + 9.925814, + 9.931315, + 9.936737, + 9.942083, + 9.947354, + 9.952551, + 9.957676, + 9.962729, + 9.967713, + 9.972628, + 9.977475, + 9.982257, + 9.986974, + 9.991627, + 9.996217, + 10.000746, + 10.005215, + 10.009624, + 10.013975, + 10.018269, + 10.022506, + 10.026688, + 10.030815, + 10.034890, + 10.038911, + 10.042881, + 10.046800, + 10.050670, + 10.054490, + 10.058262, + 10.061987, + 10.065665, + 10.069297, + 10.072884, + 10.076426, + 10.079925, + 10.083381, + 10.086795, + 10.090167, + 10.093498, + 10.096789, + 10.100041, + 10.103253, + 10.106427, + 10.109564, + 10.112663, + 10.115725, + 10.118752, + 10.121743, + 10.124699, + 10.127621, + 10.130509, + 10.133364, + 10.136186, + 10.138976, + 10.141733, + 10.144460, + 10.147155, + 10.149821, + 10.152456, + 10.155062, + 10.157638, + 10.160186, + 10.162706, + 10.165198, + 10.167663, + 10.170100, + 10.172511, + 10.174896, + 10.177255, + 10.179588, + 10.181897, + 10.184180, + 10.186439, + 10.188674, + 10.190886, + 10.193074, + 10.195238, + 10.197381, + 10.199500, + 10.201598, + 10.203674, + 10.205728, + 10.207761, + 10.209773, + 10.211765, + 10.213736, + 10.215687, + 10.217619, + 10.219530, + 10.221423, + 10.223296, + 10.225151, + 10.226987, + 10.228805, + 10.230605, + 10.232387, + 10.234151, + 10.235898, + 10.237628, + 10.239342, + 10.241038, + 10.242718, + 10.244382, + 10.246029, + 10.247661, + 10.249278, + 10.250878, + 10.252464, + 10.254035, + 10.255590, + 10.257131, + 10.258658, + 10.260170, + 10.261668, + 10.263152, + 10.264623, + 10.266079, + 10.267523, + 10.268953, + 10.270370, + 10.271774, + 10.273165, + 10.274543, + 10.275909, + 10.277263, + 10.278604, + 10.279934, + 10.281251, + 10.282557, + 10.283851, + 10.285134, + 10.286405, + 10.287665, + 10.288914, + 10.290152, + 10.291379, + 10.292596, + 10.293802, + 10.294997, + 10.296182, + 10.297357, + 10.298522, + 10.299677, + 10.300822, + 10.301957, + 10.303082, + 10.304198, + 10.305305, + 10.306402, + 10.307490, + 10.308569, + 10.309638, + 10.310699, + 10.311751, + 10.312795, + 10.313829, + 10.314856, + 10.315873, + 10.316883, + 10.317884, + 10.318877, + 10.319862, + 10.320838, + 10.321807, + 10.322769, + 10.323722, + 10.324668, + 10.325606, + 10.326537, + 10.327460, + 10.328376, + 10.329284, + 10.330186, + 10.331080, + 10.331968, + 10.332848, + 10.333721, + 10.334588, + 10.335448, + 10.336301, + 10.337148, + 10.337988, + 10.338822, + 10.339649, + 10.340470, + 10.341284, + 10.342093, + 10.342895, + 10.343691, + 10.344481, + 10.345266, + 10.346044, + 10.346816, + 10.347583, + 10.348344, + 10.349099, + 10.349849, + 10.350593, + 10.351331, + 10.352064, + 10.352792, + 10.353514, + 10.354231, + 10.354943, + 10.355650, + 10.356351, + 10.357048, + 10.357739, + 10.358425, + 10.359107, + 10.359783, + 10.360455, + 10.361122, + 10.361784, + 10.362441, + 10.363094, + 10.363742, + 10.364385, + 10.365024, + 10.365659, + 10.366289, + 10.366914, + 10.367536, + 10.368153, + 10.368765, + 10.369373, + 10.369978, + 10.370577, + 10.371173, + 10.371765, + 10.372353, + 10.372936, + 10.373516, + 10.374092, + 10.374663, + 10.375231, + 10.375795, + 10.376355, + 10.376912, + 10.377465, + 10.378014, + 10.378559, + 10.379101, + 10.379639, + 10.380173, + 10.380704, + 10.381232, + 10.381755, + 10.382276, + 10.382793, + 10.383307, + 10.383817, + 10.384324, + 10.384828, + 10.385328, + 10.385825, + 10.386319, + 10.386810, + 10.387297, + 10.387782, + 10.388263, + 10.388741, + 10.389216, + 10.389689, + 10.390158, + 10.390624, + 10.391087, + 10.391547, + 10.392005, + 10.392459, + 10.392911, + 10.393359, + 10.393805, + 10.394248, + 10.394689, + 10.395126, + 10.395561, + 10.395994, + 10.396423, + 10.396850, + 10.397274, + 10.397696, + 10.398115, + 10.398532, + 10.398946, + 10.399357, + 10.399766, + 10.400172, + 10.400576, + 10.400978, + 10.401377, + 10.401774, + 10.402168, + 10.402560, + 10.402950, + 10.403337, + 10.403722, + 10.404105, + 10.404485, + 10.404863, + 10.405239, + 10.405613, + 10.405984, + 10.406354, + 10.406721, + 10.407086, + 10.407449, + 10.407809, + 10.408168, + 10.408524, + 10.408879, + 10.409231, + 10.409582, + 10.409930, + 10.410276, + 10.410621, + 10.410963, + 10.411304, + 10.411642, + 10.411979, + 10.412313, + 10.412646, + 10.412977, + 10.413306, + 10.413633, + 10.413958, + 10.414281, + 10.414603, + 10.414923, + 10.415241, + 10.415557, + 10.415871, + 10.416184, + 10.416495, + 10.416804, + 10.417112, + 10.417418, + 10.417722, + 10.418024, + 10.418325, + 10.418624, + 10.418922, + 10.419218, + 10.419512, + 10.419805, + 10.420096, + 10.420385, + 10.420673, + 10.420960, + 10.421244, + 10.421528, + 10.421809, + 10.422090, + 10.422368, + 10.422646, + 10.422921, + 10.423196, + 10.423469, + 10.423740, + 10.424010, + 10.424278, + 10.424546, + 10.424811, + 10.425076, + 10.425338, + 10.425600, + 10.425860, + 10.426119, + 10.426376, + 10.426632, + 10.426887, + 10.427141, + 10.427393, + 10.427644, + 10.427893, + 10.428141, + 10.428388, + 10.428634, + 10.428878, + 10.429122, + 10.429364, + 10.429604, + 10.429844, + 10.430082, + 10.430319, + 10.430555, + 10.430789, + 10.431023, + 10.431255, + 10.431486, + 10.431716, + 10.431945, + 10.432173, + 10.432399, + 10.432625, + 10.432849, + 10.433072, + 10.433294, + 10.433515, + 10.433735, + 10.433953, + 10.434171, + 10.434388, + 10.434603, + 10.434818, + 10.435031, + 10.435243, + 10.435455, + 10.435665, + 10.435874, + 10.436083, + 10.436290, + 10.436496, + 10.436701, + 10.436905, + 10.437109, + 10.437311, + 10.437512, + 10.437713, + 10.437912, + 10.438110, + 10.438308, + 10.438504, + 10.438700, + 10.438895, + 10.439088, + 10.439281, + 10.439473, + 10.439664, + 10.439854, + 10.440043, + 10.440232, + 10.440419, + 10.440606, + 10.440791, + 10.440976, + 10.441160, + 10.441343, + 10.441525, + 10.441707, + 10.441887, + 10.442067, + 10.442246, + 10.442424, + 10.442601, + 10.442777, + 10.442953, + 10.443128, + 10.443302, + 10.443475, + 10.443647, + 10.443819, + 10.443990, + 10.444160, + 10.444329, + 10.444498, + 10.444665, + 10.444832, + 10.444998, + 10.445164, + 10.445329, + 10.445493, + 10.445656, + 10.445818, + 10.445980, + 10.446141, + 10.446302, + 10.446461, + 10.446620, + 10.446778, + 10.446936, + 10.447093, + 10.447249, + 10.447404, + 10.447559, + 10.447713, + 10.447867, + 10.448019, + 10.448171, + 10.448323, + 10.448473, + 10.448624, + 10.448773, + 10.448922, + 10.449070, + 10.449217, + 10.449364, + 10.449510, + 10.449656, + 10.449801, + 10.449945, + 10.450089, + 10.450232, + 10.450374, + 10.450516, + 10.450657, + 10.450798, + 10.450938, + 10.451078, + 10.451216, + 10.451355, + 10.451492, + 10.451629, + 10.451766, + 10.451902, + 10.452037, + 10.452172, + 10.452306, + 10.452440, + 10.452573, + 10.452706, + 10.452838, + 10.452969, + 10.453100, + 10.453230, + 10.453360, + 10.453489, + 10.453618, + 10.453746, + 10.453874, + 10.454001, + 10.454128, + 10.454254, + 10.454379, + 10.454504, + 10.454629, + 10.454753, + 10.454876, + 10.454999, + 10.455122, + 10.455244, + 10.455365, + 10.455486, + 10.455607, + 10.455727, + 10.455847, + 10.455966, + 10.456084, + 10.456202, + 10.456320, + 10.456437, + 10.456554, + 10.456670, + 10.456786, + 10.456901, + 10.457016, + 10.457130, + 10.457244, + 10.457358, + 10.457471, + 10.457583, + 10.457695, + 10.457807, + 10.457918, + 10.458029, + 10.458139, + 10.458249, + 10.458359, + 10.458468, + 10.458577, + 10.458685, + 10.458793, + 10.458900, + 10.459007, + 10.459113, + 10.459220, + 10.459325, + 10.459431, + 10.459535, + 10.459640, + 10.459744, + 10.459848, + 10.459951, + 10.460054, + 10.460156, + 10.460258, + 10.460360, + 10.460461, + 10.460562, + 10.460663, + 10.460763, + 10.460863, + 10.460962, + 10.461061, + 10.461160, + 10.461258, + 10.461356, + 10.461453, + 10.461551, + 10.461647, + 10.461744, + 10.461840, + 10.461936, + 10.462031, + 10.462126, + 10.462220, + 10.462315, + 10.462409, + 10.462502, + 10.462595, + 10.462688, + 10.462781, + 10.462873, + 10.462965, + 10.463056, + 10.463148, + 10.463238, + 10.463329, + 10.463419, + 10.463509, + 10.463598, + 10.463687, + 10.463776, + 10.463865, + 10.463953, + 10.464041, + 10.464128, + 10.464216, + 10.464303, + 10.464389, + 10.464475, + 10.464561, + 10.464647, + 10.464732, + 10.464817, + 10.464902, + 10.464987, + 10.465071, + 10.465154, + 10.465238, + 10.465321, + 10.465404, + 10.465487, + 10.465569, + 10.465651, + 10.465733, + 10.465814, + 10.465895, + 10.465976, + 10.466057, + 10.466137, + 10.466217, + 10.466297, + 10.466376, + 10.466455, + 10.466534, + 10.466613, + 10.466691, + 10.466769, + 10.466847, + 10.466925, + 10.467002, + 10.467079, + 10.467156, + 10.467232, + 10.467308, + 10.467384, + 10.467460, + 10.467535, + 10.467610, + 10.467685, + 10.467760, + 10.467834, + 10.467908, + 10.467982, + 10.468055, + 10.468129, + 10.468202, + 10.468275, + 10.468347, + 10.468419, + 10.468491, + 10.468563, + 10.468635, + 10.468706, + 10.468777, + 10.468848, + 10.468919, + 10.468989, + 10.469059, + 10.469129, + 10.469199, + 10.469268, + 10.469337, + 10.469406, + 10.469475, + 10.469544, + 10.469612, + 10.469680, + 10.469748, + 10.469815, + 10.469882, + 10.469950, + 10.470017, + 10.470083, + 10.470150, + 10.470216, + 10.470282, + 10.470348, + 10.470413, + 10.470479, + 10.470544, + 10.470609, + 10.470673, + 10.470738, + 10.470802, + 10.470866, + 10.470930, + 10.470994, + 10.471057, + 10.471120, + 10.471183, + 10.471246, + 10.471309, + 10.471371, + 10.471433, + 10.471495, + 10.471557, + 10.471619, + 10.471680, + 10.471742, + 10.471803, + 10.471863, + 10.471924, + 10.471984, + 10.472045, + 10.472105, + 10.472164, + 10.472224, + 10.472284, + 10.472343, + 10.472402, + 10.472461, + 10.472519, + 10.472578, + 10.472636, + 10.472694, + 10.472752, + 10.472810, + 10.472868, + 10.472925, + 10.472982, + 10.473039, + 10.473096, + 10.473153, + 10.473209, + 10.473266, + 10.473322, + 10.473378, + 10.473434, + 10.473489, + 10.473545, + 10.473600, + 10.473655, + 10.473710, + 10.473765, + 10.473819, + 10.473874, + 10.473928, + 10.473982, + 10.474036, + 10.474090, + 10.474143, + 10.474197, + 10.474250, + 10.474303, + 10.474356, + 10.474409, + 10.474461, + 10.474514, + 10.474566, + 10.474618, + 10.474670, + 10.474722, + 10.474773, + 10.474825, + 10.474876, + 10.474927, + 10.474978, + 10.475029, + 10.475080, + 10.475130, + 10.475181, + 10.475231, + 10.475281, + 10.475331, + 10.475381, + 10.475430, + 10.475480, + 10.475529, + 10.475578, + 10.475627, + 10.475676, + 10.475725, + 10.475773, + 10.475822, + 10.475870, + }, + {// The expectations for dimension = 22 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881666, + 0.959999, + 1.041665, + 1.126662, + 1.214991, + 1.306648, + 1.401631, + 1.499933, + 1.601547, + 1.706459, + 1.814649, + 1.926090, + 2.040743, + 2.158555, + 2.279456, + 2.403359, + 2.530151, + 2.659696, + 2.791829, + 2.926358, + 3.063062, + 3.201692, + 3.341975, + 3.483613, + 3.626291, + 3.769680, + 3.913444, + 4.057243, + 4.200740, + 4.343611, + 4.485541, + 4.626236, + 4.765425, + 4.902858, + 5.038315, + 5.171603, + 5.302554, + 5.431029, + 5.556915, + 5.680122, + 5.800585, + 5.918257, + 6.033111, + 6.145136, + 6.254334, + 6.360721, + 6.464322, + 6.565172, + 6.663312, + 6.758789, + 6.851657, + 6.941970, + 7.029787, + 7.115169, + 7.198178, + 7.278876, + 7.357327, + 7.433594, + 7.507739, + 7.579824, + 7.649911, + 7.718060, + 7.784330, + 7.848778, + 7.911462, + 7.972436, + 8.031754, + 8.089468, + 8.145629, + 8.200285, + 8.253485, + 8.305275, + 8.355699, + 8.404800, + 8.452621, + 8.499202, + 8.544583, + 8.588800, + 8.631891, + 8.673890, + 8.714833, + 8.754751, + 8.793677, + 8.831640, + 8.868672, + 8.904800, + 8.940053, + 8.974455, + 9.008034, + 9.040815, + 9.072820, + 9.104074, + 9.134598, + 9.164414, + 9.193543, + 9.222006, + 9.249820, + 9.277006, + 9.303581, + 9.329563, + 9.354969, + 9.379815, + 9.404116, + 9.427889, + 9.451148, + 9.473907, + 9.496179, + 9.517979, + 9.539319, + 9.560212, + 9.580669, + 9.600703, + 9.620325, + 9.639545, + 9.658375, + 9.676824, + 9.694902, + 9.712620, + 9.729986, + 9.747009, + 9.763699, + 9.780063, + 9.796111, + 9.811849, + 9.827286, + 9.842429, + 9.857285, + 9.871862, + 9.886166, + 9.900204, + 9.913982, + 9.927507, + 9.940784, + 9.953820, + 9.966621, + 9.979191, + 9.991536, + 10.003662, + 10.015574, + 10.027276, + 10.038773, + 10.050070, + 10.061172, + 10.072083, + 10.082807, + 10.093348, + 10.103711, + 10.113899, + 10.123917, + 10.133768, + 10.143455, + 10.152983, + 10.162354, + 10.171573, + 10.180641, + 10.189564, + 10.198342, + 10.206981, + 10.215482, + 10.223848, + 10.232082, + 10.240188, + 10.248167, + 10.256022, + 10.263756, + 10.271371, + 10.278870, + 10.286255, + 10.293527, + 10.300691, + 10.307746, + 10.314697, + 10.321544, + 10.328290, + 10.334937, + 10.341486, + 10.347940, + 10.354300, + 10.360568, + 10.366747, + 10.372836, + 10.378840, + 10.384758, + 10.390592, + 10.396345, + 10.402017, + 10.407610, + 10.413125, + 10.418565, + 10.423929, + 10.429221, + 10.434440, + 10.439588, + 10.444667, + 10.449678, + 10.454622, + 10.459499, + 10.464313, + 10.469062, + 10.473749, + 10.478375, + 10.482940, + 10.487446, + 10.491894, + 10.496284, + 10.500618, + 10.504897, + 10.509121, + 10.513292, + 10.517410, + 10.521477, + 10.525492, + 10.529458, + 10.533374, + 10.537242, + 10.541062, + 10.544836, + 10.548563, + 10.552245, + 10.555882, + 10.559476, + 10.563026, + 10.566534, + 10.569999, + 10.573424, + 10.576808, + 10.580152, + 10.583457, + 10.586724, + 10.589952, + 10.593142, + 10.596296, + 10.599414, + 10.602495, + 10.605541, + 10.608553, + 10.611531, + 10.614474, + 10.617385, + 10.620263, + 10.623108, + 10.625922, + 10.628705, + 10.631457, + 10.634178, + 10.636870, + 10.639532, + 10.642165, + 10.644770, + 10.647346, + 10.649895, + 10.652416, + 10.654910, + 10.657377, + 10.659818, + 10.662233, + 10.664623, + 10.666988, + 10.669327, + 10.671643, + 10.673934, + 10.676201, + 10.678445, + 10.680666, + 10.682863, + 10.685039, + 10.687192, + 10.689323, + 10.691432, + 10.693521, + 10.695588, + 10.697634, + 10.699660, + 10.701666, + 10.703651, + 10.705617, + 10.707564, + 10.709491, + 10.711400, + 10.713290, + 10.715161, + 10.717014, + 10.718849, + 10.720667, + 10.722467, + 10.724249, + 10.726015, + 10.727764, + 10.729496, + 10.731211, + 10.732911, + 10.734594, + 10.736262, + 10.737914, + 10.739550, + 10.741172, + 10.742778, + 10.744370, + 10.745946, + 10.747508, + 10.749056, + 10.750590, + 10.752110, + 10.753616, + 10.755108, + 10.756587, + 10.758053, + 10.759505, + 10.760944, + 10.762371, + 10.763785, + 10.765186, + 10.766575, + 10.767952, + 10.769316, + 10.770669, + 10.772009, + 10.773338, + 10.774656, + 10.775962, + 10.777257, + 10.778540, + 10.779813, + 10.781075, + 10.782325, + 10.783566, + 10.784795, + 10.786014, + 10.787223, + 10.788422, + 10.789611, + 10.790790, + 10.791958, + 10.793117, + 10.794267, + 10.795407, + 10.796537, + 10.797659, + 10.798770, + 10.799873, + 10.800967, + 10.802052, + 10.803128, + 10.804195, + 10.805254, + 10.806304, + 10.807346, + 10.808379, + 10.809404, + 10.810421, + 10.811430, + 10.812431, + 10.813424, + 10.814409, + 10.815386, + 10.816355, + 10.817317, + 10.818272, + 10.819219, + 10.820158, + 10.821091, + 10.822016, + 10.822934, + 10.823845, + 10.824749, + 10.825646, + 10.826536, + 10.827419, + 10.828296, + 10.829166, + 10.830029, + 10.830886, + 10.831736, + 10.832580, + 10.833418, + 10.834249, + 10.835075, + 10.835894, + 10.836707, + 10.837514, + 10.838315, + 10.839110, + 10.839899, + 10.840683, + 10.841461, + 10.842233, + 10.842999, + 10.843760, + 10.844516, + 10.845266, + 10.846010, + 10.846750, + 10.847484, + 10.848212, + 10.848936, + 10.849654, + 10.850367, + 10.851075, + 10.851779, + 10.852477, + 10.853170, + 10.853859, + 10.854542, + 10.855221, + 10.855895, + 10.856564, + 10.857229, + 10.857889, + 10.858545, + 10.859196, + 10.859843, + 10.860485, + 10.861123, + 10.861756, + 10.862385, + 10.863010, + 10.863630, + 10.864247, + 10.864859, + 10.865467, + 10.866071, + 10.866671, + 10.867267, + 10.867859, + 10.868447, + 10.869031, + 10.869611, + 10.870188, + 10.870760, + 10.871329, + 10.871894, + 10.872455, + 10.873013, + 10.873567, + 10.874117, + 10.874664, + 10.875208, + 10.875747, + 10.876284, + 10.876816, + 10.877346, + 10.877872, + 10.878394, + 10.878914, + 10.879430, + 10.879942, + 10.880452, + 10.880958, + 10.881461, + 10.881961, + 10.882457, + 10.882951, + 10.883441, + 10.883928, + 10.884413, + 10.884894, + 10.885372, + 10.885848, + 10.886320, + 10.886789, + 10.887256, + 10.887720, + 10.888181, + 10.888639, + 10.889094, + 10.889546, + 10.889996, + 10.890443, + 10.890887, + 10.891328, + 10.891767, + 10.892203, + 10.892637, + 10.893068, + 10.893496, + 10.893922, + 10.894345, + 10.894766, + 10.895184, + 10.895600, + 10.896013, + 10.896424, + 10.896833, + 10.897239, + 10.897642, + 10.898043, + 10.898442, + 10.898839, + 10.899233, + 10.899625, + 10.900015, + 10.900402, + 10.900787, + 10.901170, + 10.901551, + 10.901929, + 10.902306, + 10.902680, + 10.903052, + 10.903422, + 10.903790, + 10.904155, + 10.904519, + 10.904880, + 10.905240, + 10.905597, + 10.905953, + 10.906306, + 10.906658, + 10.907007, + 10.907355, + 10.907700, + 10.908044, + 10.908386, + 10.908726, + 10.909064, + 10.909400, + 10.909734, + 10.910067, + 10.910397, + 10.910726, + 10.911053, + 10.911378, + 10.911701, + 10.912023, + 10.912343, + 10.912661, + 10.912977, + 10.913292, + 10.913605, + 10.913916, + 10.914226, + 10.914534, + 10.914840, + 10.915145, + 10.915448, + 10.915749, + 10.916049, + 10.916347, + 10.916644, + 10.916939, + 10.917232, + 10.917524, + 10.917815, + 10.918103, + 10.918391, + 10.918677, + 10.918961, + 10.919244, + 10.919525, + 10.919805, + 10.920084, + 10.920361, + 10.920636, + 10.920910, + 10.921183, + 10.921454, + 10.921724, + 10.921993, + 10.922260, + 10.922526, + 10.922790, + 10.923053, + 10.923315, + 10.923575, + 10.923834, + 10.924092, + 10.924349, + 10.924604, + 10.924858, + 10.925110, + 10.925361, + 10.925612, + 10.925860, + 10.926108, + 10.926354, + 10.926599, + 10.926843, + 10.927086, + 10.927327, + 10.927568, + 10.927807, + 10.928045, + 10.928281, + 10.928517, + 10.928751, + 10.928984, + 10.929217, + 10.929448, + 10.929677, + 10.929906, + 10.930134, + 10.930360, + 10.930586, + 10.930810, + 10.931033, + 10.931255, + 10.931476, + 10.931696, + 10.931915, + 10.932133, + 10.932350, + 10.932566, + 10.932781, + 10.932995, + 10.933207, + 10.933419, + 10.933630, + 10.933839, + 10.934048, + 10.934256, + 10.934463, + 10.934669, + 10.934873, + 10.935077, + 10.935280, + 10.935482, + 10.935683, + 10.935883, + 10.936083, + 10.936281, + 10.936478, + 10.936674, + 10.936870, + 10.937065, + 10.937258, + 10.937451, + 10.937643, + 10.937834, + 10.938024, + 10.938213, + 10.938402, + 10.938589, + 10.938776, + 10.938962, + 10.939147, + 10.939331, + 10.939515, + 10.939697, + 10.939879, + 10.940060, + 10.940240, + 10.940419, + 10.940597, + 10.940775, + 10.940952, + 10.941128, + 10.941303, + 10.941478, + 10.941651, + 10.941824, + 10.941996, + 10.942168, + 10.942338, + 10.942508, + 10.942678, + 10.942846, + 10.943014, + 10.943181, + 10.943347, + 10.943512, + 10.943677, + 10.943841, + 10.944004, + 10.944167, + 10.944329, + 10.944490, + 10.944650, + 10.944810, + 10.944969, + 10.945128, + 10.945285, + 10.945443, + 10.945599, + 10.945755, + 10.945910, + 10.946064, + 10.946218, + 10.946371, + 10.946523, + 10.946675, + 10.946826, + 10.946977, + 10.947126, + 10.947276, + 10.947424, + 10.947572, + 10.947719, + 10.947866, + 10.948012, + 10.948158, + 10.948303, + 10.948447, + 10.948591, + 10.948734, + 10.948876, + 10.949018, + 10.949159, + 10.949300, + 10.949440, + 10.949580, + 10.949719, + 10.949857, + 10.949995, + 10.950132, + 10.950269, + 10.950405, + 10.950540, + 10.950675, + 10.950810, + 10.950944, + 10.951077, + 10.951210, + 10.951342, + 10.951474, + 10.951605, + 10.951736, + 10.951866, + 10.951996, + 10.952125, + 10.952253, + 10.952381, + 10.952509, + 10.952636, + 10.952762, + 10.952888, + 10.953014, + 10.953139, + 10.953264, + 10.953388, + 10.953511, + 10.953634, + 10.953757, + 10.953879, + 10.954000, + 10.954121, + 10.954242, + 10.954362, + 10.954482, + 10.954601, + 10.954720, + 10.954838, + 10.954956, + 10.955073, + 10.955190, + 10.955307, + 10.955423, + 10.955538, + 10.955653, + 10.955768, + 10.955882, + 10.955996, + 10.956109, + 10.956222, + 10.956335, + 10.956447, + 10.956558, + 10.956669, + 10.956780, + 10.956890, + 10.957000, + 10.957110, + 10.957219, + 10.957327, + 10.957436, + 10.957543, + 10.957651, + 10.957758, + 10.957864, + 10.957971, + 10.958076, + 10.958182, + 10.958287, + 10.958391, + 10.958496, + 10.958599, + 10.958703, + 10.958806, + 10.958909, + 10.959011, + 10.959113, + 10.959214, + 10.959315, + 10.959416, + 10.959516, + 10.959616, + 10.959716, + 10.959815, + 10.959914, + 10.960013, + 10.960111, + 10.960209, + 10.960306, + 10.960403, + 10.960500, + 10.960597, + 10.960693, + 10.960788, + 10.960884, + 10.960979, + 10.961073, + 10.961168, + 10.961262, + 10.961355, + 10.961448, + 10.961541, + 10.961634, + 10.961726, + 10.961818, + 10.961910, + 10.962001, + 10.962092, + 10.962183, + 10.962273, + 10.962363, + 10.962453, + 10.962542, + 10.962631, + 10.962720, + 10.962808, + 10.962896, + 10.962984, + 10.963071, + 10.963159, + 10.963245, + 10.963332, + 10.963418, + 10.963504, + 10.963590, + 10.963675, + 10.963760, + 10.963845, + 10.963929, + 10.964013, + 10.964097, + 10.964181, + 10.964264, + 10.964347, + 10.964430, + 10.964512, + 10.964594, + 10.964676, + 10.964757, + 10.964839, + 10.964920, + 10.965000, + 10.965081, + 10.965161, + 10.965241, + 10.965320, + 10.965400, + 10.965479, + 10.965557, + 10.965636, + 10.965714, + 10.965792, + 10.965870, + 10.965947, + 10.966024, + 10.966101, + 10.966178, + 10.966254, + 10.966331, + 10.966406, + 10.966482, + 10.966557, + 10.966632, + 10.966707, + 10.966782, + 10.966856, + 10.966930, + 10.967004, + 10.967078, + 10.967151, + 10.967224, + 10.967297, + 10.967370, + 10.967442, + 10.967514, + 10.967586, + 10.967658, + 10.967729, + 10.967801, + 10.967872, + 10.967942, + 10.968013, + 10.968083, + 10.968153, + 10.968223, + 10.968293, + 10.968362, + 10.968431, + 10.968500, + 10.968569, + 10.968637, + 10.968705, + 10.968773, + 10.968841, + 10.968909, + 10.968976, + 10.969043, + 10.969110, + 10.969177, + 10.969243, + 10.969309, + 10.969375, + 10.969441, + 10.969507, + 10.969572, + 10.969637, + 10.969702, + 10.969767, + 10.969832, + 10.969896, + 10.969960, + 10.970024, + 10.970088, + 10.970152, + 10.970215, + 10.970278, + 10.970341, + 10.970404, + 10.970466, + 10.970529, + 10.970591, + 10.970653, + 10.970714, + 10.970776, + 10.970837, + 10.970899, + 10.970960, + 10.971020, + 10.971081, + 10.971141, + 10.971202, + 10.971262, + 10.971321, + 10.971381, + 10.971441, + 10.971500, + 10.971559, + 10.971618, + 10.971677, + 10.971735, + 10.971794, + 10.971852, + 10.971910, + 10.971968, + 10.972025, + 10.972083, + 10.972140, + 10.972197, + 10.972254, + 10.972311, + 10.972367, + 10.972424, + 10.972480, + 10.972536, + 10.972592, + 10.972648, + 10.972703, + 10.972759, + 10.972814, + 10.972869, + 10.972924, + 10.972979, + 10.973033, + 10.973088, + 10.973142, + 10.973196, + 10.973250, + 10.973304, + 10.973357, + 10.973411, + 10.973464, + 10.973517, + 10.973570, + 10.973623, + }, + {// The expectations for dimension = 23 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881666, + 0.960000, + 1.041666, + 1.126665, + 1.214995, + 1.306657, + 1.401648, + 1.499965, + 1.601602, + 1.706551, + 1.814799, + 1.926327, + 2.041109, + 2.159106, + 2.280269, + 2.404529, + 2.531801, + 2.661975, + 2.794918, + 2.930469, + 3.068441, + 3.208615, + 3.350748, + 3.494568, + 3.639781, + 3.786076, + 3.933126, + 4.080593, + 4.228141, + 4.375431, + 4.522135, + 4.667939, + 4.812545, + 4.955676, + 5.097079, + 5.236530, + 5.373828, + 5.508802, + 5.641307, + 5.771223, + 5.898457, + 6.022937, + 6.144611, + 6.263448, + 6.379431, + 6.492561, + 6.602847, + 6.710313, + 6.814989, + 6.916916, + 7.016136, + 7.112702, + 7.206666, + 7.298085, + 7.387020, + 7.473530, + 7.557678, + 7.639526, + 7.719137, + 7.796573, + 7.871895, + 7.945166, + 8.016445, + 8.085791, + 8.153263, + 8.218917, + 8.282809, + 8.344993, + 8.405521, + 8.464445, + 8.521815, + 8.577678, + 8.632082, + 8.685071, + 8.736691, + 8.786984, + 8.835990, + 8.883750, + 8.930303, + 8.975685, + 9.019933, + 9.063081, + 9.105165, + 9.146214, + 9.186263, + 9.225340, + 9.263475, + 9.300697, + 9.337032, + 9.372508, + 9.407150, + 9.440982, + 9.474028, + 9.506312, + 9.537855, + 9.568680, + 9.598807, + 9.628255, + 9.657045, + 9.685195, + 9.712723, + 9.739647, + 9.765984, + 9.791750, + 9.816960, + 9.841631, + 9.865777, + 9.889412, + 9.912551, + 9.935206, + 9.957390, + 9.979117, + 10.000398, + 10.021245, + 10.041670, + 10.061683, + 10.081296, + 10.100518, + 10.119360, + 10.137831, + 10.155941, + 10.173699, + 10.191114, + 10.208195, + 10.224949, + 10.241385, + 10.257510, + 10.273333, + 10.288861, + 10.304100, + 10.319059, + 10.333742, + 10.348158, + 10.362313, + 10.376212, + 10.389861, + 10.403267, + 10.416435, + 10.429371, + 10.442080, + 10.454567, + 10.466837, + 10.478895, + 10.490746, + 10.502395, + 10.513845, + 10.525103, + 10.536171, + 10.547053, + 10.557755, + 10.568280, + 10.578631, + 10.588813, + 10.598829, + 10.608682, + 10.618377, + 10.627916, + 10.637303, + 10.646540, + 10.655632, + 10.664581, + 10.673389, + 10.682061, + 10.690598, + 10.699003, + 10.707280, + 10.715430, + 10.723456, + 10.731361, + 10.739147, + 10.746816, + 10.754371, + 10.761814, + 10.769147, + 10.776372, + 10.783492, + 10.790508, + 10.797422, + 10.804236, + 10.810953, + 10.817574, + 10.824100, + 10.830534, + 10.836878, + 10.843132, + 10.849299, + 10.855380, + 10.861377, + 10.867292, + 10.873125, + 10.878878, + 10.884553, + 10.890152, + 10.895675, + 10.901123, + 10.906499, + 10.911803, + 10.917037, + 10.922202, + 10.927299, + 10.932330, + 10.937294, + 10.942195, + 10.947032, + 10.951807, + 10.956520, + 10.961174, + 10.965768, + 10.970304, + 10.974783, + 10.979206, + 10.983574, + 10.987887, + 10.992146, + 10.996353, + 11.000508, + 11.004613, + 11.008667, + 11.012672, + 11.016628, + 11.020537, + 11.024399, + 11.028214, + 11.031984, + 11.035710, + 11.039391, + 11.043029, + 11.046624, + 11.050177, + 11.053689, + 11.057160, + 11.060591, + 11.063982, + 11.067334, + 11.070648, + 11.073925, + 11.077164, + 11.080366, + 11.083533, + 11.086664, + 11.089760, + 11.092821, + 11.095848, + 11.098842, + 11.101803, + 11.104732, + 11.107628, + 11.110493, + 11.113327, + 11.116130, + 11.118902, + 11.121645, + 11.124359, + 11.127044, + 11.129700, + 11.132328, + 11.134928, + 11.137500, + 11.140046, + 11.142565, + 11.145058, + 11.147525, + 11.149967, + 11.152383, + 11.154775, + 11.157142, + 11.159484, + 11.161803, + 11.164099, + 11.166371, + 11.168620, + 11.170847, + 11.173052, + 11.175234, + 11.177395, + 11.179534, + 11.181653, + 11.183750, + 11.185827, + 11.187883, + 11.189920, + 11.191936, + 11.193933, + 11.195911, + 11.197870, + 11.199810, + 11.201731, + 11.203634, + 11.205519, + 11.207386, + 11.209236, + 11.211068, + 11.212883, + 11.214680, + 11.216461, + 11.218226, + 11.219974, + 11.221706, + 11.223422, + 11.225122, + 11.226807, + 11.228476, + 11.230130, + 11.231769, + 11.233393, + 11.235003, + 11.236597, + 11.238178, + 11.239745, + 11.241297, + 11.242836, + 11.244361, + 11.245873, + 11.247371, + 11.248856, + 11.250328, + 11.251787, + 11.253234, + 11.254668, + 11.256089, + 11.257498, + 11.258895, + 11.260281, + 11.261654, + 11.263015, + 11.264365, + 11.265703, + 11.267030, + 11.268346, + 11.269651, + 11.270945, + 11.272228, + 11.273500, + 11.274761, + 11.276013, + 11.277253, + 11.278484, + 11.279704, + 11.280914, + 11.282115, + 11.283305, + 11.284486, + 11.285657, + 11.286819, + 11.287972, + 11.289115, + 11.290249, + 11.291373, + 11.292489, + 11.293596, + 11.294694, + 11.295783, + 11.296864, + 11.297936, + 11.299000, + 11.300055, + 11.301102, + 11.302141, + 11.303172, + 11.304195, + 11.305210, + 11.306217, + 11.307216, + 11.308207, + 11.309191, + 11.310168, + 11.311137, + 11.312098, + 11.313052, + 11.313999, + 11.314939, + 11.315872, + 11.316798, + 11.317716, + 11.318628, + 11.319533, + 11.320432, + 11.321323, + 11.322208, + 11.323087, + 11.323959, + 11.324824, + 11.325684, + 11.326537, + 11.327383, + 11.328224, + 11.329058, + 11.329887, + 11.330709, + 11.331525, + 11.332336, + 11.333141, + 11.333940, + 11.334733, + 11.335520, + 11.336302, + 11.337079, + 11.337850, + 11.338615, + 11.339375, + 11.340130, + 11.340879, + 11.341624, + 11.342363, + 11.343096, + 11.343825, + 11.344549, + 11.345267, + 11.345981, + 11.346690, + 11.347394, + 11.348093, + 11.348787, + 11.349477, + 11.350162, + 11.350842, + 11.351517, + 11.352188, + 11.352855, + 11.353517, + 11.354174, + 11.354827, + 11.355476, + 11.356121, + 11.356761, + 11.357397, + 11.358028, + 11.358656, + 11.359279, + 11.359898, + 11.360513, + 11.361124, + 11.361732, + 11.362335, + 11.362934, + 11.363529, + 11.364121, + 11.364708, + 11.365292, + 11.365872, + 11.366449, + 11.367021, + 11.367590, + 11.368155, + 11.368717, + 11.369275, + 11.369830, + 11.370381, + 11.370928, + 11.371473, + 11.372013, + 11.372551, + 11.373084, + 11.373615, + 11.374142, + 11.374666, + 11.375187, + 11.375704, + 11.376219, + 11.376730, + 11.377238, + 11.377743, + 11.378244, + 11.378743, + 11.379238, + 11.379731, + 11.380221, + 11.380707, + 11.381191, + 11.381671, + 11.382149, + 11.382624, + 11.383096, + 11.383565, + 11.384032, + 11.384495, + 11.384956, + 11.385414, + 11.385869, + 11.386322, + 11.386772, + 11.387219, + 11.387664, + 11.388106, + 11.388545, + 11.388982, + 11.389416, + 11.389848, + 11.390277, + 11.390704, + 11.391128, + 11.391550, + 11.391969, + 11.392386, + 11.392801, + 11.393213, + 11.393623, + 11.394030, + 11.394435, + 11.394838, + 11.395238, + 11.395636, + 11.396032, + 11.396426, + 11.396817, + 11.397206, + 11.397594, + 11.397978, + 11.398361, + 11.398742, + 11.399120, + 11.399496, + 11.399870, + 11.400242, + 11.400613, + 11.400980, + 11.401346, + 11.401710, + 11.402072, + 11.402432, + 11.402790, + 11.403146, + 11.403500, + 11.403852, + 11.404202, + 11.404551, + 11.404897, + 11.405241, + 11.405584, + 11.405925, + 11.406264, + 11.406601, + 11.406936, + 11.407270, + 11.407601, + 11.407931, + 11.408259, + 11.408586, + 11.408910, + 11.409233, + 11.409555, + 11.409874, + 11.410192, + 11.410508, + 11.410823, + 11.411136, + 11.411447, + 11.411756, + 11.412064, + 11.412371, + 11.412675, + 11.412979, + 11.413280, + 11.413580, + 11.413879, + 11.414176, + 11.414471, + 11.414765, + 11.415057, + 11.415348, + 11.415638, + 11.415925, + 11.416212, + 11.416497, + 11.416780, + 11.417062, + 11.417343, + 11.417622, + 11.417900, + 11.418177, + 11.418452, + 11.418725, + 11.418997, + 11.419268, + 11.419538, + 11.419806, + 11.420073, + 11.420339, + 11.420603, + 11.420866, + 11.421127, + 11.421388, + 11.421647, + 11.421904, + 11.422161, + 11.422416, + 11.422670, + 11.422923, + 11.423174, + 11.423424, + 11.423673, + 11.423921, + 11.424168, + 11.424413, + 11.424658, + 11.424901, + 11.425143, + 11.425383, + 11.425623, + 11.425861, + 11.426098, + 11.426335, + 11.426570, + 11.426803, + 11.427036, + 11.427268, + 11.427498, + 11.427728, + 11.427956, + 11.428184, + 11.428410, + 11.428635, + 11.428859, + 11.429082, + 11.429304, + 11.429525, + 11.429745, + 11.429964, + 11.430182, + 11.430399, + 11.430614, + 11.430829, + 11.431043, + 11.431256, + 11.431468, + 11.431679, + 11.431889, + 11.432098, + 11.432306, + 11.432513, + 11.432719, + 11.432924, + 11.433128, + 11.433331, + 11.433534, + 11.433735, + 11.433936, + 11.434135, + 11.434334, + 11.434532, + 11.434729, + 11.434925, + 11.435120, + 11.435314, + 11.435508, + 11.435700, + 11.435892, + 11.436083, + 11.436273, + 11.436462, + 11.436650, + 11.436838, + 11.437025, + 11.437210, + 11.437395, + 11.437579, + 11.437763, + 11.437945, + 11.438127, + 11.438308, + 11.438488, + 11.438668, + 11.438846, + 11.439024, + 11.439201, + 11.439377, + 11.439553, + 11.439728, + 11.439902, + 11.440075, + 11.440247, + 11.440419, + 11.440590, + 11.440760, + 11.440930, + 11.441099, + 11.441267, + 11.441434, + 11.441601, + 11.441767, + 11.441932, + 11.442097, + 11.442261, + 11.442424, + 11.442586, + 11.442748, + 11.442909, + 11.443069, + 11.443229, + 11.443388, + 11.443547, + 11.443704, + 11.443862, + 11.444018, + 11.444174, + 11.444329, + 11.444483, + 11.444637, + 11.444790, + 11.444943, + 11.445095, + 11.445246, + 11.445397, + 11.445547, + 11.445696, + 11.445845, + 11.445993, + 11.446141, + 11.446288, + 11.446434, + 11.446580, + 11.446725, + 11.446870, + 11.447014, + 11.447158, + 11.447300, + 11.447443, + 11.447584, + 11.447726, + 11.447866, + 11.448006, + 11.448146, + 11.448285, + 11.448423, + 11.448561, + 11.448698, + 11.448835, + 11.448971, + 11.449106, + 11.449241, + 11.449376, + 11.449510, + 11.449643, + 11.449776, + 11.449909, + 11.450040, + 11.450172, + 11.450303, + 11.450433, + 11.450563, + 11.450692, + 11.450821, + 11.450949, + 11.451077, + 11.451204, + 11.451331, + 11.451457, + 11.451583, + 11.451708, + 11.451833, + 11.451958, + 11.452082, + 11.452205, + 11.452328, + 11.452450, + 11.452572, + 11.452694, + 11.452815, + 11.452935, + 11.453056, + 11.453175, + 11.453294, + 11.453413, + 11.453531, + 11.453649, + 11.453767, + 11.453884, + 11.454000, + 11.454116, + 11.454232, + 11.454347, + 11.454462, + 11.454576, + 11.454690, + 11.454803, + 11.454916, + 11.455029, + 11.455141, + 11.455253, + 11.455364, + 11.455475, + 11.455586, + 11.455696, + 11.455806, + 11.455915, + 11.456024, + 11.456132, + 11.456241, + 11.456348, + 11.456456, + 11.456562, + 11.456669, + 11.456775, + 11.456881, + 11.456986, + 11.457091, + 11.457196, + 11.457300, + 11.457404, + 11.457507, + 11.457610, + 11.457713, + 11.457815, + 11.457917, + 11.458019, + 11.458120, + 11.458221, + 11.458321, + 11.458421, + 11.458521, + 11.458621, + 11.458720, + 11.458818, + 11.458917, + 11.459015, + 11.459112, + 11.459210, + 11.459307, + 11.459403, + 11.459499, + 11.459595, + 11.459691, + 11.459786, + 11.459881, + 11.459976, + 11.460070, + 11.460164, + 11.460257, + 11.460350, + 11.460443, + 11.460536, + 11.460628, + 11.460720, + 11.460812, + 11.460903, + 11.460994, + 11.461085, + 11.461175, + 11.461265, + 11.461355, + 11.461444, + 11.461533, + 11.461622, + 11.461710, + 11.461799, + 11.461886, + 11.461974, + 11.462061, + 11.462148, + 11.462235, + 11.462321, + 11.462407, + 11.462493, + 11.462579, + 11.462664, + 11.462749, + 11.462833, + 11.462918, + 11.463002, + 11.463085, + 11.463169, + 11.463252, + 11.463335, + 11.463418, + 11.463500, + 11.463582, + 11.463664, + 11.463745, + 11.463827, + 11.463908, + 11.463988, + 11.464069, + 11.464149, + 11.464229, + 11.464308, + 11.464388, + 11.464467, + 11.464546, + 11.464624, + 11.464702, + 11.464781, + 11.464858, + 11.464936, + 11.465013, + 11.465090, + 11.465167, + 11.465243, + 11.465320, + 11.465396, + 11.465471, + 11.465547, + 11.465622, + 11.465697, + 11.465772, + 11.465847, + 11.465921, + 11.465995, + 11.466069, + 11.466142, + 11.466216, + 11.466289, + 11.466362, + 11.466434, + 11.466507, + 11.466579, + 11.466651, + 11.466722, + 11.466794, + 11.466865, + 11.466936, + 11.467007, + 11.467077, + 11.467148, + 11.467218, + 11.467288, + 11.467357, + 11.467427, + 11.467496, + 11.467565, + 11.467634, + 11.467702, + 11.467770, + 11.467838, + 11.467906, + 11.467974, + 11.468042, + 11.468109, + 11.468176, + 11.468243, + 11.468309, + 11.468376, + 11.468442, + 11.468508, + 11.468574, + 11.468639, + 11.468705, + 11.468770, + 11.468835, + 11.468899, + 11.468964, + 11.469028, + 11.469093, + 11.469157, + 11.469220, + 11.469284, + 11.469347, + 11.469410, + 11.469473, + 11.469536, + 11.469599, + 11.469661, + 11.469723, + 11.469785, + 11.469847, + 11.469909, + 11.469970, + 11.470032, + 11.470093, + 11.470153, + 11.470214, + 11.470275, + 11.470335, + 11.470395, + 11.470455, + 11.470515, + 11.470575, + 11.470634, + 11.470693, + 11.470752, + 11.470811, + 11.470870, + 11.470928, + 11.470987, + 11.471045, + 11.471103, + 11.471161, + 11.471218, + 11.471276, + }, + {// The expectations for dimension = 24 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041666, + 1.126666, + 1.214998, + 1.306662, + 1.401657, + 1.499982, + 1.601632, + 1.706603, + 1.814886, + 1.926469, + 2.041334, + 2.159454, + 2.280793, + 2.405301, + 2.532913, + 2.663544, + 2.797087, + 2.933411, + 3.072360, + 3.213747, + 3.357358, + 3.502953, + 3.650263, + 3.798997, + 3.948846, + 4.099483, + 4.250575, + 4.401782, + 4.552768, + 4.703203, + 4.852770, + 5.001169, + 5.148120, + 5.293367, + 5.436681, + 5.577857, + 5.716719, + 5.853117, + 5.986927, + 6.118051, + 6.246413, + 6.371955, + 6.494643, + 6.614457, + 6.731391, + 6.845455, + 6.956666, + 7.065053, + 7.170653, + 7.273508, + 7.373667, + 7.471182, + 7.566107, + 7.658501, + 7.748425, + 7.835937, + 7.921102, + 8.003979, + 8.084632, + 8.163121, + 8.239509, + 8.313854, + 8.386216, + 8.456654, + 8.525225, + 8.591983, + 8.656984, + 8.720280, + 8.781924, + 8.841966, + 8.900453, + 8.957435, + 9.012957, + 9.067063, + 9.119796, + 9.171200, + 9.221314, + 9.270177, + 9.317828, + 9.364304, + 9.409639, + 9.453869, + 9.497026, + 9.539144, + 9.580252, + 9.620381, + 9.659560, + 9.697818, + 9.735181, + 9.771675, + 9.807326, + 9.842159, + 9.876197, + 9.909462, + 9.941978, + 9.973765, + 10.004845, + 10.035237, + 10.064960, + 10.094034, + 10.122476, + 10.150303, + 10.177534, + 10.204184, + 10.230268, + 10.255803, + 10.280804, + 10.305283, + 10.329257, + 10.352737, + 10.375737, + 10.398270, + 10.420347, + 10.441981, + 10.463183, + 10.483965, + 10.504337, + 10.524309, + 10.543891, + 10.563094, + 10.581927, + 10.600399, + 10.618519, + 10.636296, + 10.653739, + 10.670854, + 10.687651, + 10.704137, + 10.720320, + 10.736206, + 10.751803, + 10.767118, + 10.782157, + 10.796927, + 10.811434, + 10.825684, + 10.839683, + 10.853436, + 10.866951, + 10.880231, + 10.893282, + 10.906110, + 10.918718, + 10.931113, + 10.943299, + 10.955281, + 10.967062, + 10.978648, + 10.990042, + 11.001249, + 11.012273, + 11.023117, + 11.033786, + 11.044283, + 11.054612, + 11.064777, + 11.074780, + 11.084625, + 11.094316, + 11.103855, + 11.113246, + 11.122491, + 11.131595, + 11.140559, + 11.149386, + 11.158079, + 11.166641, + 11.175074, + 11.183381, + 11.191565, + 11.199627, + 11.207570, + 11.215397, + 11.223109, + 11.230710, + 11.238200, + 11.245582, + 11.252859, + 11.260032, + 11.267102, + 11.274073, + 11.280946, + 11.287722, + 11.294404, + 11.300992, + 11.307490, + 11.313898, + 11.320219, + 11.326453, + 11.332602, + 11.338669, + 11.344653, + 11.350558, + 11.356383, + 11.362131, + 11.367803, + 11.373400, + 11.378923, + 11.384375, + 11.389755, + 11.395066, + 11.400308, + 11.405483, + 11.410591, + 11.415635, + 11.420614, + 11.425530, + 11.430385, + 11.435178, + 11.439912, + 11.444587, + 11.449204, + 11.453763, + 11.458267, + 11.462716, + 11.467110, + 11.471451, + 11.475740, + 11.479977, + 11.484163, + 11.488299, + 11.492385, + 11.496424, + 11.500414, + 11.504358, + 11.508255, + 11.512106, + 11.515913, + 11.519676, + 11.523395, + 11.527072, + 11.530706, + 11.534299, + 11.537850, + 11.541362, + 11.544834, + 11.548267, + 11.551661, + 11.555017, + 11.558336, + 11.561619, + 11.564865, + 11.568075, + 11.571250, + 11.574390, + 11.577496, + 11.580568, + 11.583607, + 11.586614, + 11.589588, + 11.592530, + 11.595440, + 11.598320, + 11.601170, + 11.603989, + 11.606778, + 11.609539, + 11.612270, + 11.614973, + 11.617648, + 11.620296, + 11.622916, + 11.625509, + 11.628075, + 11.630616, + 11.633130, + 11.635619, + 11.638083, + 11.640522, + 11.642937, + 11.645327, + 11.647694, + 11.650037, + 11.652357, + 11.654654, + 11.656928, + 11.659180, + 11.661411, + 11.663619, + 11.665806, + 11.667971, + 11.670116, + 11.672240, + 11.674344, + 11.676428, + 11.678491, + 11.680535, + 11.682560, + 11.684566, + 11.686553, + 11.688521, + 11.690470, + 11.692402, + 11.694316, + 11.696211, + 11.698090, + 11.699951, + 11.701794, + 11.703621, + 11.705432, + 11.707225, + 11.709003, + 11.710764, + 11.712510, + 11.714240, + 11.715954, + 11.717653, + 11.719337, + 11.721006, + 11.722660, + 11.724299, + 11.725924, + 11.727535, + 11.729131, + 11.730714, + 11.732283, + 11.733838, + 11.735380, + 11.736908, + 11.738423, + 11.739926, + 11.741415, + 11.742892, + 11.744356, + 11.745807, + 11.747247, + 11.748674, + 11.750089, + 11.751492, + 11.752884, + 11.754264, + 11.755632, + 11.756989, + 11.758335, + 11.759669, + 11.760993, + 11.762306, + 11.763608, + 11.764899, + 11.766180, + 11.767450, + 11.768711, + 11.769960, + 11.771200, + 11.772430, + 11.773650, + 11.774860, + 11.776061, + 11.777252, + 11.778434, + 11.779606, + 11.780769, + 11.781923, + 11.783067, + 11.784203, + 11.785330, + 11.786448, + 11.787558, + 11.788658, + 11.789751, + 11.790835, + 11.791910, + 11.792977, + 11.794037, + 11.795088, + 11.796131, + 11.797166, + 11.798193, + 11.799212, + 11.800224, + 11.801228, + 11.802225, + 11.803214, + 11.804196, + 11.805170, + 11.806137, + 11.807098, + 11.808051, + 11.808996, + 11.809935, + 11.810867, + 11.811793, + 11.812711, + 11.813623, + 11.814528, + 11.815427, + 11.816319, + 11.817204, + 11.818084, + 11.818957, + 11.819823, + 11.820684, + 11.821538, + 11.822387, + 11.823229, + 11.824065, + 11.824895, + 11.825720, + 11.826539, + 11.827352, + 11.828159, + 11.828961, + 11.829757, + 11.830547, + 11.831332, + 11.832112, + 11.832886, + 11.833655, + 11.834419, + 11.835177, + 11.835930, + 11.836678, + 11.837421, + 11.838159, + 11.838892, + 11.839620, + 11.840343, + 11.841061, + 11.841774, + 11.842483, + 11.843187, + 11.843886, + 11.844580, + 11.845270, + 11.845955, + 11.846636, + 11.847312, + 11.847984, + 11.848651, + 11.849314, + 11.849973, + 11.850627, + 11.851277, + 11.851923, + 11.852565, + 11.853202, + 11.853836, + 11.854465, + 11.855090, + 11.855711, + 11.856329, + 11.856942, + 11.857551, + 11.858157, + 11.858759, + 11.859356, + 11.859950, + 11.860541, + 11.861127, + 11.861710, + 11.862289, + 11.862865, + 11.863437, + 11.864006, + 11.864570, + 11.865132, + 11.865690, + 11.866244, + 11.866795, + 11.867343, + 11.867887, + 11.868428, + 11.868966, + 11.869500, + 11.870031, + 11.870559, + 11.871084, + 11.871605, + 11.872124, + 11.872639, + 11.873151, + 11.873660, + 11.874166, + 11.874669, + 11.875169, + 11.875666, + 11.876160, + 11.876651, + 11.877139, + 11.877624, + 11.878107, + 11.878586, + 11.879063, + 11.879537, + 11.880008, + 11.880477, + 11.880942, + 11.881405, + 11.881865, + 11.882323, + 11.882778, + 11.883230, + 11.883680, + 11.884127, + 11.884572, + 11.885014, + 11.885453, + 11.885890, + 11.886325, + 11.886757, + 11.887186, + 11.887613, + 11.888038, + 11.888460, + 11.888880, + 11.889297, + 11.889713, + 11.890126, + 11.890536, + 11.890944, + 11.891350, + 11.891754, + 11.892155, + 11.892555, + 11.892952, + 11.893347, + 11.893739, + 11.894130, + 11.894518, + 11.894904, + 11.895288, + 11.895670, + 11.896050, + 11.896428, + 11.896804, + 11.897178, + 11.897549, + 11.897919, + 11.898287, + 11.898653, + 11.899016, + 11.899378, + 11.899738, + 11.900096, + 11.900452, + 11.900806, + 11.901159, + 11.901509, + 11.901858, + 11.902204, + 11.902549, + 11.902892, + 11.903233, + 11.903573, + 11.903910, + 11.904246, + 11.904580, + 11.904913, + 11.905243, + 11.905572, + 11.905900, + 11.906225, + 11.906549, + 11.906871, + 11.907192, + 11.907511, + 11.907828, + 11.908143, + 11.908457, + 11.908770, + 11.909081, + 11.909390, + 11.909697, + 11.910003, + 11.910308, + 11.910611, + 11.910912, + 11.911212, + 11.911511, + 11.911808, + 11.912103, + 11.912397, + 11.912689, + 11.912980, + 11.913270, + 11.913558, + 11.913845, + 11.914130, + 11.914414, + 11.914696, + 11.914977, + 11.915257, + 11.915535, + 11.915812, + 11.916088, + 11.916362, + 11.916635, + 11.916906, + 11.917176, + 11.917445, + 11.917713, + 11.917979, + 11.918244, + 11.918508, + 11.918770, + 11.919032, + 11.919292, + 11.919550, + 11.919808, + 11.920064, + 11.920319, + 11.920573, + 11.920825, + 11.921077, + 11.921327, + 11.921576, + 11.921823, + 11.922070, + 11.922315, + 11.922560, + 11.922803, + 11.923045, + 11.923286, + 11.923526, + 11.923764, + 11.924002, + 11.924238, + 11.924473, + 11.924708, + 11.924941, + 11.925173, + 11.925404, + 11.925634, + 11.925862, + 11.926090, + 11.926317, + 11.926543, + 11.926767, + 11.926991, + 11.927214, + 11.927435, + 11.927656, + 11.927875, + 11.928094, + 11.928312, + 11.928528, + 11.928744, + 11.928958, + 11.929172, + 11.929385, + 11.929597, + 11.929807, + 11.930017, + 11.930226, + 11.930434, + 11.930641, + 11.930847, + 11.931053, + 11.931257, + 11.931460, + 11.931663, + 11.931865, + 11.932065, + 11.932265, + 11.932464, + 11.932662, + 11.932859, + 11.933056, + 11.933251, + 11.933446, + 11.933640, + 11.933833, + 11.934025, + 11.934216, + 11.934406, + 11.934596, + 11.934785, + 11.934973, + 11.935160, + 11.935346, + 11.935532, + 11.935717, + 11.935901, + 11.936084, + 11.936266, + 11.936448, + 11.936629, + 11.936809, + 11.936988, + 11.937167, + 11.937344, + 11.937521, + 11.937698, + 11.937873, + 11.938048, + 11.938222, + 11.938395, + 11.938568, + 11.938740, + 11.938911, + 11.939082, + 11.939251, + 11.939420, + 11.939589, + 11.939756, + 11.939923, + 11.940089, + 11.940255, + 11.940420, + 11.940584, + 11.940747, + 11.940910, + 11.941072, + 11.941234, + 11.941395, + 11.941555, + 11.941714, + 11.941873, + 11.942032, + 11.942189, + 11.942346, + 11.942502, + 11.942658, + 11.942813, + 11.942967, + 11.943121, + 11.943274, + 11.943427, + 11.943579, + 11.943730, + 11.943881, + 11.944031, + 11.944180, + 11.944329, + 11.944478, + 11.944625, + 11.944772, + 11.944919, + 11.945065, + 11.945210, + 11.945355, + 11.945499, + 11.945643, + 11.945786, + 11.945929, + 11.946071, + 11.946212, + 11.946353, + 11.946493, + 11.946633, + 11.946772, + 11.946911, + 11.947049, + 11.947187, + 11.947324, + 11.947460, + 11.947596, + 11.947732, + 11.947867, + 11.948001, + 11.948135, + 11.948268, + 11.948401, + 11.948533, + 11.948665, + 11.948797, + 11.948927, + 11.949058, + 11.949188, + 11.949317, + 11.949446, + 11.949574, + 11.949702, + 11.949829, + 11.949956, + 11.950083, + 11.950209, + 11.950334, + 11.950459, + 11.950584, + 11.950708, + 11.950831, + 11.950954, + 11.951077, + 11.951199, + 11.951321, + 11.951442, + 11.951563, + 11.951684, + 11.951804, + 11.951923, + 11.952042, + 11.952161, + 11.952279, + 11.952397, + 11.952514, + 11.952631, + 11.952747, + 11.952863, + 11.952979, + 11.953094, + 11.953209, + 11.953323, + 11.953437, + 11.953550, + 11.953663, + 11.953776, + 11.953888, + 11.954000, + 11.954112, + 11.954223, + 11.954333, + 11.954443, + 11.954553, + 11.954663, + 11.954772, + 11.954880, + 11.954989, + 11.955097, + 11.955204, + 11.955311, + 11.955418, + 11.955524, + 11.955630, + 11.955736, + 11.955841, + 11.955946, + 11.956050, + 11.956154, + 11.956258, + 11.956361, + 11.956464, + 11.956567, + 11.956669, + 11.956771, + 11.956872, + 11.956974, + 11.957074, + 11.957175, + 11.957275, + 11.957375, + 11.957474, + 11.957573, + 11.957672, + 11.957770, + 11.957868, + 11.957966, + 11.958063, + 11.958160, + 11.958257, + 11.958353, + 11.958449, + 11.958545, + 11.958640, + 11.958735, + 11.958830, + 11.958924, + 11.959018, + 11.959112, + 11.959206, + 11.959299, + 11.959391, + 11.959484, + 11.959576, + 11.959668, + 11.959759, + 11.959850, + 11.959941, + 11.960032, + 11.960122, + 11.960212, + 11.960302, + 11.960391, + 11.960480, + 11.960569, + 11.960657, + 11.960746, + 11.960833, + 11.960921, + 11.961008, + 11.961095, + 11.961182, + 11.961268, + 11.961354, + 11.961440, + 11.961526, + 11.961611, + 11.961696, + 11.961781, + 11.961865, + 11.961949, + 11.962033, + 11.962117, + 11.962200, + 11.962283, + 11.962366, + 11.962448, + 11.962531, + 11.962612, + 11.962694, + 11.962776, + 11.962857, + 11.962938, + 11.963018, + 11.963099, + 11.963179, + 11.963258, + 11.963338, + 11.963417, + 11.963496, + 11.963575, + 11.963654, + 11.963732, + 11.963810, + 11.963888, + 11.963965, + 11.964043, + 11.964120, + 11.964197, + 11.964273, + 11.964349, + 11.964425, + 11.964501, + 11.964577, + 11.964652, + 11.964727, + 11.964802, + 11.964877, + 11.964951, + 11.965025, + 11.965099, + 11.965173, + 11.965246, + 11.965319, + 11.965392, + 11.965465, + 11.965538, + 11.965610, + 11.965682, + 11.965754, + 11.965825, + 11.965897, + 11.965968, + 11.966039, + 11.966110, + 11.966180, + 11.966250, + 11.966320, + 11.966390, + 11.966460, + 11.966529, + 11.966599, + 11.966667, + 11.966736, + 11.966805, + 11.966873, + 11.966941, + 11.967009, + 11.967077, + 11.967144, + 11.967212, + 11.967279, + 11.967346, + 11.967412, + 11.967479, + 11.967545, + 11.967611, + 11.967677, + 11.967743, + 11.967808, + 11.967873, + 11.967939, + 11.968003, + 11.968068, + 11.968133, + 11.968197, + 11.968261, + 11.968325, + 11.968389, + 11.968452, + 11.968515, + 11.968578, + 11.968641, + 11.968704, + 11.968767, + 11.968829, + }, + {// The expectations for dimension = 25 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041666, + 1.126666, + 1.214999, + 1.306664, + 1.401662, + 1.499991, + 1.601648, + 1.706632, + 1.814936, + 1.926553, + 2.041471, + 2.159671, + 2.281127, + 2.405805, + 2.533654, + 2.664611, + 2.798592, + 2.935492, + 3.075184, + 3.217510, + 3.362288, + 3.509308, + 3.658329, + 3.809086, + 3.961292, + 4.114636, + 4.268797, + 4.423439, + 4.578226, + 4.732819, + 4.886889, + 5.040117, + 5.192201, + 5.342858, + 5.491831, + 5.638886, + 5.783815, + 5.926437, + 6.066601, + 6.204176, + 6.339061, + 6.471176, + 6.600459, + 6.726873, + 6.850393, + 6.971011, + 7.088732, + 7.203573, + 7.315559, + 7.424724, + 7.531108, + 7.634758, + 7.735724, + 7.834060, + 7.929823, + 8.023071, + 8.113864, + 8.202264, + 8.288331, + 8.372126, + 8.453712, + 8.533149, + 8.610496, + 8.685813, + 8.759159, + 8.830590, + 8.900162, + 8.967930, + 9.033948, + 9.098266, + 9.160937, + 9.222009, + 9.281531, + 9.339548, + 9.396107, + 9.451250, + 9.505021, + 9.557460, + 9.608608, + 9.658503, + 9.707182, + 9.754683, + 9.801039, + 9.846285, + 9.890454, + 9.933577, + 9.975685, + 10.016808, + 10.056975, + 10.096213, + 10.134550, + 10.172010, + 10.208620, + 10.244404, + 10.279384, + 10.313585, + 10.347028, + 10.379733, + 10.411723, + 10.443016, + 10.473632, + 10.503590, + 10.532907, + 10.561601, + 10.589689, + 10.617188, + 10.644112, + 10.670478, + 10.696301, + 10.721594, + 10.746372, + 10.770647, + 10.794434, + 10.817745, + 10.840592, + 10.862987, + 10.884941, + 10.906466, + 10.927573, + 10.948271, + 10.968572, + 10.988485, + 11.008019, + 11.027185, + 11.045990, + 11.064444, + 11.082556, + 11.100333, + 11.117784, + 11.134915, + 11.151736, + 11.168253, + 11.184473, + 11.200404, + 11.216051, + 11.231422, + 11.246523, + 11.261360, + 11.275939, + 11.290266, + 11.304347, + 11.318187, + 11.331791, + 11.345165, + 11.358314, + 11.371242, + 11.383955, + 11.396457, + 11.408753, + 11.420848, + 11.432745, + 11.444448, + 11.455963, + 11.467293, + 11.478441, + 11.489412, + 11.500209, + 11.510836, + 11.521297, + 11.531594, + 11.541731, + 11.551712, + 11.561539, + 11.571216, + 11.580746, + 11.590131, + 11.599375, + 11.608480, + 11.617449, + 11.626285, + 11.634990, + 11.643567, + 11.652018, + 11.660346, + 11.668552, + 11.676641, + 11.684612, + 11.692470, + 11.700216, + 11.707852, + 11.715380, + 11.722802, + 11.730120, + 11.737336, + 11.744452, + 11.751469, + 11.758390, + 11.765217, + 11.771950, + 11.778592, + 11.785144, + 11.791608, + 11.797985, + 11.804278, + 11.810486, + 11.816613, + 11.822659, + 11.828626, + 11.834514, + 11.840326, + 11.846063, + 11.851726, + 11.857316, + 11.862835, + 11.868283, + 11.873662, + 11.878973, + 11.884218, + 11.889397, + 11.894511, + 11.899561, + 11.904549, + 11.909476, + 11.914342, + 11.919148, + 11.923896, + 11.928586, + 11.933220, + 11.937798, + 11.942320, + 11.946789, + 11.951205, + 11.955568, + 11.959880, + 11.964141, + 11.968352, + 11.972514, + 11.976627, + 11.980693, + 11.984712, + 11.988685, + 11.992612, + 11.996494, + 12.000332, + 12.004127, + 12.007879, + 12.011589, + 12.015257, + 12.018884, + 12.022471, + 12.026017, + 12.029525, + 12.032994, + 12.036426, + 12.039819, + 12.043176, + 12.046496, + 12.049781, + 12.053030, + 12.056244, + 12.059424, + 12.062569, + 12.065682, + 12.068761, + 12.071808, + 12.074823, + 12.077806, + 12.080759, + 12.083680, + 12.086571, + 12.089433, + 12.092264, + 12.095067, + 12.097841, + 12.100587, + 12.103305, + 12.105995, + 12.108658, + 12.111295, + 12.113904, + 12.116488, + 12.119046, + 12.121579, + 12.124087, + 12.126569, + 12.129028, + 12.131462, + 12.133873, + 12.136260, + 12.138623, + 12.140964, + 12.143283, + 12.145579, + 12.147853, + 12.150105, + 12.152336, + 12.154546, + 12.156734, + 12.158902, + 12.161050, + 12.163178, + 12.165285, + 12.167373, + 12.169442, + 12.171491, + 12.173522, + 12.175533, + 12.177527, + 12.179502, + 12.181458, + 12.183398, + 12.185319, + 12.187223, + 12.189110, + 12.190980, + 12.192834, + 12.194670, + 12.196491, + 12.198295, + 12.200083, + 12.201855, + 12.203612, + 12.205353, + 12.207079, + 12.208790, + 12.210486, + 12.212168, + 12.213834, + 12.215487, + 12.217125, + 12.218749, + 12.220359, + 12.221956, + 12.223538, + 12.225108, + 12.226664, + 12.228207, + 12.229737, + 12.231254, + 12.232758, + 12.234250, + 12.235730, + 12.237197, + 12.238652, + 12.240095, + 12.241526, + 12.242945, + 12.244353, + 12.245749, + 12.247134, + 12.248507, + 12.249870, + 12.251221, + 12.252562, + 12.253891, + 12.255210, + 12.256519, + 12.257817, + 12.259105, + 12.260382, + 12.261650, + 12.262907, + 12.264155, + 12.265392, + 12.266620, + 12.267839, + 12.269048, + 12.270247, + 12.271438, + 12.272619, + 12.273791, + 12.274953, + 12.276107, + 12.277253, + 12.278389, + 12.279517, + 12.280636, + 12.281747, + 12.282849, + 12.283943, + 12.285029, + 12.286106, + 12.287176, + 12.288237, + 12.289291, + 12.290337, + 12.291375, + 12.292405, + 12.293428, + 12.294443, + 12.295451, + 12.296452, + 12.297445, + 12.298431, + 12.299410, + 12.300381, + 12.301346, + 12.302303, + 12.303254, + 12.304198, + 12.305135, + 12.306066, + 12.306990, + 12.307907, + 12.308818, + 12.309722, + 12.310620, + 12.311511, + 12.312397, + 12.313276, + 12.314149, + 12.315016, + 12.315876, + 12.316731, + 12.317580, + 12.318423, + 12.319260, + 12.320092, + 12.320918, + 12.321738, + 12.322552, + 12.323361, + 12.324164, + 12.324962, + 12.325755, + 12.326542, + 12.327324, + 12.328100, + 12.328872, + 12.329638, + 12.330399, + 12.331155, + 12.331906, + 12.332652, + 12.333393, + 12.334129, + 12.334860, + 12.335587, + 12.336308, + 12.337025, + 12.337737, + 12.338445, + 12.339148, + 12.339846, + 12.340540, + 12.341230, + 12.341915, + 12.342595, + 12.343271, + 12.343943, + 12.344610, + 12.345274, + 12.345933, + 12.346587, + 12.347238, + 12.347885, + 12.348527, + 12.349165, + 12.349800, + 12.350430, + 12.351056, + 12.351679, + 12.352297, + 12.352912, + 12.353523, + 12.354130, + 12.354734, + 12.355333, + 12.355929, + 12.356521, + 12.357110, + 12.357695, + 12.358276, + 12.358854, + 12.359429, + 12.360000, + 12.360567, + 12.361131, + 12.361691, + 12.362249, + 12.362802, + 12.363353, + 12.363900, + 12.364444, + 12.364985, + 12.365522, + 12.366056, + 12.366587, + 12.367115, + 12.367640, + 12.368162, + 12.368680, + 12.369196, + 12.369708, + 12.370218, + 12.370724, + 12.371228, + 12.371729, + 12.372226, + 12.372721, + 12.373213, + 12.373702, + 12.374189, + 12.374672, + 12.375153, + 12.375631, + 12.376106, + 12.376579, + 12.377049, + 12.377516, + 12.377980, + 12.378442, + 12.378902, + 12.379358, + 12.379812, + 12.380264, + 12.380713, + 12.381159, + 12.381603, + 12.382045, + 12.382484, + 12.382921, + 12.383355, + 12.383787, + 12.384216, + 12.384643, + 12.385068, + 12.385490, + 12.385910, + 12.386328, + 12.386743, + 12.387156, + 12.387567, + 12.387976, + 12.388382, + 12.388786, + 12.389188, + 12.389588, + 12.389986, + 12.390381, + 12.390775, + 12.391166, + 12.391555, + 12.391942, + 12.392328, + 12.392711, + 12.393092, + 12.393470, + 12.393847, + 12.394222, + 12.394595, + 12.394966, + 12.395335, + 12.395703, + 12.396068, + 12.396431, + 12.396792, + 12.397152, + 12.397509, + 12.397865, + 12.398219, + 12.398571, + 12.398921, + 12.399270, + 12.399616, + 12.399961, + 12.400304, + 12.400646, + 12.400985, + 12.401323, + 12.401659, + 12.401994, + 12.402326, + 12.402657, + 12.402987, + 12.403314, + 12.403640, + 12.403965, + 12.404287, + 12.404609, + 12.404928, + 12.405246, + 12.405562, + 12.405877, + 12.406190, + 12.406502, + 12.406812, + 12.407120, + 12.407427, + 12.407733, + 12.408037, + 12.408339, + 12.408640, + 12.408940, + 12.409238, + 12.409534, + 12.409829, + 12.410123, + 12.410415, + 12.410706, + 12.410995, + 12.411283, + 12.411570, + 12.411855, + 12.412139, + 12.412422, + 12.412703, + 12.412983, + 12.413261, + 12.413538, + 12.413814, + 12.414088, + 12.414361, + 12.414633, + 12.414904, + 12.415173, + 12.415441, + 12.415708, + 12.415973, + 12.416238, + 12.416500, + 12.416762, + 12.417023, + 12.417282, + 12.417540, + 12.417797, + 12.418053, + 12.418307, + 12.418560, + 12.418813, + 12.419064, + 12.419313, + 12.419562, + 12.419810, + 12.420056, + 12.420301, + 12.420545, + 12.420788, + 12.421030, + 12.421271, + 12.421511, + 12.421749, + 12.421987, + 12.422223, + 12.422458, + 12.422693, + 12.422926, + 12.423158, + 12.423389, + 12.423619, + 12.423848, + 12.424076, + 12.424303, + 12.424529, + 12.424754, + 12.424978, + 12.425201, + 12.425423, + 12.425644, + 12.425864, + 12.426083, + 12.426301, + 12.426518, + 12.426734, + 12.426950, + 12.427164, + 12.427377, + 12.427590, + 12.427801, + 12.428011, + 12.428221, + 12.428430, + 12.428638, + 12.428844, + 12.429050, + 12.429255, + 12.429460, + 12.429663, + 12.429865, + 12.430067, + 12.430268, + 12.430468, + 12.430666, + 12.430865, + 12.431062, + 12.431258, + 12.431454, + 12.431649, + 12.431843, + 12.432036, + 12.432228, + 12.432420, + 12.432610, + 12.432800, + 12.432989, + 12.433177, + 12.433365, + 12.433552, + 12.433737, + 12.433923, + 12.434107, + 12.434291, + 12.434473, + 12.434655, + 12.434837, + 12.435017, + 12.435197, + 12.435376, + 12.435554, + 12.435732, + 12.435909, + 12.436085, + 12.436260, + 12.436435, + 12.436609, + 12.436782, + 12.436955, + 12.437127, + 12.437298, + 12.437468, + 12.437638, + 12.437807, + 12.437975, + 12.438143, + 12.438310, + 12.438476, + 12.438642, + 12.438807, + 12.438971, + 12.439135, + 12.439298, + 12.439460, + 12.439622, + 12.439783, + 12.439943, + 12.440103, + 12.440262, + 12.440421, + 12.440579, + 12.440736, + 12.440892, + 12.441048, + 12.441204, + 12.441359, + 12.441513, + 12.441666, + 12.441819, + 12.441972, + 12.442123, + 12.442275, + 12.442425, + 12.442575, + 12.442725, + 12.442873, + 12.443022, + 12.443169, + 12.443316, + 12.443463, + 12.443609, + 12.443754, + 12.443899, + 12.444043, + 12.444187, + 12.444330, + 12.444473, + 12.444615, + 12.444756, + 12.444897, + 12.445038, + 12.445178, + 12.445317, + 12.445456, + 12.445594, + 12.445732, + 12.445869, + 12.446006, + 12.446142, + 12.446278, + 12.446413, + 12.446548, + 12.446682, + 12.446816, + 12.446949, + 12.447081, + 12.447214, + 12.447345, + 12.447476, + 12.447607, + 12.447737, + 12.447867, + 12.447996, + 12.448125, + 12.448253, + 12.448381, + 12.448509, + 12.448635, + 12.448762, + 12.448888, + 12.449013, + 12.449138, + 12.449263, + 12.449387, + 12.449511, + 12.449634, + 12.449757, + 12.449879, + 12.450001, + 12.450122, + 12.450243, + 12.450364, + 12.450484, + 12.450603, + 12.450723, + 12.450841, + 12.450960, + 12.451078, + 12.451195, + 12.451312, + 12.451429, + 12.451545, + 12.451661, + 12.451776, + 12.451891, + 12.452006, + 12.452120, + 12.452234, + 12.452347, + 12.452460, + 12.452573, + 12.452685, + 12.452797, + 12.452908, + 12.453019, + 12.453130, + 12.453240, + 12.453350, + 12.453459, + 12.453568, + 12.453677, + 12.453785, + 12.453893, + 12.454001, + 12.454108, + 12.454214, + 12.454321, + 12.454427, + 12.454533, + 12.454638, + 12.454743, + 12.454847, + 12.454952, + 12.455055, + 12.455159, + 12.455262, + 12.455365, + 12.455467, + 12.455569, + 12.455671, + 12.455772, + 12.455873, + 12.455974, + 12.456074, + 12.456174, + 12.456274, + 12.456373, + 12.456472, + 12.456571, + 12.456669, + 12.456767, + 12.456865, + 12.456962, + 12.457059, + 12.457156, + 12.457252, + 12.457348, + 12.457444, + 12.457539, + 12.457634, + 12.457729, + 12.457823, + 12.457917, + 12.458011, + 12.458105, + 12.458198, + 12.458291, + 12.458383, + 12.458475, + 12.458567, + 12.458659, + 12.458750, + 12.458841, + 12.458932, + 12.459022, + 12.459112, + 12.459202, + 12.459292, + 12.459381, + 12.459470, + 12.459558, + 12.459647, + 12.459735, + 12.459823, + 12.459910, + 12.459997, + 12.460084, + 12.460171, + 12.460257, + 12.460343, + 12.460429, + 12.460514, + 12.460600, + 12.460685, + 12.460769, + 12.460854, + 12.460938, + 12.461022, + 12.461105, + 12.461189, + 12.461272, + 12.461355, + 12.461437, + 12.461519, + 12.461601, + 12.461683, + 12.461765, + 12.461846, + 12.461927, + 12.462007, + 12.462088, + 12.462168, + 12.462248, + 12.462328, + 12.462407, + 12.462486, + 12.462565, + 12.462644, + 12.462722, + 12.462801, + 12.462879, + 12.462956, + 12.463034, + 12.463111, + 12.463188, + 12.463265, + 12.463341, + 12.463417, + 12.463493, + 12.463569, + 12.463645, + 12.463720, + 12.463795, + 12.463870, + 12.463944, + 12.464019, + 12.464093, + 12.464167, + 12.464241, + 12.464314, + 12.464387, + 12.464460, + 12.464533, + 12.464606, + 12.464678, + 12.464750, + 12.464822, + 12.464894, + 12.464965, + 12.465036, + 12.465108, + 12.465178, + 12.465249, + 12.465319, + 12.465389, + 12.465459, + 12.465529, + 12.465599, + 12.465668, + 12.465737, + 12.465806, + 12.465875, + 12.465943, + 12.466012, + 12.466080, + 12.466147, + 12.466215, + 12.466283, + }, + {// The expectations for dimension = 26 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126666, + 1.215000, + 1.306666, + 1.401664, + 1.499995, + 1.601657, + 1.706648, + 1.814965, + 1.926602, + 2.041553, + 2.159804, + 2.281338, + 2.406129, + 2.534142, + 2.665328, + 2.799624, + 2.936948, + 3.077196, + 3.220240, + 3.365928, + 3.514076, + 3.664476, + 3.816891, + 3.971058, + 4.126689, + 4.283477, + 4.441101, + 4.599227, + 4.757518, + 4.915638, + 5.073254, + 5.230048, + 5.385716, + 5.539975, + 5.692563, + 5.843244, + 5.991809, + 6.138073, + 6.281880, + 6.423098, + 6.561622, + 6.697366, + 6.830270, + 6.960288, + 7.087396, + 7.211581, + 7.332846, + 7.451205, + 7.566680, + 7.679303, + 7.789114, + 7.896155, + 8.000477, + 8.102130, + 8.201172, + 8.297658, + 8.391648, + 8.483203, + 8.572382, + 8.659247, + 8.743859, + 8.826277, + 8.906562, + 8.984772, + 9.060966, + 9.135202, + 9.207534, + 9.278018, + 9.346708, + 9.413656, + 9.478912, + 9.542527, + 9.604549, + 9.665025, + 9.724000, + 9.781519, + 9.837625, + 9.892360, + 9.945764, + 9.997876, + 10.048735, + 10.098377, + 10.146838, + 10.194152, + 10.240352, + 10.285472, + 10.329543, + 10.372594, + 10.414655, + 10.455755, + 10.495921, + 10.535179, + 10.573556, + 10.611075, + 10.647762, + 10.683640, + 10.718730, + 10.753055, + 10.786637, + 10.819494, + 10.851648, + 10.883118, + 10.913921, + 10.944076, + 10.973600, + 11.002511, + 11.030824, + 11.058555, + 11.085719, + 11.112332, + 11.138408, + 11.163960, + 11.189002, + 11.213548, + 11.237609, + 11.261199, + 11.284328, + 11.307010, + 11.329254, + 11.351071, + 11.372473, + 11.393470, + 11.414070, + 11.434285, + 11.454123, + 11.473594, + 11.492706, + 11.511468, + 11.529888, + 11.547975, + 11.565735, + 11.583177, + 11.600308, + 11.617136, + 11.633667, + 11.649908, + 11.665866, + 11.681547, + 11.696957, + 11.712103, + 11.726990, + 11.741625, + 11.756012, + 11.770157, + 11.784066, + 11.797744, + 11.811195, + 11.824425, + 11.837438, + 11.850239, + 11.862833, + 11.875223, + 11.887415, + 11.899412, + 11.911218, + 11.922837, + 11.934274, + 11.945532, + 11.956615, + 11.967525, + 11.978268, + 11.988845, + 11.999261, + 12.009518, + 12.019621, + 12.029571, + 12.039372, + 12.049027, + 12.058539, + 12.067910, + 12.077143, + 12.086241, + 12.095207, + 12.104042, + 12.112750, + 12.121333, + 12.129793, + 12.138132, + 12.146354, + 12.154459, + 12.162451, + 12.170331, + 12.178101, + 12.185763, + 12.193320, + 12.200772, + 12.208123, + 12.215374, + 12.222527, + 12.229583, + 12.236544, + 12.243412, + 12.250188, + 12.256874, + 12.263472, + 12.269984, + 12.276410, + 12.282752, + 12.289012, + 12.295190, + 12.301290, + 12.307310, + 12.313254, + 12.319123, + 12.324917, + 12.330637, + 12.336286, + 12.341865, + 12.347373, + 12.352813, + 12.358186, + 12.363493, + 12.368735, + 12.373912, + 12.379027, + 12.384079, + 12.389071, + 12.394002, + 12.398875, + 12.403689, + 12.408446, + 12.413146, + 12.417791, + 12.422382, + 12.426918, + 12.431402, + 12.435834, + 12.440214, + 12.444544, + 12.448824, + 12.453055, + 12.457238, + 12.461373, + 12.465462, + 12.469504, + 12.473501, + 12.477453, + 12.481361, + 12.485225, + 12.489047, + 12.492827, + 12.496565, + 12.500262, + 12.503918, + 12.507535, + 12.511113, + 12.514652, + 12.518153, + 12.521616, + 12.525042, + 12.528432, + 12.531786, + 12.535104, + 12.538387, + 12.541636, + 12.544851, + 12.548032, + 12.551180, + 12.554296, + 12.557379, + 12.560431, + 12.563451, + 12.566441, + 12.569400, + 12.572328, + 12.575228, + 12.578098, + 12.580939, + 12.583751, + 12.586536, + 12.589292, + 12.592022, + 12.594724, + 12.597400, + 12.600049, + 12.602673, + 12.605271, + 12.607843, + 12.610391, + 12.612914, + 12.615412, + 12.617887, + 12.620338, + 12.622765, + 12.625169, + 12.627551, + 12.629910, + 12.632246, + 12.634561, + 12.636854, + 12.639126, + 12.641376, + 12.643605, + 12.645814, + 12.648003, + 12.650171, + 12.652319, + 12.654448, + 12.656557, + 12.658647, + 12.660718, + 12.662771, + 12.664805, + 12.666820, + 12.668818, + 12.670797, + 12.672759, + 12.674704, + 12.676631, + 12.678542, + 12.680435, + 12.682312, + 12.684173, + 12.686017, + 12.687845, + 12.689657, + 12.691454, + 12.693235, + 12.695001, + 12.696751, + 12.698487, + 12.700208, + 12.701914, + 12.703605, + 12.705283, + 12.706946, + 12.708595, + 12.710231, + 12.711852, + 12.713460, + 12.715055, + 12.716636, + 12.718205, + 12.719760, + 12.721303, + 12.722833, + 12.724350, + 12.725855, + 12.727348, + 12.728829, + 12.730297, + 12.731754, + 12.733199, + 12.734633, + 12.736055, + 12.737465, + 12.738865, + 12.740253, + 12.741630, + 12.742996, + 12.744352, + 12.745697, + 12.747031, + 12.748355, + 12.749668, + 12.750971, + 12.752265, + 12.753548, + 12.754821, + 12.756084, + 12.757338, + 12.758582, + 12.759816, + 12.761041, + 12.762257, + 12.763464, + 12.764661, + 12.765849, + 12.767029, + 12.768199, + 12.769361, + 12.770514, + 12.771658, + 12.772794, + 12.773922, + 12.775041, + 12.776152, + 12.777254, + 12.778349, + 12.779436, + 12.780514, + 12.781585, + 12.782648, + 12.783703, + 12.784750, + 12.785790, + 12.786823, + 12.787848, + 12.788865, + 12.789876, + 12.790879, + 12.791875, + 12.792864, + 12.793846, + 12.794821, + 12.795789, + 12.796750, + 12.797704, + 12.798652, + 12.799593, + 12.800528, + 12.801456, + 12.802377, + 12.803293, + 12.804202, + 12.805104, + 12.806001, + 12.806891, + 12.807775, + 12.808653, + 12.809525, + 12.810391, + 12.811252, + 12.812106, + 12.812955, + 12.813798, + 12.814635, + 12.815466, + 12.816293, + 12.817113, + 12.817928, + 12.818738, + 12.819542, + 12.820341, + 12.821135, + 12.821923, + 12.822706, + 12.823484, + 12.824257, + 12.825025, + 12.825788, + 12.826546, + 12.827299, + 12.828047, + 12.828790, + 12.829529, + 12.830262, + 12.830991, + 12.831716, + 12.832435, + 12.833150, + 12.833861, + 12.834567, + 12.835268, + 12.835966, + 12.836658, + 12.837346, + 12.838030, + 12.838710, + 12.839385, + 12.840057, + 12.840724, + 12.841386, + 12.842045, + 12.842700, + 12.843350, + 12.843997, + 12.844639, + 12.845278, + 12.845912, + 12.846543, + 12.847170, + 12.847793, + 12.848412, + 12.849028, + 12.849640, + 12.850248, + 12.850852, + 12.851453, + 12.852050, + 12.852644, + 12.853234, + 12.853820, + 12.854403, + 12.854982, + 12.855558, + 12.856131, + 12.856700, + 12.857266, + 12.857829, + 12.858388, + 12.858944, + 12.859496, + 12.860046, + 12.860592, + 12.861135, + 12.861675, + 12.862211, + 12.862745, + 12.863275, + 12.863803, + 12.864327, + 12.864849, + 12.865367, + 12.865882, + 12.866395, + 12.866904, + 12.867411, + 12.867915, + 12.868416, + 12.868914, + 12.869409, + 12.869901, + 12.870391, + 12.870878, + 12.871362, + 12.871843, + 12.872322, + 12.872798, + 12.873272, + 12.873742, + 12.874211, + 12.874676, + 12.875139, + 12.875600, + 12.876057, + 12.876513, + 12.876966, + 12.877416, + 12.877864, + 12.878309, + 12.878752, + 12.879193, + 12.879631, + 12.880067, + 12.880501, + 12.880932, + 12.881361, + 12.881787, + 12.882211, + 12.882633, + 12.883053, + 12.883470, + 12.883886, + 12.884299, + 12.884709, + 12.885118, + 12.885525, + 12.885929, + 12.886331, + 12.886731, + 12.887129, + 12.887525, + 12.887919, + 12.888310, + 12.888700, + 12.889088, + 12.889473, + 12.889857, + 12.890238, + 12.890618, + 12.890996, + 12.891371, + 12.891745, + 12.892117, + 12.892487, + 12.892855, + 12.893221, + 12.893586, + 12.893948, + 12.894309, + 12.894667, + 12.895024, + 12.895379, + 12.895733, + 12.896084, + 12.896434, + 12.896782, + 12.897128, + 12.897473, + 12.897816, + 12.898157, + 12.898496, + 12.898834, + 12.899170, + 12.899504, + 12.899837, + 12.900168, + 12.900497, + 12.900825, + 12.901151, + 12.901476, + 12.901799, + 12.902120, + 12.902440, + 12.902758, + 12.903075, + 12.903390, + 12.903703, + 12.904015, + 12.904326, + 12.904635, + 12.904943, + 12.905249, + 12.905553, + 12.905856, + 12.906158, + 12.906458, + 12.906757, + 12.907055, + 12.907351, + 12.907645, + 12.907938, + 12.908230, + 12.908520, + 12.908809, + 12.909097, + 12.909383, + 12.909668, + 12.909952, + 12.910234, + 12.910515, + 12.910794, + 12.911073, + 12.911350, + 12.911625, + 12.911900, + 12.912173, + 12.912445, + 12.912716, + 12.912985, + 12.913253, + 12.913520, + 12.913786, + 12.914050, + 12.914313, + 12.914575, + 12.914836, + 12.915096, + 12.915354, + 12.915611, + 12.915868, + 12.916123, + 12.916376, + 12.916629, + 12.916880, + 12.917131, + 12.917380, + 12.917628, + 12.917875, + 12.918121, + 12.918366, + 12.918609, + 12.918852, + 12.919094, + 12.919334, + 12.919573, + 12.919812, + 12.920049, + 12.920285, + 12.920520, + 12.920754, + 12.920987, + 12.921219, + 12.921451, + 12.921681, + 12.921910, + 12.922138, + 12.922365, + 12.922591, + 12.922816, + 12.923040, + 12.923263, + 12.923485, + 12.923706, + 12.923926, + 12.924146, + 12.924364, + 12.924581, + 12.924798, + 12.925013, + 12.925228, + 12.925441, + 12.925654, + 12.925866, + 12.926077, + 12.926287, + 12.926496, + 12.926704, + 12.926912, + 12.927118, + 12.927324, + 12.927528, + 12.927732, + 12.927935, + 12.928138, + 12.928339, + 12.928539, + 12.928739, + 12.928938, + 12.929136, + 12.929333, + 12.929529, + 12.929725, + 12.929919, + 12.930113, + 12.930306, + 12.930499, + 12.930690, + 12.930881, + 12.931071, + 12.931260, + 12.931448, + 12.931636, + 12.931823, + 12.932009, + 12.932194, + 12.932379, + 12.932562, + 12.932745, + 12.932928, + 12.933109, + 12.933290, + 12.933470, + 12.933650, + 12.933828, + 12.934006, + 12.934183, + 12.934360, + 12.934536, + 12.934711, + 12.934885, + 12.935059, + 12.935232, + 12.935404, + 12.935576, + 12.935746, + 12.935917, + 12.936086, + 12.936255, + 12.936423, + 12.936591, + 12.936758, + 12.936924, + 12.937090, + 12.937255, + 12.937419, + 12.937583, + 12.937746, + 12.937908, + 12.938070, + 12.938231, + 12.938391, + 12.938551, + 12.938710, + 12.938869, + 12.939027, + 12.939184, + 12.939341, + 12.939497, + 12.939653, + 12.939808, + 12.939962, + 12.940116, + 12.940269, + 12.940422, + 12.940574, + 12.940725, + 12.940876, + 12.941027, + 12.941176, + 12.941325, + 12.941474, + 12.941622, + 12.941769, + 12.941916, + 12.942063, + 12.942209, + 12.942354, + 12.942498, + 12.942643, + 12.942786, + 12.942929, + 12.943072, + 12.943214, + 12.943355, + 12.943496, + 12.943637, + 12.943777, + 12.943916, + 12.944055, + 12.944193, + 12.944331, + 12.944468, + 12.944605, + 12.944742, + 12.944877, + 12.945013, + 12.945147, + 12.945282, + 12.945416, + 12.945549, + 12.945682, + 12.945814, + 12.945946, + 12.946077, + 12.946208, + 12.946339, + 12.946469, + 12.946598, + 12.946727, + 12.946856, + 12.946984, + 12.947112, + 12.947239, + 12.947366, + 12.947492, + 12.947618, + 12.947743, + 12.947868, + 12.947992, + 12.948116, + 12.948240, + 12.948363, + 12.948486, + 12.948608, + 12.948730, + 12.948851, + 12.948972, + 12.949093, + 12.949213, + 12.949333, + 12.949452, + 12.949571, + 12.949689, + 12.949807, + 12.949925, + 12.950042, + 12.950159, + 12.950275, + 12.950391, + 12.950507, + 12.950622, + 12.950736, + 12.950851, + 12.950965, + 12.951078, + 12.951191, + 12.951304, + 12.951417, + 12.951529, + 12.951640, + 12.951751, + 12.951862, + 12.951973, + 12.952083, + 12.952192, + 12.952302, + 12.952411, + 12.952519, + 12.952627, + 12.952735, + 12.952843, + 12.952950, + 12.953057, + 12.953163, + 12.953269, + 12.953375, + 12.953480, + 12.953585, + 12.953689, + 12.953794, + 12.953898, + 12.954001, + 12.954104, + 12.954207, + 12.954310, + 12.954412, + 12.954513, + 12.954615, + 12.954716, + 12.954817, + 12.954917, + 12.955017, + 12.955117, + 12.955217, + 12.955316, + 12.955415, + 12.955513, + 12.955611, + 12.955709, + 12.955806, + 12.955904, + 12.956001, + 12.956097, + 12.956193, + 12.956289, + 12.956385, + 12.956480, + 12.956575, + 12.956670, + 12.956764, + 12.956858, + 12.956952, + 12.957045, + 12.957138, + 12.957231, + 12.957324, + 12.957416, + 12.957508, + 12.957599, + 12.957691, + 12.957782, + 12.957872, + 12.957963, + 12.958053, + 12.958143, + 12.958232, + 12.958322, + 12.958411, + 12.958499, + 12.958588, + 12.958676, + 12.958764, + 12.958852, + 12.958939, + 12.959026, + 12.959113, + 12.959199, + 12.959285, + 12.959371, + 12.959457, + 12.959542, + 12.959627, + 12.959712, + 12.959797, + 12.959881, + 12.959965, + 12.960049, + 12.960133, + 12.960216, + 12.960299, + 12.960382, + 12.960464, + 12.960546, + 12.960628, + 12.960710, + 12.960791, + 12.960873, + 12.960954, + 12.961034, + 12.961115, + 12.961195, + 12.961275, + 12.961355, + 12.961434, + 12.961513, + 12.961592, + 12.961671, + 12.961750, + 12.961828, + 12.961906, + 12.961984, + 12.962061, + 12.962139, + 12.962216, + 12.962292, + 12.962369, + 12.962445, + 12.962522, + 12.962598, + 12.962673, + 12.962749, + 12.962824, + 12.962899, + 12.962974, + 12.963048, + 12.963122, + 12.963197, + 12.963270, + 12.963344, + 12.963417, + 12.963491, + 12.963564, + 12.963636, + }, + {// The expectations for dimension = 27 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306666, + 1.401666, + 1.499998, + 1.601662, + 1.706657, + 1.814981, + 1.926631, + 2.041601, + 2.159884, + 2.281468, + 2.406335, + 2.534459, + 2.665805, + 2.800324, + 2.937955, + 3.078615, + 3.222201, + 3.368586, + 3.517618, + 3.669116, + 3.822873, + 3.978652, + 4.136192, + 4.295207, + 4.455391, + 4.616423, + 4.777971, + 4.939698, + 5.101268, + 5.262348, + 5.422620, + 5.581779, + 5.739539, + 5.895639, + 6.049840, + 6.201929, + 6.351722, + 6.499057, + 6.643803, + 6.785848, + 6.925107, + 7.061513, + 7.195022, + 7.325603, + 7.453243, + 7.577942, + 7.699710, + 7.818569, + 7.934549, + 8.047685, + 8.158021, + 8.265603, + 8.370483, + 8.472714, + 8.572354, + 8.669459, + 8.764090, + 8.856306, + 8.946167, + 9.033733, + 9.119066, + 9.202223, + 9.283265, + 9.362248, + 9.439231, + 9.514270, + 9.587418, + 9.658731, + 9.728260, + 9.796058, + 9.862173, + 9.926654, + 9.989550, + 10.050906, + 10.110766, + 10.169174, + 10.226173, + 10.281804, + 10.336105, + 10.389117, + 10.440875, + 10.491416, + 10.540776, + 10.588988, + 10.636085, + 10.682099, + 10.727061, + 10.771000, + 10.813947, + 10.855928, + 10.896970, + 10.937101, + 10.976345, + 11.014728, + 11.052272, + 11.089001, + 11.124938, + 11.160104, + 11.194519, + 11.228205, + 11.261180, + 11.293465, + 11.325076, + 11.356033, + 11.386352, + 11.416050, + 11.445144, + 11.473649, + 11.501580, + 11.528953, + 11.555781, + 11.582078, + 11.607859, + 11.633135, + 11.657920, + 11.682226, + 11.706065, + 11.729448, + 11.752386, + 11.774892, + 11.796974, + 11.818644, + 11.839911, + 11.860785, + 11.881276, + 11.901392, + 11.921142, + 11.940536, + 11.959581, + 11.978285, + 11.996657, + 12.014703, + 12.032433, + 12.049852, + 12.066968, + 12.083787, + 12.100317, + 12.116564, + 12.132534, + 12.148233, + 12.163668, + 12.178843, + 12.193766, + 12.208440, + 12.222873, + 12.237068, + 12.251031, + 12.264767, + 12.278280, + 12.291576, + 12.304659, + 12.317534, + 12.330204, + 12.342674, + 12.354949, + 12.367031, + 12.378926, + 12.390636, + 12.402167, + 12.413520, + 12.424700, + 12.435711, + 12.446555, + 12.457236, + 12.467757, + 12.478122, + 12.488333, + 12.498393, + 12.508306, + 12.518073, + 12.527699, + 12.537185, + 12.546534, + 12.555750, + 12.564833, + 12.573787, + 12.582615, + 12.591318, + 12.599899, + 12.608360, + 12.616704, + 12.624932, + 12.633046, + 12.641050, + 12.648944, + 12.656730, + 12.664411, + 12.671989, + 12.679464, + 12.686840, + 12.694118, + 12.701299, + 12.708385, + 12.715378, + 12.722280, + 12.729092, + 12.735815, + 12.742452, + 12.749003, + 12.755470, + 12.761854, + 12.768157, + 12.774381, + 12.780526, + 12.786594, + 12.792586, + 12.798503, + 12.804347, + 12.810118, + 12.815819, + 12.821450, + 12.827012, + 12.832506, + 12.837934, + 12.843296, + 12.848594, + 12.853828, + 12.859000, + 12.864110, + 12.869160, + 12.874151, + 12.879082, + 12.883956, + 12.888774, + 12.893535, + 12.898241, + 12.902893, + 12.907492, + 12.912038, + 12.916532, + 12.920975, + 12.925367, + 12.929711, + 12.934005, + 12.938252, + 12.942451, + 12.946603, + 12.950710, + 12.954771, + 12.958787, + 12.962760, + 12.966689, + 12.970575, + 12.974420, + 12.978222, + 12.981984, + 12.985706, + 12.989388, + 12.993030, + 12.996634, + 13.000200, + 13.003728, + 13.007219, + 13.010674, + 13.014093, + 13.017476, + 13.020824, + 13.024137, + 13.027417, + 13.030663, + 13.033875, + 13.037055, + 13.040203, + 13.043318, + 13.046403, + 13.049456, + 13.052479, + 13.055471, + 13.058434, + 13.061367, + 13.064271, + 13.067147, + 13.069994, + 13.072814, + 13.075606, + 13.078371, + 13.081109, + 13.083820, + 13.086506, + 13.089165, + 13.091799, + 13.094408, + 13.096992, + 13.099552, + 13.102087, + 13.104599, + 13.107087, + 13.109551, + 13.111993, + 13.114411, + 13.116808, + 13.119182, + 13.121534, + 13.123864, + 13.126174, + 13.128462, + 13.130729, + 13.132975, + 13.135201, + 13.137407, + 13.139594, + 13.141760, + 13.143907, + 13.146035, + 13.148144, + 13.150234, + 13.152306, + 13.154359, + 13.156395, + 13.158412, + 13.160412, + 13.162394, + 13.164359, + 13.166308, + 13.168239, + 13.170153, + 13.172051, + 13.173933, + 13.175799, + 13.177649, + 13.179483, + 13.181301, + 13.183104, + 13.184892, + 13.186665, + 13.188423, + 13.190166, + 13.191895, + 13.193609, + 13.195309, + 13.196995, + 13.198667, + 13.200325, + 13.201970, + 13.203601, + 13.205219, + 13.206824, + 13.208416, + 13.209994, + 13.211560, + 13.213114, + 13.214655, + 13.216183, + 13.217700, + 13.219204, + 13.220696, + 13.222177, + 13.223646, + 13.225103, + 13.226549, + 13.227983, + 13.229406, + 13.230818, + 13.232219, + 13.233610, + 13.234989, + 13.236358, + 13.237716, + 13.239064, + 13.240401, + 13.241728, + 13.243045, + 13.244352, + 13.245649, + 13.246937, + 13.248214, + 13.249482, + 13.250740, + 13.251989, + 13.253229, + 13.254459, + 13.255681, + 13.256893, + 13.258096, + 13.259290, + 13.260476, + 13.261652, + 13.262821, + 13.263980, + 13.265131, + 13.266274, + 13.267408, + 13.268535, + 13.269653, + 13.270763, + 13.271865, + 13.272959, + 13.274045, + 13.275123, + 13.276194, + 13.277257, + 13.278313, + 13.279361, + 13.280402, + 13.281436, + 13.282462, + 13.283481, + 13.284493, + 13.285497, + 13.286495, + 13.287486, + 13.288470, + 13.289447, + 13.290418, + 13.291381, + 13.292339, + 13.293289, + 13.294233, + 13.295171, + 13.296102, + 13.297027, + 13.297946, + 13.298858, + 13.299765, + 13.300665, + 13.301559, + 13.302447, + 13.303329, + 13.304206, + 13.305076, + 13.305941, + 13.306800, + 13.307653, + 13.308501, + 13.309343, + 13.310180, + 13.311011, + 13.311836, + 13.312657, + 13.313471, + 13.314281, + 13.315085, + 13.315885, + 13.316679, + 13.317468, + 13.318251, + 13.319030, + 13.319804, + 13.320573, + 13.321337, + 13.322096, + 13.322850, + 13.323600, + 13.324344, + 13.325084, + 13.325820, + 13.326550, + 13.327277, + 13.327998, + 13.328715, + 13.329428, + 13.330136, + 13.330840, + 13.331540, + 13.332235, + 13.332926, + 13.333612, + 13.334295, + 13.334973, + 13.335647, + 13.336317, + 13.336983, + 13.337645, + 13.338303, + 13.338956, + 13.339606, + 13.340252, + 13.340894, + 13.341532, + 13.342167, + 13.342797, + 13.343424, + 13.344047, + 13.344667, + 13.345282, + 13.345894, + 13.346503, + 13.347108, + 13.347709, + 13.348307, + 13.348901, + 13.349492, + 13.350079, + 13.350663, + 13.351243, + 13.351820, + 13.352394, + 13.352965, + 13.353532, + 13.354096, + 13.354656, + 13.355214, + 13.355768, + 13.356319, + 13.356867, + 13.357411, + 13.357953, + 13.358492, + 13.359027, + 13.359560, + 13.360089, + 13.360616, + 13.361139, + 13.361660, + 13.362178, + 13.362692, + 13.363204, + 13.363713, + 13.364220, + 13.364723, + 13.365224, + 13.365721, + 13.366217, + 13.366709, + 13.367199, + 13.367686, + 13.368170, + 13.368651, + 13.369130, + 13.369607, + 13.370081, + 13.370552, + 13.371021, + 13.371487, + 13.371950, + 13.372412, + 13.372870, + 13.373326, + 13.373780, + 13.374231, + 13.374680, + 13.375127, + 13.375571, + 13.376013, + 13.376452, + 13.376889, + 13.377324, + 13.377756, + 13.378186, + 13.378614, + 13.379040, + 13.379463, + 13.379885, + 13.380304, + 13.380720, + 13.381135, + 13.381548, + 13.381958, + 13.382366, + 13.382772, + 13.383176, + 13.383578, + 13.383978, + 13.384376, + 13.384772, + 13.385166, + 13.385557, + 13.385947, + 13.386335, + 13.386721, + 13.387104, + 13.387486, + 13.387866, + 13.388244, + 13.388620, + 13.388995, + 13.389367, + 13.389737, + 13.390106, + 13.390473, + 13.390838, + 13.391201, + 13.391562, + 13.391922, + 13.392279, + 13.392635, + 13.392990, + 13.393342, + 13.393693, + 13.394042, + 13.394389, + 13.394735, + 13.395079, + 13.395421, + 13.395761, + 13.396100, + 13.396437, + 13.396773, + 13.397107, + 13.397439, + 13.397770, + 13.398099, + 13.398427, + 13.398753, + 13.399077, + 13.399400, + 13.399721, + 13.400041, + 13.400359, + 13.400676, + 13.400991, + 13.401305, + 13.401617, + 13.401928, + 13.402237, + 13.402545, + 13.402852, + 13.403157, + 13.403460, + 13.403762, + 13.404063, + 13.404362, + 13.404660, + 13.404957, + 13.405252, + 13.405545, + 13.405838, + 13.406129, + 13.406418, + 13.406707, + 13.406994, + 13.407280, + 13.407564, + 13.407847, + 13.408129, + 13.408409, + 13.408688, + 13.408966, + 13.409243, + 13.409518, + 13.409793, + 13.410065, + 13.410337, + 13.410608, + 13.410877, + 13.411145, + 13.411412, + 13.411677, + 13.411942, + 13.412205, + 13.412467, + 13.412728, + 13.412988, + 13.413246, + 13.413504, + 13.413760, + 13.414015, + 13.414269, + 13.414522, + 13.414774, + 13.415024, + 13.415274, + 13.415522, + 13.415770, + 13.416016, + 13.416261, + 13.416505, + 13.416748, + 13.416990, + 13.417231, + 13.417471, + 13.417710, + 13.417948, + 13.418185, + 13.418420, + 13.418655, + 13.418889, + 13.419122, + 13.419353, + 13.419584, + 13.419814, + 13.420043, + 13.420271, + 13.420497, + 13.420723, + 13.420948, + 13.421172, + 13.421395, + 13.421617, + 13.421838, + 13.422058, + 13.422278, + 13.422496, + 13.422713, + 13.422930, + 13.423146, + 13.423360, + 13.423574, + 13.423787, + 13.423999, + 13.424210, + 13.424420, + 13.424630, + 13.424838, + 13.425046, + 13.425253, + 13.425459, + 13.425664, + 13.425868, + 13.426071, + 13.426274, + 13.426476, + 13.426677, + 13.426877, + 13.427076, + 13.427274, + 13.427472, + 13.427669, + 13.427865, + 13.428060, + 13.428255, + 13.428448, + 13.428641, + 13.428833, + 13.429025, + 13.429215, + 13.429405, + 13.429594, + 13.429782, + 13.429970, + 13.430157, + 13.430343, + 13.430528, + 13.430712, + 13.430896, + 13.431079, + 13.431262, + 13.431443, + 13.431624, + 13.431804, + 13.431984, + 13.432163, + 13.432341, + 13.432518, + 13.432695, + 13.432871, + 13.433046, + 13.433221, + 13.433395, + 13.433568, + 13.433741, + 13.433912, + 13.434084, + 13.434254, + 13.434424, + 13.434593, + 13.434762, + 13.434930, + 13.435097, + 13.435264, + 13.435430, + 13.435595, + 13.435760, + 13.435924, + 13.436088, + 13.436251, + 13.436413, + 13.436575, + 13.436736, + 13.436896, + 13.437056, + 13.437215, + 13.437374, + 13.437532, + 13.437689, + 13.437846, + 13.438002, + 13.438158, + 13.438313, + 13.438467, + 13.438621, + 13.438774, + 13.438927, + 13.439079, + 13.439231, + 13.439382, + 13.439532, + 13.439682, + 13.439831, + 13.439980, + 13.440128, + 13.440276, + 13.440423, + 13.440570, + 13.440716, + 13.440861, + 13.441006, + 13.441151, + 13.441295, + 13.441438, + 13.441581, + 13.441723, + 13.441865, + 13.442007, + 13.442147, + 13.442288, + 13.442427, + 13.442567, + 13.442705, + 13.442844, + 13.442981, + 13.443119, + 13.443256, + 13.443392, + 13.443528, + 13.443663, + 13.443798, + 13.443932, + 13.444066, + 13.444199, + 13.444332, + 13.444465, + 13.444597, + 13.444728, + 13.444859, + 13.444990, + 13.445120, + 13.445249, + 13.445379, + 13.445507, + 13.445635, + 13.445763, + 13.445891, + 13.446018, + 13.446144, + 13.446270, + 13.446396, + 13.446521, + 13.446645, + 13.446770, + 13.446894, + 13.447017, + 13.447140, + 13.447262, + 13.447385, + 13.447506, + 13.447628, + 13.447748, + 13.447869, + 13.447989, + 13.448108, + 13.448228, + 13.448346, + 13.448465, + 13.448583, + 13.448700, + 13.448818, + 13.448934, + 13.449051, + 13.449167, + 13.449282, + 13.449397, + 13.449512, + 13.449627, + 13.449741, + 13.449854, + 13.449967, + 13.450080, + 13.450193, + 13.450305, + 13.450417, + 13.450528, + 13.450639, + 13.450749, + 13.450860, + 13.450970, + 13.451079, + 13.451188, + 13.451297, + 13.451405, + 13.451513, + 13.451621, + 13.451728, + 13.451835, + 13.451942, + 13.452048, + 13.452154, + 13.452260, + 13.452365, + 13.452470, + 13.452574, + 13.452678, + 13.452782, + 13.452886, + 13.452989, + 13.453092, + 13.453194, + 13.453296, + 13.453398, + 13.453499, + 13.453600, + 13.453701, + 13.453802, + 13.453902, + 13.454002, + 13.454101, + 13.454200, + 13.454299, + 13.454398, + 13.454496, + 13.454594, + 13.454691, + 13.454789, + 13.454886, + 13.454982, + 13.455079, + 13.455175, + 13.455270, + 13.455366, + 13.455461, + 13.455556, + 13.455650, + 13.455744, + 13.455838, + 13.455932, + 13.456025, + 13.456118, + 13.456211, + 13.456303, + 13.456396, + 13.456487, + 13.456579, + 13.456670, + 13.456761, + 13.456852, + 13.456942, + 13.457032, + 13.457122, + 13.457212, + 13.457301, + 13.457390, + 13.457479, + 13.457567, + 13.457655, + 13.457743, + 13.457831, + 13.457918, + 13.458005, + 13.458092, + 13.458179, + 13.458265, + 13.458351, + 13.458437, + 13.458522, + 13.458607, + 13.458692, + 13.458777, + 13.458861, + 13.458946, + 13.459029, + 13.459113, + 13.459196, + 13.459280, + 13.459362, + 13.459445, + 13.459527, + 13.459610, + 13.459692, + 13.459773, + 13.459855, + 13.459936, + 13.460017, + 13.460097, + 13.460178, + 13.460258, + 13.460338, + 13.460417, + 13.460497, + 13.460576, + 13.460655, + 13.460734, + 13.460812, + 13.460890, + }, + {// The expectations for dimension = 28 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306666, + 1.401666, + 1.499999, + 1.601664, + 1.706661, + 1.814990, + 1.926647, + 2.041629, + 2.159933, + 2.281548, + 2.406464, + 2.534662, + 2.666117, + 2.800794, + 2.938644, + 3.079604, + 3.223593, + 3.370508, + 3.520223, + 3.672585, + 3.827415, + 3.984506, + 4.143622, + 4.304502, + 4.466862, + 4.630397, + 4.794786, + 4.959698, + 5.124796, + 5.289745, + 5.454213, + 5.617879, + 5.780440, + 5.941610, + 6.101123, + 6.258742, + 6.414252, + 6.567466, + 6.718221, + 6.866383, + 7.011839, + 7.154501, + 7.294300, + 7.431188, + 7.565133, + 7.696121, + 7.824147, + 7.949221, + 8.071362, + 8.190597, + 8.306962, + 8.420498, + 8.531249, + 8.639266, + 8.744601, + 8.847310, + 8.947450, + 9.045078, + 9.140255, + 9.233040, + 9.323492, + 9.411672, + 9.497638, + 9.581448, + 9.663162, + 9.742836, + 9.820526, + 9.896287, + 9.970173, + 10.042236, + 10.112528, + 10.181100, + 10.248000, + 10.313276, + 10.376974, + 10.439139, + 10.499816, + 10.559047, + 10.616873, + 10.673334, + 10.728470, + 10.782319, + 10.834916, + 10.886297, + 10.936498, + 10.985551, + 11.033488, + 11.080342, + 11.126142, + 11.170918, + 11.214699, + 11.257511, + 11.299383, + 11.340339, + 11.380405, + 11.419605, + 11.457963, + 11.495501, + 11.532242, + 11.568207, + 11.603416, + 11.637891, + 11.671650, + 11.704712, + 11.737096, + 11.768819, + 11.799899, + 11.830352, + 11.860194, + 11.889441, + 11.918108, + 11.946210, + 11.973761, + 12.000775, + 12.027265, + 12.053245, + 12.078728, + 12.103724, + 12.128247, + 12.152307, + 12.175917, + 12.199087, + 12.221827, + 12.244148, + 12.266060, + 12.287573, + 12.308695, + 12.329437, + 12.349807, + 12.369813, + 12.389464, + 12.408769, + 12.427734, + 12.446369, + 12.464680, + 12.482674, + 12.500360, + 12.517743, + 12.534830, + 12.551629, + 12.568144, + 12.584383, + 12.600352, + 12.616056, + 12.631501, + 12.646693, + 12.661637, + 12.676338, + 12.690802, + 12.705033, + 12.719037, + 12.732818, + 12.746380, + 12.759729, + 12.772868, + 12.785803, + 12.798536, + 12.811073, + 12.823417, + 12.835572, + 12.847542, + 12.859331, + 12.870942, + 12.882378, + 12.893644, + 12.904742, + 12.915675, + 12.926448, + 12.937062, + 12.947522, + 12.957829, + 12.967988, + 12.978000, + 12.987869, + 12.997597, + 13.007186, + 13.016640, + 13.025962, + 13.035152, + 13.044214, + 13.053150, + 13.061963, + 13.070655, + 13.079227, + 13.087682, + 13.096023, + 13.104250, + 13.112367, + 13.120375, + 13.128276, + 13.136072, + 13.143765, + 13.151356, + 13.158847, + 13.166241, + 13.173538, + 13.180741, + 13.187851, + 13.194869, + 13.201797, + 13.208637, + 13.215391, + 13.222058, + 13.228642, + 13.235143, + 13.241563, + 13.247903, + 13.254164, + 13.260348, + 13.266456, + 13.272490, + 13.278449, + 13.284336, + 13.290152, + 13.295898, + 13.301575, + 13.307184, + 13.312726, + 13.318202, + 13.323613, + 13.328961, + 13.334246, + 13.339469, + 13.344631, + 13.349733, + 13.354777, + 13.359762, + 13.364690, + 13.369562, + 13.374378, + 13.379139, + 13.383847, + 13.388502, + 13.393104, + 13.397655, + 13.402155, + 13.406606, + 13.411007, + 13.415359, + 13.419664, + 13.423922, + 13.428133, + 13.432298, + 13.436419, + 13.440494, + 13.444526, + 13.448515, + 13.452461, + 13.456366, + 13.460229, + 13.464051, + 13.467832, + 13.471574, + 13.475277, + 13.478942, + 13.482568, + 13.486157, + 13.489708, + 13.493223, + 13.496703, + 13.500146, + 13.503555, + 13.506929, + 13.510268, + 13.513575, + 13.516848, + 13.520088, + 13.523296, + 13.526471, + 13.529616, + 13.532729, + 13.535812, + 13.538864, + 13.541887, + 13.544880, + 13.547844, + 13.550779, + 13.553685, + 13.556564, + 13.559415, + 13.562239, + 13.565036, + 13.567806, + 13.570550, + 13.573268, + 13.575961, + 13.578628, + 13.581270, + 13.583887, + 13.586480, + 13.589049, + 13.591594, + 13.594116, + 13.596615, + 13.599090, + 13.601543, + 13.603974, + 13.606382, + 13.608769, + 13.611134, + 13.613478, + 13.615801, + 13.618103, + 13.620384, + 13.622645, + 13.624886, + 13.627107, + 13.629309, + 13.631491, + 13.633654, + 13.635798, + 13.637924, + 13.640031, + 13.642119, + 13.644190, + 13.646243, + 13.648278, + 13.650295, + 13.652296, + 13.654279, + 13.656245, + 13.658195, + 13.660128, + 13.662045, + 13.663946, + 13.665831, + 13.667700, + 13.669554, + 13.671392, + 13.673214, + 13.675022, + 13.676815, + 13.678593, + 13.680357, + 13.682106, + 13.683841, + 13.685561, + 13.687268, + 13.688961, + 13.690640, + 13.692306, + 13.693958, + 13.695597, + 13.697223, + 13.698836, + 13.700436, + 13.702024, + 13.703599, + 13.705161, + 13.706712, + 13.708250, + 13.709776, + 13.711290, + 13.712792, + 13.714283, + 13.715762, + 13.717230, + 13.718686, + 13.720131, + 13.721565, + 13.722989, + 13.724401, + 13.725802, + 13.727193, + 13.728574, + 13.729944, + 13.731303, + 13.732653, + 13.733992, + 13.735321, + 13.736641, + 13.737950, + 13.739250, + 13.740540, + 13.741821, + 13.743092, + 13.744354, + 13.745607, + 13.746850, + 13.748085, + 13.749310, + 13.750526, + 13.751734, + 13.752933, + 13.754123, + 13.755305, + 13.756478, + 13.757643, + 13.758800, + 13.759948, + 13.761088, + 13.762220, + 13.763344, + 13.764461, + 13.765569, + 13.766669, + 13.767762, + 13.768847, + 13.769925, + 13.770995, + 13.772057, + 13.773113, + 13.774161, + 13.775201, + 13.776235, + 13.777261, + 13.778281, + 13.779293, + 13.780299, + 13.781297, + 13.782289, + 13.783275, + 13.784253, + 13.785225, + 13.786190, + 13.787149, + 13.788102, + 13.789048, + 13.789988, + 13.790921, + 13.791849, + 13.792770, + 13.793685, + 13.794594, + 13.795497, + 13.796394, + 13.797286, + 13.798171, + 13.799051, + 13.799925, + 13.800793, + 13.801656, + 13.802513, + 13.803364, + 13.804210, + 13.805051, + 13.805886, + 13.806716, + 13.807541, + 13.808360, + 13.809174, + 13.809983, + 13.810787, + 13.811586, + 13.812379, + 13.813168, + 13.813952, + 13.814730, + 13.815504, + 13.816274, + 13.817038, + 13.817797, + 13.818552, + 13.819302, + 13.820048, + 13.820789, + 13.821525, + 13.822257, + 13.822985, + 13.823708, + 13.824426, + 13.825140, + 13.825850, + 13.826556, + 13.827257, + 13.827954, + 13.828647, + 13.829335, + 13.830020, + 13.830700, + 13.831376, + 13.832049, + 13.832717, + 13.833381, + 13.834041, + 13.834698, + 13.835350, + 13.835999, + 13.836644, + 13.837285, + 13.837922, + 13.838556, + 13.839186, + 13.839812, + 13.840435, + 13.841054, + 13.841669, + 13.842281, + 13.842889, + 13.843494, + 13.844095, + 13.844693, + 13.845287, + 13.845878, + 13.846466, + 13.847050, + 13.847631, + 13.848209, + 13.848783, + 13.849354, + 13.849922, + 13.850487, + 13.851048, + 13.851607, + 13.852162, + 13.852714, + 13.853263, + 13.853809, + 13.854352, + 13.854892, + 13.855429, + 13.855963, + 13.856494, + 13.857022, + 13.857547, + 13.858070, + 13.858589, + 13.859106, + 13.859619, + 13.860130, + 13.860638, + 13.861144, + 13.861647, + 13.862147, + 13.862644, + 13.863138, + 13.863630, + 13.864120, + 13.864606, + 13.865090, + 13.865572, + 13.866051, + 13.866527, + 13.867001, + 13.867472, + 13.867941, + 13.868407, + 13.868871, + 13.869332, + 13.869791, + 13.870248, + 13.870702, + 13.871154, + 13.871603, + 13.872050, + 13.872495, + 13.872938, + 13.873378, + 13.873816, + 13.874251, + 13.874685, + 13.875116, + 13.875545, + 13.875971, + 13.876396, + 13.876818, + 13.877238, + 13.877656, + 13.878072, + 13.878486, + 13.878898, + 13.879307, + 13.879715, + 13.880120, + 13.880524, + 13.880925, + 13.881324, + 13.881722, + 13.882117, + 13.882511, + 13.882902, + 13.883291, + 13.883679, + 13.884065, + 13.884448, + 13.884830, + 13.885210, + 13.885588, + 13.885964, + 13.886339, + 13.886711, + 13.887082, + 13.887451, + 13.887818, + 13.888183, + 13.888546, + 13.888908, + 13.889268, + 13.889626, + 13.889983, + 13.890338, + 13.890691, + 13.891042, + 13.891392, + 13.891740, + 13.892086, + 13.892431, + 13.892774, + 13.893115, + 13.893455, + 13.893793, + 13.894129, + 13.894464, + 13.894798, + 13.895129, + 13.895460, + 13.895788, + 13.896115, + 13.896441, + 13.896765, + 13.897087, + 13.897408, + 13.897728, + 13.898046, + 13.898363, + 13.898678, + 13.898991, + 13.899303, + 13.899614, + 13.899923, + 13.900231, + 13.900538, + 13.900843, + 13.901146, + 13.901449, + 13.901749, + 13.902049, + 13.902347, + 13.902644, + 13.902939, + 13.903233, + 13.903526, + 13.903817, + 13.904107, + 13.904396, + 13.904684, + 13.904970, + 13.905255, + 13.905538, + 13.905821, + 13.906102, + 13.906382, + 13.906660, + 13.906938, + 13.907214, + 13.907489, + 13.907762, + 13.908035, + 13.908306, + 13.908576, + 13.908845, + 13.909113, + 13.909379, + 13.909644, + 13.909909, + 13.910172, + 13.910433, + 13.910694, + 13.910954, + 13.911212, + 13.911470, + 13.911726, + 13.911981, + 13.912235, + 13.912488, + 13.912740, + 13.912990, + 13.913240, + 13.913489, + 13.913736, + 13.913983, + 13.914228, + 13.914472, + 13.914716, + 13.914958, + 13.915199, + 13.915439, + 13.915679, + 13.915917, + 13.916154, + 13.916390, + 13.916625, + 13.916859, + 13.917093, + 13.917325, + 13.917556, + 13.917786, + 13.918016, + 13.918244, + 13.918472, + 13.918698, + 13.918924, + 13.919148, + 13.919372, + 13.919595, + 13.919816, + 13.920037, + 13.920257, + 13.920476, + 13.920695, + 13.920912, + 13.921128, + 13.921344, + 13.921558, + 13.921772, + 13.921985, + 13.922197, + 13.922408, + 13.922618, + 13.922828, + 13.923036, + 13.923244, + 13.923451, + 13.923657, + 13.923862, + 13.924067, + 13.924270, + 13.924473, + 13.924675, + 13.924876, + 13.925077, + 13.925276, + 13.925475, + 13.925673, + 13.925870, + 13.926066, + 13.926262, + 13.926457, + 13.926651, + 13.926844, + 13.927037, + 13.927229, + 13.927420, + 13.927610, + 13.927799, + 13.927988, + 13.928176, + 13.928364, + 13.928550, + 13.928736, + 13.928921, + 13.929105, + 13.929289, + 13.929472, + 13.929654, + 13.929836, + 13.930017, + 13.930197, + 13.930376, + 13.930555, + 13.930733, + 13.930911, + 13.931088, + 13.931264, + 13.931439, + 13.931614, + 13.931788, + 13.931961, + 13.932134, + 13.932306, + 13.932477, + 13.932648, + 13.932818, + 13.932988, + 13.933156, + 13.933325, + 13.933492, + 13.933659, + 13.933825, + 13.933991, + 13.934156, + 13.934321, + 13.934484, + 13.934648, + 13.934810, + 13.934972, + 13.935134, + 13.935294, + 13.935455, + 13.935614, + 13.935773, + 13.935932, + 13.936089, + 13.936247, + 13.936403, + 13.936559, + 13.936715, + 13.936870, + 13.937024, + 13.937178, + 13.937331, + 13.937484, + 13.937636, + 13.937788, + 13.937939, + 13.938089, + 13.938239, + 13.938389, + 13.938538, + 13.938686, + 13.938834, + 13.938981, + 13.939128, + 13.939274, + 13.939419, + 13.939565, + 13.939709, + 13.939853, + 13.939997, + 13.940140, + 13.940283, + 13.940425, + 13.940566, + 13.940707, + 13.940848, + 13.940988, + 13.941127, + 13.941266, + 13.941405, + 13.941543, + 13.941681, + 13.941818, + 13.941954, + 13.942090, + 13.942226, + 13.942361, + 13.942496, + 13.942630, + 13.942764, + 13.942897, + 13.943030, + 13.943163, + 13.943294, + 13.943426, + 13.943557, + 13.943687, + 13.943818, + 13.943947, + 13.944076, + 13.944205, + 13.944333, + 13.944461, + 13.944589, + 13.944716, + 13.944842, + 13.944968, + 13.945094, + 13.945219, + 13.945344, + 13.945469, + 13.945592, + 13.945716, + 13.945839, + 13.945962, + 13.946084, + 13.946206, + 13.946328, + 13.946449, + 13.946569, + 13.946689, + 13.946809, + 13.946929, + 13.947048, + 13.947166, + 13.947285, + 13.947403, + 13.947520, + 13.947637, + 13.947754, + 13.947870, + 13.947986, + 13.948101, + 13.948216, + 13.948331, + 13.948446, + 13.948559, + 13.948673, + 13.948786, + 13.948899, + 13.949012, + 13.949124, + 13.949235, + 13.949347, + 13.949458, + 13.949568, + 13.949679, + 13.949789, + 13.949898, + 13.950007, + 13.950116, + 13.950225, + 13.950333, + 13.950441, + 13.950548, + 13.950655, + 13.950762, + 13.950868, + 13.950974, + 13.951080, + 13.951185, + 13.951290, + 13.951395, + 13.951499, + 13.951603, + 13.951707, + 13.951810, + 13.951913, + 13.952016, + 13.952118, + 13.952220, + 13.952322, + 13.952424, + 13.952525, + 13.952625, + 13.952726, + 13.952826, + 13.952926, + 13.953025, + 13.953124, + 13.953223, + 13.953322, + 13.953420, + 13.953518, + 13.953615, + 13.953712, + 13.953809, + 13.953906, + 13.954002, + 13.954099, + 13.954194, + 13.954290, + 13.954385, + 13.954480, + 13.954574, + 13.954669, + 13.954763, + 13.954856, + 13.954950, + 13.955043, + 13.955136, + 13.955228, + 13.955321, + 13.955412, + 13.955504, + 13.955596, + 13.955687, + 13.955778, + 13.955868, + 13.955958, + 13.956048, + 13.956138, + 13.956228, + 13.956317, + 13.956406, + 13.956494, + 13.956583, + 13.956671, + 13.956759, + 13.956846, + 13.956934, + 13.957021, + 13.957107, + 13.957194, + 13.957280, + 13.957366, + 13.957452, + 13.957537, + 13.957623, + 13.957707, + 13.957792, + 13.957877, + 13.957961, + 13.958045, + }, + {// The expectations for dimension = 29 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401666, + 1.499999, + 1.601665, + 1.706664, + 1.814994, + 1.926656, + 2.041646, + 2.159961, + 2.281597, + 2.406544, + 2.534792, + 2.666320, + 2.801105, + 2.939110, + 3.080286, + 3.224572, + 3.371884, + 3.522120, + 3.675153, + 3.830832, + 3.988976, + 4.149379, + 4.311806, + 4.475996, + 4.641664, + 4.808507, + 4.976205, + 5.144427, + 5.312836, + 5.481098, + 5.648880, + 5.815864, + 5.981744, + 6.146233, + 6.309069, + 6.470010, + 6.628841, + 6.785375, + 6.939447, + 7.090920, + 7.239681, + 7.385639, + 7.528724, + 7.668886, + 7.806091, + 7.940322, + 8.071573, + 8.199852, + 8.325177, + 8.447572, + 8.567071, + 8.683714, + 8.797545, + 8.908612, + 9.016967, + 9.122663, + 9.225758, + 9.326307, + 9.424371, + 9.520008, + 9.613277, + 9.704237, + 9.792947, + 9.879466, + 9.963851, + 10.046159, + 10.126445, + 10.204766, + 10.281175, + 10.355724, + 10.428466, + 10.499450, + 10.568726, + 10.636342, + 10.702344, + 10.766778, + 10.829688, + 10.891117, + 10.951106, + 11.009698, + 11.066929, + 11.122840, + 11.177467, + 11.230845, + 11.283011, + 11.333998, + 11.383838, + 11.432563, + 11.480205, + 11.526793, + 11.572356, + 11.616922, + 11.660519, + 11.703173, + 11.744909, + 11.785752, + 11.825727, + 11.864856, + 11.903162, + 11.940667, + 11.977392, + 12.013357, + 12.048584, + 12.083090, + 12.116894, + 12.150015, + 12.182471, + 12.214278, + 12.245452, + 12.276011, + 12.305969, + 12.335342, + 12.364144, + 12.392390, + 12.420092, + 12.447266, + 12.473923, + 12.500076, + 12.525738, + 12.550920, + 12.575634, + 12.599891, + 12.623703, + 12.647079, + 12.670030, + 12.692565, + 12.714696, + 12.736430, + 12.757778, + 12.778747, + 12.799348, + 12.819588, + 12.839475, + 12.859017, + 12.878223, + 12.897099, + 12.915653, + 12.933893, + 12.951824, + 12.969454, + 12.986790, + 13.003837, + 13.020603, + 13.037092, + 13.053312, + 13.069267, + 13.084964, + 13.100408, + 13.115604, + 13.130557, + 13.145273, + 13.159756, + 13.174011, + 13.188043, + 13.201856, + 13.215455, + 13.228845, + 13.242028, + 13.255011, + 13.267796, + 13.280387, + 13.292789, + 13.305004, + 13.317038, + 13.328893, + 13.340572, + 13.352080, + 13.363419, + 13.374592, + 13.385604, + 13.396457, + 13.407153, + 13.417696, + 13.428090, + 13.438335, + 13.448436, + 13.458395, + 13.468215, + 13.477898, + 13.487446, + 13.496863, + 13.506150, + 13.515310, + 13.524345, + 13.533257, + 13.542049, + 13.550723, + 13.559280, + 13.567724, + 13.576055, + 13.584276, + 13.592388, + 13.600394, + 13.608296, + 13.616095, + 13.623793, + 13.631391, + 13.638892, + 13.646297, + 13.653608, + 13.660826, + 13.667953, + 13.674989, + 13.681938, + 13.688800, + 13.695577, + 13.702270, + 13.708880, + 13.715409, + 13.721858, + 13.728228, + 13.734521, + 13.740738, + 13.746880, + 13.752948, + 13.758944, + 13.764869, + 13.770723, + 13.776508, + 13.782224, + 13.787874, + 13.793458, + 13.798977, + 13.804431, + 13.809823, + 13.815153, + 13.820421, + 13.825630, + 13.830779, + 13.835870, + 13.840903, + 13.845879, + 13.850800, + 13.855666, + 13.860477, + 13.865235, + 13.869941, + 13.874595, + 13.879197, + 13.883749, + 13.888252, + 13.892706, + 13.897111, + 13.901470, + 13.905781, + 13.910046, + 13.914265, + 13.918440, + 13.922570, + 13.926657, + 13.930701, + 13.934703, + 13.938662, + 13.942580, + 13.946458, + 13.950296, + 13.954093, + 13.957852, + 13.961573, + 13.965255, + 13.968900, + 13.972508, + 13.976080, + 13.979615, + 13.983115, + 13.986580, + 13.990011, + 13.993407, + 13.996770, + 14.000099, + 14.003396, + 14.006660, + 14.009892, + 14.013093, + 14.016263, + 14.019402, + 14.022510, + 14.025589, + 14.028638, + 14.031658, + 14.034649, + 14.037612, + 14.040547, + 14.043454, + 14.046333, + 14.049185, + 14.052011, + 14.054811, + 14.057584, + 14.060331, + 14.063054, + 14.065751, + 14.068423, + 14.071071, + 14.073694, + 14.076294, + 14.078870, + 14.081422, + 14.083952, + 14.086459, + 14.088943, + 14.091405, + 14.093845, + 14.096264, + 14.098661, + 14.101037, + 14.103391, + 14.105725, + 14.108039, + 14.110332, + 14.112606, + 14.114859, + 14.117093, + 14.119308, + 14.121504, + 14.123680, + 14.125838, + 14.127978, + 14.130099, + 14.132203, + 14.134288, + 14.136356, + 14.138407, + 14.140440, + 14.142456, + 14.144455, + 14.146438, + 14.148404, + 14.150354, + 14.152288, + 14.154205, + 14.156107, + 14.157994, + 14.159865, + 14.161720, + 14.163561, + 14.165387, + 14.167198, + 14.168994, + 14.170776, + 14.172543, + 14.174296, + 14.176036, + 14.177761, + 14.179473, + 14.181171, + 14.182856, + 14.184527, + 14.186186, + 14.187831, + 14.189463, + 14.191083, + 14.192690, + 14.194285, + 14.195867, + 14.197437, + 14.198995, + 14.200541, + 14.202075, + 14.203598, + 14.205109, + 14.206608, + 14.208096, + 14.209573, + 14.211038, + 14.212493, + 14.213936, + 14.215369, + 14.216791, + 14.218202, + 14.219603, + 14.220994, + 14.222374, + 14.223744, + 14.225104, + 14.226454, + 14.227794, + 14.229124, + 14.230445, + 14.231756, + 14.233057, + 14.234349, + 14.235632, + 14.236906, + 14.238170, + 14.239425, + 14.240671, + 14.241908, + 14.243137, + 14.244357, + 14.245568, + 14.246770, + 14.247964, + 14.249150, + 14.250327, + 14.251497, + 14.252657, + 14.253810, + 14.254955, + 14.256092, + 14.257221, + 14.258342, + 14.259455, + 14.260561, + 14.261659, + 14.262750, + 14.263833, + 14.264909, + 14.265977, + 14.267039, + 14.268093, + 14.269139, + 14.270179, + 14.271212, + 14.272238, + 14.273257, + 14.274269, + 14.275275, + 14.276274, + 14.277266, + 14.278251, + 14.279230, + 14.280203, + 14.281169, + 14.282129, + 14.283083, + 14.284030, + 14.284971, + 14.285906, + 14.286835, + 14.287758, + 14.288675, + 14.289586, + 14.290491, + 14.291391, + 14.292284, + 14.293172, + 14.294054, + 14.294931, + 14.295802, + 14.296668, + 14.297528, + 14.298382, + 14.299231, + 14.300075, + 14.300914, + 14.301747, + 14.302575, + 14.303398, + 14.304216, + 14.305028, + 14.305836, + 14.306639, + 14.307436, + 14.308229, + 14.309017, + 14.309800, + 14.310578, + 14.311352, + 14.312121, + 14.312885, + 14.313644, + 14.314399, + 14.315149, + 14.315895, + 14.316636, + 14.317373, + 14.318105, + 14.318833, + 14.319557, + 14.320276, + 14.320991, + 14.321702, + 14.322408, + 14.323111, + 14.323809, + 14.324503, + 14.325193, + 14.325879, + 14.326561, + 14.327239, + 14.327913, + 14.328583, + 14.329249, + 14.329911, + 14.330570, + 14.331224, + 14.331875, + 14.332522, + 14.333165, + 14.333805, + 14.334441, + 14.335073, + 14.335702, + 14.336327, + 14.336949, + 14.337567, + 14.338182, + 14.338793, + 14.339400, + 14.340004, + 14.340605, + 14.341203, + 14.341797, + 14.342388, + 14.342975, + 14.343559, + 14.344140, + 14.344718, + 14.345292, + 14.345864, + 14.346432, + 14.346997, + 14.347559, + 14.348118, + 14.348674, + 14.349226, + 14.349776, + 14.350323, + 14.350867, + 14.351407, + 14.351945, + 14.352480, + 14.353012, + 14.353542, + 14.354068, + 14.354591, + 14.355112, + 14.355630, + 14.356145, + 14.356658, + 14.357167, + 14.357674, + 14.358179, + 14.358680, + 14.359179, + 14.359675, + 14.360169, + 14.360660, + 14.361149, + 14.361635, + 14.362118, + 14.362599, + 14.363077, + 14.363553, + 14.364027, + 14.364498, + 14.364966, + 14.365432, + 14.365896, + 14.366357, + 14.366816, + 14.367273, + 14.367727, + 14.368179, + 14.368629, + 14.369076, + 14.369521, + 14.369964, + 14.370404, + 14.370842, + 14.371278, + 14.371712, + 14.372144, + 14.372574, + 14.373001, + 14.373426, + 14.373849, + 14.374270, + 14.374689, + 14.375106, + 14.375520, + 14.375933, + 14.376344, + 14.376752, + 14.377159, + 14.377563, + 14.377966, + 14.378366, + 14.378765, + 14.379162, + 14.379556, + 14.379949, + 14.380340, + 14.380729, + 14.381116, + 14.381501, + 14.381884, + 14.382266, + 14.382645, + 14.383023, + 14.383399, + 14.383773, + 14.384146, + 14.384516, + 14.384885, + 14.385252, + 14.385617, + 14.385981, + 14.386343, + 14.386703, + 14.387061, + 14.387418, + 14.387773, + 14.388126, + 14.388478, + 14.388828, + 14.389176, + 14.389523, + 14.389868, + 14.390212, + 14.390554, + 14.390894, + 14.391233, + 14.391570, + 14.391905, + 14.392239, + 14.392572, + 14.392903, + 14.393232, + 14.393560, + 14.393886, + 14.394211, + 14.394535, + 14.394857, + 14.395177, + 14.395496, + 14.395814, + 14.396130, + 14.396445, + 14.396758, + 14.397070, + 14.397380, + 14.397689, + 14.397997, + 14.398303, + 14.398608, + 14.398911, + 14.399213, + 14.399514, + 14.399814, + 14.400112, + 14.400408, + 14.400704, + 14.400998, + 14.401291, + 14.401582, + 14.401873, + 14.402162, + 14.402449, + 14.402736, + 14.403021, + 14.403305, + 14.403588, + 14.403869, + 14.404149, + 14.404428, + 14.404706, + 14.404983, + 14.405258, + 14.405532, + 14.405805, + 14.406077, + 14.406348, + 14.406617, + 14.406885, + 14.407153, + 14.407419, + 14.407683, + 14.407947, + 14.408210, + 14.408471, + 14.408732, + 14.408991, + 14.409249, + 14.409506, + 14.409762, + 14.410017, + 14.410271, + 14.410523, + 14.410775, + 14.411026, + 14.411275, + 14.411524, + 14.411771, + 14.412018, + 14.412263, + 14.412508, + 14.412751, + 14.412993, + 14.413235, + 14.413475, + 14.413714, + 14.413953, + 14.414190, + 14.414426, + 14.414662, + 14.414896, + 14.415130, + 14.415362, + 14.415594, + 14.415824, + 14.416054, + 14.416283, + 14.416511, + 14.416737, + 14.416963, + 14.417188, + 14.417413, + 14.417636, + 14.417858, + 14.418079, + 14.418300, + 14.418520, + 14.418738, + 14.418956, + 14.419173, + 14.419389, + 14.419605, + 14.419819, + 14.420032, + 14.420245, + 14.420457, + 14.420668, + 14.420878, + 14.421087, + 14.421296, + 14.421504, + 14.421711, + 14.421917, + 14.422122, + 14.422326, + 14.422530, + 14.422733, + 14.422935, + 14.423136, + 14.423336, + 14.423536, + 14.423735, + 14.423933, + 14.424130, + 14.424327, + 14.424523, + 14.424718, + 14.424912, + 14.425106, + 14.425298, + 14.425490, + 14.425682, + 14.425872, + 14.426062, + 14.426251, + 14.426440, + 14.426627, + 14.426814, + 14.427001, + 14.427186, + 14.427371, + 14.427555, + 14.427738, + 14.427921, + 14.428103, + 14.428285, + 14.428465, + 14.428645, + 14.428825, + 14.429003, + 14.429181, + 14.429358, + 14.429535, + 14.429711, + 14.429886, + 14.430061, + 14.430235, + 14.430408, + 14.430581, + 14.430753, + 14.430925, + 14.431095, + 14.431266, + 14.431435, + 14.431604, + 14.431772, + 14.431940, + 14.432107, + 14.432273, + 14.432439, + 14.432604, + 14.432769, + 14.432933, + 14.433096, + 14.433259, + 14.433421, + 14.433583, + 14.433744, + 14.433905, + 14.434064, + 14.434224, + 14.434383, + 14.434541, + 14.434698, + 14.434855, + 14.435012, + 14.435168, + 14.435323, + 14.435478, + 14.435632, + 14.435786, + 14.435939, + 14.436091, + 14.436243, + 14.436395, + 14.436546, + 14.436696, + 14.436846, + 14.436995, + 14.437144, + 14.437292, + 14.437440, + 14.437587, + 14.437734, + 14.437880, + 14.438026, + 14.438171, + 14.438316, + 14.438460, + 14.438604, + 14.438747, + 14.438889, + 14.439031, + 14.439173, + 14.439314, + 14.439455, + 14.439595, + 14.439735, + 14.439874, + 14.440013, + 14.440151, + 14.440289, + 14.440426, + 14.440563, + 14.440699, + 14.440835, + 14.440971, + 14.441106, + 14.441240, + 14.441374, + 14.441508, + 14.441641, + 14.441774, + 14.441906, + 14.442038, + 14.442169, + 14.442300, + 14.442430, + 14.442560, + 14.442690, + 14.442819, + 14.442947, + 14.443076, + 14.443204, + 14.443331, + 14.443458, + 14.443584, + 14.443711, + 14.443836, + 14.443961, + 14.444086, + 14.444211, + 14.444335, + 14.444458, + 14.444582, + 14.444704, + 14.444827, + 14.444949, + 14.445070, + 14.445191, + 14.445312, + 14.445433, + 14.445552, + 14.445672, + 14.445791, + 14.445910, + 14.446028, + 14.446146, + 14.446264, + 14.446381, + 14.446498, + 14.446615, + 14.446731, + 14.446846, + 14.446962, + 14.447077, + 14.447191, + 14.447306, + 14.447419, + 14.447533, + 14.447646, + 14.447759, + 14.447871, + 14.447983, + 14.448095, + 14.448206, + 14.448317, + 14.448428, + 14.448538, + 14.448648, + 14.448757, + 14.448866, + 14.448975, + 14.449084, + 14.449192, + 14.449300, + 14.449407, + 14.449514, + 14.449621, + 14.449727, + 14.449834, + 14.449939, + 14.450045, + 14.450150, + 14.450255, + 14.450359, + 14.450463, + 14.450567, + 14.450670, + 14.450774, + 14.450876, + 14.450979, + 14.451081, + 14.451183, + 14.451284, + 14.451386, + 14.451486, + 14.451587, + 14.451687, + 14.451787, + 14.451887, + 14.451986, + 14.452085, + 14.452184, + 14.452282, + 14.452381, + 14.452478, + 14.452576, + 14.452673, + 14.452770, + 14.452867, + 14.452963, + 14.453059, + 14.453155, + 14.453250, + 14.453345, + 14.453440, + 14.453535, + 14.453629, + 14.453723, + 14.453817, + 14.453910, + 14.454003, + 14.454096, + 14.454189, + 14.454281, + 14.454373, + 14.454465, + 14.454556, + 14.454648, + 14.454738, + 14.454829, + 14.454920, + 14.455010, + 14.455099, + }, + {// The expectations for dimension = 30 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601666, + 1.706665, + 1.814997, + 1.926661, + 2.041655, + 2.159978, + 2.281626, + 2.406594, + 2.534873, + 2.666451, + 2.801309, + 2.939421, + 3.080752, + 3.225252, + 3.372858, + 3.523487, + 3.677036, + 3.833378, + 3.992360, + 4.153802, + 4.317497, + 4.483210, + 4.650680, + 4.819622, + 4.989734, + 5.160695, + 5.332174, + 5.503837, + 5.675348, + 5.846377, + 6.016603, + 6.185723, + 6.353450, + 6.519520, + 6.683692, + 6.845750, + 7.005507, + 7.162796, + 7.317481, + 7.469446, + 7.618598, + 7.764868, + 7.908203, + 8.048567, + 8.185941, + 8.320319, + 8.451706, + 8.580119, + 8.705580, + 8.828123, + 8.947784, + 9.064607, + 9.178639, + 9.289930, + 9.398534, + 9.504506, + 9.607902, + 9.708780, + 9.807199, + 9.903216, + 9.996891, + 10.088282, + 10.177448, + 10.264445, + 10.349330, + 10.432159, + 10.512987, + 10.591869, + 10.668856, + 10.744000, + 10.817352, + 10.888962, + 10.958877, + 11.027144, + 11.093809, + 11.158916, + 11.222509, + 11.284630, + 11.345319, + 11.404617, + 11.462562, + 11.519191, + 11.574541, + 11.628648, + 11.681544, + 11.733264, + 11.783841, + 11.833304, + 11.881685, + 11.929012, + 11.975315, + 12.020622, + 12.064958, + 12.108349, + 12.150822, + 12.192401, + 12.233108, + 12.272968, + 12.312003, + 12.350233, + 12.387680, + 12.424365, + 12.460306, + 12.495524, + 12.530036, + 12.563861, + 12.597016, + 12.629518, + 12.661383, + 12.692628, + 12.723267, + 12.753317, + 12.782790, + 12.811702, + 12.840066, + 12.867896, + 12.895204, + 12.922003, + 12.948306, + 12.974123, + 12.999468, + 13.024349, + 13.048780, + 13.072770, + 13.096329, + 13.119468, + 13.142196, + 13.164522, + 13.186457, + 13.208008, + 13.229184, + 13.249994, + 13.270447, + 13.290549, + 13.310309, + 13.329734, + 13.348833, + 13.367610, + 13.386075, + 13.404234, + 13.422092, + 13.439658, + 13.456936, + 13.473933, + 13.490656, + 13.507109, + 13.523298, + 13.539230, + 13.554909, + 13.570340, + 13.585529, + 13.600480, + 13.615199, + 13.629691, + 13.643959, + 13.658008, + 13.671843, + 13.685467, + 13.698886, + 13.712103, + 13.725122, + 13.737947, + 13.750582, + 13.763031, + 13.775296, + 13.787382, + 13.799292, + 13.811030, + 13.822598, + 13.834000, + 13.845239, + 13.856318, + 13.867240, + 13.878008, + 13.888625, + 13.899093, + 13.909416, + 13.919596, + 13.929635, + 13.939537, + 13.949302, + 13.958935, + 13.968438, + 13.977812, + 13.987060, + 13.996184, + 14.005187, + 14.014070, + 14.022836, + 14.031487, + 14.040024, + 14.048450, + 14.056766, + 14.064975, + 14.073078, + 14.081077, + 14.088974, + 14.096770, + 14.104467, + 14.112067, + 14.119572, + 14.126982, + 14.134301, + 14.141528, + 14.148666, + 14.155716, + 14.162679, + 14.169557, + 14.176351, + 14.183063, + 14.189694, + 14.196245, + 14.202718, + 14.209113, + 14.215432, + 14.221676, + 14.227846, + 14.233944, + 14.239970, + 14.245926, + 14.251813, + 14.257632, + 14.263383, + 14.269068, + 14.274688, + 14.280244, + 14.285737, + 14.291167, + 14.296536, + 14.301845, + 14.307094, + 14.312285, + 14.317418, + 14.322494, + 14.327514, + 14.332478, + 14.337389, + 14.342245, + 14.347049, + 14.351800, + 14.356500, + 14.361150, + 14.365749, + 14.370299, + 14.374801, + 14.379255, + 14.383662, + 14.388022, + 14.392336, + 14.396606, + 14.400830, + 14.405011, + 14.409148, + 14.413242, + 14.417294, + 14.421305, + 14.425275, + 14.429204, + 14.433093, + 14.436942, + 14.440753, + 14.444525, + 14.448260, + 14.451957, + 14.455617, + 14.459241, + 14.462829, + 14.466382, + 14.469900, + 14.473383, + 14.476832, + 14.480247, + 14.483629, + 14.486979, + 14.490296, + 14.493581, + 14.496835, + 14.500057, + 14.503249, + 14.506411, + 14.509542, + 14.512644, + 14.515717, + 14.518761, + 14.521776, + 14.524764, + 14.527723, + 14.530655, + 14.533560, + 14.536438, + 14.539290, + 14.542115, + 14.544915, + 14.547689, + 14.550438, + 14.553162, + 14.555862, + 14.558537, + 14.561188, + 14.563816, + 14.566420, + 14.569001, + 14.571559, + 14.574094, + 14.576607, + 14.579098, + 14.581567, + 14.584015, + 14.586441, + 14.588846, + 14.591230, + 14.593594, + 14.595937, + 14.598260, + 14.600563, + 14.602847, + 14.605111, + 14.607356, + 14.609581, + 14.611788, + 14.613977, + 14.616147, + 14.618299, + 14.620432, + 14.622548, + 14.624647, + 14.626728, + 14.628792, + 14.630838, + 14.632868, + 14.634882, + 14.636879, + 14.638859, + 14.640824, + 14.642772, + 14.644705, + 14.646622, + 14.648524, + 14.650410, + 14.652282, + 14.654138, + 14.655980, + 14.657807, + 14.659619, + 14.661418, + 14.663202, + 14.664972, + 14.666728, + 14.668470, + 14.670199, + 14.671914, + 14.673616, + 14.675305, + 14.676981, + 14.678644, + 14.680294, + 14.681932, + 14.683557, + 14.685169, + 14.686770, + 14.688358, + 14.689934, + 14.691498, + 14.693051, + 14.694592, + 14.696121, + 14.697639, + 14.699145, + 14.700641, + 14.702125, + 14.703598, + 14.705061, + 14.706512, + 14.707953, + 14.709384, + 14.710804, + 14.712213, + 14.713613, + 14.715002, + 14.716381, + 14.717750, + 14.719109, + 14.720459, + 14.721799, + 14.723129, + 14.724450, + 14.725761, + 14.727063, + 14.728356, + 14.729639, + 14.730914, + 14.732180, + 14.733436, + 14.734684, + 14.735923, + 14.737154, + 14.738376, + 14.739590, + 14.740795, + 14.741991, + 14.743180, + 14.744360, + 14.745533, + 14.746697, + 14.747853, + 14.749001, + 14.750142, + 14.751275, + 14.752400, + 14.753518, + 14.754628, + 14.755730, + 14.756825, + 14.757913, + 14.758994, + 14.760067, + 14.761133, + 14.762192, + 14.763244, + 14.764290, + 14.765328, + 14.766359, + 14.767384, + 14.768402, + 14.769413, + 14.770418, + 14.771416, + 14.772408, + 14.773393, + 14.774372, + 14.775344, + 14.776311, + 14.777271, + 14.778225, + 14.779173, + 14.780114, + 14.781050, + 14.781980, + 14.782904, + 14.783822, + 14.784734, + 14.785641, + 14.786542, + 14.787437, + 14.788326, + 14.789210, + 14.790089, + 14.790962, + 14.791829, + 14.792691, + 14.793548, + 14.794400, + 14.795246, + 14.796087, + 14.796923, + 14.797754, + 14.798580, + 14.799401, + 14.800216, + 14.801027, + 14.801833, + 14.802634, + 14.803430, + 14.804221, + 14.805008, + 14.805790, + 14.806567, + 14.807339, + 14.808107, + 14.808870, + 14.809629, + 14.810383, + 14.811133, + 14.811879, + 14.812620, + 14.813356, + 14.814088, + 14.814816, + 14.815540, + 14.816260, + 14.816975, + 14.817686, + 14.818393, + 14.819096, + 14.819795, + 14.820490, + 14.821181, + 14.821867, + 14.822550, + 14.823229, + 14.823904, + 14.824576, + 14.825243, + 14.825907, + 14.826566, + 14.827223, + 14.827875, + 14.828524, + 14.829169, + 14.829810, + 14.830448, + 14.831082, + 14.831713, + 14.832340, + 14.832964, + 14.833584, + 14.834201, + 14.834814, + 14.835424, + 14.836031, + 14.836634, + 14.837234, + 14.837831, + 14.838424, + 14.839014, + 14.839601, + 14.840185, + 14.840765, + 14.841343, + 14.841917, + 14.842488, + 14.843056, + 14.843621, + 14.844183, + 14.844742, + 14.845298, + 14.845851, + 14.846401, + 14.846948, + 14.847492, + 14.848033, + 14.848572, + 14.849107, + 14.849640, + 14.850170, + 14.850697, + 14.851221, + 14.851743, + 14.852261, + 14.852778, + 14.853291, + 14.853802, + 14.854310, + 14.854815, + 14.855318, + 14.855818, + 14.856316, + 14.856811, + 14.857303, + 14.857793, + 14.858281, + 14.858766, + 14.859248, + 14.859728, + 14.860206, + 14.860681, + 14.861154, + 14.861624, + 14.862092, + 14.862558, + 14.863021, + 14.863482, + 14.863940, + 14.864396, + 14.864850, + 14.865302, + 14.865752, + 14.866199, + 14.866644, + 14.867086, + 14.867527, + 14.867965, + 14.868402, + 14.868836, + 14.869267, + 14.869697, + 14.870125, + 14.870550, + 14.870974, + 14.871395, + 14.871815, + 14.872232, + 14.872647, + 14.873060, + 14.873472, + 14.873881, + 14.874288, + 14.874693, + 14.875097, + 14.875498, + 14.875898, + 14.876295, + 14.876691, + 14.877085, + 14.877477, + 14.877867, + 14.878255, + 14.878641, + 14.879025, + 14.879408, + 14.879789, + 14.880168, + 14.880545, + 14.880921, + 14.881294, + 14.881666, + 14.882036, + 14.882405, + 14.882772, + 14.883137, + 14.883500, + 14.883862, + 14.884222, + 14.884580, + 14.884937, + 14.885292, + 14.885645, + 14.885997, + 14.886347, + 14.886695, + 14.887042, + 14.887387, + 14.887731, + 14.888073, + 14.888414, + 14.888753, + 14.889091, + 14.889426, + 14.889761, + 14.890094, + 14.890425, + 14.890755, + 14.891084, + 14.891411, + 14.891736, + 14.892060, + 14.892383, + 14.892704, + 14.893024, + 14.893342, + 14.893659, + 14.893974, + 14.894288, + 14.894601, + 14.894912, + 14.895222, + 14.895531, + 14.895838, + 14.896144, + 14.896448, + 14.896751, + 14.897053, + 14.897354, + 14.897653, + 14.897951, + 14.898247, + 14.898543, + 14.898837, + 14.899129, + 14.899421, + 14.899711, + 14.900000, + 14.900288, + 14.900574, + 14.900859, + 14.901143, + 14.901426, + 14.901708, + 14.901988, + 14.902267, + 14.902545, + 14.902822, + 14.903098, + 14.903372, + 14.903646, + 14.903918, + 14.904189, + 14.904459, + 14.904727, + 14.904995, + 14.905261, + 14.905527, + 14.905791, + 14.906054, + 14.906316, + 14.906577, + 14.906837, + 14.907096, + 14.907353, + 14.907610, + 14.907865, + 14.908120, + 14.908373, + 14.908626, + 14.908877, + 14.909127, + 14.909377, + 14.909625, + 14.909872, + 14.910118, + 14.910364, + 14.910608, + 14.910851, + 14.911093, + 14.911335, + 14.911575, + 14.911814, + 14.912052, + 14.912290, + 14.912526, + 14.912762, + 14.912996, + 14.913230, + 14.913462, + 14.913694, + 14.913925, + 14.914155, + 14.914384, + 14.914612, + 14.914839, + 14.915065, + 14.915290, + 14.915514, + 14.915738, + 14.915961, + 14.916182, + 14.916403, + 14.916623, + 14.916842, + 14.917061, + 14.917278, + 14.917495, + 14.917710, + 14.917925, + 14.918139, + 14.918352, + 14.918565, + 14.918776, + 14.918987, + 14.919197, + 14.919406, + 14.919614, + 14.919822, + 14.920028, + 14.920234, + 14.920439, + 14.920643, + 14.920847, + 14.921050, + 14.921252, + 14.921453, + 14.921653, + 14.921853, + 14.922052, + 14.922250, + 14.922447, + 14.922644, + 14.922839, + 14.923035, + 14.923229, + 14.923423, + 14.923615, + 14.923808, + 14.923999, + 14.924190, + 14.924380, + 14.924569, + 14.924758, + 14.924946, + 14.925133, + 14.925319, + 14.925505, + 14.925690, + 14.925875, + 14.926058, + 14.926241, + 14.926424, + 14.926605, + 14.926786, + 14.926967, + 14.927146, + 14.927326, + 14.927504, + 14.927682, + 14.927859, + 14.928035, + 14.928211, + 14.928386, + 14.928560, + 14.928734, + 14.928907, + 14.929080, + 14.929252, + 14.929423, + 14.929594, + 14.929764, + 14.929934, + 14.930102, + 14.930271, + 14.930438, + 14.930605, + 14.930772, + 14.930938, + 14.931103, + 14.931268, + 14.931432, + 14.931595, + 14.931758, + 14.931920, + 14.932082, + 14.932243, + 14.932404, + 14.932564, + 14.932723, + 14.932882, + 14.933040, + 14.933198, + 14.933355, + 14.933512, + 14.933668, + 14.933824, + 14.933979, + 14.934133, + 14.934287, + 14.934441, + 14.934593, + 14.934746, + 14.934898, + 14.935049, + 14.935200, + 14.935350, + 14.935499, + 14.935649, + 14.935797, + 14.935945, + 14.936093, + 14.936240, + 14.936387, + 14.936533, + 14.936678, + 14.936823, + 14.936968, + 14.937112, + 14.937256, + 14.937399, + 14.937542, + 14.937684, + 14.937825, + 14.937967, + 14.938107, + 14.938247, + 14.938387, + 14.938526, + 14.938665, + 14.938804, + 14.938941, + 14.939079, + 14.939216, + 14.939352, + 14.939488, + 14.939624, + 14.939759, + 14.939894, + 14.940028, + 14.940162, + 14.940295, + 14.940428, + 14.940560, + 14.940692, + 14.940824, + 14.940955, + 14.941085, + 14.941216, + 14.941345, + 14.941475, + 14.941604, + 14.941732, + 14.941860, + 14.941988, + 14.942115, + 14.942242, + 14.942369, + 14.942495, + 14.942620, + 14.942745, + 14.942870, + 14.942994, + 14.943118, + 14.943242, + 14.943365, + 14.943488, + 14.943610, + 14.943732, + 14.943854, + 14.943975, + 14.944096, + 14.944216, + 14.944336, + 14.944456, + 14.944575, + 14.944694, + 14.944812, + 14.944930, + 14.945048, + 14.945165, + 14.945282, + 14.945399, + 14.945515, + 14.945631, + 14.945746, + 14.945862, + 14.945976, + 14.946091, + 14.946205, + 14.946318, + 14.946432, + 14.946545, + 14.946657, + 14.946769, + 14.946881, + 14.946993, + 14.947104, + 14.947215, + 14.947325, + 14.947435, + 14.947545, + 14.947654, + 14.947764, + 14.947872, + 14.947981, + 14.948089, + 14.948197, + 14.948304, + 14.948411, + 14.948518, + 14.948624, + 14.948730, + 14.948836, + 14.948941, + 14.949046, + 14.949151, + 14.949256, + 14.949360, + 14.949464, + 14.949567, + 14.949670, + 14.949773, + 14.949876, + 14.949978, + 14.950080, + 14.950181, + 14.950283, + 14.950384, + 14.950484, + 14.950585, + 14.950685, + 14.950785, + 14.950884, + 14.950983, + 14.951082, + 14.951181, + 14.951279, + 14.951377, + 14.951474, + 14.951572, + 14.951669, + 14.951766, + 14.951862, + 14.951958, + 14.952054, + }, + {// The expectations for dimension = 31 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601666, + 1.706666, + 1.814998, + 1.926664, + 2.041660, + 2.159988, + 2.281643, + 2.406624, + 2.534923, + 2.666533, + 2.801441, + 2.939628, + 3.081066, + 3.225721, + 3.373541, + 3.524464, + 3.678404, + 3.835258, + 3.994898, + 4.157171, + 4.321895, + 4.488862, + 4.657837, + 4.828558, + 5.000742, + 5.174083, + 5.348263, + 5.522952, + 5.697814, + 5.872514, + 6.046723, + 6.220122, + 6.392406, + 6.563291, + 6.732511, + 6.899827, + 7.065024, + 7.227910, + 7.388323, + 7.546124, + 7.701196, + 7.853446, + 8.002803, + 8.149213, + 8.292639, + 8.433061, + 8.570471, + 8.704873, + 8.836281, + 8.964718, + 9.090215, + 9.212807, + 9.332538, + 9.449453, + 9.563601, + 9.675034, + 9.783807, + 9.889975, + 9.993596, + 10.094726, + 10.193425, + 10.289751, + 10.383760, + 10.475512, + 10.565062, + 10.652469, + 10.737786, + 10.821070, + 10.902374, + 10.981750, + 11.059251, + 11.134926, + 11.208827, + 11.280999, + 11.351492, + 11.420350, + 11.487619, + 11.553341, + 11.617560, + 11.680316, + 11.741649, + 11.801599, + 11.860203, + 11.917497, + 11.973519, + 12.028301, + 12.081879, + 12.134284, + 12.185548, + 12.235701, + 12.284774, + 12.332796, + 12.379795, + 12.425797, + 12.470829, + 12.514917, + 12.558085, + 12.600358, + 12.641760, + 12.682312, + 12.722036, + 12.760955, + 12.799088, + 12.836456, + 12.873078, + 12.908973, + 12.944160, + 12.978656, + 13.012479, + 13.045645, + 13.078171, + 13.110072, + 13.141363, + 13.172060, + 13.202178, + 13.231729, + 13.260728, + 13.289189, + 13.317123, + 13.344543, + 13.371462, + 13.397892, + 13.423843, + 13.449327, + 13.474355, + 13.498937, + 13.523084, + 13.546805, + 13.570111, + 13.593010, + 13.615512, + 13.637626, + 13.659360, + 13.680723, + 13.701723, + 13.722369, + 13.742667, + 13.762625, + 13.782252, + 13.801553, + 13.820536, + 13.839208, + 13.857576, + 13.875645, + 13.893423, + 13.910915, + 13.928127, + 13.945065, + 13.961735, + 13.978143, + 13.994293, + 14.010191, + 14.025842, + 14.041252, + 14.056424, + 14.071364, + 14.086077, + 14.100566, + 14.114837, + 14.128893, + 14.142740, + 14.156380, + 14.169818, + 14.183058, + 14.196104, + 14.208960, + 14.221628, + 14.234113, + 14.246418, + 14.258547, + 14.270502, + 14.282288, + 14.293907, + 14.305362, + 14.316656, + 14.327793, + 14.338775, + 14.349605, + 14.360286, + 14.370820, + 14.381211, + 14.391460, + 14.401570, + 14.411544, + 14.421384, + 14.431092, + 14.440672, + 14.450124, + 14.459451, + 14.468656, + 14.477740, + 14.486706, + 14.495556, + 14.504291, + 14.512914, + 14.521426, + 14.529830, + 14.538126, + 14.546318, + 14.554406, + 14.562392, + 14.570279, + 14.578068, + 14.585759, + 14.593356, + 14.600859, + 14.608270, + 14.615591, + 14.622822, + 14.629966, + 14.637023, + 14.643996, + 14.650885, + 14.657692, + 14.664418, + 14.671064, + 14.677632, + 14.684122, + 14.690537, + 14.696877, + 14.703143, + 14.709336, + 14.715459, + 14.721510, + 14.727493, + 14.733407, + 14.739254, + 14.745035, + 14.750751, + 14.756402, + 14.761990, + 14.767516, + 14.772980, + 14.778384, + 14.783728, + 14.789013, + 14.794240, + 14.799410, + 14.804524, + 14.809583, + 14.814587, + 14.819537, + 14.824433, + 14.829278, + 14.834071, + 14.838813, + 14.843504, + 14.848146, + 14.852740, + 14.857285, + 14.861783, + 14.866234, + 14.870639, + 14.874998, + 14.879313, + 14.883583, + 14.887810, + 14.891993, + 14.896134, + 14.900233, + 14.904290, + 14.908307, + 14.912283, + 14.916220, + 14.920117, + 14.923976, + 14.927797, + 14.931579, + 14.935325, + 14.939034, + 14.942707, + 14.946343, + 14.949945, + 14.953512, + 14.957044, + 14.960542, + 14.964007, + 14.967438, + 14.970837, + 14.974204, + 14.977538, + 14.980841, + 14.984114, + 14.987355, + 14.990566, + 14.993747, + 14.996899, + 15.000021, + 15.003114, + 15.006179, + 15.009216, + 15.012225, + 15.015207, + 15.018161, + 15.021088, + 15.023990, + 15.026864, + 15.029713, + 15.032537, + 15.035335, + 15.038108, + 15.040857, + 15.043581, + 15.046281, + 15.048957, + 15.051610, + 15.054240, + 15.056846, + 15.059430, + 15.061992, + 15.064531, + 15.067048, + 15.069544, + 15.072018, + 15.074471, + 15.076903, + 15.079314, + 15.081705, + 15.084075, + 15.086426, + 15.088756, + 15.091067, + 15.093359, + 15.095632, + 15.097885, + 15.100120, + 15.102337, + 15.104535, + 15.106715, + 15.108877, + 15.111021, + 15.113148, + 15.115258, + 15.117350, + 15.119425, + 15.121484, + 15.123526, + 15.125551, + 15.127561, + 15.129554, + 15.131531, + 15.133493, + 15.135438, + 15.137369, + 15.139284, + 15.141185, + 15.143070, + 15.144940, + 15.146796, + 15.148638, + 15.150465, + 15.152278, + 15.154076, + 15.155861, + 15.157633, + 15.159390, + 15.161134, + 15.162865, + 15.164583, + 15.166288, + 15.167979, + 15.169658, + 15.171324, + 15.172978, + 15.174619, + 15.176248, + 15.177865, + 15.179470, + 15.181063, + 15.182644, + 15.184213, + 15.185771, + 15.187317, + 15.188852, + 15.190375, + 15.191888, + 15.193389, + 15.194880, + 15.196360, + 15.197829, + 15.199287, + 15.200735, + 15.202172, + 15.203600, + 15.205017, + 15.206424, + 15.207820, + 15.209207, + 15.210584, + 15.211952, + 15.213309, + 15.214658, + 15.215996, + 15.217326, + 15.218646, + 15.219957, + 15.221258, + 15.222551, + 15.223835, + 15.225109, + 15.226376, + 15.227633, + 15.228882, + 15.230122, + 15.231353, + 15.232577, + 15.233792, + 15.234999, + 15.236197, + 15.237388, + 15.238570, + 15.239745, + 15.240911, + 15.242070, + 15.243221, + 15.244364, + 15.245500, + 15.246629, + 15.247749, + 15.248863, + 15.249969, + 15.251067, + 15.252159, + 15.253243, + 15.254321, + 15.255391, + 15.256454, + 15.257511, + 15.258560, + 15.259603, + 15.260639, + 15.261669, + 15.262691, + 15.263708, + 15.264717, + 15.265721, + 15.266717, + 15.267708, + 15.268692, + 15.269670, + 15.270642, + 15.271608, + 15.272567, + 15.273521, + 15.274469, + 15.275410, + 15.276346, + 15.277276, + 15.278200, + 15.279119, + 15.280032, + 15.280939, + 15.281841, + 15.282737, + 15.283627, + 15.284512, + 15.285392, + 15.286266, + 15.287135, + 15.287999, + 15.288857, + 15.289711, + 15.290559, + 15.291402, + 15.292240, + 15.293073, + 15.293901, + 15.294724, + 15.295542, + 15.296355, + 15.297163, + 15.297967, + 15.298766, + 15.299560, + 15.300349, + 15.301134, + 15.301914, + 15.302689, + 15.303460, + 15.304227, + 15.304989, + 15.305747, + 15.306500, + 15.307249, + 15.307993, + 15.308733, + 15.309469, + 15.310201, + 15.310929, + 15.311652, + 15.312371, + 15.313086, + 15.313797, + 15.314504, + 15.315207, + 15.315906, + 15.316601, + 15.317292, + 15.317980, + 15.318663, + 15.319343, + 15.320018, + 15.320690, + 15.321358, + 15.322023, + 15.322684, + 15.323341, + 15.323994, + 15.324644, + 15.325290, + 15.325933, + 15.326572, + 15.327208, + 15.327840, + 15.328469, + 15.329094, + 15.329716, + 15.330334, + 15.330949, + 15.331561, + 15.332170, + 15.332775, + 15.333377, + 15.333976, + 15.334571, + 15.335163, + 15.335752, + 15.336338, + 15.336921, + 15.337501, + 15.338078, + 15.338651, + 15.339222, + 15.339789, + 15.340354, + 15.340915, + 15.341474, + 15.342030, + 15.342582, + 15.343132, + 15.343679, + 15.344223, + 15.344765, + 15.345303, + 15.345839, + 15.346372, + 15.346902, + 15.347429, + 15.347954, + 15.348476, + 15.348996, + 15.349512, + 15.350026, + 15.350538, + 15.351046, + 15.351553, + 15.352056, + 15.352557, + 15.353056, + 15.353552, + 15.354045, + 15.354536, + 15.355025, + 15.355511, + 15.355995, + 15.356476, + 15.356955, + 15.357431, + 15.357905, + 15.358377, + 15.358846, + 15.359314, + 15.359778, + 15.360241, + 15.360701, + 15.361159, + 15.361614, + 15.362068, + 15.362519, + 15.362968, + 15.363415, + 15.363859, + 15.364302, + 15.364742, + 15.365180, + 15.365616, + 15.366050, + 15.366482, + 15.366912, + 15.367339, + 15.367765, + 15.368189, + 15.368610, + 15.369030, + 15.369447, + 15.369863, + 15.370276, + 15.370688, + 15.371097, + 15.371505, + 15.371911, + 15.372315, + 15.372717, + 15.373117, + 15.373515, + 15.373911, + 15.374305, + 15.374698, + 15.375089, + 15.375478, + 15.375865, + 15.376250, + 15.376634, + 15.377015, + 15.377395, + 15.377774, + 15.378150, + 15.378525, + 15.378898, + 15.379269, + 15.379639, + 15.380007, + 15.380373, + 15.380737, + 15.381100, + 15.381462, + 15.381821, + 15.382179, + 15.382536, + 15.382890, + 15.383243, + 15.383595, + 15.383945, + 15.384293, + 15.384640, + 15.384985, + 15.385329, + 15.385671, + 15.386012, + 15.386351, + 15.386689, + 15.387025, + 15.387359, + 15.387692, + 15.388024, + 15.388354, + 15.388683, + 15.389010, + 15.389336, + 15.389661, + 15.389984, + 15.390305, + 15.390625, + 15.390944, + 15.391262, + 15.391578, + 15.391892, + 15.392205, + 15.392517, + 15.392828, + 15.393137, + 15.393445, + 15.393751, + 15.394057, + 15.394361, + 15.394663, + 15.394965, + 15.395265, + 15.395563, + 15.395861, + 15.396157, + 15.396452, + 15.396746, + 15.397038, + 15.397329, + 15.397619, + 15.397908, + 15.398195, + 15.398482, + 15.398767, + 15.399051, + 15.399333, + 15.399615, + 15.399895, + 15.400175, + 15.400453, + 15.400729, + 15.401005, + 15.401280, + 15.401553, + 15.401825, + 15.402097, + 15.402367, + 15.402635, + 15.402903, + 15.403170, + 15.403436, + 15.403700, + 15.403964, + 15.404226, + 15.404487, + 15.404747, + 15.405007, + 15.405265, + 15.405522, + 15.405778, + 15.406033, + 15.406287, + 15.406540, + 15.406791, + 15.407042, + 15.407292, + 15.407541, + 15.407789, + 15.408036, + 15.408282, + 15.408526, + 15.408770, + 15.409013, + 15.409255, + 15.409496, + 15.409736, + 15.409975, + 15.410214, + 15.410451, + 15.410687, + 15.410922, + 15.411157, + 15.411390, + 15.411623, + 15.411854, + 15.412085, + 15.412315, + 15.412544, + 15.412772, + 15.412999, + 15.413225, + 15.413451, + 15.413675, + 15.413899, + 15.414122, + 15.414344, + 15.414565, + 15.414785, + 15.415004, + 15.415223, + 15.415440, + 15.415657, + 15.415873, + 15.416088, + 15.416303, + 15.416516, + 15.416729, + 15.416941, + 15.417152, + 15.417362, + 15.417572, + 15.417780, + 15.417988, + 15.418195, + 15.418402, + 15.418607, + 15.418812, + 15.419016, + 15.419219, + 15.419422, + 15.419623, + 15.419824, + 15.420024, + 15.420224, + 15.420423, + 15.420620, + 15.420818, + 15.421014, + 15.421210, + 15.421405, + 15.421599, + 15.421793, + 15.421986, + 15.422178, + 15.422369, + 15.422560, + 15.422750, + 15.422940, + 15.423128, + 15.423316, + 15.423503, + 15.423690, + 15.423876, + 15.424061, + 15.424246, + 15.424430, + 15.424613, + 15.424795, + 15.424977, + 15.425159, + 15.425339, + 15.425519, + 15.425698, + 15.425877, + 15.426055, + 15.426232, + 15.426409, + 15.426585, + 15.426760, + 15.426935, + 15.427110, + 15.427283, + 15.427456, + 15.427628, + 15.427800, + 15.427971, + 15.428142, + 15.428312, + 15.428481, + 15.428650, + 15.428818, + 15.428985, + 15.429152, + 15.429318, + 15.429484, + 15.429649, + 15.429814, + 15.429978, + 15.430141, + 15.430304, + 15.430467, + 15.430628, + 15.430789, + 15.430950, + 15.431110, + 15.431270, + 15.431429, + 15.431587, + 15.431745, + 15.431902, + 15.432059, + 15.432215, + 15.432371, + 15.432526, + 15.432680, + 15.432835, + 15.432988, + 15.433141, + 15.433294, + 15.433446, + 15.433597, + 15.433748, + 15.433898, + 15.434048, + 15.434198, + 15.434347, + 15.434495, + 15.434643, + 15.434790, + 15.434937, + 15.435084, + 15.435230, + 15.435375, + 15.435520, + 15.435664, + 15.435808, + 15.435952, + 15.436095, + 15.436237, + 15.436379, + 15.436521, + 15.436662, + 15.436803, + 15.436943, + 15.437082, + 15.437222, + 15.437360, + 15.437499, + 15.437637, + 15.437774, + 15.437911, + 15.438047, + 15.438184, + 15.438319, + 15.438454, + 15.438589, + 15.438723, + 15.438857, + 15.438990, + 15.439123, + 15.439256, + 15.439388, + 15.439520, + 15.439651, + 15.439782, + 15.439912, + 15.440042, + 15.440172, + 15.440301, + 15.440429, + 15.440558, + 15.440685, + 15.440813, + 15.440940, + 15.441067, + 15.441193, + 15.441319, + 15.441444, + 15.441569, + 15.441694, + 15.441818, + 15.441942, + 15.442065, + 15.442188, + 15.442311, + 15.442433, + 15.442555, + 15.442676, + 15.442798, + 15.442918, + 15.443039, + 15.443159, + 15.443278, + 15.443397, + 15.443516, + 15.443635, + 15.443753, + 15.443870, + 15.443988, + 15.444105, + 15.444221, + 15.444338, + 15.444453, + 15.444569, + 15.444684, + 15.444799, + 15.444913, + 15.445027, + 15.445141, + 15.445255, + 15.445368, + 15.445480, + 15.445593, + 15.445705, + 15.445816, + 15.445927, + 15.446038, + 15.446149, + 15.446259, + 15.446369, + 15.446479, + 15.446588, + 15.446697, + 15.446806, + 15.446914, + 15.447022, + 15.447129, + 15.447237, + 15.447344, + 15.447450, + 15.447557, + 15.447663, + 15.447768, + 15.447874, + 15.447979, + 15.448083, + 15.448188, + 15.448292, + 15.448396, + 15.448499, + 15.448602, + 15.448705, + 15.448807, + 15.448910, + }, + {// The expectations for dimension = 32 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706666, + 1.814999, + 1.926665, + 2.041663, + 2.159993, + 2.281653, + 2.406641, + 2.534954, + 2.666585, + 2.801526, + 2.939763, + 3.081277, + 3.226040, + 3.374016, + 3.525154, + 3.679388, + 3.836633, + 3.996785, + 4.159713, + 4.325264, + 4.493254, + 4.663474, + 4.835688, + 5.009633, + 5.185026, + 5.361560, + 5.538917, + 5.716768, + 5.894776, + 6.072608, + 6.249935, + 6.426438, + 6.601815, + 6.775781, + 6.948073, + 7.118450, + 7.286697, + 7.452627, + 7.616073, + 7.776897, + 7.934984, + 8.090239, + 8.242589, + 8.391980, + 8.538376, + 8.681753, + 8.822103, + 8.959429, + 9.093744, + 9.225069, + 9.353434, + 9.478875, + 9.601431, + 9.721148, + 9.838073, + 9.952260, + 10.063759, + 10.172628, + 10.278921, + 10.382696, + 10.484011, + 10.582922, + 10.679488, + 10.773766, + 10.865813, + 10.955685, + 11.043437, + 11.129124, + 11.212800, + 11.294517, + 11.374328, + 11.452283, + 11.528430, + 11.602820, + 11.675498, + 11.746511, + 11.815904, + 11.883721, + 11.950003, + 12.014794, + 12.078132, + 12.140057, + 12.200607, + 12.259819, + 12.317729, + 12.374373, + 12.429784, + 12.483994, + 12.537037, + 12.588943, + 12.639742, + 12.689463, + 12.738136, + 12.785787, + 12.832443, + 12.878131, + 12.922874, + 12.966699, + 13.009629, + 13.051685, + 13.092892, + 13.133271, + 13.172842, + 13.211627, + 13.249644, + 13.286913, + 13.323454, + 13.359283, + 13.394419, + 13.428879, + 13.462679, + 13.495835, + 13.528364, + 13.560279, + 13.591597, + 13.622332, + 13.652496, + 13.682105, + 13.711170, + 13.739706, + 13.767724, + 13.795236, + 13.822254, + 13.848790, + 13.874854, + 13.900458, + 13.925612, + 13.950325, + 13.974609, + 13.998473, + 14.021926, + 14.044977, + 14.067636, + 14.089910, + 14.111808, + 14.133340, + 14.154511, + 14.175331, + 14.195807, + 14.215946, + 14.235756, + 14.255243, + 14.274414, + 14.293276, + 14.311836, + 14.330100, + 14.348073, + 14.365762, + 14.383173, + 14.400312, + 14.417183, + 14.433793, + 14.450147, + 14.466249, + 14.482106, + 14.497721, + 14.513100, + 14.528247, + 14.543166, + 14.557864, + 14.572342, + 14.586607, + 14.600662, + 14.614511, + 14.628157, + 14.641606, + 14.654860, + 14.667924, + 14.680800, + 14.693493, + 14.706005, + 14.718341, + 14.730503, + 14.742495, + 14.754320, + 14.765980, + 14.777480, + 14.788821, + 14.800006, + 14.811039, + 14.821922, + 14.832658, + 14.843249, + 14.853699, + 14.864008, + 14.874181, + 14.884219, + 14.894125, + 14.903900, + 14.913548, + 14.923070, + 14.932468, + 14.941745, + 14.950903, + 14.959944, + 14.968869, + 14.977681, + 14.986381, + 14.994972, + 15.003455, + 15.011832, + 15.020105, + 15.028274, + 15.036344, + 15.044313, + 15.052185, + 15.059962, + 15.067643, + 15.075231, + 15.082728, + 15.090135, + 15.097453, + 15.104684, + 15.111829, + 15.118890, + 15.125867, + 15.132762, + 15.139577, + 15.146312, + 15.152969, + 15.159548, + 15.166053, + 15.172482, + 15.178838, + 15.185121, + 15.191333, + 15.197475, + 15.203547, + 15.209551, + 15.215489, + 15.221359, + 15.227165, + 15.232906, + 15.238584, + 15.244200, + 15.249754, + 15.255247, + 15.260681, + 15.266056, + 15.271373, + 15.276632, + 15.281835, + 15.286983, + 15.292075, + 15.297114, + 15.302099, + 15.307032, + 15.311913, + 15.316743, + 15.321522, + 15.326252, + 15.330933, + 15.335565, + 15.340150, + 15.344688, + 15.349179, + 15.353625, + 15.358025, + 15.362381, + 15.366693, + 15.370961, + 15.375187, + 15.379370, + 15.383512, + 15.387613, + 15.391673, + 15.395693, + 15.399673, + 15.403615, + 15.407518, + 15.411383, + 15.415210, + 15.419001, + 15.422755, + 15.426472, + 15.430155, + 15.433801, + 15.437414, + 15.440992, + 15.444536, + 15.448046, + 15.451524, + 15.454969, + 15.458381, + 15.461762, + 15.465112, + 15.468430, + 15.471718, + 15.474976, + 15.478203, + 15.481401, + 15.484570, + 15.487710, + 15.490822, + 15.493905, + 15.496961, + 15.499989, + 15.502990, + 15.505964, + 15.508911, + 15.511833, + 15.514728, + 15.517598, + 15.520443, + 15.523262, + 15.526057, + 15.528828, + 15.531574, + 15.534297, + 15.536996, + 15.539671, + 15.542324, + 15.544954, + 15.547561, + 15.550146, + 15.552709, + 15.555250, + 15.557770, + 15.560269, + 15.562746, + 15.565203, + 15.567639, + 15.570054, + 15.572450, + 15.574826, + 15.577181, + 15.579518, + 15.581835, + 15.584134, + 15.586413, + 15.588674, + 15.590916, + 15.593140, + 15.595346, + 15.597534, + 15.599705, + 15.601858, + 15.603994, + 15.606113, + 15.608215, + 15.610300, + 15.612368, + 15.614421, + 15.616457, + 15.618477, + 15.620481, + 15.622469, + 15.624442, + 15.626399, + 15.628342, + 15.630269, + 15.632181, + 15.634079, + 15.635962, + 15.637830, + 15.639684, + 15.641524, + 15.643350, + 15.645162, + 15.646961, + 15.648745, + 15.650517, + 15.652275, + 15.654020, + 15.655751, + 15.657470, + 15.659176, + 15.660869, + 15.662550, + 15.664218, + 15.665874, + 15.667518, + 15.669150, + 15.670770, + 15.672378, + 15.673974, + 15.675558, + 15.677132, + 15.678693, + 15.680244, + 15.681783, + 15.683311, + 15.684829, + 15.686335, + 15.687831, + 15.689316, + 15.690790, + 15.692254, + 15.693708, + 15.695151, + 15.696585, + 15.698008, + 15.699421, + 15.700824, + 15.702218, + 15.703602, + 15.704976, + 15.706341, + 15.707696, + 15.709042, + 15.710379, + 15.711707, + 15.713025, + 15.714335, + 15.715635, + 15.716927, + 15.718210, + 15.719484, + 15.720750, + 15.722007, + 15.723256, + 15.724496, + 15.725728, + 15.726952, + 15.728168, + 15.729375, + 15.730575, + 15.731766, + 15.732950, + 15.734126, + 15.735294, + 15.736455, + 15.737608, + 15.738753, + 15.739891, + 15.741021, + 15.742145, + 15.743260, + 15.744369, + 15.745471, + 15.746565, + 15.747653, + 15.748733, + 15.749806, + 15.750873, + 15.751933, + 15.752986, + 15.754033, + 15.755073, + 15.756106, + 15.757133, + 15.758153, + 15.759167, + 15.760174, + 15.761176, + 15.762171, + 15.763159, + 15.764142, + 15.765119, + 15.766089, + 15.767054, + 15.768012, + 15.768965, + 15.769912, + 15.770853, + 15.771788, + 15.772718, + 15.773642, + 15.774560, + 15.775473, + 15.776380, + 15.777282, + 15.778178, + 15.779069, + 15.779955, + 15.780835, + 15.781710, + 15.782580, + 15.783444, + 15.784304, + 15.785158, + 15.786008, + 15.786852, + 15.787691, + 15.788526, + 15.789355, + 15.790180, + 15.791000, + 15.791815, + 15.792625, + 15.793430, + 15.794231, + 15.795028, + 15.795819, + 15.796606, + 15.797389, + 15.798167, + 15.798940, + 15.799709, + 15.800474, + 15.801234, + 15.801990, + 15.802742, + 15.803490, + 15.804233, + 15.804972, + 15.805707, + 15.806437, + 15.807164, + 15.807887, + 15.808605, + 15.809320, + 15.810030, + 15.810737, + 15.811439, + 15.812138, + 15.812833, + 15.813524, + 15.814211, + 15.814894, + 15.815574, + 15.816250, + 15.816922, + 15.817590, + 15.818255, + 15.818916, + 15.819574, + 15.820228, + 15.820879, + 15.821526, + 15.822169, + 15.822809, + 15.823446, + 15.824079, + 15.824709, + 15.825335, + 15.825958, + 15.826578, + 15.827194, + 15.827808, + 15.828417, + 15.829024, + 15.829628, + 15.830228, + 15.830825, + 15.831419, + 15.832010, + 15.832598, + 15.833182, + 15.833764, + 15.834343, + 15.834918, + 15.835491, + 15.836060, + 15.836627, + 15.837191, + 15.837752, + 15.838310, + 15.838865, + 15.839417, + 15.839966, + 15.840513, + 15.841057, + 15.841598, + 15.842136, + 15.842671, + 15.843204, + 15.843734, + 15.844262, + 15.844787, + 15.845309, + 15.845828, + 15.846345, + 15.846859, + 15.847371, + 15.847880, + 15.848387, + 15.848891, + 15.849393, + 15.849892, + 15.850388, + 15.850882, + 15.851374, + 15.851864, + 15.852350, + 15.852835, + 15.853317, + 15.853797, + 15.854274, + 15.854749, + 15.855222, + 15.855693, + 15.856161, + 15.856627, + 15.857090, + 15.857552, + 15.858011, + 15.858468, + 15.858923, + 15.859375, + 15.859826, + 15.860274, + 15.860720, + 15.861164, + 15.861606, + 15.862045, + 15.862483, + 15.862919, + 15.863352, + 15.863784, + 15.864213, + 15.864640, + 15.865066, + 15.865489, + 15.865911, + 15.866330, + 15.866748, + 15.867163, + 15.867577, + 15.867988, + 15.868398, + 15.868806, + 15.869212, + 15.869616, + 15.870018, + 15.870418, + 15.870817, + 15.871213, + 15.871608, + 15.872001, + 15.872393, + 15.872782, + 15.873170, + 15.873556, + 15.873940, + 15.874322, + 15.874703, + 15.875082, + 15.875459, + 15.875834, + 15.876208, + 15.876580, + 15.876951, + 15.877320, + 15.877687, + 15.878052, + 15.878416, + 15.878778, + 15.879139, + 15.879498, + 15.879855, + 15.880211, + 15.880565, + 15.880918, + 15.881269, + 15.881619, + 15.881967, + 15.882313, + 15.882658, + 15.883002, + 15.883344, + 15.883684, + 15.884023, + 15.884361, + 15.884697, + 15.885031, + 15.885364, + 15.885696, + 15.886026, + 15.886355, + 15.886682, + 15.887008, + 15.887333, + 15.887656, + 15.887978, + 15.888298, + 15.888617, + 15.888935, + 15.889251, + 15.889566, + 15.889880, + 15.890192, + 15.890503, + 15.890813, + 15.891121, + 15.891428, + 15.891734, + 15.892039, + 15.892342, + 15.892644, + 15.892944, + 15.893244, + 15.893542, + 15.893839, + 15.894134, + 15.894429, + 15.894722, + 15.895014, + 15.895305, + 15.895594, + 15.895883, + 15.896170, + 15.896456, + 15.896740, + 15.897024, + 15.897307, + 15.897588, + 15.897868, + 15.898147, + 15.898425, + 15.898701, + 15.898977, + 15.899252, + 15.899525, + 15.899797, + 15.900068, + 15.900338, + 15.900607, + 15.900875, + 15.901142, + 15.901408, + 15.901672, + 15.901936, + 15.902198, + 15.902460, + 15.902720, + 15.902980, + 15.903238, + 15.903495, + 15.903751, + 15.904007, + 15.904261, + 15.904514, + 15.904766, + 15.905018, + 15.905268, + 15.905517, + 15.905766, + 15.906013, + 15.906259, + 15.906505, + 15.906749, + 15.906992, + 15.907235, + 15.907476, + 15.907717, + 15.907957, + 15.908195, + 15.908433, + 15.908670, + 15.908906, + 15.909141, + 15.909375, + 15.909609, + 15.909841, + 15.910072, + 15.910303, + 15.910533, + 15.910762, + 15.910989, + 15.911216, + 15.911443, + 15.911668, + 15.911892, + 15.912116, + 15.912339, + 15.912561, + 15.912782, + 15.913002, + 15.913221, + 15.913440, + 15.913658, + 15.913875, + 15.914091, + 15.914306, + 15.914521, + 15.914734, + 15.914947, + 15.915159, + 15.915371, + 15.915581, + 15.915791, + 15.916000, + 15.916208, + 15.916415, + 15.916622, + 15.916828, + 15.917033, + 15.917237, + 15.917441, + 15.917644, + 15.917846, + 15.918047, + 15.918248, + 15.918448, + 15.918647, + 15.918845, + 15.919043, + 15.919240, + 15.919436, + 15.919632, + 15.919827, + 15.920021, + 15.920214, + 15.920407, + 15.920599, + 15.920790, + 15.920981, + 15.921171, + 15.921360, + 15.921549, + 15.921737, + 15.921924, + 15.922111, + 15.922297, + 15.922482, + 15.922666, + 15.922850, + 15.923034, + 15.923216, + 15.923398, + 15.923580, + 15.923760, + 15.923940, + 15.924120, + 15.924298, + 15.924477, + 15.924654, + 15.924831, + 15.925007, + 15.925183, + 15.925358, + 15.925532, + 15.925706, + 15.925879, + 15.926052, + 15.926224, + 15.926395, + 15.926566, + 15.926736, + 15.926906, + 15.927075, + 15.927243, + 15.927411, + 15.927578, + 15.927745, + 15.927911, + 15.928077, + 15.928242, + 15.928406, + 15.928570, + 15.928733, + 15.928896, + 15.929058, + 15.929220, + 15.929381, + 15.929542, + 15.929701, + 15.929861, + 15.930020, + 15.930178, + 15.930336, + 15.930493, + 15.930650, + 15.930806, + 15.930962, + 15.931117, + 15.931272, + 15.931426, + 15.931579, + 15.931733, + 15.931885, + 15.932037, + 15.932189, + 15.932340, + 15.932490, + 15.932640, + 15.932790, + 15.932939, + 15.933088, + 15.933236, + 15.933383, + 15.933530, + 15.933677, + 15.933823, + 15.933969, + 15.934114, + 15.934258, + 15.934403, + 15.934546, + 15.934690, + 15.934832, + 15.934975, + 15.935117, + 15.935258, + 15.935399, + 15.935539, + 15.935679, + 15.935819, + 15.935958, + 15.936097, + 15.936235, + 15.936373, + 15.936510, + 15.936647, + 15.936783, + 15.936919, + 15.937055, + 15.937190, + 15.937324, + 15.937459, + 15.937593, + 15.937726, + 15.937859, + 15.937991, + 15.938124, + 15.938255, + 15.938386, + 15.938517, + 15.938648, + 15.938778, + 15.938907, + 15.939037, + 15.939165, + 15.939294, + 15.939422, + 15.939549, + 15.939676, + 15.939803, + 15.939930, + 15.940055, + 15.940181, + 15.940306, + 15.940431, + 15.940555, + 15.940679, + 15.940803, + 15.940926, + 15.941049, + 15.941172, + 15.941294, + 15.941415, + 15.941537, + 15.941658, + 15.941778, + 15.941898, + 15.942018, + 15.942138, + 15.942257, + 15.942375, + 15.942494, + 15.942612, + 15.942729, + 15.942847, + 15.942964, + 15.943080, + 15.943196, + 15.943312, + 15.943428, + 15.943543, + 15.943658, + 15.943772, + 15.943886, + 15.944000, + 15.944113, + 15.944226, + 15.944339, + 15.944451, + 15.944563, + 15.944675, + 15.944786, + 15.944897, + 15.945008, + 15.945118, + 15.945229, + 15.945338, + 15.945448, + 15.945557, + 15.945665, + }, + {// The expectations for dimension = 33 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706666, + 1.815000, + 1.926666, + 2.041665, + 2.159996, + 2.281659, + 2.406652, + 2.534973, + 2.666617, + 2.801580, + 2.939850, + 3.081416, + 3.226256, + 3.374342, + 3.525637, + 3.680089, + 3.837630, + 3.998175, + 4.161616, + 4.327823, + 4.496638, + 4.667879, + 4.841333, + 5.016764, + 5.193906, + 5.372476, + 5.552168, + 5.732661, + 5.913627, + 6.094730, + 6.275638, + 6.456023, + 6.635566, + 6.813967, + 6.990941, + 7.166226, + 7.339585, + 7.510802, + 7.679689, + 7.846082, + 8.009842, + 8.170854, + 8.329024, + 8.484278, + 8.636561, + 8.785836, + 8.932079, + 9.075281, + 9.215444, + 9.352580, + 9.486709, + 9.617859, + 9.746066, + 9.871367, + 9.993808, + 10.113435, + 10.230300, + 10.344454, + 10.455952, + 10.564849, + 10.671202, + 10.775067, + 10.876502, + 10.975564, + 11.072310, + 11.166796, + 11.259078, + 11.349211, + 11.437250, + 11.523249, + 11.607259, + 11.689334, + 11.769522, + 11.847875, + 11.924439, + 11.999263, + 12.072393, + 12.143874, + 12.213749, + 12.282062, + 12.348853, + 12.414164, + 12.478034, + 12.540502, + 12.601604, + 12.661376, + 12.719856, + 12.777075, + 12.833068, + 12.887867, + 12.941504, + 12.994008, + 13.045410, + 13.095738, + 13.145020, + 13.193283, + 13.240554, + 13.286857, + 13.332219, + 13.376662, + 13.420211, + 13.462887, + 13.504714, + 13.545712, + 13.585901, + 13.625303, + 13.663937, + 13.701822, + 13.738976, + 13.775417, + 13.811163, + 13.846230, + 13.880635, + 13.914394, + 13.947522, + 13.980035, + 14.011947, + 14.043272, + 14.074025, + 14.104218, + 14.133864, + 14.162977, + 14.191569, + 14.219651, + 14.247236, + 14.274334, + 14.300958, + 14.327117, + 14.352821, + 14.378082, + 14.402909, + 14.427312, + 14.451300, + 14.474882, + 14.498067, + 14.520864, + 14.543281, + 14.565326, + 14.587008, + 14.608334, + 14.629311, + 14.649948, + 14.670251, + 14.690227, + 14.709884, + 14.729227, + 14.748263, + 14.767000, + 14.785441, + 14.803595, + 14.821466, + 14.839061, + 14.856385, + 14.873443, + 14.890241, + 14.906783, + 14.923076, + 14.939123, + 14.954931, + 14.970502, + 14.985843, + 15.000957, + 15.015848, + 15.030522, + 15.044982, + 15.059233, + 15.073278, + 15.087121, + 15.100766, + 15.114216, + 15.127476, + 15.140549, + 15.153438, + 15.166147, + 15.178679, + 15.191037, + 15.203224, + 15.215244, + 15.227099, + 15.238793, + 15.250328, + 15.261707, + 15.272934, + 15.284009, + 15.294937, + 15.305720, + 15.316361, + 15.326861, + 15.337223, + 15.347450, + 15.357544, + 15.367507, + 15.377342, + 15.387050, + 15.396634, + 15.406096, + 15.415438, + 15.424662, + 15.433770, + 15.442763, + 15.451644, + 15.460415, + 15.469077, + 15.477632, + 15.486082, + 15.494428, + 15.502673, + 15.510818, + 15.518864, + 15.526813, + 15.534666, + 15.542426, + 15.550093, + 15.557669, + 15.565156, + 15.572554, + 15.579866, + 15.587092, + 15.594234, + 15.601293, + 15.608270, + 15.615167, + 15.621985, + 15.628725, + 15.635388, + 15.641976, + 15.648489, + 15.654929, + 15.661296, + 15.667592, + 15.673819, + 15.679975, + 15.686064, + 15.692086, + 15.698042, + 15.703932, + 15.709758, + 15.715521, + 15.721221, + 15.726860, + 15.732438, + 15.737957, + 15.743416, + 15.748817, + 15.754161, + 15.759449, + 15.764681, + 15.769858, + 15.774981, + 15.780050, + 15.785067, + 15.790031, + 15.794945, + 15.799808, + 15.804621, + 15.809385, + 15.814100, + 15.818767, + 15.823388, + 15.827961, + 15.832489, + 15.836971, + 15.841409, + 15.845802, + 15.850152, + 15.854459, + 15.858723, + 15.862946, + 15.867127, + 15.871267, + 15.875367, + 15.879427, + 15.883448, + 15.887430, + 15.891374, + 15.895280, + 15.899148, + 15.902980, + 15.906776, + 15.910535, + 15.914260, + 15.917949, + 15.921603, + 15.925224, + 15.928810, + 15.932364, + 15.935884, + 15.939372, + 15.942828, + 15.946252, + 15.949645, + 15.953006, + 15.956338, + 15.959639, + 15.962910, + 15.966151, + 15.969364, + 15.972548, + 15.975703, + 15.978830, + 15.981929, + 15.985001, + 15.988046, + 15.991064, + 15.994056, + 15.997021, + 15.999960, + 16.002874, + 16.005762, + 16.008626, + 16.011465, + 16.014279, + 16.017069, + 16.019835, + 16.022578, + 16.025297, + 16.027994, + 16.030667, + 16.033318, + 16.035946, + 16.038553, + 16.041137, + 16.043700, + 16.046242, + 16.048763, + 16.051262, + 16.053742, + 16.056200, + 16.058639, + 16.061057, + 16.063456, + 16.065835, + 16.068195, + 16.070536, + 16.072858, + 16.075161, + 16.077445, + 16.079711, + 16.081960, + 16.084190, + 16.086402, + 16.088597, + 16.090775, + 16.092935, + 16.095078, + 16.097205, + 16.099315, + 16.101408, + 16.103485, + 16.105546, + 16.107591, + 16.109620, + 16.111633, + 16.113631, + 16.115614, + 16.117582, + 16.119534, + 16.121471, + 16.123394, + 16.125303, + 16.127196, + 16.129076, + 16.130941, + 16.132793, + 16.134630, + 16.136454, + 16.138264, + 16.140061, + 16.141845, + 16.143615, + 16.145372, + 16.147117, + 16.148848, + 16.150567, + 16.152273, + 16.153967, + 16.155648, + 16.157318, + 16.158975, + 16.160620, + 16.162254, + 16.163875, + 16.165486, + 16.167084, + 16.168671, + 16.170247, + 16.171812, + 16.173365, + 16.174908, + 16.176440, + 16.177961, + 16.179471, + 16.180971, + 16.182460, + 16.183939, + 16.185407, + 16.186866, + 16.188314, + 16.189752, + 16.191181, + 16.192599, + 16.194008, + 16.195407, + 16.196797, + 16.198177, + 16.199548, + 16.200909, + 16.202262, + 16.203605, + 16.204939, + 16.206264, + 16.207580, + 16.208888, + 16.210186, + 16.211477, + 16.212758, + 16.214031, + 16.215296, + 16.216552, + 16.217800, + 16.219039, + 16.220271, + 16.221494, + 16.222710, + 16.223918, + 16.225117, + 16.226309, + 16.227494, + 16.228670, + 16.229839, + 16.231001, + 16.232155, + 16.233301, + 16.234441, + 16.235573, + 16.236697, + 16.237815, + 16.238926, + 16.240029, + 16.241126, + 16.242215, + 16.243298, + 16.244374, + 16.245443, + 16.246506, + 16.247562, + 16.248611, + 16.249654, + 16.250691, + 16.251721, + 16.252744, + 16.253762, + 16.254773, + 16.255778, + 16.256776, + 16.257769, + 16.258756, + 16.259736, + 16.260711, + 16.261679, + 16.262642, + 16.263599, + 16.264551, + 16.265496, + 16.266436, + 16.267370, + 16.268299, + 16.269222, + 16.270140, + 16.271052, + 16.271959, + 16.272860, + 16.273756, + 16.274647, + 16.275532, + 16.276413, + 16.277288, + 16.278158, + 16.279023, + 16.279883, + 16.280738, + 16.281588, + 16.282433, + 16.283273, + 16.284108, + 16.284939, + 16.285764, + 16.286585, + 16.287402, + 16.288213, + 16.289020, + 16.289823, + 16.290620, + 16.291414, + 16.292203, + 16.292987, + 16.293767, + 16.294542, + 16.295313, + 16.296080, + 16.296843, + 16.297601, + 16.298355, + 16.299105, + 16.299851, + 16.300592, + 16.301330, + 16.302063, + 16.302792, + 16.303518, + 16.304239, + 16.304956, + 16.305670, + 16.306379, + 16.307085, + 16.307787, + 16.308485, + 16.309179, + 16.309869, + 16.310556, + 16.311239, + 16.311918, + 16.312594, + 16.313266, + 16.313934, + 16.314599, + 16.315260, + 16.315918, + 16.316572, + 16.317223, + 16.317871, + 16.318514, + 16.319155, + 16.319792, + 16.320426, + 16.321056, + 16.321683, + 16.322307, + 16.322928, + 16.323545, + 16.324159, + 16.324770, + 16.325378, + 16.325982, + 16.326584, + 16.327182, + 16.327777, + 16.328370, + 16.328959, + 16.329545, + 16.330128, + 16.330708, + 16.331285, + 16.331860, + 16.332431, + 16.332999, + 16.333565, + 16.334127, + 16.334687, + 16.335244, + 16.335798, + 16.336350, + 16.336898, + 16.337444, + 16.337987, + 16.338528, + 16.339065, + 16.339601, + 16.340133, + 16.340663, + 16.341190, + 16.341714, + 16.342236, + 16.342756, + 16.343272, + 16.343787, + 16.344298, + 16.344807, + 16.345314, + 16.345818, + 16.346320, + 16.346820, + 16.347316, + 16.347811, + 16.348303, + 16.348793, + 16.349280, + 16.349765, + 16.350248, + 16.350728, + 16.351206, + 16.351682, + 16.352156, + 16.352627, + 16.353096, + 16.353563, + 16.354027, + 16.354489, + 16.354949, + 16.355407, + 16.355863, + 16.356317, + 16.356768, + 16.357218, + 16.357665, + 16.358110, + 16.358553, + 16.358994, + 16.359433, + 16.359870, + 16.360305, + 16.360738, + 16.361169, + 16.361598, + 16.362025, + 16.362450, + 16.362873, + 16.363294, + 16.363713, + 16.364130, + 16.364545, + 16.364958, + 16.365370, + 16.365779, + 16.366187, + 16.366593, + 16.366997, + 16.367399, + 16.367800, + 16.368198, + 16.368595, + 16.368990, + 16.369383, + 16.369775, + 16.370164, + 16.370552, + 16.370938, + 16.371323, + 16.371706, + 16.372087, + 16.372466, + 16.372844, + 16.373220, + 16.373594, + 16.373967, + 16.374338, + 16.374707, + 16.375075, + 16.375441, + 16.375806, + 16.376169, + 16.376530, + 16.376890, + 16.377248, + 16.377605, + 16.377960, + 16.378314, + 16.378666, + 16.379016, + 16.379365, + 16.379713, + 16.380059, + 16.380403, + 16.380746, + 16.381088, + 16.381428, + 16.381767, + 16.382104, + 16.382440, + 16.382774, + 16.383107, + 16.383438, + 16.383768, + 16.384097, + 16.384424, + 16.384750, + 16.385075, + 16.385398, + 16.385720, + 16.386040, + 16.386359, + 16.386677, + 16.386993, + 16.387309, + 16.387622, + 16.387935, + 16.388246, + 16.388556, + 16.388865, + 16.389172, + 16.389478, + 16.389783, + 16.390086, + 16.390389, + 16.390690, + 16.390989, + 16.391288, + 16.391585, + 16.391882, + 16.392176, + 16.392470, + 16.392763, + 16.393054, + 16.393344, + 16.393633, + 16.393921, + 16.394208, + 16.394493, + 16.394777, + 16.395061, + 16.395343, + 16.395623, + 16.395903, + 16.396182, + 16.396459, + 16.396736, + 16.397011, + 16.397285, + 16.397558, + 16.397830, + 16.398101, + 16.398371, + 16.398640, + 16.398908, + 16.399175, + 16.399440, + 16.399705, + 16.399968, + 16.400231, + 16.400492, + 16.400753, + 16.401012, + 16.401271, + 16.401528, + 16.401784, + 16.402040, + 16.402294, + 16.402548, + 16.402800, + 16.403051, + 16.403302, + 16.403551, + 16.403800, + 16.404048, + 16.404294, + 16.404540, + 16.404785, + 16.405028, + 16.405271, + 16.405513, + 16.405754, + 16.405994, + 16.406234, + 16.406472, + 16.406709, + 16.406946, + 16.407181, + 16.407416, + 16.407650, + 16.407883, + 16.408115, + 16.408346, + 16.408576, + 16.408805, + 16.409034, + 16.409262, + 16.409488, + 16.409714, + 16.409940, + 16.410164, + 16.410387, + 16.410610, + 16.410832, + 16.411053, + 16.411273, + 16.411492, + 16.411711, + 16.411928, + 16.412145, + 16.412361, + 16.412577, + 16.412791, + 16.413005, + 16.413218, + 16.413430, + 16.413642, + 16.413852, + 16.414062, + 16.414271, + 16.414479, + 16.414687, + 16.414894, + 16.415100, + 16.415305, + 16.415510, + 16.415714, + 16.415917, + 16.416119, + 16.416321, + 16.416522, + 16.416722, + 16.416921, + 16.417120, + 16.417318, + 16.417515, + 16.417712, + 16.417908, + 16.418103, + 16.418298, + 16.418492, + 16.418685, + 16.418877, + 16.419069, + 16.419260, + 16.419451, + 16.419640, + 16.419829, + 16.420018, + 16.420206, + 16.420393, + 16.420579, + 16.420765, + 16.420950, + 16.421135, + 16.421318, + 16.421502, + 16.421684, + 16.421866, + 16.422047, + 16.422228, + 16.422408, + 16.422588, + 16.422766, + 16.422945, + 16.423122, + 16.423299, + 16.423475, + 16.423651, + 16.423826, + 16.424001, + 16.424175, + 16.424348, + 16.424521, + 16.424693, + 16.424864, + 16.425035, + 16.425206, + 16.425376, + 16.425545, + 16.425714, + 16.425882, + 16.426049, + 16.426216, + 16.426383, + 16.426548, + 16.426714, + 16.426878, + 16.427042, + 16.427206, + 16.427369, + 16.427532, + 16.427694, + 16.427855, + 16.428016, + 16.428176, + 16.428336, + 16.428495, + 16.428654, + 16.428812, + 16.428970, + 16.429127, + 16.429284, + 16.429440, + 16.429596, + 16.429751, + 16.429905, + 16.430059, + 16.430213, + 16.430366, + 16.430518, + 16.430671, + 16.430822, + 16.430973, + 16.431124, + 16.431274, + 16.431423, + 16.431573, + 16.431721, + 16.431869, + 16.432017, + 16.432164, + 16.432311, + 16.432457, + 16.432603, + 16.432748, + 16.432893, + 16.433037, + 16.433181, + 16.433324, + 16.433467, + 16.433610, + 16.433752, + 16.433894, + 16.434035, + 16.434175, + 16.434316, + 16.434455, + 16.434595, + 16.434734, + 16.434872, + 16.435010, + 16.435148, + 16.435285, + 16.435421, + 16.435558, + 16.435694, + 16.435829, + 16.435964, + 16.436099, + 16.436233, + 16.436366, + 16.436500, + 16.436633, + 16.436765, + 16.436897, + 16.437029, + 16.437160, + 16.437291, + 16.437421, + 16.437551, + 16.437681, + 16.437810, + 16.437939, + 16.438067, + 16.438195, + 16.438323, + 16.438450, + 16.438577, + 16.438703, + 16.438829, + 16.438955, + 16.439080, + 16.439205, + 16.439329, + 16.439453, + 16.439577, + 16.439700, + 16.439823, + 16.439946, + 16.440068, + 16.440190, + 16.440312, + 16.440433, + 16.440553, + 16.440674, + 16.440794, + 16.440913, + 16.441033, + 16.441152, + 16.441270, + 16.441388, + 16.441506, + 16.441624, + 16.441741, + 16.441858, + 16.441974, + 16.442090, + 16.442206, + 16.442321, + }, + {// The expectations for dimension = 34 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926666, + 2.041666, + 2.159998, + 2.281662, + 2.406658, + 2.534984, + 2.666637, + 2.801613, + 2.939906, + 3.081507, + 3.226399, + 3.374564, + 3.525972, + 3.680584, + 3.838346, + 3.999189, + 4.163028, + 4.329751, + 4.499226, + 4.671294, + 4.845769, + 5.022439, + 5.201063, + 5.381376, + 5.563092, + 5.745906, + 5.929495, + 6.113532, + 6.297682, + 6.481611, + 6.664994, + 6.847515, + 7.028872, + 7.208784, + 7.386990, + 7.563253, + 7.737360, + 7.909123, + 8.078380, + 8.244992, + 8.408844, + 8.569842, + 8.727913, + 8.883002, + 9.035070, + 9.184094, + 9.330063, + 9.472979, + 9.612852, + 9.749703, + 9.883558, + 10.014450, + 10.142420, + 10.267509, + 10.389764, + 10.509234, + 10.625972, + 10.740030, + 10.851464, + 10.960329, + 11.066682, + 11.170579, + 11.272077, + 11.371232, + 11.468100, + 11.562738, + 11.655200, + 11.745540, + 11.833812, + 11.920068, + 12.004360, + 12.086739, + 12.167253, + 12.245951, + 12.322882, + 12.398090, + 12.471621, + 12.543519, + 12.613827, + 12.682587, + 12.749839, + 12.815624, + 12.879979, + 12.942943, + 13.004551, + 13.064839, + 13.123843, + 13.181594, + 13.238127, + 13.293472, + 13.347660, + 13.400722, + 13.452686, + 13.503580, + 13.553433, + 13.602270, + 13.650117, + 13.697000, + 13.742943, + 13.787969, + 13.832102, + 13.875363, + 13.917776, + 13.959359, + 14.000135, + 14.040123, + 14.079342, + 14.117811, + 14.155548, + 14.192571, + 14.228898, + 14.264544, + 14.299526, + 14.333861, + 14.367562, + 14.400646, + 14.433126, + 14.465017, + 14.496332, + 14.527086, + 14.557290, + 14.586957, + 14.616100, + 14.644730, + 14.672860, + 14.700500, + 14.727661, + 14.754355, + 14.780591, + 14.806379, + 14.831730, + 14.856653, + 14.881158, + 14.905253, + 14.928947, + 14.952249, + 14.975168, + 14.997711, + 15.019887, + 15.041703, + 15.063167, + 15.084286, + 15.105068, + 15.125519, + 15.145646, + 15.165457, + 15.184957, + 15.204152, + 15.223050, + 15.241655, + 15.259975, + 15.278013, + 15.295778, + 15.313272, + 15.330503, + 15.347475, + 15.364193, + 15.380662, + 15.396888, + 15.412874, + 15.428625, + 15.444146, + 15.459442, + 15.474516, + 15.489372, + 15.504016, + 15.518450, + 15.532679, + 15.546707, + 15.560536, + 15.574172, + 15.587617, + 15.600875, + 15.613950, + 15.626844, + 15.639561, + 15.652105, + 15.664477, + 15.676682, + 15.688723, + 15.700601, + 15.712320, + 15.723884, + 15.735294, + 15.746553, + 15.757664, + 15.768629, + 15.779452, + 15.790133, + 15.800677, + 15.811084, + 15.821358, + 15.831501, + 15.841514, + 15.851401, + 15.861163, + 15.870802, + 15.880320, + 15.889719, + 15.899002, + 15.908170, + 15.917224, + 15.926168, + 15.935002, + 15.943728, + 15.952349, + 15.960865, + 15.969279, + 15.977592, + 15.985805, + 15.993921, + 16.001940, + 16.009865, + 16.017696, + 16.025436, + 16.033085, + 16.040645, + 16.048118, + 16.055504, + 16.062805, + 16.070022, + 16.077157, + 16.084211, + 16.091185, + 16.098080, + 16.104897, + 16.111638, + 16.118304, + 16.124895, + 16.131413, + 16.137860, + 16.144235, + 16.150540, + 16.156776, + 16.162944, + 16.169045, + 16.175081, + 16.181051, + 16.186957, + 16.192799, + 16.198579, + 16.204298, + 16.209956, + 16.215555, + 16.221094, + 16.226576, + 16.232000, + 16.237367, + 16.242679, + 16.247936, + 16.253138, + 16.258287, + 16.263384, + 16.268428, + 16.273421, + 16.278363, + 16.283255, + 16.288098, + 16.292892, + 16.297639, + 16.302338, + 16.306990, + 16.311596, + 16.316156, + 16.320672, + 16.325143, + 16.329570, + 16.333955, + 16.338296, + 16.342596, + 16.346854, + 16.351070, + 16.355247, + 16.359383, + 16.363480, + 16.367538, + 16.371557, + 16.375539, + 16.379483, + 16.383389, + 16.387260, + 16.391094, + 16.394892, + 16.398655, + 16.402383, + 16.406077, + 16.409737, + 16.413363, + 16.416956, + 16.420516, + 16.424044, + 16.427540, + 16.431004, + 16.434437, + 16.437840, + 16.441212, + 16.444553, + 16.447865, + 16.451148, + 16.454401, + 16.457626, + 16.460822, + 16.463990, + 16.467131, + 16.470244, + 16.473330, + 16.476389, + 16.479422, + 16.482429, + 16.485409, + 16.488364, + 16.491294, + 16.494199, + 16.497079, + 16.499935, + 16.502766, + 16.505574, + 16.508358, + 16.511119, + 16.513856, + 16.516571, + 16.519263, + 16.521933, + 16.524580, + 16.527206, + 16.529810, + 16.532393, + 16.534955, + 16.537495, + 16.540015, + 16.542515, + 16.544994, + 16.547454, + 16.549893, + 16.552313, + 16.554713, + 16.557095, + 16.559457, + 16.561800, + 16.564125, + 16.566432, + 16.568720, + 16.570990, + 16.573243, + 16.575478, + 16.577695, + 16.579895, + 16.582078, + 16.584244, + 16.586393, + 16.588526, + 16.590643, + 16.592743, + 16.594827, + 16.596895, + 16.598947, + 16.600984, + 16.603005, + 16.605011, + 16.607002, + 16.608978, + 16.610940, + 16.612886, + 16.614818, + 16.616736, + 16.618639, + 16.620528, + 16.622403, + 16.624265, + 16.626113, + 16.627947, + 16.629767, + 16.631575, + 16.633369, + 16.635150, + 16.636919, + 16.638674, + 16.640417, + 16.642148, + 16.643865, + 16.645571, + 16.647264, + 16.648946, + 16.650615, + 16.652273, + 16.653918, + 16.655552, + 16.657175, + 16.658786, + 16.660386, + 16.661975, + 16.663553, + 16.665119, + 16.666675, + 16.668220, + 16.669754, + 16.671278, + 16.672791, + 16.674294, + 16.675786, + 16.677268, + 16.678740, + 16.680203, + 16.681655, + 16.683097, + 16.684530, + 16.685953, + 16.687366, + 16.688770, + 16.690164, + 16.691549, + 16.692925, + 16.694292, + 16.695649, + 16.696998, + 16.698337, + 16.699668, + 16.700990, + 16.702304, + 16.703608, + 16.704905, + 16.706192, + 16.707472, + 16.708743, + 16.710005, + 16.711260, + 16.712506, + 16.713745, + 16.714975, + 16.716198, + 16.717413, + 16.718620, + 16.719819, + 16.721010, + 16.722195, + 16.723371, + 16.724540, + 16.725702, + 16.726856, + 16.728003, + 16.729143, + 16.730276, + 16.731402, + 16.732521, + 16.733632, + 16.734737, + 16.735835, + 16.736927, + 16.738011, + 16.739089, + 16.740160, + 16.741225, + 16.742283, + 16.743334, + 16.744380, + 16.745418, + 16.746451, + 16.747477, + 16.748497, + 16.749511, + 16.750519, + 16.751521, + 16.752517, + 16.753506, + 16.754490, + 16.755468, + 16.756440, + 16.757407, + 16.758367, + 16.759322, + 16.760272, + 16.761215, + 16.762154, + 16.763086, + 16.764014, + 16.764935, + 16.765852, + 16.766763, + 16.767669, + 16.768569, + 16.769464, + 16.770355, + 16.771240, + 16.772119, + 16.772994, + 16.773864, + 16.774729, + 16.775589, + 16.776444, + 16.777294, + 16.778139, + 16.778980, + 16.779815, + 16.780646, + 16.781473, + 16.782294, + 16.783111, + 16.783924, + 16.784732, + 16.785535, + 16.786334, + 16.787128, + 16.787918, + 16.788704, + 16.789485, + 16.790262, + 16.791035, + 16.791804, + 16.792568, + 16.793328, + 16.794084, + 16.794835, + 16.795583, + 16.796327, + 16.797066, + 16.797802, + 16.798533, + 16.799261, + 16.799984, + 16.800704, + 16.801420, + 16.802132, + 16.802840, + 16.803544, + 16.804245, + 16.804942, + 16.805635, + 16.806325, + 16.807011, + 16.807693, + 16.808371, + 16.809046, + 16.809718, + 16.810386, + 16.811050, + 16.811711, + 16.812369, + 16.813023, + 16.813673, + 16.814321, + 16.814965, + 16.815605, + 16.816242, + 16.816876, + 16.817507, + 16.818135, + 16.818759, + 16.819380, + 16.819998, + 16.820612, + 16.821224, + 16.821832, + 16.822437, + 16.823040, + 16.823639, + 16.824235, + 16.824828, + 16.825418, + 16.826006, + 16.826590, + 16.827171, + 16.827749, + 16.828325, + 16.828897, + 16.829467, + 16.830034, + 16.830598, + 16.831159, + 16.831718, + 16.832274, + 16.832827, + 16.833377, + 16.833924, + 16.834469, + 16.835012, + 16.835551, + 16.836088, + 16.836622, + 16.837154, + 16.837683, + 16.838209, + 16.838733, + 16.839255, + 16.839774, + 16.840290, + 16.840804, + 16.841315, + 16.841824, + 16.842331, + 16.842835, + 16.843337, + 16.843836, + 16.844333, + 16.844827, + 16.845320, + 16.845810, + 16.846297, + 16.846782, + 16.847265, + 16.847746, + 16.848224, + 16.848700, + 16.849174, + 16.849646, + 16.850116, + 16.850583, + 16.851048, + 16.851511, + 16.851972, + 16.852430, + 16.852887, + 16.853341, + 16.853794, + 16.854244, + 16.854692, + 16.855138, + 16.855582, + 16.856024, + 16.856464, + 16.856902, + 16.857338, + 16.857772, + 16.858204, + 16.858634, + 16.859062, + 16.859488, + 16.859913, + 16.860335, + 16.860755, + 16.861174, + 16.861591, + 16.862005, + 16.862418, + 16.862829, + 16.863238, + 16.863646, + 16.864051, + 16.864455, + 16.864857, + 16.865257, + 16.865656, + 16.866052, + 16.866447, + 16.866840, + 16.867232, + 16.867622, + 16.868010, + 16.868396, + 16.868781, + 16.869163, + 16.869545, + 16.869924, + 16.870302, + 16.870678, + 16.871053, + 16.871426, + 16.871798, + 16.872167, + 16.872536, + 16.872902, + 16.873267, + 16.873631, + 16.873993, + 16.874353, + 16.874712, + 16.875069, + 16.875425, + 16.875779, + 16.876132, + 16.876483, + 16.876833, + 16.877181, + 16.877528, + 16.877873, + 16.878217, + 16.878560, + 16.878901, + 16.879240, + 16.879578, + 16.879915, + 16.880250, + 16.880584, + 16.880917, + 16.881248, + 16.881578, + 16.881906, + 16.882233, + 16.882559, + 16.882883, + 16.883206, + 16.883527, + 16.883848, + 16.884167, + 16.884484, + 16.884801, + 16.885116, + 16.885430, + 16.885742, + 16.886053, + 16.886363, + 16.886672, + 16.886979, + 16.887286, + 16.887591, + 16.887894, + 16.888197, + 16.888498, + 16.888798, + 16.889097, + 16.889395, + 16.889691, + 16.889986, + 16.890280, + 16.890573, + 16.890865, + 16.891156, + 16.891445, + 16.891733, + 16.892020, + 16.892306, + 16.892591, + 16.892875, + 16.893157, + 16.893439, + 16.893719, + 16.893999, + 16.894277, + 16.894554, + 16.894830, + 16.895105, + 16.895378, + 16.895651, + 16.895923, + 16.896193, + 16.896463, + 16.896732, + 16.896999, + 16.897266, + 16.897531, + 16.897795, + 16.898059, + 16.898321, + 16.898582, + 16.898843, + 16.899102, + 16.899360, + 16.899618, + 16.899874, + 16.900129, + 16.900384, + 16.900637, + 16.900890, + 16.901141, + 16.901392, + 16.901641, + 16.901890, + 16.902138, + 16.902385, + 16.902630, + 16.902875, + 16.903119, + 16.903362, + 16.903605, + 16.903846, + 16.904086, + 16.904326, + 16.904564, + 16.904802, + 16.905039, + 16.905275, + 16.905510, + 16.905744, + 16.905977, + 16.906210, + 16.906441, + 16.906672, + 16.906902, + 16.907131, + 16.907359, + 16.907586, + 16.907813, + 16.908038, + 16.908263, + 16.908487, + 16.908710, + 16.908933, + 16.909154, + 16.909375, + 16.909595, + 16.909814, + 16.910032, + 16.910250, + 16.910467, + 16.910683, + 16.910898, + 16.911112, + 16.911326, + 16.911539, + 16.911751, + 16.911962, + 16.912173, + 16.912383, + 16.912592, + 16.912800, + 16.913008, + 16.913215, + 16.913421, + 16.913626, + 16.913831, + 16.914035, + 16.914238, + 16.914441, + 16.914643, + 16.914844, + 16.915044, + 16.915244, + 16.915443, + 16.915641, + 16.915838, + 16.916035, + 16.916231, + 16.916427, + 16.916622, + 16.916816, + 16.917009, + 16.917202, + 16.917394, + 16.917586, + 16.917777, + 16.917967, + 16.918156, + 16.918345, + 16.918533, + 16.918721, + 16.918907, + 16.919094, + 16.919279, + 16.919464, + 16.919648, + 16.919832, + 16.920015, + 16.920198, + 16.920379, + 16.920561, + 16.920741, + 16.920921, + 16.921100, + 16.921279, + 16.921457, + 16.921635, + 16.921812, + 16.921988, + 16.922164, + 16.922339, + 16.922513, + 16.922687, + 16.922861, + 16.923033, + 16.923206, + 16.923377, + 16.923548, + 16.923719, + 16.923889, + 16.924058, + 16.924227, + 16.924395, + 16.924563, + 16.924730, + 16.924896, + 16.925062, + 16.925228, + 16.925393, + 16.925557, + 16.925721, + 16.925884, + 16.926047, + 16.926209, + 16.926371, + 16.926532, + 16.926692, + 16.926852, + 16.927012, + 16.927171, + 16.927330, + 16.927488, + 16.927645, + 16.927802, + 16.927958, + 16.928114, + 16.928270, + 16.928425, + 16.928579, + 16.928733, + 16.928887, + 16.929040, + 16.929192, + 16.929344, + 16.929495, + 16.929646, + 16.929797, + 16.929947, + 16.930097, + 16.930246, + 16.930394, + 16.930542, + 16.930690, + 16.930837, + 16.930984, + 16.931130, + 16.931276, + 16.931421, + 16.931566, + 16.931710, + 16.931854, + 16.931998, + 16.932141, + 16.932284, + 16.932426, + 16.932567, + 16.932709, + 16.932849, + 16.932990, + 16.933130, + 16.933269, + 16.933408, + 16.933547, + 16.933685, + 16.933823, + 16.933960, + 16.934097, + 16.934233, + 16.934370, + 16.934505, + 16.934640, + 16.934775, + 16.934910, + 16.935043, + 16.935177, + 16.935310, + 16.935443, + 16.935575, + 16.935707, + 16.935839, + 16.935970, + 16.936100, + 16.936231, + 16.936361, + 16.936490, + 16.936619, + 16.936748, + 16.936876, + 16.937004, + 16.937132, + 16.937259, + 16.937386, + 16.937512, + 16.937638, + 16.937764, + 16.937889, + 16.938014, + 16.938138, + 16.938262, + 16.938386, + 16.938510, + 16.938633, + 16.938755, + 16.938878, + }, + {// The expectations for dimension = 35 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926666, + 2.041666, + 2.159999, + 2.281664, + 2.406662, + 2.534991, + 2.666649, + 2.801634, + 2.939942, + 3.081566, + 3.226494, + 3.374714, + 3.526202, + 3.680930, + 3.838855, + 3.999924, + 4.164066, + 4.331190, + 4.501187, + 4.673920, + 4.849228, + 5.026922, + 5.206788, + 5.388583, + 5.572041, + 5.756873, + 5.942773, + 6.129419, + 6.316483, + 6.503630, + 6.690529, + 6.876854, + 7.062291, + 7.246540, + 7.429322, + 7.610377, + 7.789471, + 7.966391, + 8.140952, + 8.312993, + 8.482375, + 8.648985, + 8.812728, + 8.973533, + 9.131344, + 9.286122, + 9.437843, + 9.586497, + 9.732084, + 9.874615, + 10.014108, + 10.150589, + 10.284092, + 10.414654, + 10.542317, + 10.667127, + 10.789133, + 10.908385, + 11.024936, + 11.138841, + 11.250155, + 11.358933, + 11.465231, + 11.569106, + 11.670614, + 11.769810, + 11.866750, + 11.961488, + 12.054079, + 12.144575, + 12.233030, + 12.319494, + 12.404018, + 12.486651, + 12.567443, + 12.646439, + 12.723687, + 12.799232, + 12.873117, + 12.945386, + 13.016081, + 13.085243, + 13.152911, + 13.219125, + 13.283921, + 13.347337, + 13.409409, + 13.470170, + 13.529656, + 13.587899, + 13.644930, + 13.700781, + 13.755482, + 13.809062, + 13.861550, + 13.912973, + 13.963359, + 14.012733, + 14.061121, + 14.108548, + 14.155037, + 14.200612, + 14.245295, + 14.289109, + 14.332075, + 14.374212, + 14.415543, + 14.456086, + 14.495860, + 14.534884, + 14.573175, + 14.610752, + 14.647631, + 14.683829, + 14.719362, + 14.754245, + 14.788494, + 14.822123, + 14.855147, + 14.887579, + 14.919434, + 14.950724, + 14.981462, + 15.011662, + 15.041334, + 15.070491, + 15.099144, + 15.127305, + 15.154984, + 15.182192, + 15.208940, + 15.235237, + 15.261093, + 15.286519, + 15.311522, + 15.336112, + 15.360299, + 15.384090, + 15.407494, + 15.430519, + 15.453173, + 15.475464, + 15.497399, + 15.518986, + 15.540232, + 15.561144, + 15.581728, + 15.601992, + 15.621942, + 15.641584, + 15.660925, + 15.679970, + 15.698725, + 15.717196, + 15.735389, + 15.753309, + 15.770962, + 15.788352, + 15.805485, + 15.822365, + 15.838999, + 15.855389, + 15.871542, + 15.887461, + 15.903150, + 15.918615, + 15.933859, + 15.948887, + 15.963702, + 15.978309, + 15.992711, + 16.006912, + 16.020916, + 16.034726, + 16.048345, + 16.061778, + 16.075028, + 16.088097, + 16.100990, + 16.113709, + 16.126256, + 16.138637, + 16.150852, + 16.162906, + 16.174800, + 16.186538, + 16.198123, + 16.209557, + 16.220842, + 16.231981, + 16.242977, + 16.253831, + 16.264548, + 16.275128, + 16.285573, + 16.295888, + 16.306072, + 16.316129, + 16.326061, + 16.335869, + 16.345556, + 16.355124, + 16.364574, + 16.373909, + 16.383130, + 16.392240, + 16.401239, + 16.410130, + 16.418915, + 16.427594, + 16.436171, + 16.444645, + 16.453020, + 16.461296, + 16.469475, + 16.477559, + 16.485549, + 16.493446, + 16.501252, + 16.508968, + 16.516596, + 16.524137, + 16.531592, + 16.538962, + 16.546250, + 16.553455, + 16.560580, + 16.567625, + 16.574591, + 16.581481, + 16.588294, + 16.595032, + 16.601697, + 16.608288, + 16.614808, + 16.621257, + 16.627636, + 16.633946, + 16.640189, + 16.646365, + 16.652475, + 16.658520, + 16.664501, + 16.670419, + 16.676274, + 16.682068, + 16.687802, + 16.693476, + 16.699091, + 16.704648, + 16.710147, + 16.715590, + 16.720978, + 16.726310, + 16.731588, + 16.736813, + 16.741984, + 16.747104, + 16.752172, + 16.757190, + 16.762157, + 16.767076, + 16.771945, + 16.776766, + 16.781540, + 16.786267, + 16.790948, + 16.795583, + 16.800172, + 16.804718, + 16.809219, + 16.813678, + 16.818093, + 16.822466, + 16.826798, + 16.831088, + 16.835337, + 16.839547, + 16.843716, + 16.847847, + 16.851939, + 16.855992, + 16.860008, + 16.863987, + 16.867928, + 16.871834, + 16.875703, + 16.879537, + 16.883336, + 16.887101, + 16.890831, + 16.894527, + 16.898190, + 16.901820, + 16.905417, + 16.908982, + 16.912516, + 16.916018, + 16.919488, + 16.922928, + 16.926338, + 16.929718, + 16.933068, + 16.936388, + 16.939680, + 16.942943, + 16.946178, + 16.949385, + 16.952564, + 16.955716, + 16.958840, + 16.961938, + 16.965010, + 16.968055, + 16.971075, + 16.974069, + 16.977038, + 16.979982, + 16.982901, + 16.985796, + 16.988666, + 16.991513, + 16.994336, + 16.997136, + 16.999912, + 17.002666, + 17.005397, + 17.008106, + 17.010793, + 17.013458, + 17.016101, + 17.018723, + 17.021323, + 17.023903, + 17.026462, + 17.029000, + 17.031518, + 17.034016, + 17.036495, + 17.038953, + 17.041392, + 17.043812, + 17.046213, + 17.048595, + 17.050958, + 17.053303, + 17.055630, + 17.057938, + 17.060229, + 17.062502, + 17.064757, + 17.066995, + 17.069216, + 17.071420, + 17.073607, + 17.075778, + 17.077932, + 17.080069, + 17.082191, + 17.084296, + 17.086386, + 17.088460, + 17.090519, + 17.092562, + 17.094590, + 17.096603, + 17.098601, + 17.100584, + 17.102552, + 17.104506, + 17.106446, + 17.108372, + 17.110283, + 17.112181, + 17.114065, + 17.115935, + 17.117791, + 17.119635, + 17.121465, + 17.123281, + 17.125085, + 17.126876, + 17.128654, + 17.130420, + 17.132173, + 17.133913, + 17.135642, + 17.137358, + 17.139062, + 17.140754, + 17.142434, + 17.144103, + 17.145759, + 17.147405, + 17.149039, + 17.150661, + 17.152273, + 17.153873, + 17.155463, + 17.157041, + 17.158609, + 17.160166, + 17.161712, + 17.163248, + 17.164773, + 17.166288, + 17.167793, + 17.169288, + 17.170773, + 17.172248, + 17.173713, + 17.175168, + 17.176613, + 17.178049, + 17.179475, + 17.180892, + 17.182300, + 17.183698, + 17.185087, + 17.186467, + 17.187838, + 17.189200, + 17.190553, + 17.191897, + 17.193233, + 17.194560, + 17.195878, + 17.197188, + 17.198489, + 17.199782, + 17.201067, + 17.202344, + 17.203612, + 17.204873, + 17.206125, + 17.207369, + 17.208606, + 17.209835, + 17.211056, + 17.212269, + 17.213475, + 17.214673, + 17.215864, + 17.217047, + 17.218223, + 17.219391, + 17.220553, + 17.221707, + 17.222854, + 17.223994, + 17.225127, + 17.226253, + 17.227372, + 17.228484, + 17.229590, + 17.230689, + 17.231781, + 17.232866, + 17.233945, + 17.235018, + 17.236084, + 17.237143, + 17.238197, + 17.239243, + 17.240284, + 17.241319, + 17.242347, + 17.243369, + 17.244385, + 17.245395, + 17.246399, + 17.247398, + 17.248390, + 17.249376, + 17.250357, + 17.251332, + 17.252302, + 17.253265, + 17.254223, + 17.255176, + 17.256123, + 17.257064, + 17.258000, + 17.258931, + 17.259856, + 17.260776, + 17.261691, + 17.262601, + 17.263505, + 17.264404, + 17.265298, + 17.266187, + 17.267071, + 17.267950, + 17.268824, + 17.269693, + 17.270558, + 17.271417, + 17.272272, + 17.273121, + 17.273966, + 17.274807, + 17.275643, + 17.276474, + 17.277300, + 17.278122, + 17.278939, + 17.279752, + 17.280560, + 17.281364, + 17.282164, + 17.282959, + 17.283750, + 17.284536, + 17.285319, + 17.286097, + 17.286870, + 17.287640, + 17.288405, + 17.289167, + 17.289924, + 17.290677, + 17.291426, + 17.292171, + 17.292912, + 17.293649, + 17.294383, + 17.295112, + 17.295838, + 17.296559, + 17.297277, + 17.297991, + 17.298701, + 17.299408, + 17.300111, + 17.300810, + 17.301505, + 17.302197, + 17.302885, + 17.303570, + 17.304251, + 17.304929, + 17.305603, + 17.306274, + 17.306941, + 17.307604, + 17.308265, + 17.308922, + 17.309575, + 17.310225, + 17.310872, + 17.311516, + 17.312156, + 17.312793, + 17.313427, + 17.314057, + 17.314685, + 17.315309, + 17.315930, + 17.316548, + 17.317163, + 17.317775, + 17.318384, + 17.318989, + 17.319592, + 17.320192, + 17.320788, + 17.321382, + 17.321973, + 17.322561, + 17.323146, + 17.323728, + 17.324307, + 17.324883, + 17.325457, + 17.326028, + 17.326596, + 17.327161, + 17.327723, + 17.328283, + 17.328840, + 17.329394, + 17.329946, + 17.330494, + 17.331041, + 17.331584, + 17.332125, + 17.332664, + 17.333200, + 17.333733, + 17.334263, + 17.334792, + 17.335317, + 17.335840, + 17.336361, + 17.336879, + 17.337395, + 17.337908, + 17.338419, + 17.338928, + 17.339434, + 17.339937, + 17.340439, + 17.340938, + 17.341434, + 17.341929, + 17.342421, + 17.342910, + 17.343398, + 17.343883, + 17.344366, + 17.344847, + 17.345325, + 17.345801, + 17.346275, + 17.346747, + 17.347217, + 17.347685, + 17.348150, + 17.348613, + 17.349075, + 17.349534, + 17.349991, + 17.350446, + 17.350898, + 17.351349, + 17.351798, + 17.352245, + 17.352690, + 17.353132, + 17.353573, + 17.354012, + 17.354449, + 17.354883, + 17.355316, + 17.355747, + 17.356176, + 17.356603, + 17.357029, + 17.357452, + 17.357873, + 17.358293, + 17.358711, + 17.359127, + 17.359541, + 17.359953, + 17.360363, + 17.360772, + 17.361179, + 17.361584, + 17.361987, + 17.362389, + 17.362789, + 17.363187, + 17.363583, + 17.363978, + 17.364371, + 17.364762, + 17.365151, + 17.365539, + 17.365925, + 17.366310, + 17.366693, + 17.367074, + 17.367453, + 17.367831, + 17.368208, + 17.368582, + 17.368956, + 17.369327, + 17.369697, + 17.370066, + 17.370432, + 17.370798, + 17.371162, + 17.371524, + 17.371885, + 17.372244, + 17.372601, + 17.372958, + 17.373312, + 17.373666, + 17.374017, + 17.374368, + 17.374716, + 17.375064, + 17.375410, + 17.375754, + 17.376097, + 17.376439, + 17.376779, + 17.377118, + 17.377455, + 17.377791, + 17.378126, + 17.378459, + 17.378791, + 17.379122, + 17.379451, + 17.379779, + 17.380106, + 17.380431, + 17.380755, + 17.381077, + 17.381399, + 17.381719, + 17.382037, + 17.382355, + 17.382671, + 17.382986, + 17.383299, + 17.383612, + 17.383923, + 17.384233, + 17.384541, + 17.384849, + 17.385155, + 17.385460, + 17.385764, + 17.386066, + 17.386367, + 17.386668, + 17.386966, + 17.387264, + 17.387561, + 17.387856, + 17.388151, + 17.388444, + 17.388736, + 17.389026, + 17.389316, + 17.389605, + 17.389892, + 17.390178, + 17.390463, + 17.390748, + 17.391030, + 17.391312, + 17.391593, + 17.391873, + 17.392151, + 17.392429, + 17.392705, + 17.392981, + 17.393255, + 17.393528, + 17.393801, + 17.394072, + 17.394342, + 17.394611, + 17.394879, + 17.395146, + 17.395412, + 17.395678, + 17.395942, + 17.396205, + 17.396467, + 17.396728, + 17.396988, + 17.397247, + 17.397505, + 17.397762, + 17.398018, + 17.398274, + 17.398528, + 17.398781, + 17.399034, + 17.399285, + 17.399536, + 17.399785, + 17.400034, + 17.400281, + 17.400528, + 17.400774, + 17.401019, + 17.401263, + 17.401506, + 17.401749, + 17.401990, + 17.402230, + 17.402470, + 17.402709, + 17.402947, + 17.403184, + 17.403420, + 17.403655, + 17.403889, + 17.404123, + 17.404356, + 17.404587, + 17.404818, + 17.405049, + 17.405278, + 17.405506, + 17.405734, + 17.405961, + 17.406187, + 17.406412, + 17.406637, + 17.406860, + 17.407083, + 17.407305, + 17.407526, + 17.407747, + 17.407966, + 17.408185, + 17.408403, + 17.408620, + 17.408837, + 17.409053, + 17.409268, + 17.409482, + 17.409695, + 17.409908, + 17.410120, + 17.410331, + 17.410542, + 17.410752, + 17.410961, + 17.411169, + 17.411376, + 17.411583, + 17.411789, + 17.411995, + 17.412199, + 17.412403, + 17.412607, + 17.412809, + 17.413011, + 17.413212, + 17.413412, + 17.413612, + 17.413811, + 17.414010, + 17.414207, + 17.414404, + 17.414601, + 17.414796, + 17.414991, + 17.415186, + 17.415379, + 17.415572, + 17.415764, + 17.415956, + 17.416147, + 17.416338, + 17.416527, + 17.416716, + 17.416905, + 17.417093, + 17.417280, + 17.417466, + 17.417652, + 17.417837, + 17.418022, + 17.418206, + 17.418389, + 17.418572, + 17.418754, + 17.418936, + 17.419117, + 17.419297, + 17.419477, + 17.419656, + 17.419835, + 17.420013, + 17.420190, + 17.420367, + 17.420543, + 17.420719, + 17.420894, + 17.421068, + 17.421242, + 17.421415, + 17.421588, + 17.421760, + 17.421932, + 17.422103, + 17.422273, + 17.422443, + 17.422612, + 17.422781, + 17.422950, + 17.423117, + 17.423284, + 17.423451, + 17.423617, + 17.423783, + 17.423948, + 17.424112, + 17.424276, + 17.424439, + 17.424602, + 17.424765, + 17.424926, + 17.425088, + 17.425248, + 17.425409, + 17.425568, + 17.425728, + 17.425886, + 17.426045, + 17.426202, + 17.426359, + 17.426516, + 17.426672, + 17.426828, + 17.426983, + 17.427138, + 17.427292, + 17.427446, + 17.427599, + 17.427752, + 17.427904, + 17.428056, + 17.428207, + 17.428358, + 17.428509, + 17.428658, + 17.428808, + 17.428957, + 17.429105, + 17.429253, + 17.429401, + 17.429548, + 17.429695, + 17.429841, + 17.429987, + 17.430132, + 17.430277, + 17.430421, + 17.430565, + 17.430708, + 17.430852, + 17.430994, + 17.431136, + 17.431278, + 17.431419, + 17.431560, + 17.431701, + 17.431841, + 17.431980, + 17.432119, + 17.432258, + 17.432396, + 17.432534, + 17.432671, + 17.432808, + 17.432945, + 17.433081, + 17.433217, + 17.433352, + 17.433487, + 17.433622, + 17.433756, + 17.433890, + 17.434023, + 17.434156, + 17.434288, + 17.434420, + 17.434552, + 17.434683, + 17.434814, + 17.434945, + 17.435075, + 17.435205, + 17.435334, + }, + {// The expectations for dimension = 36 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041666, + 2.159999, + 2.281665, + 2.406664, + 2.534995, + 2.666656, + 2.801647, + 2.939964, + 3.081603, + 3.226557, + 3.374814, + 3.526359, + 3.681169, + 3.839214, + 4.000450, + 4.164822, + 4.332257, + 4.502662, + 4.675924, + 4.851904, + 5.030438, + 5.211336, + 5.394379, + 5.579322, + 5.765897, + 5.953815, + 6.142767, + 6.332431, + 6.522479, + 6.712576, + 6.902392, + 7.091604, + 7.279897, + 7.466975, + 7.652560, + 7.836396, + 8.018248, + 8.197908, + 8.375192, + 8.549939, + 8.722013, + 8.891301, + 9.057710, + 9.221168, + 9.381621, + 9.539028, + 9.693368, + 9.844627, + 9.992807, + 10.137917, + 10.279975, + 10.419007, + 10.555046, + 10.688127, + 10.818293, + 10.945587, + 11.070059, + 11.191759, + 11.310738, + 11.427050, + 11.540749, + 11.651892, + 11.760532, + 11.866727, + 11.970531, + 12.072000, + 12.171189, + 12.268153, + 12.362944, + 12.455617, + 12.546223, + 12.634814, + 12.721440, + 12.806150, + 12.888993, + 12.970016, + 13.049265, + 13.126786, + 13.202623, + 13.276819, + 13.349416, + 13.420455, + 13.489976, + 13.558018, + 13.624619, + 13.689815, + 13.753643, + 13.816137, + 13.877332, + 13.937261, + 13.995955, + 14.053447, + 14.109766, + 14.164942, + 14.219004, + 14.271979, + 14.323896, + 14.374780, + 14.424656, + 14.473551, + 14.521488, + 14.568490, + 14.614581, + 14.659783, + 14.704117, + 14.747605, + 14.790267, + 14.832122, + 14.873191, + 14.913491, + 14.953041, + 14.991859, + 15.029963, + 15.067368, + 15.104091, + 15.140148, + 15.175555, + 15.210326, + 15.244476, + 15.278019, + 15.310970, + 15.343341, + 15.375145, + 15.406396, + 15.437105, + 15.467285, + 15.496948, + 15.526104, + 15.554766, + 15.582943, + 15.610647, + 15.637887, + 15.664674, + 15.691018, + 15.716927, + 15.742412, + 15.767481, + 15.792143, + 15.816406, + 15.840279, + 15.863770, + 15.886887, + 15.909638, + 15.932030, + 15.954070, + 15.975766, + 15.997125, + 16.018153, + 16.038857, + 16.059244, + 16.079320, + 16.099091, + 16.118563, + 16.137742, + 16.156634, + 16.175244, + 16.193578, + 16.211642, + 16.229439, + 16.246977, + 16.264258, + 16.281289, + 16.298074, + 16.314618, + 16.330925, + 16.347000, + 16.362847, + 16.378470, + 16.393873, + 16.409061, + 16.424037, + 16.438805, + 16.453369, + 16.467733, + 16.481900, + 16.495874, + 16.509658, + 16.523255, + 16.536670, + 16.549905, + 16.562963, + 16.575847, + 16.588561, + 16.601107, + 16.613489, + 16.625709, + 16.637769, + 16.649673, + 16.661424, + 16.673023, + 16.684474, + 16.695778, + 16.706939, + 16.717959, + 16.728840, + 16.739584, + 16.750194, + 16.760672, + 16.771020, + 16.781240, + 16.791334, + 16.801305, + 16.811153, + 16.820882, + 16.830493, + 16.839988, + 16.849369, + 16.858638, + 16.867796, + 16.876845, + 16.885787, + 16.894624, + 16.903356, + 16.911987, + 16.920517, + 16.928947, + 16.937280, + 16.945517, + 16.953660, + 16.961709, + 16.969666, + 16.977533, + 16.985311, + 16.993001, + 17.000604, + 17.008123, + 17.015558, + 17.022909, + 17.030180, + 17.037370, + 17.044481, + 17.051514, + 17.058470, + 17.065351, + 17.072157, + 17.078889, + 17.085549, + 17.092137, + 17.098655, + 17.105104, + 17.111484, + 17.117796, + 17.124042, + 17.130222, + 17.136337, + 17.142389, + 17.148377, + 17.154303, + 17.160168, + 17.165973, + 17.171718, + 17.177404, + 17.183033, + 17.188604, + 17.194118, + 17.199577, + 17.204981, + 17.210330, + 17.215627, + 17.220870, + 17.226061, + 17.231201, + 17.236290, + 17.241329, + 17.246319, + 17.251259, + 17.256152, + 17.260997, + 17.265795, + 17.270547, + 17.275253, + 17.279914, + 17.284530, + 17.289102, + 17.293631, + 17.298117, + 17.302560, + 17.306962, + 17.311322, + 17.315641, + 17.319921, + 17.324160, + 17.328360, + 17.332521, + 17.336644, + 17.340729, + 17.344776, + 17.348787, + 17.352761, + 17.356698, + 17.360601, + 17.364467, + 17.368300, + 17.372097, + 17.375861, + 17.379591, + 17.383288, + 17.386952, + 17.390584, + 17.394183, + 17.397751, + 17.401288, + 17.404794, + 17.408269, + 17.411714, + 17.415129, + 17.418515, + 17.421871, + 17.425199, + 17.428498, + 17.431768, + 17.435011, + 17.438227, + 17.441415, + 17.444576, + 17.447710, + 17.450818, + 17.453900, + 17.456956, + 17.459987, + 17.462993, + 17.465973, + 17.468929, + 17.471861, + 17.474768, + 17.477652, + 17.480512, + 17.483349, + 17.486162, + 17.488953, + 17.491721, + 17.494467, + 17.497191, + 17.499892, + 17.502573, + 17.505231, + 17.507869, + 17.510486, + 17.513081, + 17.515657, + 17.518212, + 17.520747, + 17.523262, + 17.525757, + 17.528233, + 17.530690, + 17.533127, + 17.535546, + 17.537946, + 17.540327, + 17.542690, + 17.545035, + 17.547363, + 17.549672, + 17.551964, + 17.554238, + 17.556495, + 17.558735, + 17.560959, + 17.563165, + 17.565355, + 17.567529, + 17.569686, + 17.571827, + 17.573953, + 17.576062, + 17.578157, + 17.580235, + 17.582299, + 17.584347, + 17.586380, + 17.588399, + 17.590402, + 17.592392, + 17.594366, + 17.596327, + 17.598273, + 17.600205, + 17.602124, + 17.604029, + 17.605920, + 17.607797, + 17.609662, + 17.611513, + 17.613351, + 17.615176, + 17.616988, + 17.618787, + 17.620574, + 17.622348, + 17.624110, + 17.625860, + 17.627597, + 17.629323, + 17.631036, + 17.632738, + 17.634428, + 17.636106, + 17.637773, + 17.639428, + 17.641073, + 17.642706, + 17.644327, + 17.645938, + 17.647538, + 17.649127, + 17.650706, + 17.652274, + 17.653831, + 17.655378, + 17.656915, + 17.658441, + 17.659957, + 17.661464, + 17.662960, + 17.664446, + 17.665923, + 17.667390, + 17.668847, + 17.670295, + 17.671733, + 17.673162, + 17.674582, + 17.675992, + 17.677393, + 17.678785, + 17.680169, + 17.681543, + 17.682909, + 17.684265, + 17.685614, + 17.686953, + 17.688284, + 17.689607, + 17.690921, + 17.692227, + 17.693524, + 17.694814, + 17.696095, + 17.697368, + 17.698634, + 17.699891, + 17.701141, + 17.702382, + 17.703617, + 17.704843, + 17.706062, + 17.707273, + 17.708477, + 17.709674, + 17.710863, + 17.712045, + 17.713219, + 17.714387, + 17.715547, + 17.716701, + 17.717847, + 17.718987, + 17.720119, + 17.721245, + 17.722364, + 17.723476, + 17.724582, + 17.725681, + 17.726773, + 17.727859, + 17.728939, + 17.730012, + 17.731079, + 17.732139, + 17.733193, + 17.734241, + 17.735283, + 17.736319, + 17.737349, + 17.738372, + 17.739390, + 17.740402, + 17.741408, + 17.742408, + 17.743402, + 17.744391, + 17.745374, + 17.746351, + 17.747323, + 17.748289, + 17.749249, + 17.750204, + 17.751154, + 17.752098, + 17.753037, + 17.753971, + 17.754899, + 17.755822, + 17.756740, + 17.757653, + 17.758560, + 17.759463, + 17.760360, + 17.761253, + 17.762140, + 17.763023, + 17.763901, + 17.764773, + 17.765641, + 17.766505, + 17.767363, + 17.768217, + 17.769066, + 17.769910, + 17.770750, + 17.771585, + 17.772416, + 17.773242, + 17.774064, + 17.774881, + 17.775694, + 17.776502, + 17.777306, + 17.778106, + 17.778901, + 17.779692, + 17.780479, + 17.781262, + 17.782041, + 17.782815, + 17.783585, + 17.784352, + 17.785114, + 17.785872, + 17.786626, + 17.787376, + 17.788122, + 17.788865, + 17.789603, + 17.790338, + 17.791068, + 17.791795, + 17.792518, + 17.793238, + 17.793953, + 17.794665, + 17.795374, + 17.796078, + 17.796779, + 17.797477, + 17.798170, + 17.798861, + 17.799547, + 17.800230, + 17.800910, + 17.801586, + 17.802259, + 17.802929, + 17.803595, + 17.804257, + 17.804917, + 17.805573, + 17.806225, + 17.806875, + 17.807521, + 17.808164, + 17.808804, + 17.809440, + 17.810073, + 17.810704, + 17.811331, + 17.811955, + 17.812576, + 17.813193, + 17.813808, + 17.814420, + 17.815029, + 17.815634, + 17.816237, + 17.816837, + 17.817434, + 17.818028, + 17.818619, + 17.819207, + 17.819793, + 17.820375, + 17.820955, + 17.821532, + 17.822106, + 17.822678, + 17.823246, + 17.823812, + 17.824375, + 17.824936, + 17.825494, + 17.826049, + 17.826601, + 17.827151, + 17.827699, + 17.828243, + 17.828785, + 17.829325, + 17.829862, + 17.830397, + 17.830929, + 17.831458, + 17.831985, + 17.832510, + 17.833032, + 17.833551, + 17.834069, + 17.834583, + 17.835096, + 17.835606, + 17.836114, + 17.836619, + 17.837122, + 17.837623, + 17.838121, + 17.838617, + 17.839111, + 17.839603, + 17.840092, + 17.840579, + 17.841064, + 17.841547, + 17.842027, + 17.842506, + 17.842982, + 17.843456, + 17.843928, + 17.844397, + 17.844865, + 17.845331, + 17.845794, + 17.846255, + 17.846715, + 17.847172, + 17.847627, + 17.848080, + 17.848531, + 17.848980, + 17.849428, + 17.849873, + 17.850316, + 17.850757, + 17.851196, + 17.851634, + 17.852069, + 17.852503, + 17.852934, + 17.853364, + 17.853792, + 17.854218, + 17.854642, + 17.855064, + 17.855485, + 17.855903, + 17.856320, + 17.856735, + 17.857148, + 17.857560, + 17.857969, + 17.858377, + 17.858783, + 17.859188, + 17.859590, + 17.859991, + 17.860390, + 17.860788, + 17.861184, + 17.861578, + 17.861970, + 17.862361, + 17.862750, + 17.863138, + 17.863524, + 17.863908, + 17.864291, + 17.864672, + 17.865051, + 17.865429, + 17.865805, + 17.866180, + 17.866553, + 17.866924, + 17.867294, + 17.867663, + 17.868030, + 17.868395, + 17.868759, + 17.869121, + 17.869482, + 17.869841, + 17.870199, + 17.870556, + 17.870911, + 17.871264, + 17.871616, + 17.871967, + 17.872316, + 17.872664, + 17.873010, + 17.873355, + 17.873699, + 17.874041, + 17.874381, + 17.874721, + 17.875059, + 17.875395, + 17.875731, + 17.876065, + 17.876397, + 17.876728, + 17.877058, + 17.877387, + 17.877714, + 17.878040, + 17.878365, + 17.878688, + 17.879010, + 17.879331, + 17.879651, + 17.879969, + 17.880286, + 17.880602, + 17.880916, + 17.881229, + 17.881542, + 17.881852, + 17.882162, + 17.882470, + 17.882777, + 17.883083, + 17.883388, + 17.883692, + 17.883994, + 17.884295, + 17.884595, + 17.884894, + 17.885192, + 17.885489, + 17.885784, + 17.886078, + 17.886371, + 17.886663, + 17.886954, + 17.887244, + 17.887533, + 17.887820, + 17.888107, + 17.888392, + 17.888676, + 17.888960, + 17.889242, + 17.889523, + 17.889803, + 17.890082, + 17.890360, + 17.890636, + 17.890912, + 17.891187, + 17.891460, + 17.891733, + 17.892005, + 17.892275, + 17.892545, + 17.892814, + 17.893081, + 17.893348, + 17.893613, + 17.893878, + 17.894141, + 17.894404, + 17.894666, + 17.894926, + 17.895186, + 17.895445, + 17.895703, + 17.895959, + 17.896215, + 17.896470, + 17.896724, + 17.896977, + 17.897230, + 17.897481, + 17.897731, + 17.897980, + 17.898229, + 17.898477, + 17.898723, + 17.898969, + 17.899214, + 17.899458, + 17.899701, + 17.899943, + 17.900185, + 17.900425, + 17.900665, + 17.900903, + 17.901141, + 17.901378, + 17.901615, + 17.901850, + 17.902084, + 17.902318, + 17.902551, + 17.902783, + 17.903014, + 17.903244, + 17.903474, + 17.903703, + 17.903931, + 17.904158, + 17.904384, + 17.904609, + 17.904834, + 17.905058, + 17.905281, + 17.905503, + 17.905725, + 17.905946, + 17.906166, + 17.906385, + 17.906603, + 17.906821, + 17.907038, + 17.907254, + 17.907470, + 17.907684, + 17.907898, + 17.908111, + 17.908324, + 17.908536, + 17.908747, + 17.908957, + 17.909166, + 17.909375, + 17.909583, + 17.909791, + 17.909997, + 17.910203, + 17.910408, + 17.910613, + 17.910817, + 17.911020, + 17.911222, + 17.911424, + 17.911625, + 17.911826, + 17.912025, + 17.912224, + 17.912423, + 17.912620, + 17.912817, + 17.913014, + 17.913209, + 17.913405, + 17.913599, + 17.913793, + 17.913986, + 17.914178, + 17.914370, + 17.914561, + 17.914752, + 17.914941, + 17.915131, + 17.915319, + 17.915507, + 17.915695, + 17.915881, + 17.916067, + 17.916253, + 17.916438, + 17.916622, + 17.916806, + 17.916989, + 17.917171, + 17.917353, + 17.917534, + 17.917715, + 17.917895, + 17.918074, + 17.918253, + 17.918432, + 17.918609, + 17.918786, + 17.918963, + 17.919139, + 17.919314, + 17.919489, + 17.919664, + 17.919837, + 17.920010, + 17.920183, + 17.920355, + 17.920527, + 17.920697, + 17.920868, + 17.921038, + 17.921207, + 17.921376, + 17.921544, + 17.921711, + 17.921879, + 17.922045, + 17.922211, + 17.922377, + 17.922542, + 17.922706, + 17.922870, + 17.923034, + 17.923196, + 17.923359, + 17.923521, + 17.923682, + 17.923843, + 17.924003, + 17.924163, + 17.924322, + 17.924481, + 17.924640, + 17.924798, + 17.924955, + 17.925112, + 17.925268, + 17.925424, + 17.925579, + 17.925734, + 17.925889, + 17.926043, + 17.926196, + 17.926349, + 17.926502, + 17.926654, + 17.926805, + 17.926956, + 17.927107, + 17.927257, + 17.927407, + 17.927556, + 17.927705, + 17.927853, + 17.928001, + 17.928148, + 17.928295, + 17.928442, + 17.928588, + 17.928733, + 17.928879, + 17.929023, + 17.929168, + 17.929311, + 17.929455, + 17.929598, + 17.929740, + 17.929882, + 17.930024, + 17.930165, + 17.930306, + 17.930447, + 17.930587, + 17.930726, + 17.930865, + 17.931004, + 17.931142, + 17.931280, + 17.931418, + 17.931555, + 17.931691, + }, + {// The expectations for dimension = 37 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281666, + 2.406665, + 2.534997, + 2.666661, + 2.801655, + 2.939978, + 3.081627, + 3.226597, + 3.374880, + 3.526464, + 3.681334, + 3.839465, + 4.000825, + 4.165369, + 4.333040, + 4.503762, + 4.677441, + 4.853959, + 5.033175, + 5.214922, + 5.399007, + 5.585206, + 5.773275, + 5.962941, + 6.153913, + 6.345882, + 6.538526, + 6.731514, + 6.924515, + 7.117198, + 7.309241, + 7.500333, + 7.690179, + 7.878503, + 8.065052, + 8.249594, + 8.431922, + 8.611854, + 8.789233, + 8.963923, + 9.135813, + 9.304810, + 9.470844, + 9.633861, + 9.793821, + 9.950700, + 10.104489, + 10.255185, + 10.402799, + 10.547349, + 10.688859, + 10.827360, + 10.962890, + 11.095488, + 11.225200, + 11.352071, + 11.476152, + 11.597494, + 11.716151, + 11.832175, + 11.945622, + 12.056547, + 12.165004, + 12.271050, + 12.374739, + 12.476125, + 12.575263, + 12.672207, + 12.767008, + 12.859720, + 12.950392, + 13.039077, + 13.125822, + 13.210676, + 13.293686, + 13.374899, + 13.454360, + 13.532113, + 13.608201, + 13.682666, + 13.755550, + 13.826893, + 13.896733, + 13.965109, + 14.032058, + 14.097615, + 14.161816, + 14.224695, + 14.286286, + 14.346621, + 14.405730, + 14.463646, + 14.520397, + 14.576013, + 14.630521, + 14.683950, + 14.736326, + 14.787674, + 14.838021, + 14.887389, + 14.935804, + 14.983289, + 15.029865, + 15.075554, + 15.120379, + 15.164360, + 15.207516, + 15.249868, + 15.291434, + 15.332232, + 15.372282, + 15.411600, + 15.450203, + 15.488109, + 15.525332, + 15.561889, + 15.597794, + 15.633064, + 15.667711, + 15.701751, + 15.735197, + 15.768062, + 15.800358, + 15.832100, + 15.863298, + 15.893966, + 15.924114, + 15.953754, + 15.982896, + 16.011553, + 16.039733, + 16.067448, + 16.094707, + 16.121520, + 16.147897, + 16.173846, + 16.199376, + 16.224497, + 16.249216, + 16.273543, + 16.297485, + 16.321050, + 16.344245, + 16.367079, + 16.389559, + 16.411691, + 16.433483, + 16.454941, + 16.476072, + 16.496884, + 16.517381, + 16.537570, + 16.557457, + 16.577048, + 16.596349, + 16.615365, + 16.634103, + 16.652566, + 16.670760, + 16.688691, + 16.706364, + 16.723783, + 16.740953, + 16.757878, + 16.774564, + 16.791014, + 16.807234, + 16.823227, + 16.838997, + 16.854548, + 16.869885, + 16.885012, + 16.899931, + 16.914647, + 16.929164, + 16.943484, + 16.957612, + 16.971551, + 16.985303, + 16.998874, + 17.012264, + 17.025479, + 17.038520, + 17.051390, + 17.064094, + 17.076632, + 17.089009, + 17.101227, + 17.113289, + 17.125197, + 17.136954, + 17.148562, + 17.160024, + 17.171342, + 17.182519, + 17.193557, + 17.204458, + 17.215224, + 17.225858, + 17.236362, + 17.246738, + 17.256987, + 17.267113, + 17.277116, + 17.286999, + 17.296764, + 17.306413, + 17.315947, + 17.325368, + 17.334678, + 17.343879, + 17.352973, + 17.361960, + 17.370843, + 17.379623, + 17.388302, + 17.396881, + 17.405363, + 17.413747, + 17.422037, + 17.430232, + 17.438335, + 17.446348, + 17.454270, + 17.462104, + 17.469851, + 17.477513, + 17.485089, + 17.492583, + 17.499994, + 17.507325, + 17.514575, + 17.521748, + 17.528842, + 17.535861, + 17.542804, + 17.549673, + 17.556468, + 17.563192, + 17.569844, + 17.576426, + 17.582939, + 17.589384, + 17.595762, + 17.602073, + 17.608319, + 17.614500, + 17.620618, + 17.626672, + 17.632665, + 17.638597, + 17.644469, + 17.650281, + 17.656034, + 17.661730, + 17.667368, + 17.672950, + 17.678476, + 17.683948, + 17.689365, + 17.694729, + 17.700040, + 17.705299, + 17.710507, + 17.715664, + 17.720770, + 17.725828, + 17.730836, + 17.735797, + 17.740709, + 17.745575, + 17.750395, + 17.755168, + 17.759897, + 17.764580, + 17.769220, + 17.773816, + 17.778369, + 17.782880, + 17.787349, + 17.791776, + 17.796162, + 17.800508, + 17.804814, + 17.809080, + 17.813308, + 17.817497, + 17.821648, + 17.825761, + 17.829838, + 17.833877, + 17.837881, + 17.841848, + 17.845780, + 17.849677, + 17.853540, + 17.857368, + 17.861163, + 17.864924, + 17.868653, + 17.872348, + 17.876012, + 17.879644, + 17.883244, + 17.886813, + 17.890351, + 17.893859, + 17.897337, + 17.900785, + 17.904204, + 17.907593, + 17.910954, + 17.914287, + 17.917591, + 17.920868, + 17.924117, + 17.927339, + 17.930534, + 17.933703, + 17.936845, + 17.939962, + 17.943052, + 17.946118, + 17.949158, + 17.952173, + 17.955164, + 17.958130, + 17.961072, + 17.963991, + 17.966885, + 17.969757, + 17.972605, + 17.975431, + 17.978234, + 17.981015, + 17.983774, + 17.986511, + 17.989226, + 17.991920, + 17.994592, + 17.997244, + 17.999875, + 18.002485, + 18.005075, + 18.007645, + 18.010195, + 18.012726, + 18.015236, + 18.017728, + 18.020201, + 18.022654, + 18.025089, + 18.027505, + 18.029903, + 18.032283, + 18.034645, + 18.036989, + 18.039316, + 18.041625, + 18.043916, + 18.046191, + 18.048449, + 18.050690, + 18.052914, + 18.055122, + 18.057314, + 18.059490, + 18.061649, + 18.063793, + 18.065921, + 18.068034, + 18.070131, + 18.072214, + 18.074281, + 18.076333, + 18.078370, + 18.080393, + 18.082402, + 18.084396, + 18.086375, + 18.088341, + 18.090293, + 18.092231, + 18.094155, + 18.096066, + 18.097963, + 18.099847, + 18.101718, + 18.103576, + 18.105421, + 18.107253, + 18.109072, + 18.110879, + 18.112673, + 18.114455, + 18.116225, + 18.117983, + 18.119728, + 18.121462, + 18.123184, + 18.124894, + 18.126592, + 18.128279, + 18.129955, + 18.131620, + 18.133273, + 18.134915, + 18.136546, + 18.138167, + 18.139776, + 18.141375, + 18.142963, + 18.144541, + 18.146108, + 18.147665, + 18.149212, + 18.150749, + 18.152275, + 18.153792, + 18.155299, + 18.156796, + 18.158283, + 18.159761, + 18.161229, + 18.162687, + 18.164137, + 18.165577, + 18.167007, + 18.168429, + 18.169841, + 18.171245, + 18.172640, + 18.174025, + 18.175402, + 18.176771, + 18.178130, + 18.179482, + 18.180824, + 18.182159, + 18.183485, + 18.184802, + 18.186112, + 18.187413, + 18.188706, + 18.189992, + 18.191269, + 18.192539, + 18.193800, + 18.195054, + 18.196301, + 18.197540, + 18.198771, + 18.199994, + 18.201211, + 18.202420, + 18.203621, + 18.204815, + 18.206003, + 18.207183, + 18.208356, + 18.209521, + 18.210680, + 18.211832, + 18.212978, + 18.214116, + 18.215248, + 18.216373, + 18.217491, + 18.218603, + 18.219708, + 18.220807, + 18.221899, + 18.222985, + 18.224064, + 18.225137, + 18.226204, + 18.227265, + 18.228320, + 18.229369, + 18.230411, + 18.231448, + 18.232478, + 18.233503, + 18.234522, + 18.235535, + 18.236542, + 18.237543, + 18.238539, + 18.239529, + 18.240514, + 18.241493, + 18.242466, + 18.243434, + 18.244397, + 18.245354, + 18.246306, + 18.247252, + 18.248193, + 18.249129, + 18.250060, + 18.250986, + 18.251906, + 18.252821, + 18.253732, + 18.254637, + 18.255537, + 18.256433, + 18.257323, + 18.258209, + 18.259090, + 18.259966, + 18.260837, + 18.261703, + 18.262565, + 18.263422, + 18.264275, + 18.265123, + 18.265966, + 18.266805, + 18.267639, + 18.268469, + 18.269295, + 18.270116, + 18.270932, + 18.271745, + 18.272553, + 18.273357, + 18.274156, + 18.274951, + 18.275743, + 18.276530, + 18.277312, + 18.278091, + 18.278866, + 18.279636, + 18.280403, + 18.281166, + 18.281924, + 18.282679, + 18.283430, + 18.284177, + 18.284920, + 18.285659, + 18.286395, + 18.287126, + 18.287854, + 18.288578, + 18.289299, + 18.290016, + 18.290729, + 18.291438, + 18.292144, + 18.292847, + 18.293546, + 18.294241, + 18.294933, + 18.295621, + 18.296306, + 18.296988, + 18.297666, + 18.298340, + 18.299012, + 18.299680, + 18.300344, + 18.301006, + 18.301664, + 18.302318, + 18.302970, + 18.303618, + 18.304263, + 18.304905, + 18.305544, + 18.306180, + 18.306813, + 18.307442, + 18.308069, + 18.308692, + 18.309312, + 18.309930, + 18.310544, + 18.311156, + 18.311764, + 18.312370, + 18.312972, + 18.313572, + 18.314169, + 18.314763, + 18.315354, + 18.315942, + 18.316528, + 18.317110, + 18.317690, + 18.318268, + 18.318842, + 18.319414, + 18.319983, + 18.320549, + 18.321113, + 18.321674, + 18.322233, + 18.322788, + 18.323342, + 18.323892, + 18.324440, + 18.324986, + 18.325529, + 18.326069, + 18.326607, + 18.327143, + 18.327676, + 18.328206, + 18.328734, + 18.329260, + 18.329783, + 18.330304, + 18.330822, + 18.331339, + 18.331852, + 18.332364, + 18.332873, + 18.333380, + 18.333884, + 18.334386, + 18.334886, + 18.335384, + 18.335879, + 18.336372, + 18.336863, + 18.337352, + 18.337839, + 18.338323, + 18.338805, + 18.339285, + 18.339763, + 18.340239, + 18.340713, + 18.341184, + 18.341654, + 18.342121, + 18.342586, + 18.343050, + 18.343511, + 18.343970, + 18.344427, + 18.344883, + 18.345336, + 18.345787, + 18.346236, + 18.346684, + 18.347129, + 18.347572, + 18.348014, + 18.348454, + 18.348891, + 18.349327, + 18.349761, + 18.350193, + 18.350623, + 18.351051, + 18.351478, + 18.351903, + 18.352325, + 18.352747, + 18.353166, + 18.353583, + 18.353999, + 18.354413, + 18.354825, + 18.355235, + 18.355644, + 18.356051, + 18.356456, + 18.356860, + 18.357262, + 18.357662, + 18.358060, + 18.358457, + 18.358852, + 18.359246, + 18.359638, + 18.360028, + 18.360416, + 18.360803, + 18.361189, + 18.361572, + 18.361955, + 18.362335, + 18.362714, + 18.363092, + 18.363468, + 18.363842, + 18.364215, + 18.364586, + 18.364956, + 18.365324, + 18.365691, + 18.366056, + 18.366420, + 18.366782, + 18.367143, + 18.367503, + 18.367861, + 18.368217, + 18.368572, + 18.368926, + 18.369278, + 18.369629, + 18.369978, + 18.370326, + 18.370673, + 18.371018, + 18.371361, + 18.371704, + 18.372045, + 18.372385, + 18.372723, + 18.373060, + 18.373396, + 18.373730, + 18.374063, + 18.374395, + 18.374725, + 18.375054, + 18.375382, + 18.375709, + 18.376034, + 18.376358, + 18.376681, + 18.377002, + 18.377322, + 18.377641, + 18.377959, + 18.378275, + 18.378591, + 18.378905, + 18.379217, + 18.379529, + 18.379839, + 18.380148, + 18.380456, + 18.380763, + 18.381069, + 18.381373, + 18.381677, + 18.381979, + 18.382280, + 18.382580, + 18.382878, + 18.383176, + 18.383472, + 18.383768, + 18.384062, + 18.384355, + 18.384647, + 18.384938, + 18.385227, + 18.385516, + 18.385803, + 18.386090, + 18.386375, + 18.386660, + 18.386943, + 18.387225, + 18.387506, + 18.387786, + 18.388066, + 18.388344, + 18.388621, + 18.388897, + 18.389171, + 18.389445, + 18.389718, + 18.389990, + 18.390261, + 18.390531, + 18.390800, + 18.391068, + 18.391335, + 18.391601, + 18.391866, + 18.392130, + 18.392393, + 18.392655, + 18.392916, + 18.393176, + 18.393435, + 18.393694, + 18.393951, + 18.394207, + 18.394463, + 18.394717, + 18.394971, + 18.395224, + 18.395476, + 18.395727, + 18.395977, + 18.396226, + 18.396474, + 18.396721, + 18.396968, + 18.397213, + 18.397458, + 18.397702, + 18.397945, + 18.398187, + 18.398428, + 18.398668, + 18.398908, + 18.399147, + 18.399384, + 18.399621, + 18.399857, + 18.400093, + 18.400327, + 18.400561, + 18.400794, + 18.401026, + 18.401257, + 18.401487, + 18.401717, + 18.401946, + 18.402174, + 18.402401, + 18.402628, + 18.402853, + 18.403078, + 18.403302, + 18.403525, + 18.403748, + 18.403970, + 18.404191, + 18.404411, + 18.404630, + 18.404849, + 18.405067, + 18.405284, + 18.405501, + 18.405716, + 18.405931, + 18.406146, + 18.406359, + 18.406572, + 18.406784, + 18.406996, + 18.407206, + 18.407416, + 18.407625, + 18.407834, + 18.408042, + 18.408249, + 18.408455, + 18.408661, + 18.408866, + 18.409070, + 18.409274, + 18.409477, + 18.409679, + 18.409881, + 18.410082, + 18.410282, + 18.410481, + 18.410680, + 18.410879, + 18.411076, + 18.411273, + 18.411469, + 18.411665, + 18.411860, + 18.412054, + 18.412248, + 18.412441, + 18.412634, + 18.412825, + 18.413017, + 18.413207, + 18.413397, + 18.413586, + 18.413775, + 18.413963, + 18.414151, + 18.414337, + 18.414524, + 18.414709, + 18.414894, + 18.415079, + 18.415262, + 18.415446, + 18.415628, + 18.415810, + 18.415992, + 18.416173, + 18.416353, + 18.416533, + 18.416712, + 18.416890, + 18.417068, + 18.417246, + 18.417423, + 18.417599, + 18.417774, + 18.417950, + 18.418124, + 18.418298, + 18.418472, + 18.418645, + 18.418817, + 18.418989, + 18.419160, + 18.419331, + 18.419501, + 18.419671, + 18.419840, + 18.420008, + 18.420176, + 18.420344, + 18.420511, + 18.420677, + 18.420843, + 18.421009, + 18.421174, + 18.421338, + 18.421502, + 18.421665, + 18.421828, + 18.421991, + 18.422153, + 18.422314, + 18.422475, + 18.422635, + 18.422795, + 18.422954, + 18.423113, + 18.423272, + 18.423429, + 18.423587, + 18.423744, + 18.423900, + 18.424056, + 18.424212, + 18.424367, + 18.424521, + 18.424675, + 18.424829, + 18.424982, + 18.425135, + 18.425287, + 18.425439, + 18.425590, + 18.425741, + 18.425891, + 18.426041, + 18.426190, + 18.426339, + 18.426488, + 18.426636, + 18.426783, + 18.426931, + 18.427077, + 18.427224, + 18.427370, + 18.427515, + 18.427660, + 18.427804, + 18.427949, + }, + {// The expectations for dimension = 38 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281666, + 2.406666, + 2.534998, + 2.666663, + 2.801660, + 2.939987, + 3.081643, + 3.226623, + 3.374923, + 3.526535, + 3.681446, + 3.839639, + 4.001089, + 4.165761, + 4.333610, + 4.504576, + 4.678579, + 4.855524, + 5.035289, + 5.217730, + 5.402676, + 5.589930, + 5.779267, + 5.970437, + 6.163167, + 6.357163, + 6.552114, + 6.747698, + 6.943585, + 7.139443, + 7.334942, + 7.529763, + 7.723596, + 7.916150, + 8.107150, + 8.296347, + 8.483511, + 8.668438, + 8.850948, + 9.030886, + 9.208119, + 9.382536, + 9.554047, + 9.722582, + 9.888088, + 10.050525, + 10.209870, + 10.366113, + 10.519253, + 10.669298, + 10.816267, + 10.960183, + 11.101078, + 11.238988, + 11.373951, + 11.506012, + 11.635218, + 11.761617, + 11.885260, + 12.006200, + 12.124490, + 12.240183, + 12.353335, + 12.464000, + 12.572233, + 12.678089, + 12.781621, + 12.882884, + 12.981931, + 13.078815, + 13.173586, + 13.266297, + 13.356996, + 13.445735, + 13.532559, + 13.617518, + 13.700656, + 13.782020, + 13.861654, + 13.939600, + 14.015901, + 14.090598, + 14.163731, + 14.235340, + 14.305462, + 14.374134, + 14.441394, + 14.507276, + 14.571814, + 14.635043, + 14.696994, + 14.757699, + 14.817189, + 14.875495, + 14.932644, + 14.988666, + 15.043589, + 15.097438, + 15.150241, + 15.202022, + 15.252806, + 15.302618, + 15.351481, + 15.399417, + 15.446449, + 15.492597, + 15.537884, + 15.582329, + 15.625952, + 15.668773, + 15.710809, + 15.752080, + 15.792603, + 15.832395, + 15.871473, + 15.909854, + 15.947553, + 15.984585, + 16.020966, + 16.056711, + 16.091834, + 16.126347, + 16.160266, + 16.193604, + 16.226372, + 16.258583, + 16.290251, + 16.321385, + 16.351999, + 16.382103, + 16.411708, + 16.440825, + 16.469464, + 16.497635, + 16.525349, + 16.552614, + 16.579441, + 16.605837, + 16.631813, + 16.657377, + 16.682537, + 16.707302, + 16.731680, + 16.755677, + 16.779304, + 16.802565, + 16.825470, + 16.848025, + 16.870236, + 16.892112, + 16.913658, + 16.934880, + 16.955786, + 16.976381, + 16.996672, + 17.016664, + 17.036362, + 17.055773, + 17.074902, + 17.093755, + 17.112336, + 17.130650, + 17.148703, + 17.166500, + 17.184045, + 17.201343, + 17.218398, + 17.235215, + 17.251798, + 17.268152, + 17.284281, + 17.300188, + 17.315877, + 17.331354, + 17.346620, + 17.361681, + 17.376539, + 17.391199, + 17.405663, + 17.419936, + 17.434020, + 17.447918, + 17.461635, + 17.475172, + 17.488534, + 17.501723, + 17.514742, + 17.527594, + 17.540281, + 17.552807, + 17.565174, + 17.577385, + 17.589442, + 17.601349, + 17.613106, + 17.624718, + 17.636186, + 17.647512, + 17.658699, + 17.669750, + 17.680665, + 17.691448, + 17.702101, + 17.712625, + 17.723023, + 17.733297, + 17.743449, + 17.753479, + 17.763392, + 17.773187, + 17.782868, + 17.792436, + 17.801892, + 17.811238, + 17.820477, + 17.829609, + 17.838636, + 17.847560, + 17.856383, + 17.865105, + 17.873729, + 17.882256, + 17.890687, + 17.899023, + 17.907267, + 17.915419, + 17.923481, + 17.931454, + 17.939340, + 17.947139, + 17.954853, + 17.962483, + 17.970031, + 17.977497, + 17.984883, + 17.992190, + 17.999418, + 18.006570, + 18.013646, + 18.020646, + 18.027574, + 18.034428, + 18.041211, + 18.047923, + 18.054565, + 18.061138, + 18.067644, + 18.074082, + 18.080455, + 18.086762, + 18.093005, + 18.099185, + 18.105302, + 18.111357, + 18.117352, + 18.123286, + 18.129161, + 18.134978, + 18.140737, + 18.146439, + 18.152085, + 18.157675, + 18.163210, + 18.168691, + 18.174119, + 18.179494, + 18.184818, + 18.190090, + 18.195311, + 18.200482, + 18.205604, + 18.210676, + 18.215701, + 18.220678, + 18.225608, + 18.230492, + 18.235330, + 18.240123, + 18.244871, + 18.249575, + 18.254235, + 18.258852, + 18.263427, + 18.267960, + 18.272451, + 18.276901, + 18.281311, + 18.285680, + 18.290010, + 18.294301, + 18.298554, + 18.302768, + 18.306945, + 18.311084, + 18.315187, + 18.319253, + 18.323283, + 18.327278, + 18.331237, + 18.335162, + 18.339053, + 18.342909, + 18.346733, + 18.350523, + 18.354280, + 18.358005, + 18.361698, + 18.365359, + 18.368989, + 18.372588, + 18.376157, + 18.379695, + 18.383203, + 18.386682, + 18.390132, + 18.393553, + 18.396945, + 18.400308, + 18.403644, + 18.406953, + 18.410233, + 18.413487, + 18.416714, + 18.419915, + 18.423089, + 18.426238, + 18.429361, + 18.432459, + 18.435531, + 18.438579, + 18.441602, + 18.444601, + 18.447576, + 18.450527, + 18.453455, + 18.456360, + 18.459241, + 18.462100, + 18.464936, + 18.467750, + 18.470542, + 18.473312, + 18.476060, + 18.478787, + 18.481493, + 18.484178, + 18.486842, + 18.489485, + 18.492109, + 18.494712, + 18.497295, + 18.499859, + 18.502403, + 18.504928, + 18.507434, + 18.509920, + 18.512389, + 18.514838, + 18.517269, + 18.519682, + 18.522077, + 18.524455, + 18.526814, + 18.529156, + 18.531481, + 18.533789, + 18.536080, + 18.538353, + 18.540611, + 18.542852, + 18.545076, + 18.547285, + 18.549477, + 18.551654, + 18.553814, + 18.555960, + 18.558090, + 18.560204, + 18.562304, + 18.564389, + 18.566458, + 18.568514, + 18.570554, + 18.572580, + 18.574592, + 18.576590, + 18.578574, + 18.580544, + 18.582500, + 18.584443, + 18.586372, + 18.588287, + 18.590190, + 18.592079, + 18.593956, + 18.595819, + 18.597670, + 18.599508, + 18.601333, + 18.603146, + 18.604947, + 18.606736, + 18.608512, + 18.610277, + 18.612029, + 18.613770, + 18.615500, + 18.617217, + 18.618923, + 18.620618, + 18.622302, + 18.623974, + 18.625636, + 18.627286, + 18.628926, + 18.630554, + 18.632173, + 18.633780, + 18.635377, + 18.636964, + 18.638540, + 18.640106, + 18.641662, + 18.643208, + 18.644744, + 18.646270, + 18.647786, + 18.649293, + 18.650790, + 18.652277, + 18.653755, + 18.655224, + 18.656683, + 18.658133, + 18.659574, + 18.661006, + 18.662429, + 18.663843, + 18.665248, + 18.666644, + 18.668032, + 18.669411, + 18.670781, + 18.672143, + 18.673497, + 18.674842, + 18.676179, + 18.677508, + 18.678828, + 18.680141, + 18.681445, + 18.682741, + 18.684030, + 18.685311, + 18.686584, + 18.687849, + 18.689107, + 18.690357, + 18.691600, + 18.692835, + 18.694063, + 18.695283, + 18.696496, + 18.697702, + 18.698901, + 18.700093, + 18.701278, + 18.702455, + 18.703626, + 18.704790, + 18.705947, + 18.707097, + 18.708241, + 18.709377, + 18.710508, + 18.711631, + 18.712748, + 18.713859, + 18.714963, + 18.716061, + 18.717153, + 18.718238, + 18.719317, + 18.720390, + 18.721457, + 18.722518, + 18.723572, + 18.724621, + 18.725664, + 18.726700, + 18.727731, + 18.728757, + 18.729776, + 18.730790, + 18.731798, + 18.732800, + 18.733797, + 18.734788, + 18.735773, + 18.736754, + 18.737728, + 18.738698, + 18.739662, + 18.740620, + 18.741574, + 18.742522, + 18.743465, + 18.744403, + 18.745335, + 18.746263, + 18.747185, + 18.748103, + 18.749015, + 18.749923, + 18.750826, + 18.751724, + 18.752617, + 18.753505, + 18.754388, + 18.755267, + 18.756141, + 18.757010, + 18.757875, + 18.758735, + 18.759590, + 18.760441, + 18.761288, + 18.762130, + 18.762968, + 18.763801, + 18.764629, + 18.765454, + 18.766274, + 18.767090, + 18.767901, + 18.768709, + 18.769512, + 18.770311, + 18.771106, + 18.771896, + 18.772683, + 18.773466, + 18.774244, + 18.775019, + 18.775789, + 18.776556, + 18.777319, + 18.778077, + 18.778832, + 18.779583, + 18.780331, + 18.781074, + 18.781814, + 18.782550, + 18.783282, + 18.784011, + 18.784736, + 18.785457, + 18.786175, + 18.786889, + 18.787599, + 18.788306, + 18.789010, + 18.789710, + 18.790406, + 18.791099, + 18.791789, + 18.792475, + 18.793158, + 18.793838, + 18.794514, + 18.795187, + 18.795856, + 18.796522, + 18.797185, + 18.797845, + 18.798502, + 18.799155, + 18.799805, + 18.800452, + 18.801096, + 18.801737, + 18.802375, + 18.803009, + 18.803641, + 18.804270, + 18.804895, + 18.805518, + 18.806137, + 18.806754, + 18.807368, + 18.807978, + 18.808586, + 18.809191, + 18.809794, + 18.810393, + 18.810989, + 18.811583, + 18.812174, + 18.812762, + 18.813348, + 18.813930, + 18.814510, + 18.815087, + 18.815662, + 18.816234, + 18.816803, + 18.817369, + 18.817933, + 18.818495, + 18.819054, + 18.819610, + 18.820163, + 18.820714, + 18.821263, + 18.821809, + 18.822353, + 18.822894, + 18.823432, + 18.823968, + 18.824502, + 18.825033, + 18.825562, + 18.826089, + 18.826613, + 18.827135, + 18.827654, + 18.828171, + 18.828686, + 18.829198, + 18.829708, + 18.830216, + 18.830722, + 18.831225, + 18.831726, + 18.832225, + 18.832722, + 18.833216, + 18.833709, + 18.834199, + 18.834687, + 18.835173, + 18.835656, + 18.836138, + 18.836617, + 18.837095, + 18.837570, + 18.838043, + 18.838514, + 18.838983, + 18.839450, + 18.839915, + 18.840378, + 18.840839, + 18.841298, + 18.841755, + 18.842210, + 18.842663, + 18.843114, + 18.843563, + 18.844011, + 18.844456, + 18.844900, + 18.845341, + 18.845781, + 18.846219, + 18.846655, + 18.847089, + 18.847521, + 18.847951, + 18.848380, + 18.848807, + 18.849232, + 18.849655, + 18.850076, + 18.850496, + 18.850914, + 18.851330, + 18.851745, + 18.852157, + 18.852568, + 18.852978, + 18.853385, + 18.853791, + 18.854195, + 18.854598, + 18.854999, + 18.855398, + 18.855795, + 18.856191, + 18.856586, + 18.856978, + 18.857369, + 18.857759, + 18.858147, + 18.858533, + 18.858918, + 18.859301, + 18.859682, + 18.860063, + 18.860441, + 18.860818, + 18.861193, + 18.861567, + 18.861940, + 18.862311, + 18.862680, + 18.863048, + 18.863415, + 18.863780, + 18.864143, + 18.864505, + 18.864866, + 18.865225, + 18.865583, + 18.865939, + 18.866294, + 18.866648, + 18.867000, + 18.867351, + 18.867700, + 18.868048, + 18.868395, + 18.868740, + 18.869084, + 18.869426, + 18.869768, + 18.870108, + 18.870446, + 18.870783, + 18.871119, + 18.871454, + 18.871787, + 18.872119, + 18.872450, + 18.872779, + 18.873108, + 18.873434, + 18.873760, + 18.874084, + 18.874408, + 18.874730, + 18.875050, + 18.875370, + 18.875688, + 18.876005, + 18.876321, + 18.876635, + 18.876949, + 18.877261, + 18.877572, + 18.877882, + 18.878190, + 18.878498, + 18.878804, + 18.879109, + 18.879413, + 18.879716, + 18.880018, + 18.880319, + 18.880618, + 18.880916, + 18.881214, + 18.881510, + 18.881805, + 18.882099, + 18.882392, + 18.882683, + 18.882974, + 18.883264, + 18.883552, + 18.883839, + 18.884126, + 18.884411, + 18.884695, + 18.884979, + 18.885261, + 18.885542, + 18.885822, + 18.886101, + 18.886379, + 18.886656, + 18.886932, + 18.887207, + 18.887481, + 18.887754, + 18.888026, + 18.888298, + 18.888568, + 18.888837, + 18.889105, + 18.889372, + 18.889638, + 18.889903, + 18.890168, + 18.890431, + 18.890693, + 18.890955, + 18.891215, + 18.891475, + 18.891734, + 18.891991, + 18.892248, + 18.892504, + 18.892759, + 18.893013, + 18.893266, + 18.893518, + 18.893770, + 18.894020, + 18.894270, + 18.894519, + 18.894767, + 18.895014, + 18.895260, + 18.895505, + 18.895749, + 18.895993, + 18.896235, + 18.896477, + 18.896718, + 18.896958, + 18.897198, + 18.897436, + 18.897674, + 18.897911, + 18.898147, + 18.898382, + 18.898616, + 18.898850, + 18.899083, + 18.899315, + 18.899546, + 18.899776, + 18.900006, + 18.900235, + 18.900463, + 18.900690, + 18.900916, + 18.901142, + 18.901367, + 18.901591, + 18.901814, + 18.902037, + 18.902259, + 18.902480, + 18.902700, + 18.902920, + 18.903139, + 18.903357, + 18.903574, + 18.903791, + 18.904007, + 18.904222, + 18.904437, + 18.904650, + 18.904863, + 18.905076, + 18.905287, + 18.905498, + 18.905709, + 18.905918, + 18.906127, + 18.906335, + 18.906542, + 18.906749, + 18.906955, + 18.907161, + 18.907365, + 18.907569, + 18.907773, + 18.907975, + 18.908177, + 18.908379, + 18.908579, + 18.908780, + 18.908979, + 18.909178, + 18.909376, + 18.909573, + 18.909770, + 18.909966, + 18.910162, + 18.910356, + 18.910551, + 18.910744, + 18.910937, + 18.911130, + 18.911321, + 18.911512, + 18.911703, + 18.911893, + 18.912082, + 18.912271, + 18.912459, + 18.912646, + 18.912833, + 18.913019, + 18.913205, + 18.913390, + 18.913575, + 18.913758, + 18.913942, + 18.914125, + 18.914307, + 18.914488, + 18.914669, + 18.914850, + 18.915029, + 18.915209, + 18.915387, + 18.915566, + 18.915743, + 18.915920, + 18.916097, + 18.916272, + 18.916448, + 18.916623, + 18.916797, + 18.916971, + 18.917144, + 18.917316, + 18.917488, + 18.917660, + 18.917831, + 18.918001, + 18.918171, + 18.918341, + 18.918510, + 18.918678, + 18.918846, + 18.919013, + 18.919180, + 18.919346, + 18.919512, + 18.919678, + 18.919842, + 18.920007, + 18.920170, + 18.920334, + 18.920496, + 18.920659, + 18.920820, + 18.920982, + 18.921142, + 18.921303, + 18.921463, + 18.921622, + 18.921781, + 18.921939, + 18.922097, + 18.922254, + 18.922411, + 18.922568, + 18.922724, + 18.922879, + 18.923034, + 18.923189, + 18.923343, + 18.923496, + 18.923650, + 18.923802, + 18.923955, + 18.924106, + }, + {// The expectations for dimension = 39 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281666, + 2.406666, + 2.534999, + 2.666665, + 2.801663, + 2.939992, + 3.081652, + 3.226640, + 3.374951, + 3.526582, + 3.681522, + 3.839758, + 4.001273, + 4.166040, + 4.334022, + 4.505173, + 4.679428, + 4.856707, + 5.036910, + 5.219912, + 5.405566, + 5.593696, + 5.784102, + 5.976555, + 6.170803, + 6.366569, + 6.563557, + 6.761456, + 6.959941, + 7.158683, + 7.357351, + 7.555618, + 7.753163, + 7.949682, + 8.144884, + 8.338500, + 8.530280, + 8.720000, + 8.907458, + 9.092478, + 9.274905, + 9.454609, + 9.631482, + 9.805435, + 9.976399, + 10.144320, + 10.309162, + 10.470902, + 10.629528, + 10.785039, + 10.937445, + 11.086763, + 11.233017, + 11.376238, + 11.516460, + 11.653722, + 11.788069, + 11.919545, + 12.048200, + 12.174083, + 12.297247, + 12.417743, + 12.535626, + 12.650950, + 12.763769, + 12.874136, + 12.982107, + 13.087736, + 13.191075, + 13.292178, + 13.391097, + 13.487884, + 13.582588, + 13.675261, + 13.765951, + 13.854707, + 13.941575, + 14.026602, + 14.109832, + 14.191311, + 14.271080, + 14.349184, + 14.425662, + 14.500555, + 14.573902, + 14.645741, + 14.716110, + 14.785045, + 14.852581, + 14.918753, + 14.983595, + 15.047139, + 15.109417, + 15.170460, + 15.230298, + 15.288961, + 15.346476, + 15.402873, + 15.458178, + 15.512417, + 15.565616, + 15.617800, + 15.668993, + 15.719219, + 15.768500, + 15.816859, + 15.864318, + 15.910898, + 15.956619, + 16.001502, + 16.045565, + 16.088828, + 16.131310, + 16.173027, + 16.213998, + 16.254240, + 16.293769, + 16.332601, + 16.370752, + 16.408237, + 16.445072, + 16.481269, + 16.516845, + 16.551811, + 16.586182, + 16.619971, + 16.653190, + 16.685852, + 16.717968, + 16.749551, + 16.780611, + 16.811161, + 16.841210, + 16.870769, + 16.899849, + 16.928460, + 16.956610, + 16.984311, + 17.011572, + 17.038400, + 17.064806, + 17.090797, + 17.116382, + 17.141570, + 17.166369, + 17.190785, + 17.214828, + 17.238504, + 17.261820, + 17.284784, + 17.307402, + 17.329682, + 17.351629, + 17.373251, + 17.394554, + 17.415543, + 17.436225, + 17.456606, + 17.476691, + 17.496486, + 17.515996, + 17.535227, + 17.554184, + 17.572872, + 17.591296, + 17.609460, + 17.627371, + 17.645031, + 17.662447, + 17.679622, + 17.696560, + 17.713266, + 17.729744, + 17.745998, + 17.762033, + 17.777851, + 17.793457, + 17.808854, + 17.824047, + 17.839038, + 17.853832, + 17.868431, + 17.882839, + 17.897059, + 17.911095, + 17.924949, + 17.938625, + 17.952126, + 17.965454, + 17.978613, + 17.991605, + 18.004433, + 18.017100, + 18.029608, + 18.041960, + 18.054159, + 18.066207, + 18.078107, + 18.089861, + 18.101471, + 18.112939, + 18.124269, + 18.135461, + 18.146519, + 18.157444, + 18.168239, + 18.178905, + 18.189445, + 18.199860, + 18.210153, + 18.220325, + 18.230379, + 18.240315, + 18.250136, + 18.259844, + 18.269440, + 18.278926, + 18.288304, + 18.297575, + 18.306741, + 18.315803, + 18.324764, + 18.333624, + 18.342385, + 18.351048, + 18.359615, + 18.368087, + 18.376467, + 18.384754, + 18.392950, + 18.401057, + 18.409076, + 18.417009, + 18.424855, + 18.432618, + 18.440297, + 18.447894, + 18.455410, + 18.462847, + 18.470205, + 18.477486, + 18.484690, + 18.491819, + 18.498873, + 18.505855, + 18.512764, + 18.519601, + 18.526369, + 18.533067, + 18.539696, + 18.546258, + 18.552754, + 18.559183, + 18.565548, + 18.571849, + 18.578087, + 18.584262, + 18.590376, + 18.596430, + 18.602423, + 18.608358, + 18.614234, + 18.620052, + 18.625814, + 18.631520, + 18.637170, + 18.642766, + 18.648308, + 18.653796, + 18.659232, + 18.664616, + 18.669948, + 18.675231, + 18.680463, + 18.685645, + 18.690779, + 18.695865, + 18.700903, + 18.705895, + 18.710840, + 18.715739, + 18.720593, + 18.725402, + 18.730167, + 18.734888, + 18.739567, + 18.744202, + 18.748796, + 18.753348, + 18.757860, + 18.762330, + 18.766761, + 18.771151, + 18.775503, + 18.779816, + 18.784091, + 18.788328, + 18.792528, + 18.796691, + 18.800817, + 18.804907, + 18.808962, + 18.812982, + 18.816966, + 18.820917, + 18.824833, + 18.828715, + 18.832565, + 18.836381, + 18.840165, + 18.843917, + 18.847637, + 18.851326, + 18.854983, + 18.858610, + 18.862207, + 18.865773, + 18.869310, + 18.872817, + 18.876296, + 18.879745, + 18.883166, + 18.886559, + 18.889925, + 18.893262, + 18.896573, + 18.899856, + 18.903113, + 18.906344, + 18.909548, + 18.912727, + 18.915880, + 18.919008, + 18.922112, + 18.925190, + 18.928244, + 18.931274, + 18.934279, + 18.937261, + 18.940220, + 18.943156, + 18.946068, + 18.948958, + 18.951825, + 18.954671, + 18.957494, + 18.960295, + 18.963075, + 18.965833, + 18.968570, + 18.971287, + 18.973982, + 18.976658, + 18.979312, + 18.981947, + 18.984562, + 18.987157, + 18.989733, + 18.992289, + 18.994827, + 18.997345, + 18.999845, + 19.002326, + 19.004789, + 19.007233, + 19.009660, + 19.012069, + 19.014460, + 19.016834, + 19.019190, + 19.021529, + 19.023851, + 19.026157, + 19.028446, + 19.030718, + 19.032974, + 19.035214, + 19.037437, + 19.039645, + 19.041837, + 19.044014, + 19.046175, + 19.048321, + 19.050451, + 19.052567, + 19.054668, + 19.056754, + 19.058826, + 19.060883, + 19.062925, + 19.064954, + 19.066969, + 19.068969, + 19.070956, + 19.072929, + 19.074889, + 19.076835, + 19.078768, + 19.080688, + 19.082594, + 19.084488, + 19.086369, + 19.088237, + 19.090093, + 19.091936, + 19.093766, + 19.095585, + 19.097391, + 19.099185, + 19.100968, + 19.102738, + 19.104497, + 19.106244, + 19.107980, + 19.109704, + 19.111417, + 19.113118, + 19.114809, + 19.116489, + 19.118157, + 19.119815, + 19.121462, + 19.123098, + 19.124724, + 19.126339, + 19.127944, + 19.129539, + 19.131123, + 19.132697, + 19.134262, + 19.135816, + 19.137360, + 19.138895, + 19.140420, + 19.141935, + 19.143441, + 19.144937, + 19.146424, + 19.147902, + 19.149370, + 19.150830, + 19.152280, + 19.153721, + 19.155154, + 19.156577, + 19.157992, + 19.159398, + 19.160795, + 19.162184, + 19.163564, + 19.164936, + 19.166299, + 19.167655, + 19.169002, + 19.170340, + 19.171671, + 19.172994, + 19.174309, + 19.175615, + 19.176915, + 19.178206, + 19.179489, + 19.180765, + 19.182034, + 19.183294, + 19.184548, + 19.185794, + 19.187032, + 19.188263, + 19.189487, + 19.190704, + 19.191914, + 19.193116, + 19.194312, + 19.195501, + 19.196683, + 19.197857, + 19.199026, + 19.200187, + 19.201342, + 19.202490, + 19.203631, + 19.204766, + 19.205894, + 19.207016, + 19.208132, + 19.209241, + 19.210344, + 19.211440, + 19.212531, + 19.213615, + 19.214693, + 19.215765, + 19.216831, + 19.217892, + 19.218946, + 19.219994, + 19.221036, + 19.222073, + 19.223104, + 19.224129, + 19.225149, + 19.226162, + 19.227171, + 19.228173, + 19.229171, + 19.230162, + 19.231149, + 19.232130, + 19.233105, + 19.234075, + 19.235040, + 19.236000, + 19.236955, + 19.237904, + 19.238848, + 19.239788, + 19.240722, + 19.241651, + 19.242575, + 19.243494, + 19.244409, + 19.245318, + 19.246223, + 19.247122, + 19.248017, + 19.248908, + 19.249793, + 19.250674, + 19.251550, + 19.252422, + 19.253289, + 19.254152, + 19.255010, + 19.255863, + 19.256713, + 19.257557, + 19.258398, + 19.259234, + 19.260065, + 19.260893, + 19.261716, + 19.262535, + 19.263349, + 19.264160, + 19.264966, + 19.265768, + 19.266566, + 19.267360, + 19.268150, + 19.268936, + 19.269718, + 19.270496, + 19.271270, + 19.272041, + 19.272807, + 19.273569, + 19.274328, + 19.275083, + 19.275834, + 19.276581, + 19.277325, + 19.278065, + 19.278801, + 19.279533, + 19.280262, + 19.280988, + 19.281709, + 19.282428, + 19.283142, + 19.283853, + 19.284561, + 19.285265, + 19.285966, + 19.286663, + 19.287357, + 19.288048, + 19.288735, + 19.289419, + 19.290100, + 19.290777, + 19.291451, + 19.292122, + 19.292789, + 19.293453, + 19.294115, + 19.294772, + 19.295427, + 19.296079, + 19.296728, + 19.297373, + 19.298016, + 19.298655, + 19.299291, + 19.299925, + 19.300555, + 19.301182, + 19.301807, + 19.302428, + 19.303047, + 19.303663, + 19.304276, + 19.304885, + 19.305493, + 19.306097, + 19.306698, + 19.307297, + 19.307893, + 19.308486, + 19.309077, + 19.309664, + 19.310249, + 19.310832, + 19.311411, + 19.311988, + 19.312563, + 19.313134, + 19.313703, + 19.314270, + 19.314834, + 19.315395, + 19.315954, + 19.316510, + 19.317064, + 19.317615, + 19.318164, + 19.318710, + 19.319254, + 19.319796, + 19.320335, + 19.320871, + 19.321405, + 19.321937, + 19.322467, + 19.322994, + 19.323518, + 19.324041, + 19.324561, + 19.325079, + 19.325594, + 19.326108, + 19.326618, + 19.327127, + 19.327634, + 19.328138, + 19.328640, + 19.329140, + 19.329638, + 19.330133, + 19.330627, + 19.331118, + 19.331607, + 19.332094, + 19.332579, + 19.333061, + 19.333542, + 19.334021, + 19.334497, + 19.334972, + 19.335444, + 19.335915, + 19.336383, + 19.336850, + 19.337314, + 19.337776, + 19.338237, + 19.338696, + 19.339152, + 19.339607, + 19.340060, + 19.340510, + 19.340959, + 19.341406, + 19.341851, + 19.342295, + 19.342736, + 19.343176, + 19.343613, + 19.344049, + 19.344483, + 19.344916, + 19.345346, + 19.345775, + 19.346202, + 19.346627, + 19.347050, + 19.347472, + 19.347892, + 19.348310, + 19.348727, + 19.349141, + 19.349554, + 19.349966, + 19.350375, + 19.350783, + 19.351190, + 19.351594, + 19.351997, + 19.352399, + 19.352799, + 19.353197, + 19.353593, + 19.353988, + 19.354381, + 19.354773, + 19.355163, + 19.355552, + 19.355939, + 19.356324, + 19.356708, + 19.357091, + 19.357472, + 19.357851, + 19.358229, + 19.358605, + 19.358980, + 19.359353, + 19.359725, + 19.360096, + 19.360465, + 19.360832, + 19.361198, + 19.361563, + 19.361926, + 19.362288, + 19.362648, + 19.363007, + 19.363364, + 19.363720, + 19.364075, + 19.364429, + 19.364780, + 19.365131, + 19.365480, + 19.365828, + 19.366175, + 19.366520, + 19.366864, + 19.367206, + 19.367548, + 19.367887, + 19.368226, + 19.368563, + 19.368899, + 19.369234, + 19.369567, + 19.369900, + 19.370231, + 19.370560, + 19.370889, + 19.371216, + 19.371542, + 19.371866, + 19.372190, + 19.372512, + 19.372833, + 19.373153, + 19.373471, + 19.373789, + 19.374105, + 19.374420, + 19.374734, + 19.375046, + 19.375358, + 19.375668, + 19.375977, + 19.376285, + 19.376592, + 19.376898, + 19.377203, + 19.377506, + 19.377808, + 19.378110, + 19.378410, + 19.378709, + 19.379007, + 19.379304, + 19.379599, + 19.379894, + 19.380187, + 19.380480, + 19.380771, + 19.381062, + 19.381351, + 19.381639, + 19.381926, + 19.382213, + 19.382498, + 19.382782, + 19.383065, + 19.383347, + 19.383628, + 19.383908, + 19.384187, + 19.384465, + 19.384742, + 19.385018, + 19.385293, + 19.385567, + 19.385840, + 19.386112, + 19.386383, + 19.386653, + 19.386922, + 19.387191, + 19.387458, + 19.387724, + 19.387989, + 19.388254, + 19.388517, + 19.388780, + 19.389042, + 19.389302, + 19.389562, + 19.389821, + 19.390079, + 19.390336, + 19.390592, + 19.390847, + 19.391102, + 19.391355, + 19.391608, + 19.391860, + 19.392111, + 19.392361, + 19.392610, + 19.392858, + 19.393105, + 19.393352, + 19.393597, + 19.393842, + 19.394086, + 19.394329, + 19.394572, + 19.394813, + 19.395054, + 19.395294, + 19.395533, + 19.395771, + 19.396008, + 19.396245, + 19.396481, + 19.396716, + 19.396950, + 19.397183, + 19.397416, + 19.397648, + 19.397879, + 19.398109, + 19.398338, + 19.398567, + 19.398795, + 19.399022, + 19.399248, + 19.399474, + 19.399699, + 19.399923, + 19.400146, + 19.400369, + 19.400591, + 19.400812, + 19.401032, + 19.401252, + 19.401471, + 19.401689, + 19.401907, + 19.402123, + 19.402339, + 19.402555, + 19.402769, + 19.402983, + 19.403196, + 19.403409, + 19.403621, + 19.403832, + 19.404042, + 19.404252, + 19.404461, + 19.404669, + 19.404877, + 19.405084, + 19.405290, + 19.405496, + 19.405701, + 19.405905, + 19.406109, + 19.406312, + 19.406514, + 19.406716, + 19.406917, + 19.407117, + 19.407317, + 19.407516, + 19.407715, + 19.407913, + 19.408110, + 19.408306, + 19.408502, + 19.408698, + 19.408892, + 19.409086, + 19.409280, + 19.409472, + 19.409665, + 19.409856, + 19.410047, + 19.410238, + 19.410427, + 19.410617, + 19.410805, + 19.410993, + 19.411180, + 19.411367, + 19.411553, + 19.411739, + 19.411924, + 19.412109, + 19.412292, + 19.412476, + 19.412658, + 19.412841, + 19.413022, + 19.413203, + 19.413384, + 19.413564, + 19.413743, + 19.413922, + 19.414100, + 19.414277, + 19.414455, + 19.414631, + 19.414807, + 19.414983, + 19.415158, + 19.415332, + 19.415506, + 19.415679, + 19.415852, + 19.416024, + 19.416196, + 19.416367, + 19.416538, + 19.416708, + 19.416878, + 19.417047, + 19.417215, + 19.417384, + 19.417551, + 19.417718, + 19.417885, + 19.418051, + 19.418216, + 19.418381, + 19.418546, + 19.418710, + 19.418874, + 19.419037, + 19.419199, + 19.419361, + 19.419523, + 19.419684, + 19.419845, + 19.420005, + 19.420165, + }, + {// The expectations for dimension = 40 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406666, + 2.534999, + 2.666666, + 2.801664, + 2.939995, + 3.081658, + 3.226650, + 3.374969, + 3.526612, + 3.681572, + 3.839839, + 4.001401, + 4.166236, + 4.334317, + 4.505607, + 4.680055, + 4.857595, + 5.038143, + 5.221596, + 5.407825, + 5.596678, + 5.787977, + 5.981517, + 6.177065, + 6.374365, + 6.573139, + 6.773088, + 6.973898, + 7.175246, + 7.376801, + 7.578233, + 7.779217, + 7.979435, + 8.178584, + 8.376377, + 8.572547, + 8.766849, + 8.959061, + 9.148984, + 9.336446, + 9.521294, + 9.703401, + 9.882660, + 10.058985, + 10.232307, + 10.402574, + 10.569751, + 10.733814, + 10.894753, + 11.052568, + 11.207266, + 11.358866, + 11.507391, + 11.652871, + 11.795341, + 11.934839, + 12.071408, + 12.205094, + 12.335944, + 12.464007, + 12.589337, + 12.711983, + 12.832000, + 12.949441, + 13.064360, + 13.176810, + 13.286847, + 13.394522, + 13.499889, + 13.603002, + 13.703911, + 13.802668, + 13.899324, + 13.993928, + 14.086530, + 14.177177, + 14.265916, + 14.352793, + 14.437854, + 14.521143, + 14.602703, + 14.682575, + 14.760802, + 14.837424, + 14.912479, + 14.986007, + 15.058044, + 15.128627, + 15.197792, + 15.265572, + 15.332003, + 15.397116, + 15.460943, + 15.523517, + 15.584866, + 15.645021, + 15.704011, + 15.761863, + 15.818604, + 15.874262, + 15.928861, + 15.982427, + 16.034985, + 16.086559, + 16.137170, + 16.186843, + 16.235598, + 16.283457, + 16.330442, + 16.376571, + 16.421866, + 16.466344, + 16.510025, + 16.552926, + 16.595066, + 16.636462, + 16.677130, + 16.717086, + 16.756347, + 16.794928, + 16.832844, + 16.870109, + 16.906738, + 16.942745, + 16.978144, + 17.012947, + 17.047167, + 17.080817, + 17.113910, + 17.146456, + 17.178468, + 17.209957, + 17.240933, + 17.271409, + 17.301393, + 17.330897, + 17.359930, + 17.388501, + 17.416622, + 17.444299, + 17.471544, + 17.498364, + 17.524768, + 17.550764, + 17.576360, + 17.601565, + 17.626387, + 17.650831, + 17.674908, + 17.698622, + 17.721982, + 17.744995, + 17.767666, + 17.790003, + 17.812012, + 17.833699, + 17.855071, + 17.876133, + 17.896892, + 17.917352, + 17.937520, + 17.957401, + 17.977000, + 17.996323, + 18.015374, + 18.034159, + 18.052682, + 18.070948, + 18.088962, + 18.106729, + 18.124252, + 18.141536, + 18.158586, + 18.175406, + 18.191999, + 18.208369, + 18.224522, + 18.240459, + 18.256186, + 18.271705, + 18.287021, + 18.302136, + 18.317055, + 18.331780, + 18.346315, + 18.360663, + 18.374828, + 18.388811, + 18.402618, + 18.416249, + 18.429708, + 18.442999, + 18.456123, + 18.469084, + 18.481884, + 18.494526, + 18.507013, + 18.519346, + 18.531528, + 18.543563, + 18.555451, + 18.567196, + 18.578800, + 18.590265, + 18.601593, + 18.612786, + 18.623847, + 18.634777, + 18.645578, + 18.656254, + 18.666804, + 18.677232, + 18.687539, + 18.697727, + 18.707798, + 18.717754, + 18.727596, + 18.737327, + 18.746946, + 18.756458, + 18.765862, + 18.775161, + 18.784356, + 18.793449, + 18.802441, + 18.811334, + 18.820129, + 18.828827, + 18.837430, + 18.845939, + 18.854357, + 18.862683, + 18.870919, + 18.879067, + 18.887127, + 18.895102, + 18.902992, + 18.910798, + 18.918522, + 18.926164, + 18.933727, + 18.941210, + 18.948615, + 18.955944, + 18.963196, + 18.970374, + 18.977478, + 18.984509, + 18.991469, + 18.998357, + 19.005176, + 19.011926, + 19.018608, + 19.025223, + 19.031771, + 19.038254, + 19.044673, + 19.051028, + 19.057320, + 19.063550, + 19.069719, + 19.075828, + 19.081877, + 19.087867, + 19.093799, + 19.099673, + 19.105492, + 19.111254, + 19.116961, + 19.122613, + 19.128212, + 19.133758, + 19.139251, + 19.144692, + 19.150082, + 19.155422, + 19.160712, + 19.165952, + 19.171144, + 19.176288, + 19.181384, + 19.186434, + 19.191437, + 19.196394, + 19.201306, + 19.206174, + 19.210997, + 19.215776, + 19.220513, + 19.225207, + 19.229859, + 19.234469, + 19.239039, + 19.243567, + 19.248056, + 19.252505, + 19.256915, + 19.261286, + 19.265619, + 19.269913, + 19.274171, + 19.278392, + 19.282576, + 19.286724, + 19.290836, + 19.294913, + 19.298955, + 19.302962, + 19.306936, + 19.310875, + 19.314782, + 19.318655, + 19.322496, + 19.326304, + 19.330081, + 19.333826, + 19.337540, + 19.341223, + 19.344875, + 19.348498, + 19.352090, + 19.355653, + 19.359187, + 19.362692, + 19.366168, + 19.369616, + 19.373036, + 19.376429, + 19.379794, + 19.383132, + 19.386444, + 19.389728, + 19.392987, + 19.396220, + 19.399427, + 19.402608, + 19.405765, + 19.408897, + 19.412004, + 19.415086, + 19.418145, + 19.421180, + 19.424191, + 19.427179, + 19.430144, + 19.433085, + 19.436005, + 19.438901, + 19.441776, + 19.444629, + 19.447460, + 19.450269, + 19.453057, + 19.455824, + 19.458570, + 19.461296, + 19.464001, + 19.466686, + 19.469350, + 19.471995, + 19.474620, + 19.477226, + 19.479812, + 19.482380, + 19.484928, + 19.487458, + 19.489969, + 19.492462, + 19.494937, + 19.497394, + 19.499832, + 19.502254, + 19.504657, + 19.507044, + 19.509413, + 19.511765, + 19.514101, + 19.516419, + 19.518722, + 19.521008, + 19.523277, + 19.525531, + 19.527769, + 19.529991, + 19.532197, + 19.534388, + 19.536564, + 19.538724, + 19.540870, + 19.543000, + 19.545116, + 19.547217, + 19.549304, + 19.551376, + 19.553434, + 19.555478, + 19.557509, + 19.559525, + 19.561527, + 19.563516, + 19.565492, + 19.567454, + 19.569403, + 19.571338, + 19.573261, + 19.575171, + 19.577068, + 19.578953, + 19.580825, + 19.582684, + 19.584532, + 19.586367, + 19.588190, + 19.590001, + 19.591800, + 19.593587, + 19.595362, + 19.597126, + 19.598879, + 19.600620, + 19.602350, + 19.604069, + 19.605776, + 19.607473, + 19.609158, + 19.610833, + 19.612497, + 19.614151, + 19.615794, + 19.617426, + 19.619049, + 19.620660, + 19.622262, + 19.623854, + 19.625435, + 19.627007, + 19.628569, + 19.630121, + 19.631663, + 19.633196, + 19.634719, + 19.636233, + 19.637738, + 19.639233, + 19.640719, + 19.642195, + 19.643663, + 19.645122, + 19.646571, + 19.648012, + 19.649445, + 19.650868, + 19.652283, + 19.653689, + 19.655087, + 19.656476, + 19.657857, + 19.659230, + 19.660594, + 19.661951, + 19.663299, + 19.664639, + 19.665971, + 19.667295, + 19.668612, + 19.669921, + 19.671222, + 19.672515, + 19.673800, + 19.675079, + 19.676349, + 19.677613, + 19.678868, + 19.680117, + 19.681358, + 19.682592, + 19.683819, + 19.685039, + 19.686252, + 19.687458, + 19.688657, + 19.689849, + 19.691034, + 19.692213, + 19.693384, + 19.694549, + 19.695708, + 19.696860, + 19.698005, + 19.699144, + 19.700277, + 19.701403, + 19.702523, + 19.703636, + 19.704743, + 19.705845, + 19.706940, + 19.708028, + 19.709111, + 19.710188, + 19.711259, + 19.712324, + 19.713383, + 19.714436, + 19.715484, + 19.716526, + 19.717562, + 19.718592, + 19.719617, + 19.720636, + 19.721650, + 19.722658, + 19.723660, + 19.724658, + 19.725650, + 19.726636, + 19.727617, + 19.728593, + 19.729564, + 19.730530, + 19.731490, + 19.732445, + 19.733396, + 19.734341, + 19.735281, + 19.736216, + 19.737146, + 19.738072, + 19.738992, + 19.739908, + 19.740819, + 19.741725, + 19.742626, + 19.743523, + 19.744415, + 19.745302, + 19.746185, + 19.747063, + 19.747936, + 19.748805, + 19.749670, + 19.750530, + 19.751386, + 19.752237, + 19.753084, + 19.753927, + 19.754765, + 19.755599, + 19.756429, + 19.757255, + 19.758076, + 19.758894, + 19.759707, + 19.760516, + 19.761321, + 19.762122, + 19.762919, + 19.763712, + 19.764501, + 19.765286, + 19.766067, + 19.766844, + 19.767617, + 19.768387, + 19.769153, + 19.769914, + 19.770673, + 19.771427, + 19.772178, + 19.772925, + 19.773668, + 19.774408, + 19.775144, + 19.775877, + 19.776606, + 19.777331, + 19.778053, + 19.778771, + 19.779486, + 19.780198, + 19.780906, + 19.781610, + 19.782311, + 19.783009, + 19.783704, + 19.784395, + 19.785083, + 19.785767, + 19.786449, + 19.787127, + 19.787802, + 19.788473, + 19.789142, + 19.789807, + 19.790469, + 19.791128, + 19.791784, + 19.792437, + 19.793087, + 19.793734, + 19.794378, + 19.795018, + 19.795656, + 19.796291, + 19.796923, + 19.797552, + 19.798178, + 19.798801, + 19.799421, + 19.800038, + 19.800653, + 19.801265, + 19.801874, + 19.802480, + 19.803083, + 19.803684, + 19.804281, + 19.804877, + 19.805469, + 19.806059, + 19.806646, + 19.807230, + 19.807812, + 19.808391, + 19.808967, + 19.809541, + 19.810113, + 19.810681, + 19.811248, + 19.811811, + 19.812372, + 19.812931, + 19.813487, + 19.814041, + 19.814592, + 19.815141, + 19.815687, + 19.816231, + 19.816773, + 19.817312, + 19.817849, + 19.818383, + 19.818915, + 19.819445, + 19.819972, + 19.820498, + 19.821020, + 19.821541, + 19.822059, + 19.822575, + 19.823089, + 19.823601, + 19.824110, + 19.824617, + 19.825122, + 19.825625, + 19.826126, + 19.826624, + 19.827120, + 19.827615, + 19.828107, + 19.828597, + 19.829085, + 19.829570, + 19.830054, + 19.830536, + 19.831016, + 19.831493, + 19.831969, + 19.832442, + 19.832914, + 19.833384, + 19.833851, + 19.834317, + 19.834781, + 19.835242, + 19.835702, + 19.836160, + 19.836616, + 19.837070, + 19.837523, + 19.837973, + 19.838421, + 19.838868, + 19.839313, + 19.839756, + 19.840197, + 19.840636, + 19.841074, + 19.841509, + 19.841943, + 19.842375, + 19.842806, + 19.843234, + 19.843661, + 19.844086, + 19.844510, + 19.844931, + 19.845351, + 19.845770, + 19.846186, + 19.846601, + 19.847014, + 19.847426, + 19.847836, + 19.848244, + 19.848650, + 19.849055, + 19.849459, + 19.849860, + 19.850261, + 19.850659, + 19.851056, + 19.851451, + 19.851845, + 19.852237, + 19.852628, + 19.853017, + 19.853405, + 19.853791, + 19.854175, + 19.854558, + 19.854940, + 19.855320, + 19.855698, + 19.856076, + 19.856451, + 19.856825, + 19.857198, + 19.857569, + 19.857939, + 19.858307, + 19.858674, + 19.859039, + 19.859403, + 19.859766, + 19.860127, + 19.860487, + 19.860846, + 19.861203, + 19.861558, + 19.861913, + 19.862266, + 19.862617, + 19.862968, + 19.863317, + 19.863664, + 19.864011, + 19.864356, + 19.864699, + 19.865042, + 19.865383, + 19.865722, + 19.866061, + 19.866398, + 19.866734, + 19.867069, + 19.867402, + 19.867734, + 19.868065, + 19.868395, + 19.868724, + 19.869051, + 19.869377, + 19.869702, + 19.870025, + 19.870348, + 19.870669, + 19.870989, + 19.871308, + 19.871625, + 19.871942, + 19.872257, + 19.872571, + 19.872884, + 19.873196, + 19.873507, + 19.873816, + 19.874124, + 19.874432, + 19.874738, + 19.875043, + 19.875347, + 19.875650, + 19.875951, + 19.876252, + 19.876552, + 19.876850, + 19.877147, + 19.877444, + 19.877739, + 19.878033, + 19.878326, + 19.878618, + 19.878909, + 19.879199, + 19.879488, + 19.879776, + 19.880063, + 19.880348, + 19.880633, + 19.880917, + 19.881200, + 19.881482, + 19.881762, + 19.882042, + 19.882321, + 19.882599, + 19.882876, + 19.883151, + 19.883426, + 19.883700, + 19.883973, + 19.884245, + 19.884516, + 19.884786, + 19.885055, + 19.885323, + 19.885591, + 19.885857, + 19.886122, + 19.886387, + 19.886650, + 19.886913, + 19.887175, + 19.887435, + 19.887695, + 19.887954, + 19.888212, + 19.888470, + 19.888726, + 19.888981, + 19.889236, + 19.889490, + 19.889743, + 19.889995, + 19.890246, + 19.890496, + 19.890745, + 19.890994, + 19.891242, + 19.891488, + 19.891734, + 19.891980, + 19.892224, + 19.892467, + 19.892710, + 19.892952, + 19.893193, + 19.893433, + 19.893673, + 19.893911, + 19.894149, + 19.894386, + 19.894622, + 19.894858, + 19.895092, + 19.895326, + 19.895559, + 19.895792, + 19.896023, + 19.896254, + 19.896484, + 19.896713, + 19.896942, + 19.897170, + 19.897396, + 19.897623, + 19.897848, + 19.898073, + 19.898297, + 19.898520, + 19.898743, + 19.898964, + 19.899185, + 19.899406, + 19.899625, + 19.899844, + 19.900062, + 19.900280, + 19.900497, + 19.900713, + 19.900928, + 19.901143, + 19.901357, + 19.901570, + 19.901783, + 19.901994, + 19.902206, + 19.902416, + 19.902626, + 19.902835, + 19.903044, + 19.903251, + 19.903459, + 19.903665, + 19.903871, + 19.904076, + 19.904281, + 19.904484, + 19.904688, + 19.904890, + 19.905092, + 19.905293, + 19.905494, + 19.905694, + 19.905893, + 19.906092, + 19.906290, + 19.906488, + 19.906685, + 19.906881, + 19.907076, + 19.907271, + 19.907466, + 19.907660, + 19.907853, + 19.908045, + 19.908237, + 19.908429, + 19.908619, + 19.908810, + 19.908999, + 19.909188, + 19.909377, + 19.909564, + 19.909752, + 19.909938, + 19.910124, + 19.910310, + 19.910495, + 19.910679, + 19.910863, + 19.911046, + 19.911229, + 19.911411, + 19.911592, + 19.911773, + 19.911954, + 19.912134, + 19.912313, + 19.912492, + 19.912670, + 19.912848, + 19.913025, + 19.913201, + 19.913377, + 19.913553, + 19.913728, + 19.913902, + 19.914076, + 19.914250, + 19.914423, + 19.914595, + 19.914767, + 19.914938, + 19.915109, + 19.915279, + 19.915449, + 19.915618, + 19.915787, + 19.915955, + 19.916123, + }, + {// The expectations for dimension = 41 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666666, + 2.801665, + 2.939997, + 3.081661, + 3.226656, + 3.374981, + 3.526632, + 3.681605, + 3.839894, + 4.001488, + 4.166373, + 4.334527, + 4.505921, + 4.680515, + 4.858256, + 5.039075, + 5.222885, + 5.409579, + 5.599024, + 5.791063, + 5.985515, + 6.182169, + 6.380789, + 6.581117, + 6.782869, + 6.985746, + 7.189432, + 7.393602, + 7.597927, + 7.802078, + 8.005730, + 8.208568, + 8.410292, + 8.610619, + 8.809284, + 9.006047, + 9.200688, + 9.393013, + 9.582851, + 9.770054, + 9.954497, + 10.136075, + 10.314703, + 10.490315, + 10.662861, + 10.832304, + 10.998624, + 11.161809, + 11.321859, + 11.478784, + 11.632600, + 11.783332, + 11.931007, + 12.075661, + 12.217332, + 12.356063, + 12.491898, + 12.624884, + 12.755071, + 12.882509, + 13.007250, + 13.129347, + 13.248852, + 13.365819, + 13.480302, + 13.592353, + 13.702027, + 13.809376, + 13.914452, + 14.017306, + 14.117991, + 14.216555, + 14.313050, + 14.407523, + 14.500022, + 14.590594, + 14.679286, + 14.766142, + 14.851206, + 14.934522, + 15.016131, + 15.096076, + 15.174395, + 15.251129, + 15.326316, + 15.399994, + 15.472198, + 15.542964, + 15.612327, + 15.680322, + 15.746980, + 15.812334, + 15.876416, + 15.939255, + 16.000882, + 16.061325, + 16.120612, + 16.178771, + 16.235829, + 16.291811, + 16.346744, + 16.400650, + 16.453555, + 16.505481, + 16.556452, + 16.606489, + 16.655615, + 16.703849, + 16.751213, + 16.797726, + 16.843407, + 16.888276, + 16.932351, + 16.975649, + 17.018188, + 17.059985, + 17.101056, + 17.141418, + 17.181086, + 17.220075, + 17.258400, + 17.296076, + 17.333116, + 17.369535, + 17.405345, + 17.440560, + 17.475193, + 17.509255, + 17.542759, + 17.575717, + 17.608140, + 17.640040, + 17.671426, + 17.702311, + 17.732703, + 17.762614, + 17.792053, + 17.821029, + 17.849553, + 17.877633, + 17.905278, + 17.932497, + 17.959299, + 17.985691, + 18.011682, + 18.037280, + 18.062492, + 18.087326, + 18.111789, + 18.135889, + 18.159633, + 18.183026, + 18.206077, + 18.228792, + 18.251176, + 18.273236, + 18.294979, + 18.316410, + 18.337536, + 18.358360, + 18.378891, + 18.399132, + 18.419089, + 18.438767, + 18.458171, + 18.477307, + 18.496179, + 18.514792, + 18.533151, + 18.551259, + 18.569122, + 18.586744, + 18.604129, + 18.621282, + 18.638206, + 18.654905, + 18.671383, + 18.687644, + 18.703692, + 18.719531, + 18.735164, + 18.750594, + 18.765825, + 18.780860, + 18.795704, + 18.810358, + 18.824826, + 18.839111, + 18.853216, + 18.867144, + 18.880898, + 18.894482, + 18.907896, + 18.921146, + 18.934232, + 18.947158, + 18.959926, + 18.972539, + 18.985000, + 18.997310, + 19.009472, + 19.021488, + 19.033362, + 19.045094, + 19.056687, + 19.068144, + 19.079466, + 19.090656, + 19.101715, + 19.112645, + 19.123450, + 19.134129, + 19.144686, + 19.155122, + 19.165439, + 19.175639, + 19.185724, + 19.195694, + 19.205553, + 19.215301, + 19.224941, + 19.234473, + 19.243900, + 19.253222, + 19.262442, + 19.271561, + 19.280580, + 19.289502, + 19.298326, + 19.307055, + 19.315690, + 19.324232, + 19.332683, + 19.341044, + 19.349316, + 19.357500, + 19.365598, + 19.373611, + 19.381539, + 19.389385, + 19.397150, + 19.404834, + 19.412438, + 19.419964, + 19.427412, + 19.434785, + 19.442082, + 19.449305, + 19.456454, + 19.463532, + 19.470538, + 19.477474, + 19.484340, + 19.491138, + 19.497868, + 19.504532, + 19.511130, + 19.517663, + 19.524131, + 19.530537, + 19.536880, + 19.543161, + 19.549381, + 19.555542, + 19.561643, + 19.567685, + 19.573669, + 19.579597, + 19.585468, + 19.591283, + 19.597044, + 19.602750, + 19.608402, + 19.614002, + 19.619549, + 19.625045, + 19.630489, + 19.635884, + 19.641228, + 19.646523, + 19.651770, + 19.656969, + 19.662120, + 19.667225, + 19.672283, + 19.677295, + 19.682263, + 19.687186, + 19.692064, + 19.696899, + 19.701691, + 19.706441, + 19.711148, + 19.715814, + 19.720439, + 19.725023, + 19.729567, + 19.734072, + 19.738537, + 19.742963, + 19.747351, + 19.751702, + 19.756014, + 19.760290, + 19.764530, + 19.768733, + 19.772900, + 19.777032, + 19.781129, + 19.785191, + 19.789219, + 19.793214, + 19.797175, + 19.801103, + 19.804998, + 19.808861, + 19.812692, + 19.816491, + 19.820259, + 19.823996, + 19.827703, + 19.831379, + 19.835025, + 19.838642, + 19.842229, + 19.845787, + 19.849317, + 19.852818, + 19.856291, + 19.859737, + 19.863154, + 19.866545, + 19.869909, + 19.873246, + 19.876557, + 19.879842, + 19.883101, + 19.886334, + 19.889543, + 19.892726, + 19.895884, + 19.899018, + 19.902128, + 19.905214, + 19.908276, + 19.911314, + 19.914330, + 19.917322, + 19.920291, + 19.923238, + 19.926163, + 19.929065, + 19.931946, + 19.934804, + 19.937642, + 19.940458, + 19.943253, + 19.946027, + 19.948781, + 19.951514, + 19.954228, + 19.956921, + 19.959594, + 19.962247, + 19.964882, + 19.967497, + 19.970092, + 19.972669, + 19.975228, + 19.977768, + 19.980289, + 19.982792, + 19.985278, + 19.987745, + 19.990195, + 19.992627, + 19.995042, + 19.997440, + 19.999821, + 20.002185, + 20.004533, + 20.006864, + 20.009178, + 20.011477, + 20.013759, + 20.016025, + 20.018276, + 20.020511, + 20.022730, + 20.024934, + 20.027123, + 20.029297, + 20.031456, + 20.033601, + 20.035730, + 20.037845, + 20.039946, + 20.042032, + 20.044105, + 20.046163, + 20.048208, + 20.050238, + 20.052255, + 20.054259, + 20.056249, + 20.058226, + 20.060190, + 20.062141, + 20.064078, + 20.066004, + 20.067916, + 20.069816, + 20.071703, + 20.073578, + 20.075441, + 20.077291, + 20.079130, + 20.080956, + 20.082771, + 20.084574, + 20.086365, + 20.088145, + 20.089913, + 20.091670, + 20.093416, + 20.095151, + 20.096875, + 20.098587, + 20.100289, + 20.101980, + 20.103660, + 20.105330, + 20.106989, + 20.108638, + 20.110277, + 20.111905, + 20.113523, + 20.115131, + 20.116729, + 20.118317, + 20.119895, + 20.121464, + 20.123023, + 20.124572, + 20.126112, + 20.127642, + 20.129163, + 20.130675, + 20.132177, + 20.133671, + 20.135155, + 20.136630, + 20.138097, + 20.139554, + 20.141003, + 20.142443, + 20.143875, + 20.145298, + 20.146712, + 20.148118, + 20.149516, + 20.150905, + 20.152286, + 20.153659, + 20.155024, + 20.156381, + 20.157730, + 20.159070, + 20.160404, + 20.161729, + 20.163046, + 20.164356, + 20.165659, + 20.166953, + 20.168241, + 20.169520, + 20.170793, + 20.172058, + 20.173316, + 20.174566, + 20.175810, + 20.177046, + 20.178276, + 20.179498, + 20.180713, + 20.181922, + 20.183124, + 20.184319, + 20.185507, + 20.186688, + 20.187863, + 20.189031, + 20.190193, + 20.191348, + 20.192497, + 20.193639, + 20.194776, + 20.195905, + 20.197029, + 20.198146, + 20.199257, + 20.200362, + 20.201461, + 20.202554, + 20.203641, + 20.204722, + 20.205798, + 20.206867, + 20.207930, + 20.208988, + 20.210040, + 20.211086, + 20.212127, + 20.213162, + 20.214192, + 20.215216, + 20.216234, + 20.217247, + 20.218255, + 20.219257, + 20.220254, + 20.221246, + 20.222232, + 20.223213, + 20.224189, + 20.225160, + 20.226126, + 20.227086, + 20.228042, + 20.228993, + 20.229938, + 20.230879, + 20.231815, + 20.232746, + 20.233672, + 20.234593, + 20.235510, + 20.236422, + 20.237329, + 20.238231, + 20.239129, + 20.240022, + 20.240911, + 20.241795, + 20.242675, + 20.243550, + 20.244421, + 20.245287, + 20.246149, + 20.247006, + 20.247859, + 20.248708, + 20.249553, + 20.250393, + 20.251229, + 20.252061, + 20.252889, + 20.253713, + 20.254532, + 20.255348, + 20.256159, + 20.256967, + 20.257770, + 20.258569, + 20.259365, + 20.260156, + 20.260944, + 20.261728, + 20.262508, + 20.263284, + 20.264056, + 20.264825, + 20.265590, + 20.266351, + 20.267108, + 20.267862, + 20.268612, + 20.269359, + 20.270101, + 20.270841, + 20.271576, + 20.272309, + 20.273037, + 20.273763, + 20.274484, + 20.275203, + 20.275917, + 20.276629, + 20.277337, + 20.278042, + 20.278743, + 20.279441, + 20.280136, + 20.280828, + 20.281516, + 20.282201, + 20.282883, + 20.283561, + 20.284237, + 20.284909, + 20.285578, + 20.286244, + 20.286907, + 20.287567, + 20.288224, + 20.288878, + 20.289528, + 20.290176, + 20.290821, + 20.291463, + 20.292102, + 20.292738, + 20.293371, + 20.294001, + 20.294628, + 20.295252, + 20.295874, + 20.296493, + 20.297109, + 20.297722, + 20.298332, + 20.298940, + 20.299545, + 20.300147, + 20.300746, + 20.301343, + 20.301937, + 20.302529, + 20.303118, + 20.303704, + 20.304287, + 20.304868, + 20.305447, + 20.306022, + 20.306596, + 20.307166, + 20.307735, + 20.308300, + 20.308864, + 20.309424, + 20.309983, + 20.310538, + 20.311092, + 20.311643, + 20.312191, + 20.312738, + 20.313281, + 20.313823, + 20.314362, + 20.314899, + 20.315433, + 20.315965, + 20.316495, + 20.317023, + 20.317548, + 20.318071, + 20.318592, + 20.319110, + 20.319627, + 20.320141, + 20.320653, + 20.321163, + 20.321670, + 20.322176, + 20.322679, + 20.323180, + 20.323679, + 20.324176, + 20.324671, + 20.325164, + 20.325654, + 20.326143, + 20.326629, + 20.327114, + 20.327596, + 20.328077, + 20.328555, + 20.329032, + 20.329506, + 20.329979, + 20.330450, + 20.330918, + 20.331385, + 20.331850, + 20.332313, + 20.332773, + 20.333233, + 20.333690, + 20.334145, + 20.334598, + 20.335050, + 20.335500, + 20.335948, + 20.336394, + 20.336838, + 20.337280, + 20.337721, + 20.338160, + 20.338597, + 20.339032, + 20.339466, + 20.339898, + 20.340328, + 20.340756, + 20.341183, + 20.341608, + 20.342031, + 20.342452, + 20.342872, + 20.343290, + 20.343707, + 20.344122, + 20.344535, + 20.344946, + 20.345356, + 20.345765, + 20.346171, + 20.346576, + 20.346980, + 20.347382, + 20.347782, + 20.348181, + 20.348578, + 20.348974, + 20.349368, + 20.349760, + 20.350151, + 20.350541, + 20.350929, + 20.351315, + 20.351700, + 20.352084, + 20.352466, + 20.352846, + 20.353225, + 20.353603, + 20.353979, + 20.354354, + 20.354727, + 20.355099, + 20.355469, + 20.355838, + 20.356206, + 20.356572, + 20.356936, + 20.357300, + 20.357662, + 20.358022, + 20.358382, + 20.358740, + 20.359096, + 20.359451, + 20.359805, + 20.360158, + 20.360509, + 20.360859, + 20.361207, + 20.361554, + 20.361900, + 20.362245, + 20.362588, + 20.362931, + 20.363271, + 20.363611, + 20.363949, + 20.364286, + 20.364622, + 20.364956, + 20.365290, + 20.365622, + 20.365953, + 20.366282, + 20.366611, + 20.366938, + 20.367264, + 20.367589, + 20.367912, + 20.368235, + 20.368556, + 20.368876, + 20.369195, + 20.369513, + 20.369829, + 20.370145, + 20.370459, + 20.370772, + 20.371084, + 20.371395, + 20.371705, + 20.372013, + 20.372321, + 20.372627, + 20.372933, + 20.373237, + 20.373540, + 20.373842, + 20.374143, + 20.374443, + 20.374742, + 20.375040, + 20.375336, + 20.375632, + 20.375927, + 20.376220, + 20.376513, + 20.376804, + 20.377095, + 20.377384, + 20.377673, + 20.377960, + 20.378246, + 20.378532, + 20.378816, + 20.379100, + 20.379382, + 20.379663, + 20.379944, + 20.380223, + 20.380502, + 20.380779, + 20.381056, + 20.381331, + 20.381606, + 20.381880, + 20.382152, + 20.382424, + 20.382695, + 20.382965, + 20.383234, + 20.383502, + 20.383769, + 20.384035, + 20.384300, + 20.384565, + 20.384828, + 20.385091, + 20.385353, + 20.385613, + 20.385873, + 20.386132, + 20.386390, + 20.386648, + 20.386904, + 20.387160, + 20.387414, + 20.387668, + 20.387921, + 20.388173, + 20.388424, + 20.388675, + 20.388924, + 20.389173, + 20.389421, + 20.389668, + 20.389914, + 20.390160, + 20.390404, + 20.390648, + 20.390891, + 20.391133, + 20.391374, + 20.391615, + 20.391855, + 20.392094, + 20.392332, + 20.392569, + 20.392806, + 20.393042, + 20.393277, + 20.393511, + 20.393744, + 20.393977, + 20.394209, + 20.394440, + 20.394671, + 20.394900, + 20.395129, + 20.395357, + 20.395585, + 20.395812, + 20.396038, + 20.396263, + 20.396487, + 20.396711, + 20.396934, + 20.397157, + 20.397378, + 20.397599, + 20.397819, + 20.398039, + 20.398257, + 20.398476, + 20.398693, + 20.398910, + 20.399126, + 20.399341, + 20.399555, + 20.399769, + 20.399983, + 20.400195, + 20.400407, + 20.400618, + 20.400829, + 20.401039, + 20.401248, + 20.401456, + 20.401664, + 20.401871, + 20.402078, + 20.402284, + 20.402489, + 20.402694, + 20.402898, + 20.403101, + 20.403304, + 20.403506, + 20.403707, + 20.403908, + 20.404108, + 20.404308, + 20.404507, + 20.404705, + 20.404903, + 20.405100, + 20.405296, + 20.405492, + 20.405687, + 20.405882, + 20.406076, + 20.406270, + 20.406462, + 20.406655, + 20.406846, + 20.407037, + 20.407228, + 20.407418, + 20.407607, + 20.407796, + 20.407984, + 20.408172, + 20.408359, + 20.408545, + 20.408731, + 20.408916, + 20.409101, + 20.409285, + 20.409469, + 20.409652, + 20.409834, + 20.410016, + 20.410198, + 20.410379, + 20.410559, + 20.410739, + 20.410918, + 20.411097, + 20.411275, + 20.411453, + 20.411630, + 20.411806, + 20.411982, + }, + {// The expectations for dimension = 42 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666666, + 2.801666, + 2.939998, + 3.081664, + 3.226660, + 3.374988, + 3.526645, + 3.681627, + 3.839931, + 4.001548, + 4.166468, + 4.334675, + 4.506146, + 4.680850, + 4.858744, + 5.039774, + 5.223866, + 5.410931, + 5.600855, + 5.793504, + 5.988716, + 6.186303, + 6.386051, + 6.587721, + 6.791050, + 6.995751, + 7.201522, + 7.408047, + 7.615000, + 7.822052, + 8.028874, + 8.235145, + 8.440552, + 8.644797, + 8.847601, + 9.048703, + 9.247866, + 9.444875, + 9.639539, + 9.831690, + 10.021184, + 10.207897, + 10.391728, + 10.572594, + 10.750431, + 10.925188, + 11.096833, + 11.265343, + 11.430709, + 11.592931, + 11.752018, + 11.907986, + 12.060861, + 12.210670, + 12.357447, + 12.501231, + 12.642064, + 12.779990, + 12.915055, + 13.047308, + 13.176800, + 13.303581, + 13.427705, + 13.549222, + 13.668187, + 13.784652, + 13.898671, + 14.010296, + 14.119580, + 14.226574, + 14.331330, + 14.433899, + 14.534331, + 14.632675, + 14.728979, + 14.823293, + 14.915661, + 15.006130, + 15.094746, + 15.181551, + 15.266590, + 15.349903, + 15.431534, + 15.511521, + 15.589904, + 15.666721, + 15.742011, + 15.815809, + 15.888151, + 15.959072, + 16.028605, + 16.096785, + 16.163643, + 16.229210, + 16.293517, + 16.356595, + 16.418471, + 16.479174, + 16.538732, + 16.597172, + 16.654519, + 16.710799, + 16.766038, + 16.820258, + 16.873484, + 16.925738, + 16.977043, + 17.027420, + 17.076891, + 17.125476, + 17.173195, + 17.220068, + 17.266113, + 17.311349, + 17.355795, + 17.399467, + 17.442383, + 17.484559, + 17.526012, + 17.566758, + 17.606812, + 17.646188, + 17.684902, + 17.722968, + 17.760399, + 17.797210, + 17.833413, + 17.869021, + 17.904048, + 17.938504, + 17.972402, + 18.005754, + 18.038571, + 18.070863, + 18.102643, + 18.133920, + 18.164704, + 18.195006, + 18.224835, + 18.254200, + 18.283112, + 18.311579, + 18.339611, + 18.367214, + 18.394399, + 18.421174, + 18.447545, + 18.473522, + 18.499112, + 18.524322, + 18.549159, + 18.573632, + 18.597746, + 18.621509, + 18.644927, + 18.668007, + 18.690755, + 18.713177, + 18.735280, + 18.757069, + 18.778550, + 18.799729, + 18.820611, + 18.841202, + 18.861507, + 18.881531, + 18.901279, + 18.920756, + 18.939968, + 18.958918, + 18.977612, + 18.996054, + 19.014248, + 19.032199, + 19.049911, + 19.067388, + 19.084634, + 19.101654, + 19.118450, + 19.135028, + 19.151390, + 19.167540, + 19.183483, + 19.199221, + 19.214757, + 19.230096, + 19.245241, + 19.260194, + 19.274959, + 19.289539, + 19.303937, + 19.318156, + 19.332199, + 19.346069, + 19.359768, + 19.373300, + 19.386667, + 19.399872, + 19.412916, + 19.425804, + 19.438537, + 19.451117, + 19.463548, + 19.475831, + 19.487969, + 19.499964, + 19.511818, + 19.523534, + 19.535113, + 19.546558, + 19.557870, + 19.569052, + 19.580106, + 19.591033, + 19.601836, + 19.612516, + 19.623075, + 19.633516, + 19.643839, + 19.654046, + 19.664140, + 19.674121, + 19.683993, + 19.693755, + 19.703409, + 19.712959, + 19.722403, + 19.731745, + 19.740986, + 19.750127, + 19.759170, + 19.768115, + 19.776965, + 19.785721, + 19.794384, + 19.802955, + 19.811435, + 19.819827, + 19.828131, + 19.836347, + 19.844479, + 19.852526, + 19.860490, + 19.868372, + 19.876173, + 19.883894, + 19.891536, + 19.899101, + 19.906589, + 19.914002, + 19.921340, + 19.928604, + 19.935795, + 19.942915, + 19.949965, + 19.956944, + 19.963854, + 19.970697, + 19.977472, + 19.984181, + 19.990825, + 19.997404, + 20.003919, + 20.010372, + 20.016762, + 20.023091, + 20.029359, + 20.035568, + 20.041718, + 20.047809, + 20.053843, + 20.059820, + 20.065741, + 20.071606, + 20.077417, + 20.083173, + 20.088876, + 20.094527, + 20.100125, + 20.105672, + 20.111168, + 20.116614, + 20.122010, + 20.127357, + 20.132655, + 20.137906, + 20.143110, + 20.148267, + 20.153377, + 20.158442, + 20.163462, + 20.168437, + 20.173369, + 20.178256, + 20.183101, + 20.187903, + 20.192664, + 20.197382, + 20.202060, + 20.206697, + 20.211294, + 20.215851, + 20.220370, + 20.224849, + 20.229290, + 20.233693, + 20.238059, + 20.242388, + 20.246680, + 20.250936, + 20.255156, + 20.259340, + 20.263490, + 20.267605, + 20.271686, + 20.275733, + 20.279746, + 20.283727, + 20.287674, + 20.291589, + 20.295472, + 20.299324, + 20.303144, + 20.306933, + 20.310691, + 20.314419, + 20.318117, + 20.321785, + 20.325424, + 20.329034, + 20.332614, + 20.336167, + 20.339691, + 20.343188, + 20.346656, + 20.350098, + 20.353512, + 20.356900, + 20.360261, + 20.363596, + 20.366906, + 20.370189, + 20.373447, + 20.376680, + 20.379888, + 20.383072, + 20.386231, + 20.389366, + 20.392477, + 20.395565, + 20.398629, + 20.401670, + 20.404688, + 20.407684, + 20.410657, + 20.413607, + 20.416536, + 20.419443, + 20.422328, + 20.425192, + 20.428034, + 20.430856, + 20.433657, + 20.436437, + 20.439197, + 20.441937, + 20.444657, + 20.447357, + 20.450038, + 20.452699, + 20.455341, + 20.457964, + 20.460568, + 20.463154, + 20.465720, + 20.468269, + 20.470800, + 20.473312, + 20.475807, + 20.478284, + 20.480744, + 20.483186, + 20.485611, + 20.488019, + 20.490411, + 20.492786, + 20.495144, + 20.497486, + 20.499811, + 20.502121, + 20.504415, + 20.506692, + 20.508955, + 20.511202, + 20.513433, + 20.515649, + 20.517850, + 20.520037, + 20.522208, + 20.524365, + 20.526507, + 20.528635, + 20.530749, + 20.532848, + 20.534934, + 20.537005, + 20.539063, + 20.541107, + 20.543138, + 20.545155, + 20.547159, + 20.549149, + 20.551127, + 20.553092, + 20.555044, + 20.556983, + 20.558909, + 20.560823, + 20.562725, + 20.564614, + 20.566491, + 20.568356, + 20.570209, + 20.572051, + 20.573880, + 20.575698, + 20.577504, + 20.579299, + 20.581082, + 20.582854, + 20.584615, + 20.586364, + 20.588103, + 20.589831, + 20.591548, + 20.593254, + 20.594950, + 20.596635, + 20.598309, + 20.599973, + 20.601627, + 20.603271, + 20.604905, + 20.606528, + 20.608142, + 20.609745, + 20.611339, + 20.612923, + 20.614498, + 20.616063, + 20.617618, + 20.619164, + 20.620701, + 20.622228, + 20.623746, + 20.625255, + 20.626756, + 20.628247, + 20.629729, + 20.631202, + 20.632667, + 20.634123, + 20.635570, + 20.637009, + 20.638439, + 20.639861, + 20.641275, + 20.642680, + 20.644077, + 20.645466, + 20.646846, + 20.648219, + 20.649584, + 20.650941, + 20.652289, + 20.653631, + 20.654964, + 20.656290, + 20.657608, + 20.658919, + 20.660222, + 20.661517, + 20.662806, + 20.664087, + 20.665360, + 20.666627, + 20.667886, + 20.669138, + 20.670384, + 20.671622, + 20.672853, + 20.674077, + 20.675295, + 20.676505, + 20.677709, + 20.678906, + 20.680097, + 20.681281, + 20.682458, + 20.683629, + 20.684794, + 20.685952, + 20.687104, + 20.688249, + 20.689388, + 20.690521, + 20.691648, + 20.692768, + 20.693883, + 20.694991, + 20.696094, + 20.697190, + 20.698281, + 20.699366, + 20.700445, + 20.701518, + 20.702585, + 20.703647, + 20.704703, + 20.705753, + 20.706798, + 20.707837, + 20.708871, + 20.709899, + 20.710922, + 20.711939, + 20.712951, + 20.713958, + 20.714960, + 20.715956, + 20.716947, + 20.717933, + 20.718914, + 20.719889, + 20.720860, + 20.721825, + 20.722786, + 20.723742, + 20.724692, + 20.725638, + 20.726579, + 20.727515, + 20.728446, + 20.729373, + 20.730295, + 20.731212, + 20.732124, + 20.733032, + 20.733935, + 20.734834, + 20.735728, + 20.736618, + 20.737503, + 20.738384, + 20.739260, + 20.740132, + 20.740999, + 20.741863, + 20.742722, + 20.743576, + 20.744427, + 20.745273, + 20.746115, + 20.746952, + 20.747786, + 20.748616, + 20.749441, + 20.750263, + 20.751080, + 20.751893, + 20.752703, + 20.753508, + 20.754310, + 20.755108, + 20.755901, + 20.756691, + 20.757477, + 20.758260, + 20.759038, + 20.759813, + 20.760584, + 20.761352, + 20.762115, + 20.762875, + 20.763632, + 20.764385, + 20.765134, + 20.765879, + 20.766621, + 20.767360, + 20.768095, + 20.768827, + 20.769555, + 20.770280, + 20.771001, + 20.771719, + 20.772434, + 20.773145, + 20.773853, + 20.774557, + 20.775259, + 20.775957, + 20.776651, + 20.777343, + 20.778031, + 20.778717, + 20.779399, + 20.780077, + 20.780753, + 20.781426, + 20.782095, + 20.782762, + 20.783425, + 20.784086, + 20.784743, + 20.785398, + 20.786049, + 20.786698, + 20.787343, + 20.787986, + 20.788625, + 20.789262, + 20.789896, + 20.790527, + 20.791156, + 20.791781, + 20.792404, + 20.793024, + 20.793641, + 20.794255, + 20.794867, + 20.795475, + 20.796082, + 20.796685, + 20.797286, + 20.797884, + 20.798480, + 20.799073, + 20.799663, + 20.800251, + 20.800836, + 20.801418, + 20.801998, + 20.802576, + 20.803151, + 20.803723, + 20.804293, + 20.804860, + 20.805425, + 20.805988, + 20.806548, + 20.807106, + 20.807661, + 20.808214, + 20.808765, + 20.809313, + 20.809859, + 20.810402, + 20.810943, + 20.811482, + 20.812019, + 20.812553, + 20.813085, + 20.813615, + 20.814142, + 20.814667, + 20.815190, + 20.815711, + 20.816230, + 20.816746, + 20.817261, + 20.817773, + 20.818283, + 20.818790, + 20.819296, + 20.819800, + 20.820301, + 20.820801, + 20.821298, + 20.821793, + 20.822286, + 20.822778, + 20.823267, + 20.823754, + 20.824239, + 20.824722, + 20.825203, + 20.825682, + 20.826160, + 20.826635, + 20.827108, + 20.827579, + 20.828049, + 20.828516, + 20.828982, + 20.829446, + 20.829907, + 20.830367, + 20.830826, + 20.831282, + 20.831736, + 20.832189, + 20.832640, + 20.833088, + 20.833536, + 20.833981, + 20.834424, + 20.834866, + 20.835306, + 20.835745, + 20.836181, + 20.836616, + 20.837049, + 20.837480, + 20.837910, + 20.838338, + 20.838764, + 20.839189, + 20.839612, + 20.840033, + 20.840452, + 20.840870, + 20.841287, + 20.841701, + 20.842114, + 20.842526, + 20.842936, + 20.843344, + 20.843750, + 20.844155, + 20.844559, + 20.844961, + 20.845361, + 20.845760, + 20.846157, + 20.846553, + 20.846947, + 20.847340, + 20.847731, + 20.848121, + 20.848509, + 20.848896, + 20.849281, + 20.849665, + 20.850047, + 20.850428, + 20.850807, + 20.851185, + 20.851562, + 20.851937, + 20.852311, + 20.852683, + 20.853054, + 20.853423, + 20.853791, + 20.854158, + 20.854523, + 20.854887, + 20.855250, + 20.855611, + 20.855971, + 20.856329, + 20.856687, + 20.857043, + 20.857397, + 20.857750, + 20.858102, + 20.858453, + 20.858802, + 20.859150, + 20.859497, + 20.859842, + 20.860187, + 20.860530, + 20.860871, + 20.861212, + 20.861551, + 20.861889, + 20.862225, + 20.862561, + 20.862895, + 20.863228, + 20.863560, + 20.863891, + 20.864220, + 20.864548, + 20.864875, + 20.865201, + 20.865526, + 20.865849, + 20.866172, + 20.866493, + 20.866813, + 20.867132, + 20.867449, + 20.867766, + 20.868082, + 20.868396, + 20.868709, + 20.869021, + 20.869332, + 20.869642, + 20.869951, + 20.870259, + 20.870565, + 20.870871, + 20.871175, + 20.871478, + 20.871781, + 20.872082, + 20.872382, + 20.872681, + 20.872979, + 20.873276, + 20.873572, + 20.873867, + 20.874161, + 20.874454, + 20.874746, + 20.875037, + 20.875327, + 20.875615, + 20.875903, + 20.876190, + 20.876476, + 20.876761, + 20.877045, + 20.877328, + 20.877609, + 20.877890, + 20.878170, + 20.878449, + 20.878727, + 20.879005, + 20.879281, + 20.879556, + 20.879830, + 20.880104, + 20.880376, + 20.880648, + 20.880918, + 20.881188, + 20.881456, + 20.881724, + 20.881991, + 20.882257, + 20.882522, + 20.882787, + 20.883050, + 20.883312, + 20.883574, + 20.883835, + 20.884094, + 20.884353, + 20.884611, + 20.884869, + 20.885125, + 20.885380, + 20.885635, + 20.885889, + 20.886142, + 20.886394, + 20.886645, + 20.886896, + 20.887145, + 20.887394, + 20.887642, + 20.887889, + 20.888136, + 20.888381, + 20.888626, + 20.888870, + 20.889113, + 20.889355, + 20.889597, + 20.889838, + 20.890077, + 20.890317, + 20.890555, + 20.890793, + 20.891030, + 20.891266, + 20.891501, + 20.891735, + 20.891969, + 20.892202, + 20.892435, + 20.892666, + 20.892897, + 20.893127, + 20.893356, + 20.893585, + 20.893813, + 20.894040, + 20.894266, + 20.894492, + 20.894717, + 20.894941, + 20.895164, + 20.895387, + 20.895609, + 20.895831, + 20.896051, + 20.896271, + 20.896491, + 20.896709, + 20.896927, + 20.897144, + 20.897361, + 20.897577, + 20.897792, + 20.898006, + 20.898220, + 20.898433, + 20.898646, + 20.898857, + 20.899068, + 20.899279, + 20.899489, + 20.899698, + 20.899906, + 20.900114, + 20.900321, + 20.900528, + 20.900734, + 20.900939, + 20.901144, + 20.901348, + 20.901551, + 20.901754, + 20.901956, + 20.902158, + 20.902359, + 20.902559, + 20.902759, + 20.902958, + 20.903156, + 20.903354, + 20.903551, + 20.903748, + 20.903944, + 20.904139, + 20.904334, + 20.904528, + 20.904722, + 20.904915, + 20.905107, + 20.905299, + 20.905491, + 20.905681, + 20.905871, + 20.906061, + 20.906250, + 20.906438, + 20.906626, + 20.906814, + 20.907000, + 20.907186, + 20.907372, + 20.907557, + 20.907742, + }, + {// The expectations for dimension = 43 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666666, + 2.801666, + 2.939999, + 3.081665, + 3.226663, + 3.374993, + 3.526653, + 3.681642, + 3.839955, + 4.001588, + 4.166533, + 4.334778, + 4.506305, + 4.681091, + 4.859102, + 5.040293, + 5.224606, + 5.411965, + 5.602276, + 5.795422, + 5.991262, + 6.189631, + 6.390335, + 6.593157, + 6.797853, + 7.004154, + 7.211773, + 7.420405, + 7.629731, + 7.839427, + 8.049162, + 8.258609, + 8.467450, + 8.675374, + 8.882086, + 9.087312, + 9.290794, + 9.492298, + 9.691615, + 9.888556, + 10.082958, + 10.274679, + 10.463599, + 10.649620, + 10.832660, + 11.012657, + 11.189562, + 11.363344, + 11.533981, + 11.701465, + 11.865795, + 12.026982, + 12.185042, + 12.339998, + 12.491880, + 12.640722, + 12.786560, + 12.929437, + 13.069397, + 13.206485, + 13.340750, + 13.472242, + 13.601011, + 13.727109, + 13.850588, + 13.971501, + 14.089900, + 14.205839, + 14.319368, + 14.430542, + 14.539410, + 14.646024, + 14.750436, + 14.852694, + 14.952847, + 15.050945, + 15.147034, + 15.241161, + 15.333373, + 15.423713, + 15.512225, + 15.598953, + 15.683939, + 15.767224, + 15.848849, + 15.928851, + 16.007271, + 16.084145, + 16.159510, + 16.233401, + 16.305854, + 16.376903, + 16.446580, + 16.514918, + 16.581949, + 16.647702, + 16.712209, + 16.775498, + 16.837597, + 16.898535, + 16.958338, + 17.017032, + 17.074643, + 17.131197, + 17.186716, + 17.241226, + 17.294748, + 17.347306, + 17.398921, + 17.449615, + 17.499407, + 17.548320, + 17.596371, + 17.643580, + 17.689967, + 17.735549, + 17.780343, + 17.824368, + 17.867639, + 17.910174, + 17.951988, + 17.993097, + 18.033516, + 18.073260, + 18.112344, + 18.150780, + 18.188584, + 18.225768, + 18.262345, + 18.298329, + 18.333730, + 18.368563, + 18.402838, + 18.436566, + 18.469760, + 18.502429, + 18.534585, + 18.566238, + 18.597398, + 18.628075, + 18.658279, + 18.688019, + 18.717304, + 18.746144, + 18.774547, + 18.802521, + 18.830075, + 18.857218, + 18.883957, + 18.910299, + 18.936254, + 18.961827, + 18.987026, + 19.011859, + 19.036332, + 19.060452, + 19.084226, + 19.107660, + 19.130760, + 19.153533, + 19.175984, + 19.198120, + 19.219947, + 19.241469, + 19.262693, + 19.283624, + 19.304266, + 19.324627, + 19.344709, + 19.364519, + 19.384061, + 19.403339, + 19.422360, + 19.441126, + 19.459642, + 19.477914, + 19.495944, + 19.513738, + 19.531299, + 19.548631, + 19.565738, + 19.582624, + 19.599293, + 19.615748, + 19.631993, + 19.648031, + 19.663866, + 19.679502, + 19.694941, + 19.710187, + 19.725242, + 19.740111, + 19.754796, + 19.769300, + 19.783625, + 19.797776, + 19.811754, + 19.825563, + 19.839205, + 19.852683, + 19.865998, + 19.879155, + 19.892155, + 19.905002, + 19.917696, + 19.930241, + 19.942638, + 19.954891, + 19.967002, + 19.978972, + 19.990803, + 20.002499, + 20.014060, + 20.025489, + 20.036788, + 20.047959, + 20.059003, + 20.069924, + 20.080721, + 20.091398, + 20.101956, + 20.112397, + 20.122722, + 20.132933, + 20.143033, + 20.153021, + 20.162901, + 20.172673, + 20.182340, + 20.191902, + 20.201361, + 20.210719, + 20.219977, + 20.229136, + 20.238198, + 20.247164, + 20.256036, + 20.264815, + 20.273501, + 20.282097, + 20.290604, + 20.299023, + 20.307354, + 20.315600, + 20.323761, + 20.331839, + 20.339834, + 20.347748, + 20.355583, + 20.363338, + 20.371014, + 20.378614, + 20.386139, + 20.393588, + 20.400963, + 20.408265, + 20.415495, + 20.422654, + 20.429742, + 20.436762, + 20.443713, + 20.450597, + 20.457413, + 20.464165, + 20.470851, + 20.477473, + 20.484031, + 20.490528, + 20.496962, + 20.503336, + 20.509649, + 20.515903, + 20.522098, + 20.528235, + 20.534315, + 20.540339, + 20.546306, + 20.552218, + 20.558076, + 20.563880, + 20.569631, + 20.575329, + 20.580976, + 20.586571, + 20.592115, + 20.597610, + 20.603055, + 20.608451, + 20.613799, + 20.619099, + 20.624351, + 20.629558, + 20.634718, + 20.639833, + 20.644902, + 20.649928, + 20.654909, + 20.659847, + 20.664742, + 20.669594, + 20.674405, + 20.679174, + 20.683902, + 20.688590, + 20.693237, + 20.697845, + 20.702413, + 20.706943, + 20.711435, + 20.715889, + 20.720305, + 20.724684, + 20.729027, + 20.733333, + 20.737604, + 20.741839, + 20.746039, + 20.750204, + 20.754336, + 20.758433, + 20.762497, + 20.766527, + 20.770525, + 20.774490, + 20.778423, + 20.782325, + 20.786195, + 20.790034, + 20.793842, + 20.797620, + 20.801367, + 20.805085, + 20.808774, + 20.812433, + 20.816063, + 20.819665, + 20.823238, + 20.826784, + 20.830302, + 20.833792, + 20.837255, + 20.840692, + 20.844102, + 20.847486, + 20.850843, + 20.854175, + 20.857481, + 20.860763, + 20.864019, + 20.867250, + 20.870457, + 20.873640, + 20.876799, + 20.879934, + 20.883045, + 20.886133, + 20.889199, + 20.892241, + 20.895261, + 20.898258, + 20.901233, + 20.904187, + 20.907118, + 20.910028, + 20.912917, + 20.915785, + 20.918632, + 20.921458, + 20.924263, + 20.927049, + 20.929814, + 20.932559, + 20.935285, + 20.937991, + 20.940677, + 20.943345, + 20.945994, + 20.948623, + 20.951235, + 20.953827, + 20.956402, + 20.958958, + 20.961497, + 20.964017, + 20.966520, + 20.969006, + 20.971474, + 20.973925, + 20.976360, + 20.978777, + 20.981178, + 20.983562, + 20.985930, + 20.988282, + 20.990617, + 20.992937, + 20.995241, + 20.997530, + 20.999802, + 21.002060, + 21.004302, + 21.006530, + 21.008742, + 21.010939, + 21.013122, + 21.015291, + 21.017445, + 21.019584, + 21.021710, + 21.023821, + 21.025919, + 21.028002, + 21.030072, + 21.032129, + 21.034172, + 21.036202, + 21.038218, + 21.040222, + 21.042212, + 21.044190, + 21.046155, + 21.048107, + 21.050047, + 21.051974, + 21.053889, + 21.055791, + 21.057682, + 21.059561, + 21.061427, + 21.063282, + 21.065125, + 21.066957, + 21.068777, + 21.070585, + 21.072383, + 21.074169, + 21.075944, + 21.077707, + 21.079460, + 21.081202, + 21.082933, + 21.084654, + 21.086364, + 21.088063, + 21.089752, + 21.091431, + 21.093100, + 21.094758, + 21.096406, + 21.098044, + 21.099672, + 21.101291, + 21.102899, + 21.104498, + 21.106087, + 21.107667, + 21.109237, + 21.110798, + 21.112350, + 21.113892, + 21.115425, + 21.116949, + 21.118464, + 21.119970, + 21.121468, + 21.122956, + 21.124436, + 21.125907, + 21.127369, + 21.128823, + 21.130268, + 21.131705, + 21.133134, + 21.134554, + 21.135966, + 21.137370, + 21.138766, + 21.140154, + 21.141534, + 21.142906, + 21.144270, + 21.145626, + 21.146975, + 21.148316, + 21.149649, + 21.150975, + 21.152293, + 21.153604, + 21.154907, + 21.156204, + 21.157492, + 21.158774, + 21.160048, + 21.161316, + 21.162576, + 21.163829, + 21.165076, + 21.166315, + 21.167548, + 21.168773, + 21.169992, + 21.171205, + 21.172410, + 21.173609, + 21.174802, + 21.175988, + 21.177167, + 21.178341, + 21.179507, + 21.180668, + 21.181822, + 21.182970, + 21.184111, + 21.185247, + 21.186376, + 21.187500, + 21.188617, + 21.189728, + 21.190834, + 21.191933, + 21.193027, + 21.194115, + 21.195197, + 21.196274, + 21.197345, + 21.198410, + 21.199469, + 21.200523, + 21.201572, + 21.202614, + 21.203652, + 21.204684, + 21.205711, + 21.206732, + 21.207748, + 21.208759, + 21.209765, + 21.210765, + 21.211760, + 21.212750, + 21.213735, + 21.214715, + 21.215690, + 21.216660, + 21.217625, + 21.218585, + 21.219541, + 21.220491, + 21.221437, + 21.222377, + 21.223314, + 21.224245, + 21.225171, + 21.226093, + 21.227011, + 21.227924, + 21.228832, + 21.229735, + 21.230635, + 21.231529, + 21.232420, + 21.233305, + 21.234187, + 21.235064, + 21.235937, + 21.236805, + 21.237669, + 21.238529, + 21.239385, + 21.240237, + 21.241084, + 21.241927, + 21.242766, + 21.243601, + 21.244432, + 21.245259, + 21.246082, + 21.246901, + 21.247716, + 21.248528, + 21.249335, + 21.250138, + 21.250938, + 21.251733, + 21.252525, + 21.253313, + 21.254098, + 21.254878, + 21.255655, + 21.256428, + 21.257198, + 21.257964, + 21.258726, + 21.259485, + 21.260240, + 21.260992, + 21.261740, + 21.262484, + 21.263226, + 21.263963, + 21.264697, + 21.265428, + 21.266156, + 21.266880, + 21.267600, + 21.268318, + 21.269032, + 21.269742, + 21.270450, + 21.271154, + 21.271855, + 21.272553, + 21.273247, + 21.273939, + 21.274627, + 21.275312, + 21.275994, + 21.276673, + 21.277349, + 21.278022, + 21.278691, + 21.279358, + 21.280022, + 21.280683, + 21.281340, + 21.281995, + 21.282647, + 21.283296, + 21.283942, + 21.284585, + 21.285225, + 21.285863, + 21.286497, + 21.287129, + 21.287758, + 21.288384, + 21.289008, + 21.289629, + 21.290247, + 21.290862, + 21.291474, + 21.292084, + 21.292692, + 21.293296, + 21.293898, + 21.294497, + 21.295094, + 21.295688, + 21.296280, + 21.296869, + 21.297455, + 21.298039, + 21.298620, + 21.299199, + 21.299776, + 21.300349, + 21.300921, + 21.301490, + 21.302056, + 21.302621, + 21.303182, + 21.303742, + 21.304299, + 21.304853, + 21.305405, + 21.305955, + 21.306503, + 21.307048, + 21.307591, + 21.308132, + 21.308670, + 21.309206, + 21.309740, + 21.310272, + 21.310801, + 21.311329, + 21.311854, + 21.312377, + 21.312897, + 21.313416, + 21.313932, + 21.314446, + 21.314958, + 21.315468, + 21.315976, + 21.316482, + 21.316986, + 21.317487, + 21.317987, + 21.318484, + 21.318980, + 21.319473, + 21.319965, + 21.320454, + 21.320942, + 21.321427, + 21.321911, + 21.322392, + 21.322872, + 21.323350, + 21.323825, + 21.324299, + 21.324771, + 21.325241, + 21.325709, + 21.326176, + 21.326640, + 21.327102, + 21.327563, + 21.328022, + 21.328479, + 21.328934, + 21.329388, + 21.329839, + 21.330289, + 21.330737, + 21.331183, + 21.331628, + 21.332071, + 21.332512, + 21.332951, + 21.333388, + 21.333824, + 21.334258, + 21.334691, + 21.335122, + 21.335551, + 21.335978, + 21.336404, + 21.336828, + 21.337250, + 21.337671, + 21.338090, + 21.338508, + 21.338924, + 21.339338, + 21.339751, + 21.340162, + 21.340571, + 21.340979, + 21.341386, + 21.341791, + 21.342194, + 21.342596, + 21.342996, + 21.343395, + 21.343792, + 21.344188, + 21.344582, + 21.344975, + 21.345366, + 21.345756, + 21.346144, + 21.346531, + 21.346916, + 21.347300, + 21.347683, + 21.348064, + 21.348443, + 21.348821, + 21.349198, + 21.349574, + 21.349948, + 21.350320, + 21.350691, + 21.351061, + 21.351430, + 21.351797, + 21.352162, + 21.352527, + 21.352890, + 21.353252, + 21.353612, + 21.353971, + 21.354329, + 21.354685, + 21.355040, + 21.355394, + 21.355747, + 21.356098, + 21.356448, + 21.356796, + 21.357144, + 21.357490, + 21.357835, + 21.358178, + 21.358521, + 21.358862, + 21.359202, + 21.359541, + 21.359878, + 21.360214, + 21.360549, + 21.360883, + 21.361216, + 21.361547, + 21.361878, + 21.362207, + 21.362535, + 21.362861, + 21.363187, + 21.363512, + 21.363835, + 21.364157, + 21.364478, + 21.364798, + 21.365117, + 21.365434, + 21.365751, + 21.366066, + 21.366380, + 21.366694, + 21.367006, + 21.367317, + 21.367626, + 21.367935, + 21.368243, + 21.368550, + 21.368855, + 21.369160, + 21.369463, + 21.369766, + 21.370067, + 21.370367, + 21.370666, + 21.370965, + 21.371262, + 21.371558, + 21.371853, + 21.372147, + 21.372441, + 21.372733, + 21.373024, + 21.373314, + 21.373603, + 21.373891, + 21.374178, + 21.374465, + 21.374750, + 21.375034, + 21.375317, + 21.375600, + 21.375881, + 21.376161, + 21.376441, + 21.376719, + 21.376997, + 21.377274, + 21.377549, + 21.377824, + 21.378098, + 21.378371, + 21.378643, + 21.378914, + 21.379184, + 21.379453, + 21.379722, + 21.379989, + 21.380256, + 21.380522, + 21.380787, + 21.381051, + 21.381314, + 21.381576, + 21.381837, + 21.382098, + 21.382357, + 21.382616, + 21.382874, + 21.383131, + 21.383387, + 21.383643, + 21.383897, + 21.384151, + 21.384404, + 21.384656, + 21.384907, + 21.385158, + 21.385407, + 21.385656, + 21.385904, + 21.386151, + 21.386397, + 21.386643, + 21.386888, + 21.387132, + 21.387375, + 21.387617, + 21.387859, + 21.388100, + 21.388340, + 21.388579, + 21.388818, + 21.389056, + 21.389293, + 21.389529, + 21.389764, + 21.389999, + 21.390233, + 21.390466, + 21.390699, + 21.390931, + 21.391162, + 21.391392, + 21.391622, + 21.391850, + 21.392079, + 21.392306, + 21.392533, + 21.392759, + 21.392984, + 21.393208, + 21.393432, + 21.393655, + 21.393878, + 21.394100, + 21.394321, + 21.394541, + 21.394761, + 21.394980, + 21.395198, + 21.395416, + 21.395633, + 21.395849, + 21.396064, + 21.396279, + 21.396494, + 21.396707, + 21.396920, + 21.397132, + 21.397344, + 21.397555, + 21.397765, + 21.397975, + 21.398184, + 21.398393, + 21.398600, + 21.398807, + 21.399014, + 21.399220, + 21.399425, + 21.399630, + 21.399834, + 21.400037, + 21.400240, + 21.400442, + 21.400643, + 21.400844, + 21.401045, + 21.401244, + 21.401443, + 21.401642, + 21.401840, + 21.402037, + 21.402234, + 21.402430, + 21.402625, + 21.402820, + 21.403015, + 21.403208, + 21.403402, + }, + {// The expectations for dimension = 44 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801666, + 2.939999, + 3.081666, + 3.226664, + 3.374996, + 3.526658, + 3.681651, + 3.839971, + 4.001615, + 4.166578, + 4.334850, + 4.506418, + 4.681264, + 4.859362, + 5.040677, + 5.225161, + 5.412752, + 5.603371, + 5.796919, + 5.993274, + 6.192292, + 6.393802, + 6.597605, + 6.803479, + 7.011174, + 7.220420, + 7.430926, + 7.642383, + 7.854473, + 8.066869, + 8.279243, + 8.491270, + 8.702631, + 8.913020, + 9.122147, + 9.329738, + 9.535543, + 9.739331, + 9.940897, + 10.140055, + 10.336647, + 10.530534, + 10.721600, + 10.909748, + 11.094900, + 11.276995, + 11.455986, + 11.631843, + 11.804545, + 11.974085, + 12.140463, + 12.303689, + 12.463780, + 12.620759, + 12.774656, + 12.925504, + 13.073340, + 13.218205, + 13.360143, + 13.499200, + 13.635423, + 13.768862, + 13.899568, + 14.027590, + 14.152982, + 14.275794, + 14.396080, + 14.513891, + 14.629281, + 14.742299, + 14.852998, + 14.961429, + 15.067641, + 15.171685, + 15.273609, + 15.373461, + 15.471289, + 15.567139, + 15.661056, + 15.753086, + 15.843273, + 15.931658, + 16.018284, + 16.103193, + 16.186424, + 16.268017, + 16.348010, + 16.426441, + 16.503346, + 16.578761, + 16.652721, + 16.725260, + 16.796411, + 16.866206, + 16.934678, + 17.001856, + 17.067771, + 17.132452, + 17.195928, + 17.258226, + 17.319373, + 17.379397, + 17.438321, + 17.496173, + 17.552975, + 17.608753, + 17.663528, + 17.717324, + 17.770162, + 17.822064, + 17.873051, + 17.923144, + 17.972361, + 18.020723, + 18.068248, + 18.114954, + 18.160860, + 18.205982, + 18.250339, + 18.293945, + 18.336819, + 18.378974, + 18.420427, + 18.461192, + 18.501285, + 18.540718, + 18.579507, + 18.617664, + 18.655204, + 18.692137, + 18.728478, + 18.764238, + 18.799430, + 18.834064, + 18.868153, + 18.901707, + 18.934737, + 18.967254, + 18.999267, + 19.030788, + 19.061825, + 19.092389, + 19.122489, + 19.152133, + 19.181331, + 19.210091, + 19.238422, + 19.266333, + 19.293830, + 19.320923, + 19.347619, + 19.373925, + 19.399849, + 19.425398, + 19.450579, + 19.475399, + 19.499864, + 19.523982, + 19.547759, + 19.571200, + 19.594313, + 19.617102, + 19.639575, + 19.661736, + 19.683592, + 19.705147, + 19.726408, + 19.747379, + 19.768066, + 19.788473, + 19.808606, + 19.828469, + 19.848067, + 19.867405, + 19.886487, + 19.905318, + 19.923901, + 19.942242, + 19.960344, + 19.978212, + 19.995849, + 20.013259, + 20.030446, + 20.047414, + 20.064166, + 20.080707, + 20.097039, + 20.113166, + 20.129091, + 20.144818, + 20.160350, + 20.175690, + 20.190841, + 20.205806, + 20.220589, + 20.235191, + 20.249617, + 20.263868, + 20.277948, + 20.291860, + 20.305605, + 20.319187, + 20.332607, + 20.345870, + 20.358976, + 20.371929, + 20.384731, + 20.397383, + 20.409890, + 20.422252, + 20.434471, + 20.446551, + 20.458492, + 20.470298, + 20.481970, + 20.493510, + 20.504921, + 20.516203, + 20.527359, + 20.538392, + 20.549301, + 20.560090, + 20.570761, + 20.581314, + 20.591751, + 20.602075, + 20.612287, + 20.622388, + 20.632380, + 20.642265, + 20.652044, + 20.661718, + 20.671290, + 20.680760, + 20.690130, + 20.699401, + 20.708575, + 20.717653, + 20.726637, + 20.735527, + 20.744325, + 20.753032, + 20.761650, + 20.770179, + 20.778621, + 20.786977, + 20.795248, + 20.803436, + 20.811541, + 20.819564, + 20.827507, + 20.835371, + 20.843156, + 20.850864, + 20.858496, + 20.866053, + 20.873535, + 20.880944, + 20.888281, + 20.895546, + 20.902740, + 20.909865, + 20.916922, + 20.923910, + 20.930832, + 20.937687, + 20.944477, + 20.951202, + 20.957864, + 20.964463, + 20.971000, + 20.977476, + 20.983890, + 20.990246, + 20.996542, + 21.002779, + 21.008959, + 21.015082, + 21.021149, + 21.027161, + 21.033117, + 21.039019, + 21.044868, + 21.050663, + 21.056407, + 21.062098, + 21.067739, + 21.073329, + 21.078870, + 21.084361, + 21.089803, + 21.095197, + 21.100544, + 21.105843, + 21.111097, + 21.116304, + 21.121466, + 21.126583, + 21.131655, + 21.136684, + 21.141670, + 21.146612, + 21.151513, + 21.156371, + 21.161188, + 21.165964, + 21.170699, + 21.175395, + 21.180051, + 21.184668, + 21.189246, + 21.193786, + 21.198288, + 21.202752, + 21.207180, + 21.211571, + 21.215925, + 21.220244, + 21.224528, + 21.228776, + 21.232990, + 21.237169, + 21.241315, + 21.245427, + 21.249506, + 21.253552, + 21.257565, + 21.261546, + 21.265496, + 21.269414, + 21.273301, + 21.277157, + 21.280982, + 21.284778, + 21.288544, + 21.292280, + 21.295986, + 21.299664, + 21.303314, + 21.306934, + 21.310527, + 21.314092, + 21.317630, + 21.321140, + 21.324624, + 21.328081, + 21.331511, + 21.334916, + 21.338294, + 21.341647, + 21.344975, + 21.348278, + 21.351555, + 21.354809, + 21.358037, + 21.361242, + 21.364423, + 21.367580, + 21.370714, + 21.373825, + 21.376913, + 21.379978, + 21.383021, + 21.386041, + 21.389039, + 21.392016, + 21.394971, + 21.397904, + 21.400816, + 21.403708, + 21.406578, + 21.409428, + 21.412257, + 21.415066, + 21.417856, + 21.420625, + 21.423375, + 21.426105, + 21.428816, + 21.431507, + 21.434180, + 21.436834, + 21.439470, + 21.442087, + 21.444686, + 21.447267, + 21.449830, + 21.452375, + 21.454903, + 21.457413, + 21.459906, + 21.462382, + 21.464841, + 21.467283, + 21.469709, + 21.472118, + 21.474511, + 21.476888, + 21.479248, + 21.481593, + 21.483922, + 21.486235, + 21.488533, + 21.490815, + 21.493083, + 21.495335, + 21.497572, + 21.499795, + 21.502002, + 21.504196, + 21.506374, + 21.508539, + 21.510689, + 21.512826, + 21.514948, + 21.517057, + 21.519152, + 21.521233, + 21.523301, + 21.525355, + 21.527397, + 21.529425, + 21.531440, + 21.533443, + 21.535432, + 21.537409, + 21.539374, + 21.541326, + 21.543265, + 21.545192, + 21.547108, + 21.549011, + 21.550902, + 21.552781, + 21.554649, + 21.556505, + 21.558349, + 21.560182, + 21.562004, + 21.563814, + 21.565613, + 21.567401, + 21.569178, + 21.570945, + 21.572700, + 21.574445, + 21.576179, + 21.577902, + 21.579615, + 21.581318, + 21.583010, + 21.584692, + 21.586364, + 21.588026, + 21.589678, + 21.591320, + 21.592952, + 21.594575, + 21.596187, + 21.597791, + 21.599384, + 21.600969, + 21.602544, + 21.604109, + 21.605666, + 21.607213, + 21.608751, + 21.610281, + 21.611801, + 21.613312, + 21.614815, + 21.616309, + 21.617794, + 21.619271, + 21.620739, + 21.622199, + 21.623650, + 21.625093, + 21.626528, + 21.627954, + 21.629373, + 21.630783, + 21.632185, + 21.633579, + 21.634966, + 21.636344, + 21.637715, + 21.639078, + 21.640434, + 21.641782, + 21.643122, + 21.644455, + 21.645780, + 21.647098, + 21.648408, + 21.649712, + 21.651008, + 21.652297, + 21.653579, + 21.654854, + 21.656121, + 21.657382, + 21.658636, + 21.659883, + 21.661123, + 21.662357, + 21.663584, + 21.664804, + 21.666017, + 21.667224, + 21.668424, + 21.669618, + 21.670806, + 21.671987, + 21.673162, + 21.674330, + 21.675493, + 21.676649, + 21.677799, + 21.678942, + 21.680080, + 21.681212, + 21.682338, + 21.683457, + 21.684571, + 21.685679, + 21.686781, + 21.687878, + 21.688968, + 21.690053, + 21.691133, + 21.692206, + 21.693275, + 21.694337, + 21.695394, + 21.696446, + 21.697492, + 21.698533, + 21.699568, + 21.700598, + 21.701623, + 21.702643, + 21.703657, + 21.704667, + 21.705671, + 21.706670, + 21.707664, + 21.708652, + 21.709636, + 21.710615, + 21.711589, + 21.712558, + 21.713522, + 21.714482, + 21.715436, + 21.716386, + 21.717331, + 21.718272, + 21.719207, + 21.720138, + 21.721065, + 21.721986, + 21.722904, + 21.723816, + 21.724725, + 21.725629, + 21.726528, + 21.727423, + 21.728313, + 21.729200, + 21.730081, + 21.730959, + 21.731832, + 21.732701, + 21.733566, + 21.734427, + 21.735283, + 21.736136, + 21.736984, + 21.737828, + 21.738669, + 21.739505, + 21.740337, + 21.741165, + 21.741989, + 21.742809, + 21.743626, + 21.744438, + 21.745247, + 21.746052, + 21.746853, + 21.747650, + 21.748444, + 21.749233, + 21.750019, + 21.750802, + 21.751580, + 21.752356, + 21.753127, + 21.753895, + 21.754659, + 21.755420, + 21.756177, + 21.756931, + 21.757681, + 21.758428, + 21.759171, + 21.759911, + 21.760647, + 21.761380, + 21.762110, + 21.762837, + 21.763560, + 21.764279, + 21.764996, + 21.765709, + 21.766419, + 21.767126, + 21.767830, + 21.768530, + 21.769227, + 21.769921, + 21.770612, + 21.771300, + 21.771985, + 21.772667, + 21.773346, + 21.774021, + 21.774694, + 21.775364, + 21.776030, + 21.776694, + 21.777355, + 21.778013, + 21.778668, + 21.779320, + 21.779969, + 21.780615, + 21.781259, + 21.781899, + 21.782537, + 21.783172, + 21.783804, + 21.784434, + 21.785061, + 21.785685, + 21.786306, + 21.786925, + 21.787541, + 21.788154, + 21.788765, + 21.789373, + 21.789978, + 21.790581, + 21.791181, + 21.791779, + 21.792374, + 21.792966, + 21.793556, + 21.794144, + 21.794729, + 21.795311, + 21.795891, + 21.796469, + 21.797044, + 21.797617, + 21.798187, + 21.798755, + 21.799320, + 21.799883, + 21.800444, + 21.801002, + 21.801559, + 21.802112, + 21.802664, + 21.803213, + 21.803760, + 21.804304, + 21.804846, + 21.805386, + 21.805924, + 21.806460, + 21.806993, + 21.807524, + 21.808053, + 21.808580, + 21.809105, + 21.809627, + 21.810148, + 21.810666, + 21.811182, + 21.811696, + 21.812208, + 21.812718, + 21.813225, + 21.813731, + 21.814235, + 21.814736, + 21.815236, + 21.815734, + 21.816229, + 21.816723, + 21.817214, + 21.817704, + 21.818191, + 21.818677, + 21.819161, + 21.819643, + 21.820123, + 21.820601, + 21.821077, + 21.821551, + 21.822023, + 21.822494, + 21.822962, + 21.823429, + 21.823894, + 21.824357, + 21.824818, + 21.825278, + 21.825735, + 21.826191, + 21.826645, + 21.827097, + 21.827548, + 21.827997, + 21.828444, + 21.828889, + 21.829332, + 21.829774, + 21.830214, + 21.830653, + 21.831089, + 21.831524, + 21.831958, + 21.832389, + 21.832819, + 21.833248, + 21.833674, + 21.834100, + 21.834523, + 21.834945, + 21.835365, + 21.835784, + 21.836201, + 21.836616, + 21.837030, + 21.837442, + 21.837853, + 21.838262, + 21.838670, + 21.839076, + 21.839481, + 21.839884, + 21.840285, + 21.840685, + 21.841084, + 21.841481, + 21.841876, + 21.842270, + 21.842663, + 21.843054, + 21.843444, + 21.843832, + 21.844219, + 21.844604, + 21.844988, + 21.845371, + 21.845752, + 21.846131, + 21.846510, + 21.846887, + 21.847262, + 21.847636, + 21.848009, + 21.848380, + 21.848750, + 21.849119, + 21.849486, + 21.849852, + 21.850217, + 21.850581, + 21.850943, + 21.851303, + 21.851663, + 21.852021, + 21.852378, + 21.852733, + 21.853087, + 21.853440, + 21.853792, + 21.854142, + 21.854492, + 21.854840, + 21.855186, + 21.855532, + 21.855876, + 21.856219, + 21.856561, + 21.856901, + 21.857241, + 21.857579, + 21.857916, + 21.858251, + 21.858586, + 21.858919, + 21.859251, + 21.859582, + 21.859912, + 21.860241, + 21.860569, + 21.860895, + 21.861220, + 21.861544, + 21.861867, + 21.862189, + 21.862510, + 21.862829, + 21.863148, + 21.863465, + 21.863782, + 21.864097, + 21.864411, + 21.864724, + 21.865036, + 21.865347, + 21.865656, + 21.865965, + 21.866273, + 21.866579, + 21.866885, + 21.867189, + 21.867493, + 21.867795, + 21.868097, + 21.868397, + 21.868696, + 21.868995, + 21.869292, + 21.869588, + 21.869883, + 21.870178, + 21.870471, + 21.870763, + 21.871055, + 21.871345, + 21.871634, + 21.871923, + 21.872210, + 21.872496, + 21.872782, + 21.873066, + 21.873350, + 21.873633, + 21.873914, + 21.874195, + 21.874475, + 21.874754, + 21.875032, + 21.875309, + 21.875585, + 21.875860, + 21.876134, + 21.876407, + 21.876680, + 21.876951, + 21.877222, + 21.877492, + 21.877761, + 21.878029, + 21.878296, + 21.878562, + 21.878827, + 21.879092, + 21.879355, + 21.879618, + 21.879880, + 21.880141, + 21.880401, + 21.880661, + 21.880919, + 21.881177, + 21.881434, + 21.881690, + 21.881945, + 21.882199, + 21.882453, + 21.882706, + 21.882958, + 21.883209, + 21.883459, + 21.883708, + 21.883957, + 21.884205, + 21.884452, + 21.884699, + 21.884944, + 21.885189, + 21.885433, + 21.885676, + 21.885918, + 21.886160, + 21.886401, + 21.886641, + 21.886880, + 21.887119, + 21.887357, + 21.887594, + 21.887830, + 21.888066, + 21.888301, + 21.888535, + 21.888768, + 21.889001, + 21.889233, + 21.889464, + 21.889694, + 21.889924, + 21.890153, + 21.890382, + 21.890609, + 21.890836, + 21.891062, + 21.891288, + 21.891513, + 21.891737, + 21.891960, + 21.892183, + 21.892405, + 21.892626, + 21.892847, + 21.893067, + 21.893286, + 21.893505, + 21.893723, + 21.893940, + 21.894157, + 21.894373, + 21.894588, + 21.894803, + 21.895017, + 21.895230, + 21.895443, + 21.895655, + 21.895866, + 21.896077, + 21.896287, + 21.896497, + 21.896706, + 21.896914, + 21.897121, + 21.897328, + 21.897535, + 21.897740, + 21.897946, + 21.898150, + 21.898354, + 21.898557, + 21.898760, + 21.898962, + }, + {// The expectations for dimension = 45 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081666, + 3.226665, + 3.374997, + 3.526661, + 3.681657, + 3.839982, + 4.001633, + 4.166608, + 4.334899, + 4.506497, + 4.681387, + 4.859551, + 5.040959, + 5.225574, + 5.413345, + 5.604208, + 5.798079, + 5.994854, + 6.194408, + 6.396590, + 6.601223, + 6.808105, + 7.017007, + 7.227676, + 7.439838, + 7.653197, + 7.867444, + 8.082258, + 8.297313, + 8.512281, + 8.726840, + 8.940672, + 9.153475, + 9.364963, + 9.574866, + 9.782938, + 9.988953, + 10.192708, + 10.394026, + 10.592748, + 10.788742, + 10.981893, + 11.172108, + 11.359311, + 11.543443, + 11.724460, + 11.902332, + 12.077040, + 12.248576, + 12.416942, + 12.582149, + 12.744213, + 12.903158, + 13.059013, + 13.211810, + 13.361588, + 13.508387, + 13.652250, + 13.793223, + 13.931352, + 14.066688, + 14.199279, + 14.329176, + 14.456431, + 14.581096, + 14.703222, + 14.822862, + 14.940066, + 15.054886, + 15.167373, + 15.277579, + 15.385552, + 15.491342, + 15.594997, + 15.696566, + 15.796096, + 15.893633, + 15.989222, + 16.082908, + 16.174734, + 16.264744, + 16.352980, + 16.439482, + 16.524290, + 16.607444, + 16.688983, + 16.768943, + 16.847362, + 16.924274, + 16.999716, + 17.073721, + 17.146321, + 17.217551, + 17.287441, + 17.356022, + 17.423324, + 17.489377, + 17.554209, + 17.617848, + 17.680322, + 17.741656, + 17.801877, + 17.861009, + 17.919078, + 17.976107, + 18.032120, + 18.087138, + 18.141185, + 18.194282, + 18.246450, + 18.297709, + 18.348080, + 18.397581, + 18.446232, + 18.494052, + 18.541058, + 18.587267, + 18.632698, + 18.677366, + 18.721289, + 18.764481, + 18.806959, + 18.848737, + 18.889830, + 18.930252, + 18.970018, + 19.009141, + 19.047635, + 19.085512, + 19.122785, + 19.159466, + 19.195568, + 19.231102, + 19.266080, + 19.300513, + 19.334411, + 19.367787, + 19.400649, + 19.433008, + 19.464874, + 19.496257, + 19.527167, + 19.557611, + 19.587601, + 19.617143, + 19.646247, + 19.674922, + 19.703175, + 19.731015, + 19.758449, + 19.785485, + 19.812131, + 19.838393, + 19.864280, + 19.889797, + 19.914953, + 19.939752, + 19.964203, + 19.988311, + 20.012083, + 20.035525, + 20.058642, + 20.081441, + 20.103927, + 20.126106, + 20.147983, + 20.169564, + 20.190854, + 20.211858, + 20.232581, + 20.253028, + 20.273203, + 20.293112, + 20.312759, + 20.332149, + 20.351285, + 20.370173, + 20.388816, + 20.407219, + 20.425385, + 20.443319, + 20.461025, + 20.478506, + 20.495766, + 20.512808, + 20.529637, + 20.546256, + 20.562668, + 20.578876, + 20.594885, + 20.610696, + 20.626314, + 20.641741, + 20.656981, + 20.672036, + 20.686910, + 20.701604, + 20.716123, + 20.730469, + 20.744644, + 20.758652, + 20.772494, + 20.786173, + 20.799693, + 20.813054, + 20.826261, + 20.839315, + 20.852218, + 20.864972, + 20.877581, + 20.890046, + 20.902369, + 20.914553, + 20.926599, + 20.938509, + 20.950287, + 20.961932, + 20.973448, + 20.984837, + 20.996099, + 21.007238, + 21.018254, + 21.029151, + 21.039928, + 21.050588, + 21.061133, + 21.071565, + 21.081884, + 21.092093, + 21.102193, + 21.112185, + 21.122072, + 21.131854, + 21.141533, + 21.151111, + 21.160589, + 21.169968, + 21.179249, + 21.188434, + 21.197525, + 21.206522, + 21.215427, + 21.224241, + 21.232966, + 21.241601, + 21.250150, + 21.258612, + 21.266989, + 21.275283, + 21.283493, + 21.291622, + 21.299670, + 21.307639, + 21.315529, + 21.323342, + 21.331078, + 21.338738, + 21.346324, + 21.353836, + 21.361276, + 21.368644, + 21.375941, + 21.383169, + 21.390327, + 21.397417, + 21.404440, + 21.411396, + 21.418287, + 21.425113, + 21.431874, + 21.438573, + 21.445209, + 21.451784, + 21.458297, + 21.464751, + 21.471145, + 21.477480, + 21.483757, + 21.489978, + 21.496141, + 21.502248, + 21.508301, + 21.514298, + 21.520242, + 21.526133, + 21.531970, + 21.537756, + 21.543490, + 21.549174, + 21.554807, + 21.560390, + 21.565925, + 21.571411, + 21.576849, + 21.582240, + 21.587584, + 21.592881, + 21.598133, + 21.603339, + 21.608501, + 21.613619, + 21.618693, + 21.623723, + 21.628711, + 21.633657, + 21.638561, + 21.643423, + 21.648245, + 21.653026, + 21.657767, + 21.662469, + 21.667132, + 21.671756, + 21.676342, + 21.680890, + 21.685401, + 21.689874, + 21.694311, + 21.698712, + 21.703077, + 21.707407, + 21.711702, + 21.715962, + 21.720187, + 21.724379, + 21.728537, + 21.732662, + 21.736754, + 21.740814, + 21.744842, + 21.748837, + 21.752801, + 21.756734, + 21.760636, + 21.764508, + 21.768349, + 21.772161, + 21.775943, + 21.779696, + 21.783419, + 21.787114, + 21.790781, + 21.794419, + 21.798030, + 21.801613, + 21.805169, + 21.808698, + 21.812200, + 21.815676, + 21.819125, + 21.822549, + 21.825947, + 21.829319, + 21.832667, + 21.835989, + 21.839287, + 21.842560, + 21.845810, + 21.849035, + 21.852236, + 21.855415, + 21.858569, + 21.861701, + 21.864810, + 21.867897, + 21.870961, + 21.874003, + 21.877023, + 21.880021, + 21.882998, + 21.885953, + 21.888887, + 21.891801, + 21.894694, + 21.897566, + 21.900418, + 21.903249, + 21.906061, + 21.908853, + 21.911625, + 21.914378, + 21.917112, + 21.919827, + 21.922523, + 21.925200, + 21.927859, + 21.930499, + 21.933121, + 21.935726, + 21.938312, + 21.940881, + 21.943432, + 21.945965, + 21.948482, + 21.950981, + 21.953464, + 21.955930, + 21.958379, + 21.960812, + 21.963228, + 21.965629, + 21.968013, + 21.970381, + 21.972734, + 21.975071, + 21.977393, + 21.979699, + 21.981990, + 21.984266, + 21.986527, + 21.988773, + 21.991005, + 21.993222, + 21.995425, + 21.997613, + 21.999788, + 22.001948, + 22.004094, + 22.006226, + 22.008345, + 22.010450, + 22.012542, + 22.014621, + 22.016686, + 22.018738, + 22.020777, + 22.022803, + 22.024816, + 22.026817, + 22.028805, + 22.030781, + 22.032744, + 22.034695, + 22.036634, + 22.038561, + 22.040475, + 22.042378, + 22.044269, + 22.046149, + 22.048017, + 22.049873, + 22.051718, + 22.053552, + 22.055375, + 22.057186, + 22.058987, + 22.060776, + 22.062555, + 22.064323, + 22.066080, + 22.067826, + 22.069563, + 22.071288, + 22.073004, + 22.074709, + 22.076404, + 22.078089, + 22.079764, + 22.081429, + 22.083084, + 22.084729, + 22.086365, + 22.087991, + 22.089607, + 22.091214, + 22.092812, + 22.094400, + 22.095979, + 22.097549, + 22.099109, + 22.100661, + 22.102204, + 22.103737, + 22.105262, + 22.106778, + 22.108286, + 22.109785, + 22.111275, + 22.112757, + 22.114230, + 22.115695, + 22.117152, + 22.118600, + 22.120040, + 22.121472, + 22.122896, + 22.124312, + 22.125721, + 22.127121, + 22.128513, + 22.129898, + 22.131275, + 22.132644, + 22.134005, + 22.135359, + 22.136706, + 22.138045, + 22.139377, + 22.140701, + 22.142019, + 22.143329, + 22.144631, + 22.145927, + 22.147216, + 22.148497, + 22.149772, + 22.151040, + 22.152301, + 22.153555, + 22.154802, + 22.156043, + 22.157277, + 22.158504, + 22.159725, + 22.160939, + 22.162147, + 22.163348, + 22.164543, + 22.165732, + 22.166914, + 22.168090, + 22.169260, + 22.170424, + 22.171582, + 22.172733, + 22.173878, + 22.175018, + 22.176152, + 22.177279, + 22.178401, + 22.179517, + 22.180627, + 22.181731, + 22.182830, + 22.183923, + 22.185010, + 22.186092, + 22.187168, + 22.188239, + 22.189304, + 22.190364, + 22.191419, + 22.192468, + 22.193511, + 22.194550, + 22.195583, + 22.196611, + 22.197633, + 22.198651, + 22.199663, + 22.200671, + 22.201673, + 22.202670, + 22.203663, + 22.204650, + 22.205633, + 22.206610, + 22.207583, + 22.208551, + 22.209514, + 22.210472, + 22.211426, + 22.212375, + 22.213319, + 22.214258, + 22.215193, + 22.216124, + 22.217050, + 22.217971, + 22.218888, + 22.219800, + 22.220708, + 22.221612, + 22.222511, + 22.223406, + 22.224297, + 22.225183, + 22.226065, + 22.226943, + 22.227816, + 22.228686, + 22.229551, + 22.230412, + 22.231269, + 22.232122, + 22.232971, + 22.233816, + 22.234657, + 22.235493, + 22.236326, + 22.237155, + 22.237981, + 22.238802, + 22.239619, + 22.240433, + 22.241243, + 22.242049, + 22.242851, + 22.243649, + 22.244444, + 22.245235, + 22.246023, + 22.246807, + 22.247587, + 22.248363, + 22.249136, + 22.249906, + 22.250672, + 22.251434, + 22.252193, + 22.252949, + 22.253701, + 22.254449, + 22.255194, + 22.255936, + 22.256675, + 22.257410, + 22.258142, + 22.258870, + 22.259595, + 22.260317, + 22.261036, + 22.261752, + 22.262464, + 22.263173, + 22.263879, + 22.264582, + 22.265281, + 22.265978, + 22.266671, + 22.267362, + 22.268049, + 22.268733, + 22.269415, + 22.270093, + 22.270768, + 22.271440, + 22.272110, + 22.272776, + 22.273440, + 22.274100, + 22.274758, + 22.275413, + 22.276065, + 22.276714, + 22.277360, + 22.278004, + 22.278645, + 22.279283, + 22.279918, + 22.280551, + 22.281180, + 22.281808, + 22.282432, + 22.283054, + 22.283673, + 22.284289, + 22.284903, + 22.285514, + 22.286123, + 22.286729, + 22.287332, + 22.287933, + 22.288532, + 22.289127, + 22.289721, + 22.290312, + 22.290900, + 22.291486, + 22.292069, + 22.292650, + 22.293229, + 22.293805, + 22.294379, + 22.294950, + 22.295519, + 22.296085, + 22.296650, + 22.297212, + 22.297771, + 22.298328, + 22.298883, + 22.299436, + 22.299987, + 22.300535, + 22.301081, + 22.301624, + 22.302166, + 22.302705, + 22.303242, + 22.303777, + 22.304310, + 22.304840, + 22.305368, + 22.305895, + 22.306419, + 22.306941, + 22.307461, + 22.307978, + 22.308494, + 22.309008, + 22.309519, + 22.310029, + 22.310536, + 22.311042, + 22.311545, + 22.312046, + 22.312546, + 22.313043, + 22.313539, + 22.314032, + 22.314524, + 22.315013, + 22.315501, + 22.315987, + 22.316471, + 22.316953, + 22.317433, + 22.317911, + 22.318387, + 22.318861, + 22.319334, + 22.319805, + 22.320273, + 22.320740, + 22.321206, + 22.321669, + 22.322131, + 22.322591, + 22.323049, + 22.323505, + 22.323959, + 22.324412, + 22.324863, + 22.325313, + 22.325760, + 22.326206, + 22.326650, + 22.327093, + 22.327533, + 22.327972, + 22.328410, + 22.328845, + 22.329280, + 22.329712, + 22.330143, + 22.330572, + 22.330999, + 22.331425, + 22.331850, + 22.332272, + 22.332694, + 22.333113, + 22.333531, + 22.333947, + 22.334362, + 22.334776, + 22.335187, + 22.335598, + 22.336006, + 22.336413, + 22.336819, + 22.337223, + 22.337626, + 22.338027, + 22.338427, + 22.338825, + 22.339222, + 22.339617, + 22.340011, + 22.340403, + 22.340794, + 22.341183, + 22.341571, + 22.341958, + 22.342343, + 22.342727, + 22.343110, + 22.343491, + 22.343870, + 22.344249, + 22.344625, + 22.345001, + 22.345375, + 22.345748, + 22.346119, + 22.346490, + 22.346858, + 22.347226, + 22.347592, + 22.347957, + 22.348320, + 22.348683, + 22.349044, + 22.349403, + 22.349762, + 22.350119, + 22.350474, + 22.350829, + 22.351182, + 22.351534, + 22.351885, + 22.352235, + 22.352583, + 22.352930, + 22.353276, + 22.353621, + 22.353964, + 22.354306, + 22.354647, + 22.354987, + 22.355326, + 22.355663, + 22.356000, + 22.356335, + 22.356669, + 22.357001, + 22.357333, + 22.357664, + 22.357993, + 22.358321, + 22.358648, + 22.358974, + 22.359299, + 22.359623, + 22.359945, + 22.360267, + 22.360587, + 22.360906, + 22.361224, + 22.361541, + 22.361857, + 22.362172, + 22.362486, + 22.362799, + 22.363110, + 22.363421, + 22.363731, + 22.364039, + 22.364347, + 22.364653, + 22.364959, + 22.365263, + 22.365566, + 22.365869, + 22.366170, + 22.366470, + 22.366769, + 22.367068, + 22.367365, + 22.367661, + 22.367957, + 22.368251, + 22.368544, + 22.368837, + 22.369128, + 22.369418, + 22.369708, + 22.369996, + 22.370284, + 22.370570, + 22.370856, + 22.371141, + 22.371424, + 22.371707, + 22.371989, + 22.372270, + 22.372550, + 22.372829, + 22.373107, + 22.373384, + 22.373661, + 22.373936, + 22.374211, + 22.374485, + 22.374757, + 22.375029, + 22.375300, + 22.375570, + 22.375840, + 22.376108, + 22.376375, + 22.376642, + 22.376908, + 22.377173, + 22.377437, + 22.377700, + 22.377962, + 22.378224, + 22.378485, + 22.378745, + 22.379004, + 22.379262, + 22.379519, + 22.379776, + 22.380031, + 22.380286, + 22.380540, + 22.380794, + 22.381046, + 22.381298, + 22.381549, + 22.381799, + 22.382048, + 22.382297, + 22.382544, + 22.382791, + 22.383038, + 22.383283, + 22.383528, + 22.383771, + 22.384015, + 22.384257, + 22.384498, + 22.384739, + 22.384979, + 22.385219, + 22.385457, + 22.385695, + 22.385932, + 22.386169, + 22.386404, + 22.386639, + 22.386873, + 22.387107, + 22.387339, + 22.387571, + 22.387803, + 22.388033, + 22.388263, + 22.388492, + 22.388721, + 22.388949, + 22.389176, + 22.389402, + 22.389628, + 22.389853, + 22.390077, + 22.390301, + 22.390523, + 22.390746, + 22.390967, + 22.391188, + 22.391408, + 22.391628, + 22.391847, + 22.392065, + 22.392283, + 22.392500, + 22.392716, + 22.392931, + 22.393146, + 22.393361, + 22.393574, + 22.393787, + 22.394000, + 22.394212, + 22.394423, + }, + {// The expectations for dimension = 46 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081666, + 3.226666, + 3.374998, + 3.526664, + 3.681661, + 3.839988, + 4.001645, + 4.166628, + 4.334933, + 4.506551, + 4.681474, + 4.859685, + 5.041163, + 5.225879, + 5.413790, + 5.604845, + 5.798973, + 5.996087, + 6.196079, + 6.398819, + 6.604148, + 6.811887, + 7.021826, + 7.233733, + 7.447348, + 7.662394, + 7.878573, + 8.095573, + 8.313071, + 8.530743, + 8.748261, + 8.965303, + 9.181557, + 9.396724, + 9.610519, + 9.822680, + 10.032964, + 10.241148, + 10.447037, + 10.650455, + 10.851251, + 11.049292, + 11.244470, + 11.436693, + 11.625889, + 11.811999, + 11.994983, + 12.174811, + 12.351466, + 12.524941, + 12.695239, + 12.862369, + 13.026350, + 13.187204, + 13.344962, + 13.499655, + 13.651321, + 13.800000, + 13.945735, + 14.088572, + 14.228557, + 14.365739, + 14.500167, + 14.631892, + 14.760964, + 14.887434, + 15.011355, + 15.132778, + 15.251753, + 15.368333, + 15.482567, + 15.594506, + 15.704200, + 15.811697, + 15.917046, + 16.020295, + 16.121491, + 16.220679, + 16.317905, + 16.413213, + 16.506648, + 16.598251, + 16.688064, + 16.776129, + 16.862485, + 16.947172, + 17.030228, + 17.111691, + 17.191596, + 17.269981, + 17.346879, + 17.422325, + 17.496352, + 17.568993, + 17.640279, + 17.710241, + 17.778910, + 17.846314, + 17.912483, + 17.977444, + 18.041224, + 18.103851, + 18.165350, + 18.225747, + 18.285065, + 18.343330, + 18.400564, + 18.456790, + 18.512031, + 18.566308, + 18.619643, + 18.672056, + 18.723567, + 18.774195, + 18.823961, + 18.872881, + 18.920976, + 18.968262, + 19.014756, + 19.060476, + 19.105437, + 19.149657, + 19.193149, + 19.235931, + 19.278016, + 19.319419, + 19.360154, + 19.400235, + 19.439675, + 19.478488, + 19.516686, + 19.554281, + 19.591287, + 19.627714, + 19.663575, + 19.698881, + 19.733643, + 19.767871, + 19.801576, + 19.834769, + 19.867459, + 19.899657, + 19.931371, + 19.962612, + 19.993389, + 20.023709, + 20.053583, + 20.083018, + 20.112023, + 20.140607, + 20.168776, + 20.196539, + 20.223903, + 20.250876, + 20.277466, + 20.303678, + 20.329521, + 20.355000, + 20.380123, + 20.404896, + 20.429325, + 20.453416, + 20.477177, + 20.500611, + 20.523726, + 20.546527, + 20.569020, + 20.591209, + 20.613101, + 20.634701, + 20.656013, + 20.677042, + 20.697794, + 20.718273, + 20.738484, + 20.758432, + 20.778121, + 20.797555, + 20.816739, + 20.835676, + 20.854372, + 20.872829, + 20.891053, + 20.909047, + 20.926814, + 20.944359, + 20.961685, + 20.978795, + 20.995694, + 21.012384, + 21.028869, + 21.045152, + 21.061237, + 21.077127, + 21.092824, + 21.108332, + 21.123654, + 21.138792, + 21.153751, + 21.168531, + 21.183137, + 21.197571, + 21.211835, + 21.225932, + 21.239865, + 21.253637, + 21.267249, + 21.280704, + 21.294005, + 21.307153, + 21.320152, + 21.333003, + 21.345708, + 21.358271, + 21.370692, + 21.382974, + 21.395119, + 21.407129, + 21.419006, + 21.430751, + 21.442368, + 21.453857, + 21.465221, + 21.476461, + 21.487579, + 21.498577, + 21.509457, + 21.520220, + 21.530867, + 21.541401, + 21.551823, + 21.562135, + 21.572338, + 21.582434, + 21.592423, + 21.602309, + 21.612091, + 21.621772, + 21.631353, + 21.640835, + 21.650220, + 21.659508, + 21.668702, + 21.677802, + 21.686810, + 21.695727, + 21.704554, + 21.713292, + 21.721943, + 21.730508, + 21.738987, + 21.747382, + 21.755695, + 21.763925, + 21.772075, + 21.780145, + 21.788136, + 21.796049, + 21.803886, + 21.811647, + 21.819333, + 21.826946, + 21.834485, + 21.841952, + 21.849349, + 21.856675, + 21.863932, + 21.871120, + 21.878241, + 21.885295, + 21.892284, + 21.899207, + 21.906066, + 21.912861, + 21.919594, + 21.926264, + 21.932874, + 21.939423, + 21.945912, + 21.952342, + 21.958714, + 21.965028, + 21.971285, + 21.977486, + 21.983632, + 21.989722, + 21.995759, + 22.001741, + 22.007671, + 22.013548, + 22.019374, + 22.025148, + 22.030872, + 22.036545, + 22.042170, + 22.047745, + 22.053272, + 22.058752, + 22.064184, + 22.069570, + 22.074909, + 22.080203, + 22.085452, + 22.090656, + 22.095816, + 22.100933, + 22.106006, + 22.111037, + 22.116026, + 22.120973, + 22.125879, + 22.130744, + 22.135569, + 22.140353, + 22.145099, + 22.149805, + 22.154473, + 22.159103, + 22.163695, + 22.168250, + 22.172767, + 22.177249, + 22.181694, + 22.186103, + 22.190477, + 22.194816, + 22.199120, + 22.203390, + 22.207626, + 22.211828, + 22.215997, + 22.220134, + 22.224238, + 22.228310, + 22.232349, + 22.236358, + 22.240335, + 22.244281, + 22.248197, + 22.252083, + 22.255938, + 22.259764, + 22.263561, + 22.267329, + 22.271068, + 22.274778, + 22.278461, + 22.282115, + 22.285742, + 22.289342, + 22.292914, + 22.296460, + 22.299979, + 22.303473, + 22.306940, + 22.310381, + 22.313797, + 22.317187, + 22.320553, + 22.323894, + 22.327211, + 22.330503, + 22.333771, + 22.337015, + 22.340236, + 22.343434, + 22.346608, + 22.349760, + 22.352888, + 22.355995, + 22.359079, + 22.362141, + 22.365181, + 22.368200, + 22.371197, + 22.374173, + 22.377129, + 22.380063, + 22.382976, + 22.385870, + 22.388743, + 22.391596, + 22.394429, + 22.397242, + 22.400036, + 22.402811, + 22.405566, + 22.408303, + 22.411020, + 22.413719, + 22.416400, + 22.419062, + 22.421706, + 22.424333, + 22.426941, + 22.429532, + 22.432105, + 22.434661, + 22.437200, + 22.439722, + 22.442227, + 22.444715, + 22.447187, + 22.449642, + 22.452081, + 22.454504, + 22.456911, + 22.459302, + 22.461677, + 22.464037, + 22.466381, + 22.468710, + 22.471024, + 22.473323, + 22.475607, + 22.477876, + 22.480130, + 22.482370, + 22.484596, + 22.486807, + 22.489004, + 22.491187, + 22.493356, + 22.495512, + 22.497653, + 22.499781, + 22.501896, + 22.503997, + 22.506085, + 22.508160, + 22.510222, + 22.512271, + 22.514307, + 22.516330, + 22.518341, + 22.520340, + 22.522326, + 22.524300, + 22.526261, + 22.528211, + 22.530148, + 22.532074, + 22.533988, + 22.535890, + 22.537780, + 22.539659, + 22.541527, + 22.543383, + 22.545228, + 22.547062, + 22.548885, + 22.550697, + 22.552498, + 22.554289, + 22.556068, + 22.557837, + 22.559596, + 22.561344, + 22.563082, + 22.564809, + 22.566526, + 22.568233, + 22.569930, + 22.571617, + 22.573295, + 22.574962, + 22.576620, + 22.578268, + 22.579906, + 22.581535, + 22.583154, + 22.584765, + 22.586365, + 22.587957, + 22.589539, + 22.591113, + 22.592677, + 22.594233, + 22.595779, + 22.597317, + 22.598846, + 22.600366, + 22.601878, + 22.603381, + 22.604876, + 22.606362, + 22.607840, + 22.609309, + 22.610771, + 22.612224, + 22.613669, + 22.615106, + 22.616535, + 22.617957, + 22.619370, + 22.620775, + 22.622173, + 22.623563, + 22.624945, + 22.626320, + 22.627688, + 22.629047, + 22.630400, + 22.631745, + 22.633082, + 22.634413, + 22.635736, + 22.637052, + 22.638361, + 22.639663, + 22.640958, + 22.642246, + 22.643527, + 22.644801, + 22.646068, + 22.647329, + 22.648583, + 22.649830, + 22.651071, + 22.652305, + 22.653532, + 22.654753, + 22.655968, + 22.657176, + 22.658378, + 22.659574, + 22.660763, + 22.661946, + 22.663123, + 22.664294, + 22.665459, + 22.666617, + 22.667770, + 22.668917, + 22.670058, + 22.671193, + 22.672322, + 22.673445, + 22.674563, + 22.675675, + 22.676781, + 22.677881, + 22.678976, + 22.680066, + 22.681149, + 22.682228, + 22.683301, + 22.684368, + 22.685430, + 22.686487, + 22.687539, + 22.688585, + 22.689626, + 22.690661, + 22.691692, + 22.692717, + 22.693738, + 22.694753, + 22.695763, + 22.696769, + 22.697769, + 22.698764, + 22.699755, + 22.700740, + 22.701721, + 22.702697, + 22.703668, + 22.704634, + 22.705596, + 22.706553, + 22.707506, + 22.708453, + 22.709396, + 22.710335, + 22.711269, + 22.712199, + 22.713124, + 22.714044, + 22.714961, + 22.715872, + 22.716780, + 22.717683, + 22.718582, + 22.719476, + 22.720367, + 22.721253, + 22.722135, + 22.723012, + 22.723886, + 22.724755, + 22.725621, + 22.726482, + 22.727339, + 22.728192, + 22.729042, + 22.729887, + 22.730728, + 22.731565, + 22.732399, + 22.733229, + 22.734054, + 22.734876, + 22.735694, + 22.736509, + 22.737319, + 22.738126, + 22.738930, + 22.739729, + 22.740525, + 22.741317, + 22.742106, + 22.742891, + 22.743672, + 22.744450, + 22.745224, + 22.745995, + 22.746762, + 22.747526, + 22.748287, + 22.749044, + 22.749797, + 22.750547, + 22.751294, + 22.752038, + 22.752778, + 22.753515, + 22.754248, + 22.754979, + 22.755706, + 22.756429, + 22.757150, + 22.757868, + 22.758582, + 22.759293, + 22.760001, + 22.760706, + 22.761408, + 22.762106, + 22.762802, + 22.763494, + 22.764184, + 22.764871, + 22.765554, + 22.766235, + 22.766912, + 22.767587, + 22.768259, + 22.768928, + 22.769594, + 22.770257, + 22.770917, + 22.771574, + 22.772229, + 22.772881, + 22.773530, + 22.774176, + 22.774820, + 22.775460, + 22.776098, + 22.776733, + 22.777366, + 22.777996, + 22.778623, + 22.779248, + 22.779870, + 22.780489, + 22.781106, + 22.781720, + 22.782331, + 22.782940, + 22.783547, + 22.784151, + 22.784752, + 22.785351, + 22.785947, + 22.786541, + 22.787133, + 22.787722, + 22.788308, + 22.788892, + 22.789474, + 22.790053, + 22.790630, + 22.791205, + 22.791777, + 22.792347, + 22.792914, + 22.793480, + 22.794042, + 22.794603, + 22.795161, + 22.795717, + 22.796271, + 22.796823, + 22.797372, + 22.797919, + 22.798464, + 22.799007, + 22.799547, + 22.800085, + 22.800622, + 22.801155, + 22.801687, + 22.802217, + 22.802745, + 22.803270, + 22.803794, + 22.804315, + 22.804834, + 22.805351, + 22.805866, + 22.806380, + 22.806891, + 22.807400, + 22.807907, + 22.808412, + 22.808915, + 22.809416, + 22.809915, + 22.810412, + 22.810907, + 22.811401, + 22.811892, + 22.812381, + 22.812869, + 22.813354, + 22.813838, + 22.814320, + 22.814800, + 22.815278, + 22.815754, + 22.816229, + 22.816702, + 22.817172, + 22.817641, + 22.818109, + 22.818574, + 22.819038, + 22.819499, + 22.819959, + 22.820418, + 22.820874, + 22.821329, + 22.821782, + 22.822234, + 22.822683, + 22.823131, + 22.823578, + 22.824022, + 22.824465, + 22.824906, + 22.825346, + 22.825784, + 22.826220, + 22.826655, + 22.827088, + 22.827519, + 22.827949, + 22.828377, + 22.828804, + 22.829229, + 22.829652, + 22.830074, + 22.830495, + 22.830913, + 22.831331, + 22.831746, + 22.832160, + 22.832573, + 22.832984, + 22.833394, + 22.833802, + 22.834208, + 22.834613, + 22.835017, + 22.835419, + 22.835820, + 22.836219, + 22.836617, + 22.837013, + 22.837408, + 22.837801, + 22.838193, + 22.838584, + 22.838973, + 22.839361, + 22.839747, + 22.840132, + 22.840516, + 22.840898, + 22.841279, + 22.841658, + 22.842037, + 22.842413, + 22.842789, + 22.843163, + 22.843536, + 22.843907, + 22.844277, + 22.844646, + 22.845013, + 22.845380, + 22.845744, + 22.846108, + 22.846470, + 22.846831, + 22.847191, + 22.847550, + 22.847907, + 22.848263, + 22.848618, + 22.848971, + 22.849323, + 22.849675, + 22.850024, + 22.850373, + 22.850720, + 22.851066, + 22.851411, + 22.851755, + 22.852098, + 22.852439, + 22.852779, + 22.853119, + 22.853456, + 22.853793, + 22.854129, + 22.854463, + 22.854796, + 22.855128, + 22.855459, + 22.855789, + 22.856118, + 22.856446, + 22.856772, + 22.857097, + 22.857422, + 22.857745, + 22.858067, + 22.858388, + 22.858708, + 22.859027, + 22.859344, + 22.859661, + 22.859977, + 22.860291, + 22.860605, + 22.860917, + 22.861228, + 22.861539, + 22.861848, + 22.862156, + 22.862463, + 22.862770, + 22.863075, + 22.863379, + 22.863682, + 22.863984, + 22.864285, + 22.864585, + 22.864885, + 22.865183, + 22.865480, + 22.865776, + 22.866071, + 22.866366, + 22.866659, + 22.866951, + 22.867242, + 22.867533, + 22.867822, + 22.868111, + 22.868398, + 22.868685, + 22.868971, + 22.869255, + 22.869539, + 22.869822, + 22.870104, + 22.870385, + 22.870665, + 22.870945, + 22.871223, + 22.871500, + 22.871777, + 22.872052, + 22.872327, + 22.872601, + 22.872874, + 22.873146, + 22.873418, + 22.873688, + 22.873957, + 22.874226, + 22.874494, + 22.874761, + 22.875027, + 22.875292, + 22.875557, + 22.875820, + 22.876083, + 22.876345, + 22.876606, + 22.876866, + 22.877126, + 22.877384, + 22.877642, + 22.877899, + 22.878155, + 22.878411, + 22.878665, + 22.878919, + 22.879172, + 22.879424, + 22.879675, + 22.879926, + 22.880176, + 22.880425, + 22.880673, + 22.880921, + 22.881167, + 22.881413, + 22.881659, + 22.881903, + 22.882147, + 22.882390, + 22.882632, + 22.882873, + 22.883114, + 22.883354, + 22.883593, + 22.883832, + 22.884069, + 22.884307, + 22.884543, + 22.884778, + 22.885013, + 22.885247, + 22.885481, + 22.885714, + 22.885946, + 22.886177, + 22.886407, + 22.886637, + 22.886867, + 22.887095, + 22.887323, + 22.887550, + 22.887776, + 22.888002, + 22.888227, + 22.888452, + 22.888675, + 22.888898, + 22.889121, + 22.889343, + 22.889564, + 22.889784, + }, + {// The expectations for dimension = 47 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081666, + 3.226666, + 3.374999, + 3.526665, + 3.681663, + 3.839993, + 4.001653, + 4.166642, + 4.334955, + 4.506589, + 4.681535, + 4.859781, + 5.041311, + 5.226102, + 5.414121, + 5.605325, + 5.799656, + 5.997042, + 6.197391, + 6.400589, + 6.606500, + 6.814961, + 7.025786, + 7.238761, + 7.453646, + 7.670179, + 7.888078, + 8.107041, + 8.326756, + 8.546898, + 8.767143, + 8.987165, + 9.206643, + 9.425270, + 9.642748, + 9.858799, + 10.073163, + 10.285603, + 10.495903, + 10.703869, + 10.909332, + 11.112142, + 11.312175, + 11.509322, + 11.703496, + 11.894626, + 12.082658, + 12.267552, + 12.449280, + 12.627825, + 12.803183, + 12.975356, + 13.144354, + 13.310197, + 13.472907, + 13.632513, + 13.789048, + 13.942550, + 14.093058, + 14.240615, + 14.385266, + 14.527057, + 14.666037, + 14.802254, + 14.935759, + 15.066601, + 15.194833, + 15.320504, + 15.443666, + 15.564371, + 15.682668, + 15.798608, + 15.912241, + 16.023617, + 16.132783, + 16.239789, + 16.344681, + 16.447507, + 16.548312, + 16.647141, + 16.744038, + 16.839048, + 16.932212, + 17.023573, + 17.113171, + 17.201046, + 17.287237, + 17.371783, + 17.454721, + 17.536088, + 17.615918, + 17.694249, + 17.771112, + 17.846542, + 17.920571, + 17.993231, + 18.064553, + 18.134566, + 18.203301, + 18.270787, + 18.337050, + 18.402119, + 18.466021, + 18.528780, + 18.590423, + 18.650975, + 18.710459, + 18.768899, + 18.826318, + 18.882738, + 18.938181, + 18.992669, + 19.046221, + 19.098859, + 19.150603, + 19.201470, + 19.251480, + 19.300652, + 19.349002, + 19.396549, + 19.443310, + 19.489300, + 19.534537, + 19.579035, + 19.622811, + 19.665879, + 19.708253, + 19.749949, + 19.790980, + 19.831359, + 19.871100, + 19.910215, + 19.948718, + 19.986621, + 20.023935, + 20.060673, + 20.096845, + 20.132464, + 20.167539, + 20.202082, + 20.236103, + 20.269612, + 20.302619, + 20.335134, + 20.367167, + 20.398726, + 20.429820, + 20.460459, + 20.490651, + 20.520405, + 20.549728, + 20.578629, + 20.607115, + 20.635195, + 20.662876, + 20.690165, + 20.717070, + 20.743597, + 20.769753, + 20.795546, + 20.820981, + 20.846065, + 20.870805, + 20.895206, + 20.919274, + 20.943016, + 20.966438, + 20.989544, + 21.012341, + 21.034833, + 21.057026, + 21.078926, + 21.100537, + 21.121864, + 21.142913, + 21.163687, + 21.184192, + 21.204432, + 21.224412, + 21.244136, + 21.263607, + 21.282832, + 21.301813, + 21.320554, + 21.339060, + 21.357335, + 21.375381, + 21.393204, + 21.410806, + 21.428191, + 21.445363, + 21.462325, + 21.479080, + 21.495632, + 21.511984, + 21.528139, + 21.544100, + 21.559870, + 21.575453, + 21.590851, + 21.606067, + 21.621103, + 21.635964, + 21.650650, + 21.665166, + 21.679514, + 21.693695, + 21.707713, + 21.721571, + 21.735270, + 21.748813, + 21.762202, + 21.775440, + 21.788528, + 21.801470, + 21.814267, + 21.826921, + 21.839435, + 21.851810, + 21.864048, + 21.876153, + 21.888124, + 21.899965, + 21.911677, + 21.923262, + 21.934722, + 21.946059, + 21.957274, + 21.968369, + 21.979346, + 21.990206, + 22.000951, + 22.011583, + 22.022104, + 22.032514, + 22.042815, + 22.053009, + 22.063098, + 22.073082, + 22.082963, + 22.092743, + 22.102423, + 22.112004, + 22.121488, + 22.130875, + 22.140168, + 22.149367, + 22.158474, + 22.167489, + 22.176415, + 22.185252, + 22.194002, + 22.202665, + 22.211243, + 22.219736, + 22.228147, + 22.236475, + 22.244723, + 22.252890, + 22.260979, + 22.268990, + 22.276924, + 22.284782, + 22.292565, + 22.300274, + 22.307910, + 22.315473, + 22.322966, + 22.330388, + 22.337740, + 22.345024, + 22.352240, + 22.359389, + 22.366471, + 22.373489, + 22.380442, + 22.387331, + 22.394157, + 22.400921, + 22.407623, + 22.414265, + 22.420846, + 22.427369, + 22.433832, + 22.440238, + 22.446586, + 22.452878, + 22.459114, + 22.465295, + 22.471422, + 22.477494, + 22.483513, + 22.489479, + 22.495393, + 22.501256, + 22.507068, + 22.512830, + 22.518541, + 22.524204, + 22.529818, + 22.535384, + 22.540902, + 22.546374, + 22.551799, + 22.557178, + 22.562512, + 22.567801, + 22.573045, + 22.578245, + 22.583402, + 22.588517, + 22.593588, + 22.598618, + 22.603606, + 22.608553, + 22.613459, + 22.618325, + 22.623152, + 22.627939, + 22.632687, + 22.637396, + 22.642068, + 22.646702, + 22.651298, + 22.655858, + 22.660381, + 22.664869, + 22.669320, + 22.673736, + 22.678117, + 22.682464, + 22.686776, + 22.691054, + 22.695299, + 22.699511, + 22.703690, + 22.707836, + 22.711950, + 22.716033, + 22.720084, + 22.724103, + 22.728092, + 22.732050, + 22.735978, + 22.739876, + 22.743745, + 22.747584, + 22.751394, + 22.755175, + 22.758928, + 22.762653, + 22.766349, + 22.770019, + 22.773660, + 22.777275, + 22.780863, + 22.784424, + 22.787959, + 22.791468, + 22.794951, + 22.798409, + 22.801841, + 22.805249, + 22.808631, + 22.811989, + 22.815323, + 22.818633, + 22.821919, + 22.825181, + 22.828419, + 22.831635, + 22.834828, + 22.837998, + 22.841145, + 22.844270, + 22.847373, + 22.850454, + 22.853513, + 22.856551, + 22.859568, + 22.862563, + 22.865538, + 22.868491, + 22.871425, + 22.874338, + 22.877231, + 22.880104, + 22.882957, + 22.885790, + 22.888605, + 22.891399, + 22.894175, + 22.896932, + 22.899671, + 22.902390, + 22.905092, + 22.907775, + 22.910440, + 22.913087, + 22.915716, + 22.918328, + 22.920923, + 22.923500, + 22.926060, + 22.928603, + 22.931129, + 22.933639, + 22.936132, + 22.938609, + 22.941069, + 22.943513, + 22.945942, + 22.948354, + 22.950751, + 22.953133, + 22.955499, + 22.957849, + 22.960185, + 22.962505, + 22.964811, + 22.967102, + 22.969378, + 22.971640, + 22.973887, + 22.976120, + 22.978339, + 22.980544, + 22.982735, + 22.984912, + 22.987076, + 22.989226, + 22.991362, + 22.993485, + 22.995595, + 22.997692, + 22.999776, + 23.001847, + 23.003905, + 23.005950, + 23.007983, + 23.010003, + 23.012011, + 23.014007, + 23.015990, + 23.017961, + 23.019921, + 23.021868, + 23.023804, + 23.025728, + 23.027640, + 23.029541, + 23.031430, + 23.033309, + 23.035175, + 23.037031, + 23.038876, + 23.040709, + 23.042532, + 23.044344, + 23.046145, + 23.047936, + 23.049716, + 23.051486, + 23.053245, + 23.054994, + 23.056732, + 23.058461, + 23.060179, + 23.061888, + 23.063586, + 23.065275, + 23.066954, + 23.068623, + 23.070283, + 23.071933, + 23.073574, + 23.075205, + 23.076827, + 23.078439, + 23.080043, + 23.081637, + 23.083223, + 23.084799, + 23.086366, + 23.087925, + 23.089475, + 23.091016, + 23.092549, + 23.094072, + 23.095588, + 23.097095, + 23.098593, + 23.100084, + 23.101566, + 23.103039, + 23.104505, + 23.105962, + 23.107412, + 23.108853, + 23.110287, + 23.111713, + 23.113131, + 23.114541, + 23.115944, + 23.117339, + 23.118726, + 23.120106, + 23.121478, + 23.122843, + 23.124201, + 23.125551, + 23.126894, + 23.128230, + 23.129559, + 23.130880, + 23.132195, + 23.133502, + 23.134803, + 23.136097, + 23.137384, + 23.138664, + 23.139937, + 23.141204, + 23.142464, + 23.143717, + 23.144964, + 23.146204, + 23.147438, + 23.148665, + 23.149886, + 23.151101, + 23.152309, + 23.153511, + 23.154707, + 23.155897, + 23.157080, + 23.158258, + 23.159429, + 23.160594, + 23.161754, + 23.162907, + 23.164055, + 23.165197, + 23.166333, + 23.167463, + 23.168588, + 23.169707, + 23.170820, + 23.171927, + 23.173029, + 23.174126, + 23.175217, + 23.176302, + 23.177382, + 23.178457, + 23.179527, + 23.180591, + 23.181649, + 23.182703, + 23.183751, + 23.184794, + 23.185832, + 23.186865, + 23.187893, + 23.188916, + 23.189933, + 23.190946, + 23.191954, + 23.192957, + 23.193955, + 23.194948, + 23.195936, + 23.196920, + 23.197899, + 23.198873, + 23.199842, + 23.200807, + 23.201767, + 23.202723, + 23.203673, + 23.204620, + 23.205562, + 23.206499, + 23.207432, + 23.208360, + 23.209284, + 23.210204, + 23.211119, + 23.212030, + 23.212937, + 23.213839, + 23.214737, + 23.215631, + 23.216521, + 23.217407, + 23.218288, + 23.219166, + 23.220039, + 23.220908, + 23.221773, + 23.222634, + 23.223492, + 23.224345, + 23.225194, + 23.226039, + 23.226881, + 23.227718, + 23.228552, + 23.229382, + 23.230208, + 23.231031, + 23.231849, + 23.232664, + 23.233475, + 23.234283, + 23.235087, + 23.235887, + 23.236684, + 23.237477, + 23.238266, + 23.239052, + 23.239834, + 23.240613, + 23.241389, + 23.242160, + 23.242929, + 23.243694, + 23.244456, + 23.245214, + 23.245969, + 23.246720, + 23.247468, + 23.248213, + 23.248955, + 23.249693, + 23.250428, + 23.251160, + 23.251889, + 23.252614, + 23.253336, + 23.254056, + 23.254772, + 23.255484, + 23.256194, + 23.256901, + 23.257605, + 23.258305, + 23.259003, + 23.259697, + 23.260389, + 23.261077, + 23.261763, + 23.262446, + 23.263125, + 23.263802, + 23.264476, + 23.265147, + 23.265815, + 23.266481, + 23.267143, + 23.267803, + 23.268460, + 23.269114, + 23.269765, + 23.270414, + 23.271060, + 23.271703, + 23.272343, + 23.272981, + 23.273616, + 23.274249, + 23.274879, + 23.275506, + 23.276130, + 23.276752, + 23.277372, + 23.277988, + 23.278603, + 23.279214, + 23.279824, + 23.280430, + 23.281034, + 23.281636, + 23.282235, + 23.282832, + 23.283426, + 23.284018, + 23.284608, + 23.285195, + 23.285779, + 23.286361, + 23.286941, + 23.287519, + 23.288094, + 23.288667, + 23.289237, + 23.289806, + 23.290372, + 23.290935, + 23.291497, + 23.292056, + 23.292613, + 23.293167, + 23.293720, + 23.294270, + 23.294818, + 23.295364, + 23.295908, + 23.296449, + 23.296988, + 23.297526, + 23.298061, + 23.298594, + 23.299125, + 23.299653, + 23.300180, + 23.300705, + 23.301227, + 23.301748, + 23.302266, + 23.302783, + 23.303297, + 23.303810, + 23.304320, + 23.304828, + 23.305335, + 23.305839, + 23.306342, + 23.306843, + 23.307341, + 23.307838, + 23.308333, + 23.308826, + 23.309317, + 23.309806, + 23.310293, + 23.310778, + 23.311262, + 23.311744, + 23.312223, + 23.312701, + 23.313178, + 23.313652, + 23.314125, + 23.314595, + 23.315064, + 23.315531, + 23.315997, + 23.316461, + 23.316923, + 23.317383, + 23.317841, + 23.318298, + 23.318753, + 23.319206, + 23.319658, + 23.320108, + 23.320556, + 23.321003, + 23.321448, + 23.321891, + 23.322332, + 23.322772, + 23.323211, + 23.323647, + 23.324083, + 23.324516, + 23.324948, + 23.325378, + 23.325807, + 23.326234, + 23.326660, + 23.327084, + 23.327506, + 23.327927, + 23.328347, + 23.328764, + 23.329181, + 23.329596, + 23.330009, + 23.330421, + 23.330831, + 23.331240, + 23.331647, + 23.332053, + 23.332457, + 23.332860, + 23.333262, + 23.333662, + 23.334061, + 23.334458, + 23.334854, + 23.335248, + 23.335641, + 23.336032, + 23.336423, + 23.336811, + 23.337199, + 23.337585, + 23.337969, + 23.338353, + 23.338735, + 23.339115, + 23.339494, + 23.339872, + 23.340249, + 23.340624, + 23.340998, + 23.341370, + 23.341742, + 23.342112, + 23.342480, + 23.342848, + 23.343214, + 23.343579, + 23.343942, + 23.344305, + 23.344666, + 23.345025, + 23.345384, + 23.345741, + 23.346097, + 23.346452, + 23.346806, + 23.347158, + 23.347509, + 23.347859, + 23.348208, + 23.348556, + 23.348902, + 23.349247, + 23.349591, + 23.349934, + 23.350276, + 23.350616, + 23.350955, + 23.351294, + 23.351631, + 23.351967, + 23.352301, + 23.352635, + 23.352967, + 23.353299, + 23.353629, + 23.353958, + 23.354286, + 23.354613, + 23.354939, + 23.355264, + 23.355587, + 23.355910, + 23.356231, + 23.356552, + 23.356871, + 23.357189, + 23.357507, + 23.357823, + 23.358138, + 23.358452, + 23.358765, + 23.359077, + 23.359388, + 23.359698, + 23.360007, + 23.360315, + 23.360621, + 23.360927, + 23.361232, + 23.361536, + 23.361839, + 23.362141, + 23.362442, + 23.362742, + 23.363040, + 23.363338, + 23.363635, + 23.363931, + 23.364226, + 23.364521, + 23.364814, + 23.365106, + 23.365397, + 23.365687, + 23.365977, + 23.366265, + 23.366553, + 23.366839, + 23.367125, + 23.367410, + 23.367693, + 23.367976, + 23.368258, + 23.368539, + 23.368820, + 23.369099, + 23.369377, + 23.369655, + 23.369932, + 23.370207, + 23.370482, + 23.370756, + 23.371029, + 23.371302, + 23.371573, + 23.371844, + 23.372113, + 23.372382, + 23.372650, + 23.372917, + 23.373184, + 23.373449, + 23.373714, + 23.373978, + 23.374241, + 23.374503, + 23.374764, + 23.375025, + 23.375285, + 23.375544, + 23.375802, + 23.376059, + 23.376316, + 23.376571, + 23.376826, + 23.377081, + 23.377334, + 23.377586, + 23.377838, + 23.378089, + 23.378340, + 23.378589, + 23.378838, + 23.379086, + 23.379333, + 23.379579, + 23.379825, + 23.380070, + 23.380314, + 23.380558, + 23.380800, + 23.381042, + 23.381284, + 23.381524, + 23.381764, + 23.382003, + 23.382241, + 23.382479, + 23.382716, + 23.382952, + 23.383187, + 23.383422, + 23.383656, + 23.383890, + 23.384122, + 23.384354, + 23.384585, + 23.384816, + 23.385046, + }, + {// The expectations for dimension = 48 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226666, + 3.374999, + 3.526666, + 3.681664, + 3.839995, + 4.001658, + 4.166650, + 4.334971, + 4.506615, + 4.681577, + 4.859849, + 5.041418, + 5.226265, + 5.414366, + 5.605685, + 5.800176, + 5.997778, + 6.198414, + 6.401987, + 6.608379, + 6.817446, + 7.029022, + 7.242912, + 7.458898, + 7.676735, + 7.896157, + 8.116875, + 8.338587, + 8.560977, + 8.783722, + 9.006496, + 9.228975, + 9.450842, + 9.671790, + 9.891529, + 10.109783, + 10.326298, + 10.540840, + 10.753200, + 10.963188, + 11.170639, + 11.375410, + 11.577377, + 11.776437, + 11.972506, + 12.165516, + 12.355414, + 12.542162, + 12.725734, + 12.906115, + 13.083300, + 13.257294, + 13.428107, + 13.595758, + 13.760271, + 13.921674, + 14.080000, + 14.235286, + 14.387573, + 14.536902, + 14.683318, + 14.826867, + 14.967598, + 15.105557, + 15.240796, + 15.373365, + 15.503313, + 15.630691, + 15.755551, + 15.877943, + 15.997917, + 16.115523, + 16.230811, + 16.343829, + 16.454628, + 16.563253, + 16.669753, + 16.774174, + 16.876561, + 16.976960, + 17.075415, + 17.171968, + 17.266663, + 17.359540, + 17.450642, + 17.540007, + 17.627674, + 17.713683, + 17.798069, + 17.880871, + 17.962123, + 18.041860, + 18.120116, + 18.196926, + 18.272321, + 18.346332, + 18.418992, + 18.490330, + 18.560376, + 18.629158, + 18.696704, + 18.763043, + 18.828201, + 18.892203, + 18.955076, + 19.016844, + 19.077531, + 19.137161, + 19.195757, + 19.253342, + 19.309936, + 19.365563, + 19.420242, + 19.473994, + 19.526839, + 19.578795, + 19.629883, + 19.680120, + 19.729524, + 19.778113, + 19.825903, + 19.872912, + 19.919156, + 19.964650, + 20.009411, + 20.053453, + 20.096790, + 20.139438, + 20.181410, + 20.222720, + 20.263381, + 20.303407, + 20.342810, + 20.381602, + 20.419796, + 20.457404, + 20.494437, + 20.530906, + 20.566823, + 20.602198, + 20.637041, + 20.671364, + 20.705176, + 20.738486, + 20.771305, + 20.803642, + 20.835506, + 20.866906, + 20.897851, + 20.928348, + 20.958407, + 20.988036, + 21.017243, + 21.046035, + 21.074420, + 21.102406, + 21.130000, + 21.157209, + 21.184039, + 21.210499, + 21.236594, + 21.262330, + 21.287716, + 21.312755, + 21.337456, + 21.361823, + 21.385863, + 21.409581, + 21.432983, + 21.456074, + 21.478860, + 21.501346, + 21.523537, + 21.545439, + 21.567055, + 21.588392, + 21.609453, + 21.630243, + 21.650768, + 21.671030, + 21.691036, + 21.710788, + 21.730291, + 21.749550, + 21.768568, + 21.787349, + 21.805897, + 21.824216, + 21.842309, + 21.860181, + 21.877834, + 21.895272, + 21.912499, + 21.929518, + 21.946332, + 21.962945, + 21.979360, + 21.995579, + 22.011606, + 22.027443, + 22.043095, + 22.058563, + 22.073850, + 22.088960, + 22.103894, + 22.118656, + 22.133248, + 22.147673, + 22.161933, + 22.176031, + 22.189968, + 22.203749, + 22.217374, + 22.230846, + 22.244168, + 22.257342, + 22.270369, + 22.283252, + 22.295993, + 22.308594, + 22.321057, + 22.333384, + 22.345577, + 22.357639, + 22.369570, + 22.381372, + 22.393048, + 22.404600, + 22.416028, + 22.427335, + 22.438523, + 22.449592, + 22.460546, + 22.471384, + 22.482110, + 22.492724, + 22.503228, + 22.513623, + 22.523912, + 22.534095, + 22.544173, + 22.554149, + 22.564024, + 22.573799, + 22.583475, + 22.593053, + 22.602536, + 22.611923, + 22.621217, + 22.630419, + 22.639530, + 22.648551, + 22.657483, + 22.666327, + 22.675085, + 22.683757, + 22.692346, + 22.700851, + 22.709274, + 22.717616, + 22.725877, + 22.734060, + 22.742165, + 22.750193, + 22.758144, + 22.766021, + 22.773823, + 22.781552, + 22.789209, + 22.796794, + 22.804309, + 22.811754, + 22.819130, + 22.826438, + 22.833678, + 22.840853, + 22.847961, + 22.855005, + 22.861985, + 22.868902, + 22.875756, + 22.882549, + 22.889280, + 22.895952, + 22.902563, + 22.909116, + 22.915611, + 22.922048, + 22.928428, + 22.934752, + 22.941021, + 22.947235, + 22.953394, + 22.959500, + 22.965553, + 22.971554, + 22.977503, + 22.983400, + 22.989247, + 22.995044, + 23.000792, + 23.006491, + 23.012141, + 23.017743, + 23.023298, + 23.028807, + 23.034269, + 23.039686, + 23.045057, + 23.050383, + 23.055666, + 23.060904, + 23.066100, + 23.071252, + 23.076362, + 23.081431, + 23.086458, + 23.091444, + 23.096389, + 23.101295, + 23.106161, + 23.110987, + 23.115775, + 23.120524, + 23.125236, + 23.129909, + 23.134546, + 23.139146, + 23.143709, + 23.148237, + 23.152728, + 23.157185, + 23.161606, + 23.165993, + 23.170346, + 23.174665, + 23.178950, + 23.183203, + 23.187422, + 23.191609, + 23.195764, + 23.199887, + 23.203979, + 23.208039, + 23.212069, + 23.216068, + 23.220036, + 23.223975, + 23.227884, + 23.231764, + 23.235615, + 23.239437, + 23.243230, + 23.246996, + 23.250733, + 23.254443, + 23.258125, + 23.261780, + 23.265409, + 23.269010, + 23.272586, + 23.276135, + 23.279659, + 23.283157, + 23.286630, + 23.290077, + 23.293500, + 23.296898, + 23.300272, + 23.303622, + 23.306947, + 23.310250, + 23.313528, + 23.316783, + 23.320016, + 23.323225, + 23.326412, + 23.329577, + 23.332719, + 23.335840, + 23.338938, + 23.342016, + 23.345071, + 23.348106, + 23.351119, + 23.354112, + 23.357085, + 23.360036, + 23.362968, + 23.365880, + 23.368771, + 23.371643, + 23.374496, + 23.377329, + 23.380143, + 23.382938, + 23.385715, + 23.388472, + 23.391212, + 23.393933, + 23.396635, + 23.399320, + 23.401987, + 23.404636, + 23.407268, + 23.409883, + 23.412480, + 23.415060, + 23.417623, + 23.420170, + 23.422700, + 23.425213, + 23.427710, + 23.430191, + 23.432656, + 23.435105, + 23.437538, + 23.439955, + 23.442357, + 23.444744, + 23.447115, + 23.449471, + 23.451813, + 23.454139, + 23.456451, + 23.458748, + 23.461030, + 23.463299, + 23.465552, + 23.467792, + 23.470018, + 23.472230, + 23.474428, + 23.476613, + 23.478783, + 23.480941, + 23.483085, + 23.485216, + 23.487334, + 23.489438, + 23.491530, + 23.493609, + 23.495676, + 23.497730, + 23.499771, + 23.501800, + 23.503816, + 23.505821, + 23.507813, + 23.509793, + 23.511762, + 23.513719, + 23.515664, + 23.517597, + 23.519519, + 23.521429, + 23.523328, + 23.525216, + 23.527092, + 23.528958, + 23.530812, + 23.532656, + 23.534489, + 23.536311, + 23.538122, + 23.539923, + 23.541714, + 23.543493, + 23.545263, + 23.547023, + 23.548772, + 23.550511, + 23.552240, + 23.553959, + 23.555668, + 23.557368, + 23.559058, + 23.560738, + 23.562409, + 23.564070, + 23.565721, + 23.567364, + 23.568997, + 23.570621, + 23.572235, + 23.573841, + 23.575438, + 23.577026, + 23.578604, + 23.580174, + 23.581736, + 23.583288, + 23.584832, + 23.586368, + 23.587895, + 23.589413, + 23.590924, + 23.592425, + 23.593919, + 23.595405, + 23.596882, + 23.598351, + 23.599813, + 23.601266, + 23.602711, + 23.604149, + 23.605579, + 23.607001, + 23.608415, + 23.609822, + 23.611222, + 23.612613, + 23.613998, + 23.615375, + 23.616744, + 23.618107, + 23.619462, + 23.620810, + 23.622151, + 23.623484, + 23.624811, + 23.626131, + 23.627443, + 23.628749, + 23.630048, + 23.631341, + 23.632626, + 23.633905, + 23.635177, + 23.636442, + 23.637701, + 23.638954, + 23.640200, + 23.641439, + 23.642672, + 23.643899, + 23.645120, + 23.646334, + 23.647542, + 23.648744, + 23.649940, + 23.651129, + 23.652313, + 23.653491, + 23.654662, + 23.655828, + 23.656988, + 23.658142, + 23.659290, + 23.660433, + 23.661569, + 23.662700, + 23.663826, + 23.664946, + 23.666060, + 23.667168, + 23.668272, + 23.669369, + 23.670462, + 23.671548, + 23.672630, + 23.673706, + 23.674777, + 23.675843, + 23.676903, + 23.677958, + 23.679008, + 23.680053, + 23.681093, + 23.682128, + 23.683158, + 23.684183, + 23.685202, + 23.686217, + 23.687227, + 23.688232, + 23.689233, + 23.690228, + 23.691219, + 23.692205, + 23.693187, + 23.694163, + 23.695135, + 23.696103, + 23.697065, + 23.698024, + 23.698977, + 23.699926, + 23.700871, + 23.701811, + 23.702747, + 23.703679, + 23.704606, + 23.705529, + 23.706447, + 23.707361, + 23.708271, + 23.709177, + 23.710078, + 23.710975, + 23.711869, + 23.712758, + 23.713642, + 23.714523, + 23.715400, + 23.716273, + 23.717142, + 23.718006, + 23.718867, + 23.719724, + 23.720577, + 23.721426, + 23.722271, + 23.723113, + 23.723950, + 23.724784, + 23.725614, + 23.726440, + 23.727263, + 23.728082, + 23.728897, + 23.729709, + 23.730516, + 23.731321, + 23.732121, + 23.732919, + 23.733712, + 23.734502, + 23.735289, + 23.736072, + 23.736851, + 23.737627, + 23.738400, + 23.739170, + 23.739935, + 23.740698, + 23.741457, + 23.742213, + 23.742966, + 23.743715, + 23.744461, + 23.745204, + 23.745943, + 23.746680, + 23.747413, + 23.748143, + 23.748870, + 23.749593, + 23.750314, + 23.751031, + 23.751746, + 23.752457, + 23.753165, + 23.753871, + 23.754573, + 23.755272, + 23.755968, + 23.756662, + 23.757352, + 23.758039, + 23.758724, + 23.759405, + 23.760084, + 23.760760, + 23.761433, + 23.762103, + 23.762771, + 23.763435, + 23.764097, + 23.764756, + 23.765412, + 23.766066, + 23.766716, + 23.767364, + 23.768010, + 23.768652, + 23.769293, + 23.769930, + 23.770565, + 23.771197, + 23.771826, + 23.772453, + 23.773078, + 23.773699, + 23.774319, + 23.774935, + 23.775549, + 23.776161, + 23.776770, + 23.777377, + 23.777981, + 23.778583, + 23.779182, + 23.779779, + 23.780374, + 23.780966, + 23.781556, + 23.782143, + 23.782728, + 23.783310, + 23.783891, + 23.784469, + 23.785044, + 23.785618, + 23.786189, + 23.786758, + 23.787324, + 23.787888, + 23.788450, + 23.789010, + 23.789568, + 23.790123, + 23.790676, + 23.791227, + 23.791776, + 23.792323, + 23.792867, + 23.793410, + 23.793950, + 23.794488, + 23.795024, + 23.795558, + 23.796090, + 23.796620, + 23.797147, + 23.797673, + 23.798197, + 23.798718, + 23.799238, + 23.799755, + 23.800271, + 23.800785, + 23.801296, + 23.801806, + 23.802314, + 23.802819, + 23.803323, + 23.803825, + 23.804325, + 23.804823, + 23.805319, + 23.805814, + 23.806306, + 23.806797, + 23.807285, + 23.807772, + 23.808257, + 23.808740, + 23.809222, + 23.809701, + 23.810179, + 23.810655, + 23.811129, + 23.811601, + 23.812072, + 23.812541, + 23.813008, + 23.813473, + 23.813937, + 23.814399, + 23.814859, + 23.815317, + 23.815774, + 23.816229, + 23.816682, + 23.817134, + 23.817584, + 23.818033, + 23.818479, + 23.818924, + 23.819368, + 23.819810, + 23.820250, + 23.820689, + 23.821126, + 23.821561, + 23.821995, + 23.822427, + 23.822858, + 23.823287, + 23.823714, + 23.824140, + 23.824565, + 23.824988, + 23.825409, + 23.825829, + 23.826248, + 23.826664, + 23.827080, + 23.827494, + 23.827906, + 23.828317, + 23.828726, + 23.829134, + 23.829541, + 23.829946, + 23.830350, + 23.830752, + 23.831153, + 23.831552, + 23.831950, + 23.832347, + 23.832742, + 23.833136, + 23.833528, + 23.833919, + 23.834308, + 23.834697, + 23.835084, + 23.835469, + 23.835853, + 23.836236, + 23.836618, + 23.836998, + 23.837377, + 23.837754, + 23.838130, + 23.838505, + 23.838879, + 23.839251, + 23.839622, + 23.839992, + 23.840360, + 23.840728, + 23.841094, + 23.841458, + 23.841822, + 23.842184, + 23.842545, + 23.842904, + 23.843263, + 23.843620, + 23.843976, + 23.844331, + 23.844685, + 23.845037, + 23.845388, + 23.845738, + 23.846087, + 23.846435, + 23.846781, + 23.847126, + 23.847471, + 23.847813, + 23.848155, + 23.848496, + 23.848835, + 23.849174, + 23.849511, + 23.849847, + 23.850182, + 23.850516, + 23.850849, + 23.851181, + 23.851511, + 23.851841, + 23.852169, + 23.852496, + 23.852822, + 23.853147, + 23.853471, + 23.853794, + 23.854116, + 23.854437, + 23.854757, + 23.855076, + 23.855393, + 23.855710, + 23.856026, + 23.856340, + 23.856654, + 23.856966, + 23.857278, + 23.857588, + 23.857898, + 23.858206, + 23.858513, + 23.858820, + 23.859125, + 23.859430, + 23.859733, + 23.860036, + 23.860337, + 23.860638, + 23.860937, + 23.861236, + 23.861534, + 23.861830, + 23.862126, + 23.862421, + 23.862715, + 23.863008, + 23.863300, + 23.863591, + 23.863881, + 23.864170, + 23.864458, + 23.864746, + 23.865032, + 23.865318, + 23.865602, + 23.865886, + 23.866169, + 23.866451, + 23.866732, + 23.867012, + 23.867291, + 23.867570, + 23.867847, + 23.868124, + 23.868400, + 23.868675, + 23.868949, + 23.869222, + 23.869494, + 23.869766, + 23.870037, + 23.870306, + 23.870575, + 23.870844, + 23.871111, + 23.871377, + 23.871643, + 23.871908, + 23.872172, + 23.872435, + 23.872697, + 23.872959, + 23.873220, + 23.873480, + 23.873739, + 23.873997, + 23.874255, + 23.874512, + 23.874768, + 23.875023, + 23.875278, + 23.875531, + 23.875784, + 23.876036, + 23.876288, + 23.876538, + 23.876788, + 23.877037, + 23.877286, + 23.877533, + 23.877780, + 23.878026, + 23.878272, + 23.878516, + 23.878760, + 23.879003, + 23.879246, + 23.879487, + 23.879728, + 23.879968, + 23.880208, + }, + {// The expectations for dimension = 49 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526666, + 3.681665, + 3.839997, + 4.001661, + 4.166656, + 4.334981, + 4.506632, + 4.681606, + 4.859896, + 5.041493, + 5.226383, + 5.414545, + 5.605953, + 5.800568, + 5.998341, + 6.199207, + 6.403084, + 6.609871, + 6.819443, + 7.031651, + 7.246322, + 7.463257, + 7.682229, + 7.902990, + 8.125268, + 8.348771, + 8.573195, + 8.798220, + 9.023525, + 9.248783, + 9.473672, + 9.697879, + 9.921100, + 10.143047, + 10.363452, + 10.582064, + 10.798656, + 11.013021, + 11.224977, + 11.434363, + 11.641039, + 11.844886, + 12.045805, + 12.243714, + 12.438548, + 12.630258, + 12.818806, + 13.004168, + 13.186332, + 13.365292, + 13.541054, + 13.713630, + 13.883037, + 14.049301, + 14.212450, + 14.372517, + 14.529539, + 14.683555, + 14.834608, + 14.982741, + 15.128002, + 15.270436, + 15.410093, + 15.547022, + 15.681272, + 15.812893, + 15.941937, + 16.068453, + 16.192491, + 16.314102, + 16.433335, + 16.550239, + 16.664864, + 16.777257, + 16.887466, + 16.995539, + 17.101520, + 17.205457, + 17.307392, + 17.407372, + 17.505437, + 17.601632, + 17.695996, + 17.788572, + 17.879398, + 17.968515, + 18.055958, + 18.141767, + 18.225978, + 18.308626, + 18.389746, + 18.469372, + 18.547538, + 18.624276, + 18.699617, + 18.773594, + 18.846235, + 18.917571, + 18.987630, + 19.056441, + 19.124031, + 19.190426, + 19.255654, + 19.319739, + 19.382706, + 19.444580, + 19.505385, + 19.565142, + 19.623876, + 19.681608, + 19.738360, + 19.794151, + 19.849004, + 19.902937, + 19.955971, + 20.008123, + 20.059414, + 20.109860, + 20.159479, + 20.208289, + 20.256306, + 20.303547, + 20.350028, + 20.395763, + 20.440769, + 20.485061, + 20.528652, + 20.571557, + 20.613789, + 20.655363, + 20.696291, + 20.736587, + 20.776262, + 20.815329, + 20.853800, + 20.891687, + 20.929000, + 20.965752, + 21.001953, + 21.037613, + 21.072744, + 21.107355, + 21.141456, + 21.175057, + 21.208167, + 21.240795, + 21.272952, + 21.304644, + 21.335882, + 21.366673, + 21.397027, + 21.426950, + 21.456450, + 21.485536, + 21.514216, + 21.542495, + 21.570382, + 21.597884, + 21.625008, + 21.651760, + 21.678147, + 21.704175, + 21.729851, + 21.755181, + 21.780171, + 21.804827, + 21.829155, + 21.853161, + 21.876849, + 21.900226, + 21.923297, + 21.946066, + 21.968540, + 21.990724, + 22.012621, + 22.034237, + 22.055577, + 22.076645, + 22.097445, + 22.117983, + 22.138262, + 22.158288, + 22.178063, + 22.197592, + 22.216879, + 22.235927, + 22.254742, + 22.273326, + 22.291684, + 22.309818, + 22.327733, + 22.345431, + 22.362917, + 22.380193, + 22.397264, + 22.414131, + 22.430799, + 22.447270, + 22.463547, + 22.479634, + 22.495534, + 22.511248, + 22.526781, + 22.542134, + 22.557311, + 22.572314, + 22.587145, + 22.601808, + 22.616305, + 22.630639, + 22.644811, + 22.658824, + 22.672680, + 22.686382, + 22.699933, + 22.713333, + 22.726586, + 22.739694, + 22.752658, + 22.765481, + 22.778164, + 22.790711, + 22.803122, + 22.815399, + 22.827545, + 22.839562, + 22.851450, + 22.863213, + 22.874851, + 22.886366, + 22.897761, + 22.909036, + 22.920194, + 22.931236, + 22.942164, + 22.952978, + 22.963682, + 22.974275, + 22.984761, + 22.995139, + 23.005413, + 23.015582, + 23.025648, + 23.035614, + 23.045479, + 23.055246, + 23.064916, + 23.074489, + 23.083968, + 23.093353, + 23.102646, + 23.111848, + 23.120960, + 23.129984, + 23.138919, + 23.147768, + 23.156532, + 23.165211, + 23.173808, + 23.182322, + 23.190754, + 23.199107, + 23.207381, + 23.215576, + 23.223694, + 23.231737, + 23.239703, + 23.247596, + 23.255415, + 23.263161, + 23.270836, + 23.278441, + 23.285975, + 23.293440, + 23.300837, + 23.308167, + 23.315430, + 23.322627, + 23.329759, + 23.336827, + 23.343832, + 23.350774, + 23.357654, + 23.364473, + 23.371231, + 23.377929, + 23.384569, + 23.391150, + 23.397673, + 23.404139, + 23.410549, + 23.416903, + 23.423201, + 23.429446, + 23.435636, + 23.441774, + 23.447858, + 23.453891, + 23.459872, + 23.465802, + 23.471682, + 23.477512, + 23.483293, + 23.489026, + 23.494710, + 23.500347, + 23.505937, + 23.511480, + 23.516977, + 23.522429, + 23.527836, + 23.533198, + 23.538516, + 23.543791, + 23.549022, + 23.554211, + 23.559358, + 23.564463, + 23.569527, + 23.574550, + 23.579533, + 23.584476, + 23.589379, + 23.594243, + 23.599068, + 23.603855, + 23.608605, + 23.613317, + 23.617991, + 23.622629, + 23.627231, + 23.631797, + 23.636327, + 23.640822, + 23.645282, + 23.649708, + 23.654099, + 23.658457, + 23.662781, + 23.667072, + 23.671330, + 23.675556, + 23.679750, + 23.683912, + 23.688043, + 23.692142, + 23.696211, + 23.700249, + 23.704257, + 23.708235, + 23.712183, + 23.716102, + 23.719992, + 23.723853, + 23.727685, + 23.731490, + 23.735266, + 23.739015, + 23.742736, + 23.746431, + 23.750098, + 23.753739, + 23.757353, + 23.760942, + 23.764504, + 23.768041, + 23.771553, + 23.775039, + 23.778501, + 23.781938, + 23.785350, + 23.788739, + 23.792103, + 23.795444, + 23.798761, + 23.802055, + 23.805325, + 23.808573, + 23.811799, + 23.815001, + 23.818182, + 23.821341, + 23.824477, + 23.827592, + 23.830686, + 23.833759, + 23.836810, + 23.839841, + 23.842851, + 23.845840, + 23.848809, + 23.851758, + 23.854687, + 23.857597, + 23.860487, + 23.863357, + 23.866208, + 23.869040, + 23.871854, + 23.874648, + 23.877424, + 23.880182, + 23.882921, + 23.885643, + 23.888346, + 23.891032, + 23.893700, + 23.896351, + 23.898984, + 23.901600, + 23.904199, + 23.906782, + 23.909347, + 23.911897, + 23.914429, + 23.916946, + 23.919446, + 23.921930, + 23.924399, + 23.926851, + 23.929288, + 23.931710, + 23.934116, + 23.936507, + 23.938883, + 23.941244, + 23.943590, + 23.945922, + 23.948239, + 23.950541, + 23.952829, + 23.955103, + 23.957363, + 23.959609, + 23.961841, + 23.964059, + 23.966263, + 23.968454, + 23.970632, + 23.972796, + 23.974947, + 23.977085, + 23.979210, + 23.981322, + 23.983421, + 23.985508, + 23.987582, + 23.989643, + 23.991692, + 23.993729, + 23.995753, + 23.997766, + 23.999766, + 24.001755, + 24.003732, + 24.005697, + 24.007651, + 24.009592, + 24.011523, + 24.013442, + 24.015350, + 24.017247, + 24.019132, + 24.021007, + 24.022871, + 24.024724, + 24.026566, + 24.028397, + 24.030218, + 24.032029, + 24.033829, + 24.035618, + 24.037398, + 24.039167, + 24.040926, + 24.042675, + 24.044414, + 24.046143, + 24.047863, + 24.049572, + 24.051272, + 24.052963, + 24.054644, + 24.056315, + 24.057977, + 24.059630, + 24.061274, + 24.062908, + 24.064534, + 24.066150, + 24.067757, + 24.069356, + 24.070945, + 24.072526, + 24.074098, + 24.075662, + 24.077217, + 24.078763, + 24.080301, + 24.081830, + 24.083352, + 24.084865, + 24.086369, + 24.087866, + 24.089354, + 24.090835, + 24.092307, + 24.093772, + 24.095229, + 24.096678, + 24.098119, + 24.099552, + 24.100978, + 24.102396, + 24.103807, + 24.105210, + 24.106606, + 24.107995, + 24.109376, + 24.110749, + 24.112116, + 24.113476, + 24.114828, + 24.116173, + 24.117511, + 24.118843, + 24.120167, + 24.121484, + 24.122795, + 24.124099, + 24.125396, + 24.126686, + 24.127970, + 24.129247, + 24.130518, + 24.131782, + 24.133040, + 24.134291, + 24.135536, + 24.136774, + 24.138006, + 24.139232, + 24.140452, + 24.141666, + 24.142873, + 24.144075, + 24.145270, + 24.146459, + 24.147643, + 24.148820, + 24.149992, + 24.151157, + 24.152317, + 24.153472, + 24.154620, + 24.155763, + 24.156900, + 24.158031, + 24.159157, + 24.160278, + 24.161392, + 24.162502, + 24.163606, + 24.164704, + 24.165797, + 24.166885, + 24.167968, + 24.169045, + 24.170117, + 24.171184, + 24.172246, + 24.173303, + 24.174354, + 24.175400, + 24.176442, + 24.177478, + 24.178510, + 24.179536, + 24.180558, + 24.181575, + 24.182587, + 24.183594, + 24.184596, + 24.185594, + 24.186586, + 24.187575, + 24.188558, + 24.189537, + 24.190511, + 24.191481, + 24.192446, + 24.193407, + 24.194363, + 24.195315, + 24.196262, + 24.197205, + 24.198143, + 24.199078, + 24.200007, + 24.200933, + 24.201854, + 24.202771, + 24.203684, + 24.204593, + 24.205497, + 24.206397, + 24.207293, + 24.208186, + 24.209074, + 24.209958, + 24.210837, + 24.211713, + 24.212585, + 24.213454, + 24.214318, + 24.215178, + 24.216034, + 24.216887, + 24.217735, + 24.218580, + 24.219421, + 24.220259, + 24.221092, + 24.221922, + 24.222748, + 24.223571, + 24.224390, + 24.225205, + 24.226017, + 24.226825, + 24.227629, + 24.228430, + 24.229227, + 24.230021, + 24.230812, + 24.231599, + 24.232382, + 24.233162, + 24.233939, + 24.234712, + 24.235482, + 24.236249, + 24.237012, + 24.237772, + 24.238529, + 24.239282, + 24.240033, + 24.240780, + 24.241523, + 24.242264, + 24.243001, + 24.243735, + 24.244467, + 24.245195, + 24.245919, + 24.246641, + 24.247360, + 24.248076, + 24.248788, + 24.249498, + 24.250204, + 24.250908, + 24.251609, + 24.252306, + 24.253001, + 24.253693, + 24.254382, + 24.255068, + 24.255751, + 24.256432, + 24.257109, + 24.257784, + 24.258456, + 24.259125, + 24.259791, + 24.260455, + 24.261116, + 24.261774, + 24.262429, + 24.263082, + 24.263732, + 24.264379, + 24.265024, + 24.265666, + 24.266306, + 24.266942, + 24.267577, + 24.268208, + 24.268837, + 24.269464, + 24.270088, + 24.270709, + 24.271328, + 24.271945, + 24.272559, + 24.273170, + 24.273779, + 24.274386, + 24.274990, + 24.275592, + 24.276191, + 24.276788, + 24.277382, + 24.277975, + 24.278564, + 24.279152, + 24.279737, + 24.280320, + 24.280900, + 24.281478, + 24.282054, + 24.282628, + 24.283199, + 24.283769, + 24.284335, + 24.284900, + 24.285463, + 24.286023, + 24.286581, + 24.287137, + 24.287691, + 24.288242, + 24.288792, + 24.289339, + 24.289884, + 24.290427, + 24.290968, + 24.291507, + 24.292044, + 24.292579, + 24.293111, + 24.293642, + 24.294170, + 24.294697, + 24.295222, + 24.295744, + 24.296265, + 24.296783, + 24.297300, + 24.297814, + 24.298327, + 24.298838, + 24.299347, + 24.299853, + 24.300358, + 24.300861, + 24.301363, + 24.301862, + 24.302359, + 24.302855, + 24.303348, + 24.303840, + 24.304330, + 24.304818, + 24.305305, + 24.305789, + 24.306272, + 24.306753, + 24.307232, + 24.307709, + 24.308185, + 24.308658, + 24.309130, + 24.309601, + 24.310069, + 24.310536, + 24.311001, + 24.311465, + 24.311926, + 24.312386, + 24.312845, + 24.313301, + 24.313756, + 24.314210, + 24.314661, + 24.315111, + 24.315560, + 24.316007, + 24.316452, + 24.316895, + 24.317337, + 24.317778, + 24.318216, + 24.318653, + 24.319089, + 24.319523, + 24.319956, + 24.320386, + 24.320816, + 24.321244, + 24.321670, + 24.322095, + 24.322518, + 24.322940, + 24.323360, + 24.323779, + 24.324196, + 24.324612, + 24.325026, + 24.325439, + 24.325851, + 24.326260, + 24.326669, + 24.327076, + 24.327482, + 24.327886, + 24.328289, + 24.328690, + 24.329090, + 24.329489, + 24.329886, + 24.330282, + 24.330676, + 24.331069, + 24.331461, + 24.331851, + 24.332240, + 24.332628, + 24.333014, + 24.333399, + 24.333783, + 24.334165, + 24.334546, + 24.334926, + 24.335304, + 24.335681, + 24.336057, + 24.336431, + 24.336805, + 24.337177, + 24.337547, + 24.337917, + 24.338285, + 24.338652, + 24.339017, + 24.339382, + 24.339745, + 24.340107, + 24.340468, + 24.340827, + 24.341185, + 24.341543, + 24.341898, + 24.342253, + 24.342607, + 24.342959, + 24.343310, + 24.343660, + 24.344009, + 24.344356, + 24.344703, + 24.345048, + 24.345392, + 24.345735, + 24.346077, + 24.346418, + 24.346758, + 24.347096, + 24.347433, + 24.347770, + 24.348105, + 24.348439, + 24.348772, + 24.349104, + 24.349434, + 24.349764, + 24.350093, + 24.350420, + 24.350747, + 24.351072, + 24.351396, + 24.351719, + 24.352042, + 24.352363, + 24.352683, + 24.353002, + 24.353320, + 24.353637, + 24.353953, + 24.354268, + 24.354582, + 24.354895, + 24.355207, + 24.355518, + 24.355828, + 24.356136, + 24.356444, + 24.356751, + 24.357057, + 24.357362, + 24.357666, + 24.357969, + 24.358271, + 24.358572, + 24.358873, + 24.359172, + 24.359470, + 24.359767, + 24.360064, + 24.360359, + 24.360654, + 24.360947, + 24.361240, + 24.361531, + 24.361822, + 24.362112, + 24.362401, + 24.362689, + 24.362976, + 24.363263, + 24.363548, + 24.363832, + 24.364116, + 24.364399, + 24.364680, + 24.364961, + 24.365241, + 24.365521, + 24.365799, + 24.366076, + 24.366353, + 24.366629, + 24.366904, + 24.367178, + 24.367451, + 24.367723, + 24.367995, + 24.368266, + 24.368535, + 24.368804, + 24.369073, + 24.369340, + 24.369607, + 24.369872, + 24.370137, + 24.370401, + 24.370665, + 24.370927, + 24.371189, + 24.371450, + 24.371710, + 24.371969, + 24.372228, + 24.372486, + 24.372743, + 24.372999, + 24.373255, + 24.373509, + 24.373763, + 24.374016, + 24.374269, + 24.374520, + 24.374771, + 24.375021, + 24.375271, + }, + {// The expectations for dimension = 50 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526666, + 3.681666, + 3.839998, + 4.001663, + 4.166660, + 4.334988, + 4.506644, + 4.681626, + 4.859929, + 5.041547, + 5.226467, + 5.414676, + 5.606151, + 5.800862, + 5.998768, + 6.199817, + 6.403940, + 6.611049, + 6.821037, + 7.033775, + 7.249107, + 7.466854, + 7.686809, + 7.908742, + 8.132397, + 8.357499, + 8.583752, + 8.810848, + 9.038468, + 9.266289, + 9.493985, + 9.721238, + 9.947735, + 10.173178, + 10.397284, + 10.619787, + 10.840444, + 11.059032, + 11.275350, + 11.489220, + 11.700486, + 11.909013, + 12.114687, + 12.317411, + 12.517107, + 12.713713, + 12.907181, + 13.097477, + 13.284578, + 13.468471, + 13.649155, + 13.826634, + 14.000921, + 14.172035, + 14.340000, + 14.504845, + 14.666604, + 14.825313, + 14.981011, + 15.133741, + 15.283545, + 15.430471, + 15.574565, + 15.715875, + 15.854450, + 15.990339, + 16.123592, + 16.254259, + 16.382390, + 16.508035, + 16.631243, + 16.752065, + 16.870548, + 16.986742, + 17.100694, + 17.212452, + 17.322063, + 17.429571, + 17.535024, + 17.638464, + 17.739936, + 17.839483, + 17.937148, + 18.032970, + 18.126991, + 18.219251, + 18.309788, + 18.398641, + 18.485846, + 18.571441, + 18.655460, + 18.737938, + 18.818911, + 18.898410, + 18.976468, + 19.053118, + 19.128389, + 19.202313, + 19.274919, + 19.346236, + 19.416291, + 19.485114, + 19.552729, + 19.619164, + 19.684444, + 19.748595, + 19.811639, + 19.873602, + 19.934507, + 19.994375, + 20.053229, + 20.111091, + 20.167982, + 20.223922, + 20.278931, + 20.333028, + 20.386234, + 20.438566, + 20.490042, + 20.540681, + 20.590499, + 20.639514, + 20.687742, + 20.735198, + 20.781899, + 20.827860, + 20.873096, + 20.917622, + 20.961451, + 21.004598, + 21.047076, + 21.088899, + 21.130079, + 21.170630, + 21.210562, + 21.249890, + 21.288623, + 21.326775, + 21.364356, + 21.401376, + 21.437848, + 21.473781, + 21.509185, + 21.544071, + 21.578449, + 21.612327, + 21.645716, + 21.678624, + 21.711060, + 21.743033, + 21.774553, + 21.805626, + 21.836261, + 21.866467, + 21.896250, + 21.925619, + 21.954581, + 21.983144, + 22.011314, + 22.039098, + 22.066505, + 22.093539, + 22.120207, + 22.146517, + 22.172474, + 22.198085, + 22.223355, + 22.248291, + 22.272898, + 22.297181, + 22.321147, + 22.344801, + 22.368147, + 22.391192, + 22.413940, + 22.436397, + 22.458566, + 22.480454, + 22.502064, + 22.523402, + 22.544471, + 22.565276, + 22.585822, + 22.606113, + 22.626152, + 22.645944, + 22.665493, + 22.684803, + 22.703877, + 22.722720, + 22.741335, + 22.759725, + 22.777895, + 22.795847, + 22.813585, + 22.831113, + 22.848433, + 22.865549, + 22.882464, + 22.899182, + 22.915704, + 22.932035, + 22.948176, + 22.964132, + 22.979904, + 22.995496, + 23.010910, + 23.026148, + 23.041215, + 23.056111, + 23.070840, + 23.085404, + 23.099805, + 23.114046, + 23.128129, + 23.142057, + 23.155831, + 23.169455, + 23.182929, + 23.196257, + 23.209440, + 23.222481, + 23.235380, + 23.248142, + 23.260766, + 23.273257, + 23.285614, + 23.297840, + 23.309937, + 23.321907, + 23.333751, + 23.345472, + 23.357070, + 23.368548, + 23.379907, + 23.391149, + 23.402275, + 23.413287, + 23.424187, + 23.434976, + 23.445655, + 23.456226, + 23.466691, + 23.477050, + 23.487306, + 23.497459, + 23.507511, + 23.517463, + 23.527317, + 23.537074, + 23.546735, + 23.556301, + 23.565774, + 23.575155, + 23.584444, + 23.593644, + 23.602755, + 23.611778, + 23.620715, + 23.629567, + 23.638334, + 23.647018, + 23.655620, + 23.664140, + 23.672580, + 23.680941, + 23.689224, + 23.697430, + 23.705559, + 23.713613, + 23.721593, + 23.729499, + 23.737332, + 23.745094, + 23.752785, + 23.760405, + 23.767957, + 23.775440, + 23.782856, + 23.790205, + 23.797488, + 23.804706, + 23.811859, + 23.818949, + 23.825976, + 23.832941, + 23.839844, + 23.846686, + 23.853469, + 23.860192, + 23.866857, + 23.873464, + 23.880013, + 23.886506, + 23.892943, + 23.899325, + 23.905651, + 23.911924, + 23.918143, + 23.924310, + 23.930424, + 23.936486, + 23.942498, + 23.948458, + 23.954369, + 23.960230, + 23.966043, + 23.971807, + 23.977523, + 23.983192, + 23.988814, + 23.994390, + 23.999920, + 24.005405, + 24.010845, + 24.016241, + 24.021593, + 24.026902, + 24.032168, + 24.037391, + 24.042573, + 24.047712, + 24.052811, + 24.057869, + 24.062887, + 24.067865, + 24.072804, + 24.077704, + 24.082565, + 24.087388, + 24.092174, + 24.096922, + 24.101633, + 24.106307, + 24.110945, + 24.115548, + 24.120114, + 24.124646, + 24.129143, + 24.133606, + 24.138034, + 24.142429, + 24.146790, + 24.151118, + 24.155414, + 24.159677, + 24.163908, + 24.168108, + 24.172276, + 24.176412, + 24.180519, + 24.184594, + 24.188639, + 24.192655, + 24.196641, + 24.200597, + 24.204525, + 24.208423, + 24.212293, + 24.216135, + 24.219949, + 24.223736, + 24.227495, + 24.231227, + 24.234932, + 24.238610, + 24.242262, + 24.245888, + 24.249488, + 24.253062, + 24.256612, + 24.260135, + 24.263634, + 24.267109, + 24.270559, + 24.273984, + 24.277386, + 24.280764, + 24.284118, + 24.287449, + 24.290757, + 24.294042, + 24.297304, + 24.300544, + 24.303762, + 24.306957, + 24.310131, + 24.313283, + 24.316413, + 24.319522, + 24.322610, + 24.325678, + 24.328724, + 24.331750, + 24.334756, + 24.337741, + 24.340706, + 24.343652, + 24.346578, + 24.349485, + 24.352372, + 24.355240, + 24.358089, + 24.360919, + 24.363731, + 24.366524, + 24.369299, + 24.372056, + 24.374795, + 24.377516, + 24.380220, + 24.382905, + 24.385574, + 24.388225, + 24.390859, + 24.393477, + 24.396077, + 24.398661, + 24.401228, + 24.403779, + 24.406314, + 24.408833, + 24.411336, + 24.413823, + 24.416294, + 24.418750, + 24.421190, + 24.423615, + 24.426025, + 24.428419, + 24.430799, + 24.433164, + 24.435515, + 24.437851, + 24.440172, + 24.442479, + 24.444772, + 24.447051, + 24.449316, + 24.451567, + 24.453804, + 24.456028, + 24.458238, + 24.460435, + 24.462618, + 24.464788, + 24.466945, + 24.469090, + 24.471221, + 24.473339, + 24.475445, + 24.477539, + 24.479619, + 24.481688, + 24.483744, + 24.485788, + 24.487820, + 24.489840, + 24.491848, + 24.493844, + 24.495828, + 24.497801, + 24.499763, + 24.501713, + 24.503651, + 24.505578, + 24.507495, + 24.509400, + 24.511294, + 24.513177, + 24.515049, + 24.516910, + 24.518761, + 24.520601, + 24.522431, + 24.524250, + 24.526059, + 24.527858, + 24.529647, + 24.531425, + 24.533193, + 24.534952, + 24.536700, + 24.538439, + 24.540167, + 24.541887, + 24.543596, + 24.545296, + 24.546987, + 24.548668, + 24.550340, + 24.552003, + 24.553656, + 24.555300, + 24.556936, + 24.558562, + 24.560179, + 24.561788, + 24.563388, + 24.564979, + 24.566561, + 24.568135, + 24.569700, + 24.571257, + 24.572805, + 24.574345, + 24.575877, + 24.577400, + 24.578915, + 24.580423, + 24.581922, + 24.583413, + 24.584896, + 24.586371, + 24.587839, + 24.589298, + 24.590750, + 24.592194, + 24.593631, + 24.595060, + 24.596482, + 24.597896, + 24.599302, + 24.600702, + 24.602094, + 24.603478, + 24.604856, + 24.606226, + 24.607590, + 24.608946, + 24.610295, + 24.611637, + 24.612973, + 24.614301, + 24.615623, + 24.616938, + 24.618246, + 24.619548, + 24.620843, + 24.622131, + 24.623413, + 24.624688, + 24.625957, + 24.627219, + 24.628475, + 24.629725, + 24.630968, + 24.632206, + 24.633436, + 24.634661, + 24.635880, + 24.637093, + 24.638299, + 24.639500, + 24.640694, + 24.641883, + 24.643066, + 24.644243, + 24.645414, + 24.646580, + 24.647739, + 24.648893, + 24.650042, + 24.651184, + 24.652322, + 24.653453, + 24.654579, + 24.655700, + 24.656815, + 24.657925, + 24.659029, + 24.660129, + 24.661222, + 24.662311, + 24.663394, + 24.664472, + 24.665545, + 24.666613, + 24.667676, + 24.668734, + 24.669786, + 24.670834, + 24.671876, + 24.672914, + 24.673947, + 24.674975, + 24.675998, + 24.677016, + 24.678030, + 24.679039, + 24.680043, + 24.681042, + 24.682037, + 24.683027, + 24.684012, + 24.684993, + 24.685969, + 24.686941, + 24.687908, + 24.688871, + 24.689829, + 24.690783, + 24.691733, + 24.692678, + 24.693619, + 24.694555, + 24.695487, + 24.696415, + 24.697339, + 24.698259, + 24.699174, + 24.700085, + 24.700992, + 24.701895, + 24.702794, + 24.703689, + 24.704580, + 24.705467, + 24.706350, + 24.707229, + 24.708103, + 24.708975, + 24.709842, + 24.710705, + 24.711564, + 24.712420, + 24.713272, + 24.714120, + 24.714964, + 24.715805, + 24.716642, + 24.717475, + 24.718304, + 24.719130, + 24.719953, + 24.720771, + 24.721586, + 24.722398, + 24.723206, + 24.724010, + 24.724811, + 24.725609, + 24.726403, + 24.727193, + 24.727980, + 24.728764, + 24.729545, + 24.730322, + 24.731095, + 24.731866, + 24.732633, + 24.733397, + 24.734157, + 24.734914, + 24.735668, + 24.736419, + 24.737167, + 24.737911, + 24.738653, + 24.739391, + 24.740126, + 24.740858, + 24.741587, + 24.742313, + 24.743035, + 24.743755, + 24.744472, + 24.745186, + 24.745896, + 24.746604, + 24.747309, + 24.748011, + 24.748710, + 24.749406, + 24.750099, + 24.750789, + 24.751477, + 24.752162, + 24.752843, + 24.753522, + 24.754199, + 24.754872, + 24.755543, + 24.756211, + 24.756876, + 24.757538, + 24.758198, + 24.758855, + 24.759510, + 24.760161, + 24.760810, + 24.761457, + 24.762101, + 24.762742, + 24.763381, + 24.764017, + 24.764650, + 24.765281, + 24.765910, + 24.766536, + 24.767159, + 24.767780, + 24.768399, + 24.769015, + 24.769628, + 24.770240, + 24.770848, + 24.771455, + 24.772058, + 24.772660, + 24.773259, + 24.773856, + 24.774450, + 24.775042, + 24.775632, + 24.776220, + 24.776805, + 24.777388, + 24.777968, + 24.778546, + 24.779123, + 24.779696, + 24.780268, + 24.780837, + 24.781404, + 24.781969, + 24.782532, + 24.783093, + 24.783651, + 24.784207, + 24.784762, + 24.785314, + 24.785863, + 24.786411, + 24.786957, + 24.787501, + 24.788042, + 24.788582, + 24.789119, + 24.789654, + 24.790188, + 24.790719, + 24.791248, + 24.791776, + 24.792301, + 24.792824, + 24.793345, + 24.793865, + 24.794382, + 24.794898, + 24.795411, + 24.795923, + 24.796433, + 24.796940, + 24.797446, + 24.797950, + 24.798452, + 24.798953, + 24.799451, + 24.799948, + 24.800442, + 24.800935, + 24.801426, + 24.801916, + 24.802403, + 24.802889, + 24.803373, + 24.803855, + 24.804335, + 24.804814, + 24.805290, + 24.805765, + 24.806239, + 24.806710, + 24.807180, + 24.807648, + 24.808115, + 24.808580, + 24.809043, + 24.809504, + 24.809964, + 24.810422, + 24.810878, + 24.811333, + 24.811786, + 24.812238, + 24.812688, + 24.813136, + 24.813583, + 24.814028, + 24.814471, + 24.814913, + 24.815354, + 24.815792, + 24.816230, + 24.816665, + 24.817099, + 24.817532, + 24.817963, + 24.818393, + 24.818821, + 24.819247, + 24.819672, + 24.820095, + 24.820517, + 24.820938, + 24.821357, + 24.821775, + 24.822191, + 24.822605, + 24.823019, + 24.823430, + 24.823841, + 24.824250, + 24.824657, + 24.825063, + 24.825468, + 24.825871, + 24.826273, + 24.826673, + 24.827073, + 24.827470, + 24.827867, + 24.828262, + 24.828655, + 24.829048, + 24.829438, + 24.829828, + 24.830216, + 24.830603, + 24.830989, + 24.831373, + 24.831756, + 24.832138, + 24.832518, + 24.832897, + 24.833275, + 24.833652, + 24.834027, + 24.834401, + 24.834774, + 24.835145, + 24.835516, + 24.835885, + 24.836252, + 24.836619, + 24.836984, + 24.837348, + 24.837711, + 24.838073, + 24.838433, + 24.838792, + 24.839150, + 24.839507, + 24.839863, + 24.840217, + 24.840571, + 24.840923, + 24.841274, + 24.841624, + 24.841972, + 24.842320, + 24.842666, + 24.843011, + 24.843355, + 24.843698, + 24.844040, + 24.844381, + 24.844720, + 24.845059, + 24.845396, + 24.845733, + 24.846068, + 24.846402, + 24.846735, + 24.847067, + 24.847398, + 24.847728, + 24.848056, + 24.848384, + 24.848711, + 24.849036, + 24.849361, + 24.849684, + 24.850006, + 24.850328, + 24.850648, + 24.850967, + 24.851286, + 24.851603, + 24.851919, + 24.852235, + 24.852549, + 24.852862, + 24.853174, + 24.853486, + 24.853796, + 24.854105, + 24.854413, + 24.854721, + 24.855027, + 24.855333, + 24.855637, + 24.855940, + 24.856243, + 24.856545, + 24.856845, + 24.857145, + 24.857444, + 24.857741, + 24.858038, + 24.858334, + 24.858629, + 24.858923, + 24.859216, + 24.859509, + 24.859800, + 24.860091, + 24.860380, + 24.860669, + 24.860957, + 24.861243, + 24.861529, + 24.861815, + 24.862099, + 24.862382, + 24.862665, + 24.862946, + 24.863227, + 24.863507, + 24.863786, + 24.864064, + 24.864341, + 24.864618, + 24.864893, + 24.865168, + 24.865442, + 24.865715, + 24.865988, + 24.866259, + 24.866530, + 24.866800, + 24.867069, + 24.867337, + 24.867604, + 24.867871, + 24.868136, + 24.868401, + 24.868666, + 24.868929, + 24.869192, + 24.869453, + 24.869714, + 24.869975, + 24.870234, + }, + {// The expectations for dimension = 51 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526666, + 3.681666, + 3.839999, + 4.001665, + 4.166662, + 4.334992, + 4.506652, + 4.681640, + 4.859952, + 5.041584, + 5.226528, + 5.414771, + 5.606296, + 5.801081, + 5.999091, + 6.200284, + 6.404603, + 6.611973, + 6.822304, + 7.035481, + 7.251370, + 7.469807, + 7.690608, + 7.913560, + 8.138425, + 8.364944, + 8.592835, + 8.821800, + 9.051530, + 9.281702, + 9.511994, + 9.742083, + 9.971651, + 10.200389, + 10.428004, + 10.654216, + 10.878767, + 11.101416, + 11.321947, + 11.540165, + 11.755897, + 11.968991, + 12.179317, + 12.386765, + 12.591242, + 12.792673, + 12.990998, + 13.186174, + 13.378166, + 13.566954, + 13.752527, + 13.934883, + 14.114029, + 14.289979, + 14.462750, + 14.632368, + 14.798862, + 14.962265, + 15.122614, + 15.279948, + 15.434308, + 15.585739, + 15.734286, + 15.879995, + 16.022915, + 16.163093, + 16.300580, + 16.435423, + 16.567673, + 16.697380, + 16.824593, + 16.949361, + 17.071733, + 17.191759, + 17.309486, + 17.424962, + 17.538234, + 17.649348, + 17.758351, + 17.865286, + 17.970200, + 18.073134, + 18.174132, + 18.273237, + 18.370488, + 18.465926, + 18.559592, + 18.651523, + 18.741758, + 18.830334, + 18.917287, + 19.002653, + 19.086466, + 19.168761, + 19.249570, + 19.328927, + 19.406863, + 19.483409, + 19.558595, + 19.632451, + 19.705006, + 19.776287, + 19.846323, + 19.915140, + 19.982765, + 20.049224, + 20.114540, + 20.178739, + 20.241845, + 20.303880, + 20.364868, + 20.424830, + 20.483788, + 20.541764, + 20.598778, + 20.654849, + 20.709999, + 20.764245, + 20.817606, + 20.870101, + 20.921748, + 20.972564, + 21.022565, + 21.071769, + 21.120191, + 21.167848, + 21.214755, + 21.260926, + 21.306377, + 21.351122, + 21.395175, + 21.438549, + 21.481258, + 21.523316, + 21.564734, + 21.605525, + 21.645702, + 21.685276, + 21.724259, + 21.762662, + 21.800496, + 21.837772, + 21.874502, + 21.910694, + 21.946359, + 21.981508, + 22.016149, + 22.050293, + 22.083948, + 22.117123, + 22.149828, + 22.182070, + 22.213859, + 22.245203, + 22.276109, + 22.306586, + 22.336642, + 22.366283, + 22.395517, + 22.424352, + 22.452795, + 22.480852, + 22.508530, + 22.535837, + 22.562777, + 22.589359, + 22.615588, + 22.641469, + 22.667010, + 22.692216, + 22.717093, + 22.741645, + 22.765880, + 22.789802, + 22.813416, + 22.836727, + 22.859741, + 22.882463, + 22.904897, + 22.927048, + 22.948921, + 22.970521, + 22.991851, + 23.012916, + 23.033721, + 23.054269, + 23.074566, + 23.094614, + 23.114418, + 23.133982, + 23.153309, + 23.172404, + 23.191269, + 23.209909, + 23.228327, + 23.246527, + 23.264511, + 23.282284, + 23.299848, + 23.317207, + 23.334364, + 23.351322, + 23.368083, + 23.384652, + 23.401030, + 23.417222, + 23.433228, + 23.449053, + 23.464699, + 23.480169, + 23.495464, + 23.510589, + 23.525545, + 23.540334, + 23.554960, + 23.569425, + 23.583730, + 23.597879, + 23.611873, + 23.625715, + 23.639406, + 23.652950, + 23.666348, + 23.679602, + 23.692714, + 23.705686, + 23.718521, + 23.731219, + 23.743784, + 23.756216, + 23.768518, + 23.780692, + 23.792739, + 23.804661, + 23.816459, + 23.828136, + 23.839693, + 23.851131, + 23.862453, + 23.873659, + 23.884752, + 23.895733, + 23.906603, + 23.917364, + 23.928017, + 23.938563, + 23.949005, + 23.959343, + 23.969579, + 23.979715, + 23.989750, + 23.999688, + 24.009528, + 24.019273, + 24.028923, + 24.038480, + 24.047944, + 24.057318, + 24.066602, + 24.075797, + 24.084905, + 24.093926, + 24.102862, + 24.111714, + 24.120482, + 24.129168, + 24.137773, + 24.146297, + 24.154743, + 24.163110, + 24.171400, + 24.179614, + 24.187752, + 24.195815, + 24.203805, + 24.211723, + 24.219568, + 24.227343, + 24.235047, + 24.242682, + 24.250249, + 24.257748, + 24.265180, + 24.272546, + 24.279846, + 24.287082, + 24.294255, + 24.301364, + 24.308411, + 24.315396, + 24.322321, + 24.329185, + 24.335990, + 24.342736, + 24.349424, + 24.356054, + 24.362628, + 24.369145, + 24.375607, + 24.382014, + 24.388367, + 24.394665, + 24.400911, + 24.407105, + 24.413246, + 24.419336, + 24.425376, + 24.431365, + 24.437304, + 24.443194, + 24.449036, + 24.454830, + 24.460576, + 24.466275, + 24.471928, + 24.477534, + 24.483096, + 24.488612, + 24.494083, + 24.499511, + 24.504895, + 24.510235, + 24.515534, + 24.520790, + 24.526004, + 24.531176, + 24.536308, + 24.541400, + 24.546451, + 24.551463, + 24.556435, + 24.561369, + 24.566264, + 24.571121, + 24.575941, + 24.580723, + 24.585469, + 24.590178, + 24.594851, + 24.599488, + 24.604090, + 24.608657, + 24.613189, + 24.617686, + 24.622150, + 24.626580, + 24.630977, + 24.635341, + 24.639672, + 24.643971, + 24.648238, + 24.652473, + 24.656677, + 24.660849, + 24.664991, + 24.669103, + 24.673184, + 24.677235, + 24.681257, + 24.685250, + 24.689213, + 24.693148, + 24.697054, + 24.700933, + 24.704783, + 24.708605, + 24.712400, + 24.716168, + 24.719910, + 24.723624, + 24.727312, + 24.730974, + 24.734611, + 24.738221, + 24.741806, + 24.745366, + 24.748901, + 24.752412, + 24.755898, + 24.759359, + 24.762797, + 24.766211, + 24.769601, + 24.772968, + 24.776312, + 24.779633, + 24.782931, + 24.786206, + 24.789460, + 24.792691, + 24.795900, + 24.799088, + 24.802254, + 24.805398, + 24.808522, + 24.811624, + 24.814706, + 24.817768, + 24.820808, + 24.823829, + 24.826830, + 24.829810, + 24.832771, + 24.835713, + 24.838635, + 24.841538, + 24.844422, + 24.847287, + 24.850133, + 24.852961, + 24.855771, + 24.858562, + 24.861336, + 24.864091, + 24.866829, + 24.869549, + 24.872251, + 24.874937, + 24.877605, + 24.880256, + 24.882891, + 24.885508, + 24.888109, + 24.890694, + 24.893262, + 24.895815, + 24.898351, + 24.900871, + 24.903376, + 24.905864, + 24.908338, + 24.910796, + 24.913239, + 24.915666, + 24.918079, + 24.920477, + 24.922860, + 24.925228, + 24.927582, + 24.929922, + 24.932247, + 24.934558, + 24.936855, + 24.939138, + 24.941408, + 24.943663, + 24.945905, + 24.948134, + 24.950349, + 24.952551, + 24.954739, + 24.956915, + 24.959078, + 24.961227, + 24.963364, + 24.965489, + 24.967601, + 24.969700, + 24.971787, + 24.973862, + 24.975924, + 24.977975, + 24.980013, + 24.982040, + 24.984055, + 24.986058, + 24.988049, + 24.990029, + 24.991998, + 24.993955, + 24.995901, + 24.997836, + 24.999759, + 25.001672, + 25.003574, + 25.005465, + 25.007345, + 25.009214, + 25.011073, + 25.012921, + 25.014759, + 25.016587, + 25.018404, + 25.020211, + 25.022008, + 25.023795, + 25.025572, + 25.027339, + 25.029096, + 25.030843, + 25.032581, + 25.034309, + 25.036028, + 25.037737, + 25.039437, + 25.041127, + 25.042808, + 25.044480, + 25.046143, + 25.047796, + 25.049441, + 25.051077, + 25.052704, + 25.054322, + 25.055931, + 25.057531, + 25.059123, + 25.060707, + 25.062282, + 25.063848, + 25.065407, + 25.066956, + 25.068498, + 25.070031, + 25.071556, + 25.073074, + 25.074583, + 25.076084, + 25.077577, + 25.079062, + 25.080540, + 25.082010, + 25.083472, + 25.084926, + 25.086373, + 25.087812, + 25.089244, + 25.090669, + 25.092086, + 25.093495, + 25.094898, + 25.096293, + 25.097681, + 25.099062, + 25.100436, + 25.101802, + 25.103162, + 25.104515, + 25.105861, + 25.107200, + 25.108532, + 25.109858, + 25.111177, + 25.112489, + 25.113794, + 25.115093, + 25.116386, + 25.117672, + 25.118951, + 25.120224, + 25.121491, + 25.122751, + 25.124006, + 25.125253, + 25.126495, + 25.127731, + 25.128960, + 25.130184, + 25.131401, + 25.132612, + 25.133818, + 25.135017, + 25.136211, + 25.137399, + 25.138581, + 25.139757, + 25.140927, + 25.142092, + 25.143251, + 25.144405, + 25.145553, + 25.146695, + 25.147832, + 25.148964, + 25.150090, + 25.151211, + 25.152326, + 25.153436, + 25.154540, + 25.155640, + 25.156734, + 25.157823, + 25.158907, + 25.159985, + 25.161059, + 25.162127, + 25.163191, + 25.164249, + 25.165303, + 25.166351, + 25.167395, + 25.168434, + 25.169467, + 25.170497, + 25.171521, + 25.172540, + 25.173555, + 25.174565, + 25.175571, + 25.176571, + 25.177567, + 25.178559, + 25.179546, + 25.180528, + 25.181506, + 25.182480, + 25.183449, + 25.184413, + 25.185374, + 25.186330, + 25.187281, + 25.188228, + 25.189171, + 25.190110, + 25.191044, + 25.191974, + 25.192900, + 25.193822, + 25.194740, + 25.195653, + 25.196563, + 25.197468, + 25.198370, + 25.199267, + 25.200160, + 25.201050, + 25.201935, + 25.202817, + 25.203694, + 25.204568, + 25.205438, + 25.206304, + 25.207166, + 25.208025, + 25.208879, + 25.209730, + 25.210578, + 25.211421, + 25.212261, + 25.213097, + 25.213930, + 25.214759, + 25.215584, + 25.216406, + 25.217224, + 25.218039, + 25.218850, + 25.219658, + 25.220462, + 25.221263, + 25.222060, + 25.222854, + 25.223645, + 25.224432, + 25.225216, + 25.225996, + 25.226773, + 25.227547, + 25.228318, + 25.229085, + 25.229849, + 25.230610, + 25.231368, + 25.232122, + 25.232873, + 25.233622, + 25.234367, + 25.235109, + 25.235847, + 25.236583, + 25.237316, + 25.238045, + 25.238772, + 25.239495, + 25.240216, + 25.240934, + 25.241648, + 25.242360, + 25.243069, + 25.243774, + 25.244477, + 25.245177, + 25.245874, + 25.246569, + 25.247260, + 25.247949, + 25.248635, + 25.249318, + 25.249998, + 25.250675, + 25.251350, + 25.252022, + 25.252692, + 25.253358, + 25.254022, + 25.254683, + 25.255342, + 25.255998, + 25.256651, + 25.257302, + 25.257950, + 25.258595, + 25.259238, + 25.259879, + 25.260516, + 25.261152, + 25.261784, + 25.262415, + 25.263042, + 25.263668, + 25.264290, + 25.264911, + 25.265529, + 25.266144, + 25.266757, + 25.267368, + 25.267976, + 25.268582, + 25.269185, + 25.269787, + 25.270385, + 25.270982, + 25.271576, + 25.272168, + 25.272757, + 25.273345, + 25.273930, + 25.274512, + 25.275093, + 25.275671, + 25.276247, + 25.276821, + 25.277393, + 25.277962, + 25.278529, + 25.279094, + 25.279657, + 25.280218, + 25.280777, + 25.281333, + 25.281888, + 25.282440, + 25.282990, + 25.283538, + 25.284084, + 25.284628, + 25.285170, + 25.285710, + 25.286248, + 25.286784, + 25.287318, + 25.287849, + 25.288379, + 25.288907, + 25.289433, + 25.289957, + 25.290479, + 25.290999, + 25.291517, + 25.292033, + 25.292548, + 25.293060, + 25.293570, + 25.294079, + 25.294586, + 25.295090, + 25.295593, + 25.296095, + 25.296594, + 25.297091, + 25.297587, + 25.298081, + 25.298573, + 25.299063, + 25.299552, + 25.300038, + 25.300523, + 25.301006, + 25.301488, + 25.301967, + 25.302445, + 25.302921, + 25.303396, + 25.303869, + 25.304340, + 25.304809, + 25.305277, + 25.305743, + 25.306207, + 25.306670, + 25.307131, + 25.307590, + 25.308048, + 25.308504, + 25.308959, + 25.309411, + 25.309863, + 25.310312, + 25.310760, + 25.311207, + 25.311652, + 25.312095, + 25.312537, + 25.312977, + 25.313416, + 25.313853, + 25.314289, + 25.314723, + 25.315155, + 25.315586, + 25.316016, + 25.316444, + 25.316870, + 25.317295, + 25.317719, + 25.318141, + 25.318562, + 25.318981, + 25.319399, + 25.319815, + 25.320230, + 25.320643, + 25.321055, + 25.321466, + 25.321875, + 25.322283, + 25.322689, + 25.323094, + 25.323498, + 25.323900, + 25.324301, + 25.324701, + 25.325099, + 25.325496, + 25.325891, + 25.326285, + 25.326678, + 25.327069, + 25.327459, + 25.327848, + 25.328236, + 25.328622, + 25.329007, + 25.329390, + 25.329773, + 25.330154, + 25.330533, + 25.330912, + 25.331289, + 25.331665, + 25.332040, + 25.332413, + 25.332785, + 25.333156, + 25.333526, + 25.333894, + 25.334262, + 25.334628, + 25.334992, + 25.335356, + 25.335719, + 25.336080, + 25.336440, + 25.336799, + 25.337156, + 25.337513, + 25.337868, + 25.338222, + 25.338575, + 25.338927, + 25.339278, + 25.339628, + 25.339976, + 25.340323, + 25.340670, + 25.341015, + 25.341359, + 25.341701, + 25.342043, + 25.342384, + 25.342723, + 25.343062, + 25.343399, + 25.343735, + 25.344070, + 25.344404, + 25.344737, + 25.345069, + 25.345400, + 25.345730, + 25.346059, + 25.346387, + 25.346713, + 25.347039, + 25.347364, + 25.347687, + 25.348010, + 25.348331, + 25.348652, + 25.348971, + 25.349290, + 25.349607, + 25.349924, + 25.350239, + 25.350554, + 25.350867, + 25.351180, + 25.351491, + 25.351802, + 25.352111, + 25.352420, + 25.352727, + 25.353034, + 25.353340, + 25.353645, + 25.353948, + 25.354251, + 25.354553, + 25.354854, + 25.355154, + 25.355453, + 25.355752, + 25.356049, + 25.356345, + 25.356641, + 25.356935, + 25.357229, + 25.357522, + 25.357814, + 25.358105, + 25.358395, + 25.358684, + 25.358972, + 25.359259, + 25.359546, + 25.359832, + 25.360116, + 25.360400, + 25.360683, + 25.360966, + 25.361247, + 25.361527, + 25.361807, + 25.362086, + 25.362364, + 25.362641, + 25.362917, + 25.363193, + 25.363467, + 25.363741, + 25.364014, + 25.364286, + 25.364558, + 25.364828, + 25.365098, + }, + {// The expectations for dimension = 52 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681666, + 3.839999, + 4.001665, + 4.166664, + 4.334995, + 4.506657, + 4.681649, + 4.859968, + 5.041610, + 5.226570, + 5.414839, + 5.606402, + 5.801243, + 5.999333, + 6.200640, + 6.405114, + 6.612695, + 6.823304, + 7.036844, + 7.253197, + 7.472219, + 7.693743, + 7.917575, + 8.143497, + 8.371265, + 8.600615, + 8.831260, + 9.062900, + 9.295222, + 9.527903, + 9.760622, + 9.993055, + 10.224890, + 10.455820, + 10.685556, + 10.913823, + 11.140369, + 11.364959, + 11.587382, + 11.807447, + 12.024989, + 12.239859, + 12.451933, + 12.661103, + 12.867282, + 13.070397, + 13.270392, + 13.467224, + 13.660862, + 13.851288, + 14.038491, + 14.222472, + 14.403237, + 14.580800, + 14.755181, + 14.926404, + 15.094500, + 15.259502, + 15.421445, + 15.580369, + 15.736316, + 15.889329, + 16.039454, + 16.186736, + 16.331223, + 16.472964, + 16.612006, + 16.748400, + 16.882194, + 17.013437, + 17.142180, + 17.268470, + 17.392357, + 17.513889, + 17.633114, + 17.750079, + 17.864831, + 17.977416, + 18.087880, + 18.196267, + 18.302622, + 18.406988, + 18.509408, + 18.609923, + 18.708574, + 18.805402, + 18.900446, + 18.993745, + 19.085336, + 19.175257, + 19.263544, + 19.350232, + 19.435356, + 19.518950, + 19.601048, + 19.681681, + 19.760882, + 19.838681, + 19.915109, + 19.990195, + 20.063968, + 20.136456, + 20.207688, + 20.277689, + 20.346486, + 20.414105, + 20.480571, + 20.545909, + 20.610141, + 20.673292, + 20.735384, + 20.796440, + 20.856480, + 20.915527, + 20.973601, + 21.030723, + 21.086911, + 21.142185, + 21.196564, + 21.250066, + 21.302709, + 21.354511, + 21.405488, + 21.455658, + 21.505036, + 21.553639, + 21.601481, + 21.648578, + 21.694946, + 21.740597, + 21.785547, + 21.829809, + 21.873397, + 21.916324, + 21.958602, + 22.000244, + 22.041263, + 22.081670, + 22.121477, + 22.160696, + 22.199338, + 22.237413, + 22.274932, + 22.311907, + 22.348346, + 22.384260, + 22.419659, + 22.454553, + 22.488950, + 22.522859, + 22.556290, + 22.589252, + 22.621752, + 22.653800, + 22.685403, + 22.716569, + 22.747307, + 22.777623, + 22.807526, + 22.837023, + 22.866120, + 22.894825, + 22.923144, + 22.951085, + 22.978654, + 23.005857, + 23.032701, + 23.059192, + 23.085336, + 23.111139, + 23.136606, + 23.161743, + 23.186557, + 23.211051, + 23.235232, + 23.259105, + 23.282675, + 23.305947, + 23.328926, + 23.351617, + 23.374024, + 23.396152, + 23.418005, + 23.439589, + 23.460907, + 23.481963, + 23.502763, + 23.523309, + 23.543607, + 23.563659, + 23.583470, + 23.603043, + 23.622383, + 23.641493, + 23.660376, + 23.679037, + 23.697477, + 23.715702, + 23.733714, + 23.751516, + 23.769112, + 23.786505, + 23.803697, + 23.820692, + 23.837494, + 23.854103, + 23.870525, + 23.886761, + 23.902814, + 23.918686, + 23.934381, + 23.949902, + 23.965250, + 23.980428, + 23.995439, + 24.010284, + 24.024968, + 24.039491, + 24.053856, + 24.068065, + 24.082121, + 24.096025, + 24.109781, + 24.123389, + 24.136852, + 24.150173, + 24.163352, + 24.176393, + 24.189296, + 24.202064, + 24.214699, + 24.227203, + 24.239576, + 24.251822, + 24.263942, + 24.275937, + 24.287809, + 24.299561, + 24.311192, + 24.322706, + 24.334104, + 24.345386, + 24.356556, + 24.367613, + 24.378561, + 24.389399, + 24.400130, + 24.410756, + 24.421276, + 24.431693, + 24.442008, + 24.452223, + 24.462338, + 24.472356, + 24.482276, + 24.492101, + 24.501831, + 24.511468, + 24.521014, + 24.530468, + 24.539833, + 24.549109, + 24.558298, + 24.567400, + 24.576417, + 24.585350, + 24.594200, + 24.602967, + 24.611653, + 24.620259, + 24.628786, + 24.637234, + 24.645605, + 24.653900, + 24.662119, + 24.670264, + 24.678335, + 24.686334, + 24.694260, + 24.702116, + 24.709901, + 24.717616, + 24.725264, + 24.732843, + 24.740356, + 24.747802, + 24.755183, + 24.762499, + 24.769751, + 24.776940, + 24.784067, + 24.791132, + 24.798135, + 24.805079, + 24.811963, + 24.818788, + 24.825554, + 24.832263, + 24.838915, + 24.845511, + 24.852051, + 24.858536, + 24.864966, + 24.871342, + 24.877665, + 24.883936, + 24.890154, + 24.896321, + 24.902437, + 24.908502, + 24.914518, + 24.920484, + 24.926401, + 24.932270, + 24.938092, + 24.943866, + 24.949593, + 24.955274, + 24.960910, + 24.966500, + 24.972045, + 24.977546, + 24.983004, + 24.988418, + 24.993789, + 24.999117, + 25.004404, + 25.009649, + 25.014853, + 25.020016, + 25.025139, + 25.030222, + 25.035265, + 25.040270, + 25.045236, + 25.050163, + 25.055053, + 25.059905, + 25.064720, + 25.069498, + 25.074240, + 25.078946, + 25.083617, + 25.088252, + 25.092852, + 25.097417, + 25.101949, + 25.106446, + 25.110910, + 25.115341, + 25.119738, + 25.124104, + 25.128437, + 25.132737, + 25.137007, + 25.141245, + 25.145452, + 25.149628, + 25.153774, + 25.157890, + 25.161976, + 25.166032, + 25.170059, + 25.174058, + 25.178027, + 25.181968, + 25.185881, + 25.189766, + 25.193623, + 25.197453, + 25.201256, + 25.205032, + 25.208781, + 25.212504, + 25.216201, + 25.219872, + 25.223517, + 25.227137, + 25.230732, + 25.234302, + 25.237847, + 25.241368, + 25.244864, + 25.248336, + 25.251785, + 25.255210, + 25.258612, + 25.261990, + 25.265346, + 25.268678, + 25.271988, + 25.275276, + 25.278542, + 25.281786, + 25.285008, + 25.288208, + 25.291387, + 25.294545, + 25.297682, + 25.300798, + 25.303893, + 25.306968, + 25.310023, + 25.313058, + 25.316073, + 25.319068, + 25.322043, + 25.324999, + 25.327936, + 25.330854, + 25.333753, + 25.336633, + 25.339494, + 25.342337, + 25.345162, + 25.347969, + 25.350758, + 25.353529, + 25.356282, + 25.359018, + 25.361736, + 25.364438, + 25.367122, + 25.369789, + 25.372440, + 25.375074, + 25.377691, + 25.380292, + 25.382877, + 25.385445, + 25.387998, + 25.390535, + 25.393056, + 25.395562, + 25.398052, + 25.400527, + 25.402987, + 25.405432, + 25.407861, + 25.410276, + 25.412676, + 25.415062, + 25.417433, + 25.419790, + 25.422132, + 25.424461, + 25.426775, + 25.429076, + 25.431363, + 25.433636, + 25.435895, + 25.438141, + 25.440374, + 25.442593, + 25.444800, + 25.446993, + 25.449173, + 25.451341, + 25.453495, + 25.455638, + 25.457767, + 25.459884, + 25.461989, + 25.464082, + 25.466162, + 25.468230, + 25.470287, + 25.472331, + 25.474364, + 25.476385, + 25.478394, + 25.480392, + 25.482379, + 25.484354, + 25.486318, + 25.488270, + 25.490212, + 25.492142, + 25.494062, + 25.495971, + 25.497869, + 25.499756, + 25.501633, + 25.503499, + 25.505355, + 25.507201, + 25.509036, + 25.510861, + 25.512676, + 25.514481, + 25.516275, + 25.518060, + 25.519835, + 25.521601, + 25.523356, + 25.525102, + 25.526839, + 25.528566, + 25.530283, + 25.531991, + 25.533690, + 25.535380, + 25.537060, + 25.538732, + 25.540394, + 25.542048, + 25.543692, + 25.545328, + 25.546955, + 25.548573, + 25.550183, + 25.551784, + 25.553377, + 25.554961, + 25.556537, + 25.558104, + 25.559663, + 25.561214, + 25.562757, + 25.564291, + 25.565818, + 25.567336, + 25.568847, + 25.570350, + 25.571845, + 25.573332, + 25.574811, + 25.576283, + 25.577747, + 25.579204, + 25.580653, + 25.582095, + 25.583529, + 25.584956, + 25.586375, + 25.587787, + 25.589193, + 25.590591, + 25.591981, + 25.593365, + 25.594742, + 25.596112, + 25.597474, + 25.598830, + 25.600180, + 25.601522, + 25.602858, + 25.604187, + 25.605509, + 25.606825, + 25.608134, + 25.609436, + 25.610733, + 25.612022, + 25.613306, + 25.614583, + 25.615853, + 25.617118, + 25.618376, + 25.619628, + 25.620874, + 25.622114, + 25.623347, + 25.624575, + 25.625797, + 25.627012, + 25.628222, + 25.629426, + 25.630624, + 25.631817, + 25.633003, + 25.634184, + 25.635360, + 25.636529, + 25.637693, + 25.638851, + 25.640004, + 25.641152, + 25.642294, + 25.643430, + 25.644561, + 25.645687, + 25.646807, + 25.647922, + 25.649032, + 25.650137, + 25.651236, + 25.652330, + 25.653419, + 25.654503, + 25.655582, + 25.656656, + 25.657725, + 25.658789, + 25.659848, + 25.660902, + 25.661951, + 25.662995, + 25.664035, + 25.665069, + 25.666099, + 25.667124, + 25.668145, + 25.669160, + 25.670172, + 25.671178, + 25.672180, + 25.673177, + 25.674170, + 25.675159, + 25.676142, + 25.677122, + 25.678097, + 25.679067, + 25.680033, + 25.680995, + 25.681953, + 25.682906, + 25.683855, + 25.684799, + 25.685740, + 25.686676, + 25.687608, + 25.688536, + 25.689460, + 25.690380, + 25.691295, + 25.692207, + 25.693114, + 25.694018, + 25.694917, + 25.695813, + 25.696705, + 25.697593, + 25.698476, + 25.699356, + 25.700233, + 25.701105, + 25.701974, + 25.702838, + 25.703699, + 25.704557, + 25.705410, + 25.706260, + 25.707106, + 25.707949, + 25.708788, + 25.709623, + 25.710455, + 25.711283, + 25.712108, + 25.712929, + 25.713747, + 25.714561, + 25.715372, + 25.716179, + 25.716983, + 25.717783, + 25.718580, + 25.719374, + 25.720164, + 25.720951, + 25.721735, + 25.722515, + 25.723292, + 25.724066, + 25.724837, + 25.725604, + 25.726368, + 25.727129, + 25.727887, + 25.728642, + 25.729393, + 25.730142, + 25.730887, + 25.731630, + 25.732369, + 25.733105, + 25.733838, + 25.734568, + 25.735295, + 25.736019, + 25.736741, + 25.737459, + 25.738174, + 25.738886, + 25.739596, + 25.740303, + 25.741006, + 25.741707, + 25.742405, + 25.743100, + 25.743793, + 25.744482, + 25.745169, + 25.745853, + 25.746535, + 25.747213, + 25.747889, + 25.748562, + 25.749233, + 25.749901, + 25.750566, + 25.751228, + 25.751888, + 25.752545, + 25.753200, + 25.753852, + 25.754502, + 25.755149, + 25.755793, + 25.756435, + 25.757074, + 25.757711, + 25.758345, + 25.758977, + 25.759606, + 25.760233, + 25.760857, + 25.761479, + 25.762099, + 25.762716, + 25.763331, + 25.763943, + 25.764553, + 25.765161, + 25.765766, + 25.766369, + 25.766970, + 25.767568, + 25.768164, + 25.768758, + 25.769350, + 25.769939, + 25.770526, + 25.771110, + 25.771693, + 25.772273, + 25.772851, + 25.773427, + 25.774001, + 25.774572, + 25.775142, + 25.775709, + 25.776274, + 25.776837, + 25.777398, + 25.777956, + 25.778513, + 25.779067, + 25.779620, + 25.780170, + 25.780719, + 25.781265, + 25.781809, + 25.782351, + 25.782891, + 25.783430, + 25.783966, + 25.784500, + 25.785032, + 25.785562, + 25.786091, + 25.786617, + 25.787141, + 25.787664, + 25.788184, + 25.788703, + 25.789220, + 25.789735, + 25.790248, + 25.790759, + 25.791268, + 25.791775, + 25.792281, + 25.792785, + 25.793286, + 25.793787, + 25.794285, + 25.794781, + 25.795276, + 25.795769, + 25.796260, + 25.796749, + 25.797237, + 25.797722, + 25.798206, + 25.798689, + 25.799169, + 25.799648, + 25.800125, + 25.800601, + 25.801075, + 25.801547, + 25.802017, + 25.802486, + 25.802953, + 25.803418, + 25.803882, + 25.804344, + 25.804805, + 25.805264, + 25.805721, + 25.806177, + 25.806631, + 25.807083, + 25.807534, + 25.807984, + 25.808431, + 25.808878, + 25.809322, + 25.809765, + 25.810207, + 25.810647, + 25.811085, + 25.811522, + 25.811958, + 25.812392, + 25.812824, + 25.813255, + 25.813684, + 25.814112, + 25.814539, + 25.814964, + 25.815388, + 25.815810, + 25.816230, + 25.816650, + 25.817068, + 25.817484, + 25.817899, + 25.818312, + 25.818725, + 25.819135, + 25.819545, + 25.819953, + 25.820359, + 25.820765, + 25.821168, + 25.821571, + 25.821972, + 25.822372, + 25.822770, + 25.823167, + 25.823563, + 25.823958, + 25.824351, + 25.824743, + 25.825133, + 25.825522, + 25.825910, + 25.826297, + 25.826682, + 25.827066, + 25.827449, + 25.827830, + 25.828211, + 25.828590, + 25.828967, + 25.829344, + 25.829719, + 25.830093, + 25.830466, + 25.830837, + 25.831208, + 25.831577, + 25.831945, + 25.832312, + 25.832677, + 25.833041, + 25.833404, + 25.833766, + 25.834127, + 25.834487, + 25.834845, + 25.835203, + 25.835559, + 25.835914, + 25.836267, + 25.836620, + 25.836972, + 25.837322, + 25.837671, + 25.838019, + 25.838366, + 25.838712, + 25.839057, + 25.839401, + 25.839744, + 25.840085, + 25.840425, + 25.840765, + 25.841103, + 25.841440, + 25.841776, + 25.842111, + 25.842445, + 25.842778, + 25.843110, + 25.843441, + 25.843771, + 25.844100, + 25.844427, + 25.844754, + 25.845080, + 25.845404, + 25.845728, + 25.846050, + 25.846372, + 25.846693, + 25.847012, + 25.847331, + 25.847648, + 25.847965, + 25.848280, + 25.848595, + 25.848909, + 25.849221, + 25.849533, + 25.849844, + 25.850154, + 25.850462, + 25.850770, + 25.851077, + 25.851383, + 25.851688, + 25.851992, + 25.852295, + 25.852598, + 25.852899, + 25.853199, + 25.853499, + 25.853797, + 25.854095, + 25.854392, + 25.854688, + 25.854983, + 25.855277, + 25.855570, + 25.855862, + 25.856153, + 25.856444, + 25.856733, + 25.857022, + 25.857310, + 25.857597, + 25.857883, + 25.858168, + 25.858453, + 25.858736, + 25.859019, + 25.859301, + 25.859582, + 25.859862, + }, + {// The expectations for dimension = 53 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681666, + 3.840000, + 4.001666, + 4.166665, + 4.334997, + 4.506660, + 4.681655, + 4.859979, + 5.041629, + 5.226600, + 5.414887, + 5.606479, + 5.801362, + 5.999514, + 6.200908, + 6.405505, + 6.613254, + 6.824089, + 7.037927, + 7.254665, + 7.474178, + 7.696316, + 7.920904, + 8.147743, + 8.376608, + 8.607249, + 8.839396, + 9.072759, + 9.307034, + 9.541905, + 9.777051, + 10.012149, + 10.246881, + 10.480932, + 10.714004, + 10.945810, + 11.176082, + 11.404572, + 11.631051, + 11.855314, + 12.077176, + 12.296476, + 12.513072, + 12.726842, + 12.937685, + 13.145515, + 13.350265, + 13.551880, + 13.750319, + 13.945555, + 14.137570, + 14.326356, + 14.511913, + 14.694249, + 14.873380, + 15.049324, + 15.222107, + 15.391760, + 15.558314, + 15.721807, + 15.882278, + 16.039768, + 16.194321, + 16.345980, + 16.494794, + 16.640808, + 16.784070, + 16.924629, + 17.062534, + 17.197833, + 17.330575, + 17.460810, + 17.588586, + 17.713952, + 17.836954, + 17.957642, + 18.076063, + 18.192261, + 18.306285, + 18.418178, + 18.527986, + 18.635752, + 18.741520, + 18.845331, + 18.947228, + 19.047251, + 19.145441, + 19.241837, + 19.336477, + 19.429399, + 19.520639, + 19.610236, + 19.698222, + 19.784634, + 19.869505, + 19.952868, + 20.034756, + 20.115200, + 20.194232, + 20.271881, + 20.348177, + 20.423150, + 20.496826, + 20.569235, + 20.640402, + 20.710354, + 20.779117, + 20.846716, + 20.913175, + 20.978519, + 21.042770, + 21.105952, + 21.168086, + 21.229195, + 21.289299, + 21.348420, + 21.406578, + 21.463792, + 21.520081, + 21.575466, + 21.629963, + 21.683591, + 21.736368, + 21.788311, + 21.839436, + 21.889759, + 21.939297, + 21.988066, + 22.036080, + 22.083354, + 22.129904, + 22.175742, + 22.220884, + 22.265342, + 22.309129, + 22.352260, + 22.394746, + 22.436599, + 22.477832, + 22.518457, + 22.558485, + 22.597927, + 22.636795, + 22.675098, + 22.712849, + 22.750056, + 22.786731, + 22.822882, + 22.858520, + 22.893653, + 22.928292, + 22.962445, + 22.996121, + 23.029328, + 23.062075, + 23.094371, + 23.126223, + 23.157639, + 23.188627, + 23.219194, + 23.249348, + 23.279096, + 23.308446, + 23.337403, + 23.365976, + 23.394170, + 23.421992, + 23.449448, + 23.476545, + 23.503289, + 23.529686, + 23.555741, + 23.581461, + 23.606851, + 23.631916, + 23.656663, + 23.681095, + 23.705219, + 23.729039, + 23.752561, + 23.775790, + 23.798729, + 23.821384, + 23.843759, + 23.865860, + 23.887690, + 23.909253, + 23.930554, + 23.951598, + 23.972387, + 23.992927, + 24.013221, + 24.033272, + 24.053086, + 24.072664, + 24.092012, + 24.111132, + 24.130029, + 24.148705, + 24.167163, + 24.185408, + 24.203443, + 24.221270, + 24.238893, + 24.256314, + 24.273538, + 24.290566, + 24.307402, + 24.324048, + 24.340508, + 24.356784, + 24.372878, + 24.388794, + 24.404534, + 24.420101, + 24.435496, + 24.450724, + 24.465785, + 24.480682, + 24.495418, + 24.509995, + 24.524415, + 24.538681, + 24.552794, + 24.566757, + 24.580572, + 24.594241, + 24.607765, + 24.621148, + 24.634391, + 24.647495, + 24.660463, + 24.673296, + 24.685998, + 24.698568, + 24.711009, + 24.723323, + 24.735511, + 24.747576, + 24.759518, + 24.771340, + 24.783043, + 24.794628, + 24.806098, + 24.817453, + 24.828695, + 24.839826, + 24.850847, + 24.861760, + 24.872565, + 24.883265, + 24.893860, + 24.904353, + 24.914744, + 24.925034, + 24.935226, + 24.945319, + 24.955316, + 24.965218, + 24.975025, + 24.984740, + 24.994362, + 25.003894, + 25.013336, + 25.022690, + 25.031957, + 25.041137, + 25.050232, + 25.059243, + 25.068171, + 25.077016, + 25.085781, + 25.094465, + 25.103070, + 25.111597, + 25.120046, + 25.128419, + 25.136717, + 25.144940, + 25.153089, + 25.161166, + 25.169170, + 25.177104, + 25.184967, + 25.192761, + 25.200486, + 25.208143, + 25.215734, + 25.223258, + 25.230716, + 25.238110, + 25.245439, + 25.252706, + 25.259910, + 25.267051, + 25.274132, + 25.281153, + 25.288113, + 25.295015, + 25.301858, + 25.308643, + 25.315371, + 25.322042, + 25.328658, + 25.335218, + 25.341724, + 25.348176, + 25.354574, + 25.360920, + 25.367213, + 25.373454, + 25.379644, + 25.385784, + 25.391873, + 25.397913, + 25.403904, + 25.409847, + 25.415741, + 25.421588, + 25.427389, + 25.433143, + 25.438850, + 25.444513, + 25.450130, + 25.455703, + 25.461232, + 25.466717, + 25.472160, + 25.477559, + 25.482916, + 25.488232, + 25.493506, + 25.498739, + 25.503932, + 25.509084, + 25.514197, + 25.519271, + 25.524306, + 25.529302, + 25.534260, + 25.539180, + 25.544063, + 25.548910, + 25.553719, + 25.558492, + 25.563230, + 25.567932, + 25.572598, + 25.577230, + 25.581828, + 25.586391, + 25.590921, + 25.595417, + 25.599880, + 25.604310, + 25.608708, + 25.613073, + 25.617407, + 25.621709, + 25.625980, + 25.630220, + 25.634429, + 25.638608, + 25.642757, + 25.646876, + 25.650965, + 25.655025, + 25.659057, + 25.663060, + 25.667034, + 25.670980, + 25.674898, + 25.678789, + 25.682652, + 25.686489, + 25.690298, + 25.694081, + 25.697837, + 25.701568, + 25.705272, + 25.708951, + 25.712604, + 25.716233, + 25.719836, + 25.723415, + 25.726969, + 25.730499, + 25.734005, + 25.737487, + 25.740945, + 25.744381, + 25.747792, + 25.751181, + 25.754548, + 25.757891, + 25.761212, + 25.764511, + 25.767788, + 25.771044, + 25.774277, + 25.777490, + 25.780681, + 25.783851, + 25.787000, + 25.790129, + 25.793237, + 25.796325, + 25.799392, + 25.802440, + 25.805468, + 25.808476, + 25.811465, + 25.814435, + 25.817385, + 25.820317, + 25.823230, + 25.826124, + 25.828999, + 25.831857, + 25.834696, + 25.837517, + 25.840321, + 25.843106, + 25.845874, + 25.848625, + 25.851358, + 25.854075, + 25.856774, + 25.859456, + 25.862122, + 25.864772, + 25.867404, + 25.870021, + 25.872621, + 25.875206, + 25.877774, + 25.880327, + 25.882864, + 25.885385, + 25.887892, + 25.890383, + 25.892858, + 25.895319, + 25.897765, + 25.900196, + 25.902613, + 25.905015, + 25.907402, + 25.909775, + 25.912134, + 25.914479, + 25.916810, + 25.919127, + 25.921431, + 25.923721, + 25.925997, + 25.928260, + 25.930509, + 25.932745, + 25.934968, + 25.937179, + 25.939376, + 25.941560, + 25.943732, + 25.945891, + 25.948038, + 25.950172, + 25.952294, + 25.954403, + 25.956501, + 25.958586, + 25.960660, + 25.962721, + 25.964771, + 25.966809, + 25.968836, + 25.970851, + 25.972855, + 25.974847, + 25.976828, + 25.978798, + 25.980757, + 25.982705, + 25.984642, + 25.986568, + 25.988483, + 25.990388, + 25.992282, + 25.994165, + 25.996039, + 25.997901, + 25.999754, + 26.001596, + 26.003428, + 26.005250, + 26.007062, + 26.008865, + 26.010657, + 26.012439, + 26.014212, + 26.015976, + 26.017729, + 26.019473, + 26.021208, + 26.022934, + 26.024650, + 26.026356, + 26.028054, + 26.029743, + 26.031422, + 26.033093, + 26.034755, + 26.036408, + 26.038052, + 26.039687, + 26.041314, + 26.042932, + 26.044542, + 26.046143, + 26.047736, + 26.049320, + 26.050896, + 26.052464, + 26.054024, + 26.055575, + 26.057119, + 26.058654, + 26.060182, + 26.061702, + 26.063213, + 26.064717, + 26.066214, + 26.067702, + 26.069183, + 26.070656, + 26.072122, + 26.073581, + 26.075032, + 26.076475, + 26.077911, + 26.079340, + 26.080762, + 26.082176, + 26.083584, + 26.084984, + 26.086377, + 26.087764, + 26.089143, + 26.090515, + 26.091881, + 26.093240, + 26.094592, + 26.095937, + 26.097276, + 26.098608, + 26.099933, + 26.101252, + 26.102564, + 26.103870, + 26.105170, + 26.106463, + 26.107750, + 26.109030, + 26.110304, + 26.111572, + 26.112834, + 26.114090, + 26.115340, + 26.116583, + 26.117821, + 26.119052, + 26.120278, + 26.121498, + 26.122712, + 26.123920, + 26.125122, + 26.126319, + 26.127510, + 26.128695, + 26.129874, + 26.131048, + 26.132217, + 26.133380, + 26.134537, + 26.135689, + 26.136835, + 26.137976, + 26.139112, + 26.140242, + 26.141368, + 26.142487, + 26.143602, + 26.144711, + 26.145816, + 26.146915, + 26.148009, + 26.149098, + 26.150182, + 26.151260, + 26.152334, + 26.153403, + 26.154467, + 26.155527, + 26.156581, + 26.157630, + 26.158675, + 26.159715, + 26.160750, + 26.161781, + 26.162807, + 26.163828, + 26.164844, + 26.165856, + 26.166863, + 26.167866, + 26.168865, + 26.169858, + 26.170848, + 26.171833, + 26.172813, + 26.173789, + 26.174761, + 26.175729, + 26.176692, + 26.177651, + 26.178605, + 26.179556, + 26.180502, + 26.181444, + 26.182382, + 26.183315, + 26.184245, + 26.185170, + 26.186092, + 26.187009, + 26.187923, + 26.188832, + 26.189738, + 26.190639, + 26.191537, + 26.192431, + 26.193320, + 26.194206, + 26.195089, + 26.195967, + 26.196841, + 26.197712, + 26.198579, + 26.199443, + 26.200302, + 26.201158, + 26.202011, + 26.202859, + 26.203704, + 26.204546, + 26.205384, + 26.206218, + 26.207049, + 26.207876, + 26.208700, + 26.209520, + 26.210337, + 26.211151, + 26.211961, + 26.212767, + 26.213570, + 26.214370, + 26.215167, + 26.215960, + 26.216750, + 26.217537, + 26.218320, + 26.219100, + 26.219877, + 26.220651, + 26.221421, + 26.222188, + 26.222952, + 26.223713, + 26.224471, + 26.225226, + 26.225978, + 26.226726, + 26.227472, + 26.228214, + 26.228954, + 26.229690, + 26.230423, + 26.231154, + 26.231881, + 26.232606, + 26.233328, + 26.234046, + 26.234762, + 26.235475, + 26.236185, + 26.236892, + 26.237597, + 26.238298, + 26.238997, + 26.239693, + 26.240386, + 26.241076, + 26.241764, + 26.242449, + 26.243131, + 26.243811, + 26.244488, + 26.245162, + 26.245833, + 26.246502, + 26.247168, + 26.247832, + 26.248493, + 26.249151, + 26.249807, + 26.250460, + 26.251111, + 26.251759, + 26.252405, + 26.253048, + 26.253688, + 26.254327, + 26.254962, + 26.255595, + 26.256226, + 26.256854, + 26.257480, + 26.258104, + 26.258725, + 26.259343, + 26.259960, + 26.260574, + 26.261185, + 26.261795, + 26.262402, + 26.263006, + 26.263608, + 26.264209, + 26.264806, + 26.265402, + 26.265995, + 26.266586, + 26.267175, + 26.267761, + 26.268346, + 26.268928, + 26.269508, + 26.270085, + 26.270661, + 26.271234, + 26.271806, + 26.272375, + 26.272942, + 26.273507, + 26.274069, + 26.274630, + 26.275189, + 26.275745, + 26.276300, + 26.276852, + 26.277403, + 26.277951, + 26.278497, + 26.279042, + 26.279584, + 26.280124, + 26.280663, + 26.281199, + 26.281733, + 26.282266, + 26.282796, + 26.283325, + 26.283852, + 26.284376, + 26.284899, + 26.285420, + 26.285939, + 26.286456, + 26.286972, + 26.287485, + 26.287997, + 26.288506, + 26.289014, + 26.289520, + 26.290025, + 26.290527, + 26.291028, + 26.291527, + 26.292024, + 26.292519, + 26.293013, + 26.293504, + 26.293994, + 26.294483, + 26.294969, + 26.295454, + 26.295937, + 26.296419, + 26.296898, + 26.297376, + 26.297853, + 26.298327, + 26.298800, + 26.299272, + 26.299741, + 26.300209, + 26.300676, + 26.301141, + 26.301604, + 26.302065, + 26.302525, + 26.302984, + 26.303440, + 26.303895, + 26.304349, + 26.304801, + 26.305251, + 26.305700, + 26.306148, + 26.306593, + 26.307038, + 26.307480, + 26.307922, + 26.308361, + 26.308799, + 26.309236, + 26.309671, + 26.310105, + 26.310537, + 26.310968, + 26.311397, + 26.311825, + 26.312252, + 26.312676, + 26.313100, + 26.313522, + 26.313943, + 26.314362, + 26.314780, + 26.315196, + 26.315611, + 26.316025, + 26.316437, + 26.316848, + 26.317257, + 26.317665, + 26.318072, + 26.318477, + 26.318881, + 26.319284, + 26.319685, + 26.320085, + 26.320484, + 26.320881, + 26.321277, + 26.321672, + 26.322065, + 26.322457, + 26.322848, + 26.323238, + 26.323626, + 26.324013, + 26.324399, + 26.324783, + 26.325166, + 26.325548, + 26.325929, + 26.326308, + 26.326686, + 26.327063, + 26.327439, + 26.327813, + 26.328187, + 26.328559, + 26.328930, + 26.329299, + 26.329668, + 26.330035, + 26.330401, + 26.330766, + 26.331130, + 26.331492, + 26.331854, + 26.332214, + 26.332573, + 26.332931, + 26.333288, + 26.333643, + 26.333998, + 26.334351, + 26.334703, + 26.335054, + 26.335404, + 26.335753, + 26.336101, + 26.336448, + 26.336793, + 26.337138, + 26.337481, + 26.337824, + 26.338165, + 26.338505, + 26.338844, + 26.339182, + 26.339519, + 26.339855, + 26.340190, + 26.340524, + 26.340856, + 26.341188, + 26.341519, + 26.341849, + 26.342177, + 26.342505, + 26.342831, + 26.343157, + 26.343482, + 26.343805, + 26.344128, + 26.344449, + 26.344770, + 26.345089, + 26.345408, + 26.345726, + 26.346042, + 26.346358, + 26.346673, + 26.346986, + 26.347299, + 26.347611, + 26.347922, + 26.348232, + 26.348541, + 26.348849, + 26.349156, + 26.349462, + 26.349767, + 26.350071, + 26.350375, + 26.350677, + 26.350979, + 26.351279, + 26.351579, + 26.351878, + 26.352176, + 26.352473, + 26.352769, + 26.353064, + 26.353358, + 26.353652, + 26.353944, + 26.354236, + 26.354527, + }, + {// The expectations for dimension = 54 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001666, + 4.166666, + 4.334998, + 4.506663, + 4.681659, + 4.859986, + 5.041641, + 5.226621, + 5.414922, + 5.606535, + 5.801449, + 5.999648, + 6.201109, + 6.405802, + 6.613685, + 6.824701, + 7.038782, + 7.255838, + 7.475760, + 7.698417, + 7.923651, + 8.151282, + 8.381103, + 8.612882, + 8.846363, + 9.081272, + 9.317314, + 9.554182, + 9.791560, + 10.029125, + 10.266556, + 10.503536, + 10.739756, + 10.974919, + 11.208745, + 11.440970, + 11.671352, + 11.899669, + 12.125721, + 12.349330, + 12.570338, + 12.788609, + 13.004026, + 13.216493, + 13.425926, + 13.632261, + 13.835448, + 14.035447, + 14.232234, + 14.425791, + 14.616112, + 14.803199, + 14.987061, + 15.167713, + 15.345175, + 15.519474, + 15.690638, + 15.858702, + 16.023702, + 16.185676, + 16.344667, + 16.500717, + 16.653871, + 16.804175, + 16.951675, + 17.096420, + 17.238457, + 17.377834, + 17.514601, + 17.648805, + 17.780496, + 17.909722, + 18.036531, + 18.160970, + 18.283088, + 18.402930, + 18.520543, + 18.635972, + 18.749264, + 18.860461, + 18.969608, + 19.076748, + 19.181923, + 19.285173, + 19.386541, + 19.486066, + 19.583786, + 19.679741, + 19.773969, + 19.866505, + 19.957386, + 20.046647, + 20.134324, + 20.220449, + 20.305055, + 20.388176, + 20.469843, + 20.550086, + 20.628937, + 20.706424, + 20.782576, + 20.857422, + 20.930989, + 21.003305, + 21.074395, + 21.144285, + 21.213000, + 21.280565, + 21.347004, + 21.412340, + 21.476596, + 21.539795, + 21.601958, + 21.663106, + 21.723260, + 21.782441, + 21.840668, + 21.897961, + 21.954339, + 22.009819, + 22.064421, + 22.118162, + 22.171059, + 22.223128, + 22.274387, + 22.324850, + 22.374535, + 22.423456, + 22.471629, + 22.519067, + 22.565785, + 22.611797, + 22.657117, + 22.701758, + 22.745733, + 22.789054, + 22.831735, + 22.873787, + 22.915222, + 22.956052, + 22.996289, + 23.035942, + 23.075024, + 23.113544, + 23.151514, + 23.188942, + 23.225840, + 23.262217, + 23.298082, + 23.333445, + 23.368315, + 23.402700, + 23.436610, + 23.470052, + 23.503036, + 23.535569, + 23.567659, + 23.599314, + 23.630542, + 23.661350, + 23.691746, + 23.721736, + 23.751328, + 23.780529, + 23.809345, + 23.837783, + 23.865849, + 23.893549, + 23.920891, + 23.947879, + 23.974520, + 24.000820, + 24.026784, + 24.052417, + 24.077726, + 24.102716, + 24.127392, + 24.151759, + 24.175822, + 24.199586, + 24.223056, + 24.246236, + 24.269132, + 24.291748, + 24.314088, + 24.336157, + 24.357958, + 24.379497, + 24.400778, + 24.421804, + 24.442579, + 24.463108, + 24.483393, + 24.503440, + 24.523251, + 24.542831, + 24.562182, + 24.581308, + 24.600213, + 24.618901, + 24.637373, + 24.655634, + 24.673687, + 24.691534, + 24.709179, + 24.726625, + 24.743875, + 24.760932, + 24.777798, + 24.794477, + 24.810971, + 24.827282, + 24.843414, + 24.859369, + 24.875149, + 24.890757, + 24.906196, + 24.921468, + 24.936575, + 24.951520, + 24.966304, + 24.980931, + 24.995402, + 25.009720, + 25.023886, + 25.037904, + 25.051774, + 25.065499, + 25.079081, + 25.092521, + 25.105823, + 25.118987, + 25.132016, + 25.144911, + 25.157674, + 25.170307, + 25.182812, + 25.195190, + 25.207443, + 25.219574, + 25.231582, + 25.243470, + 25.255240, + 25.266894, + 25.278431, + 25.289855, + 25.301167, + 25.312367, + 25.323458, + 25.334442, + 25.345318, + 25.356089, + 25.366756, + 25.377320, + 25.387783, + 25.398146, + 25.408410, + 25.418577, + 25.428647, + 25.438622, + 25.448503, + 25.458292, + 25.467988, + 25.477594, + 25.487111, + 25.496540, + 25.505881, + 25.515136, + 25.524306, + 25.533392, + 25.542395, + 25.551315, + 25.560155, + 25.568915, + 25.577595, + 25.586197, + 25.594722, + 25.603171, + 25.611544, + 25.619842, + 25.628067, + 25.636219, + 25.644300, + 25.652309, + 25.660247, + 25.668116, + 25.675917, + 25.683649, + 25.691315, + 25.698914, + 25.706448, + 25.713916, + 25.721321, + 25.728662, + 25.735941, + 25.743157, + 25.750313, + 25.757407, + 25.764442, + 25.771418, + 25.778335, + 25.785194, + 25.791996, + 25.798741, + 25.805431, + 25.812064, + 25.818643, + 25.825168, + 25.831640, + 25.838058, + 25.844423, + 25.850737, + 25.857000, + 25.863212, + 25.869373, + 25.875485, + 25.881548, + 25.887562, + 25.893528, + 25.899446, + 25.905317, + 25.911142, + 25.916920, + 25.922653, + 25.928340, + 25.933983, + 25.939582, + 25.945137, + 25.950649, + 25.956117, + 25.961544, + 25.966928, + 25.972271, + 25.977572, + 25.982833, + 25.988054, + 25.993234, + 25.998375, + 26.003477, + 26.008541, + 26.013566, + 26.018553, + 26.023502, + 26.028415, + 26.033290, + 26.038129, + 26.042933, + 26.047700, + 26.052432, + 26.057129, + 26.061791, + 26.066419, + 26.071013, + 26.075573, + 26.080100, + 26.084593, + 26.089055, + 26.093483, + 26.097880, + 26.102245, + 26.106578, + 26.110880, + 26.115152, + 26.119392, + 26.123603, + 26.127783, + 26.131934, + 26.136055, + 26.140147, + 26.144211, + 26.148245, + 26.152251, + 26.156230, + 26.160180, + 26.164103, + 26.167998, + 26.171866, + 26.175708, + 26.179523, + 26.183312, + 26.187074, + 26.190811, + 26.194522, + 26.198208, + 26.201869, + 26.205504, + 26.209115, + 26.212702, + 26.216264, + 26.219802, + 26.223317, + 26.226807, + 26.230275, + 26.233719, + 26.237140, + 26.240539, + 26.243915, + 26.247268, + 26.250599, + 26.253909, + 26.257196, + 26.260462, + 26.263706, + 26.266930, + 26.270132, + 26.273313, + 26.276474, + 26.279614, + 26.282734, + 26.285833, + 26.288913, + 26.291973, + 26.295013, + 26.298034, + 26.301035, + 26.304018, + 26.306981, + 26.309925, + 26.312851, + 26.315758, + 26.318647, + 26.321518, + 26.324371, + 26.327205, + 26.330022, + 26.332822, + 26.335604, + 26.338368, + 26.341116, + 26.343846, + 26.346560, + 26.349257, + 26.351937, + 26.354601, + 26.357248, + 26.359879, + 26.362494, + 26.365093, + 26.367677, + 26.370244, + 26.372797, + 26.375333, + 26.377854, + 26.380361, + 26.382852, + 26.385328, + 26.387789, + 26.390236, + 26.392668, + 26.395085, + 26.397488, + 26.399877, + 26.402252, + 26.404613, + 26.406959, + 26.409292, + 26.411612, + 26.413917, + 26.416209, + 26.418488, + 26.420754, + 26.423006, + 26.425245, + 26.427472, + 26.429685, + 26.431886, + 26.434074, + 26.436249, + 26.438412, + 26.440562, + 26.442700, + 26.444826, + 26.446940, + 26.449042, + 26.451132, + 26.453210, + 26.455276, + 26.457331, + 26.459374, + 26.461406, + 26.463426, + 26.465435, + 26.467433, + 26.469419, + 26.471394, + 26.473359, + 26.475312, + 26.477255, + 26.479187, + 26.481108, + 26.483019, + 26.484919, + 26.486809, + 26.488688, + 26.490558, + 26.492417, + 26.494265, + 26.496104, + 26.497933, + 26.499752, + 26.501561, + 26.503360, + 26.505149, + 26.506929, + 26.508700, + 26.510460, + 26.512212, + 26.513954, + 26.515686, + 26.517410, + 26.519124, + 26.520830, + 26.522526, + 26.524213, + 26.525891, + 26.527561, + 26.529221, + 26.530873, + 26.532517, + 26.534151, + 26.535778, + 26.537395, + 26.539005, + 26.540605, + 26.542198, + 26.543782, + 26.545358, + 26.546926, + 26.548486, + 26.550038, + 26.551582, + 26.553118, + 26.554646, + 26.556167, + 26.557679, + 26.559184, + 26.560681, + 26.562171, + 26.563653, + 26.565128, + 26.566595, + 26.568054, + 26.569507, + 26.570952, + 26.572390, + 26.573820, + 26.575244, + 26.576660, + 26.578070, + 26.579472, + 26.580867, + 26.582256, + 26.583637, + 26.585012, + 26.586380, + 26.587741, + 26.589095, + 26.590443, + 26.591784, + 26.593119, + 26.594447, + 26.595769, + 26.597084, + 26.598393, + 26.599695, + 26.600992, + 26.602281, + 26.603565, + 26.604842, + 26.606114, + 26.607379, + 26.608638, + 26.609891, + 26.611138, + 26.612379, + 26.613614, + 26.614844, + 26.616067, + 26.617285, + 26.618497, + 26.619703, + 26.620903, + 26.622098, + 26.623287, + 26.624471, + 26.625649, + 26.626821, + 26.627988, + 26.629150, + 26.630306, + 26.631456, + 26.632602, + 26.633742, + 26.634876, + 26.636006, + 26.637130, + 26.638249, + 26.639363, + 26.640472, + 26.641576, + 26.642674, + 26.643768, + 26.644856, + 26.645940, + 26.647019, + 26.648092, + 26.649161, + 26.650225, + 26.651284, + 26.652339, + 26.653388, + 26.654433, + 26.655473, + 26.656509, + 26.657540, + 26.658566, + 26.659587, + 26.660604, + 26.661617, + 26.662625, + 26.663628, + 26.664627, + 26.665622, + 26.666612, + 26.667598, + 26.668579, + 26.669556, + 26.670529, + 26.671498, + 26.672462, + 26.673422, + 26.674378, + 26.675329, + 26.676277, + 26.677220, + 26.678159, + 26.679094, + 26.680025, + 26.680952, + 26.681875, + 26.682794, + 26.683709, + 26.684620, + 26.685528, + 26.686431, + 26.687330, + 26.688226, + 26.689117, + 26.690005, + 26.690889, + 26.691770, + 26.692646, + 26.693519, + 26.694388, + 26.695253, + 26.696115, + 26.696973, + 26.697828, + 26.698679, + 26.699526, + 26.700370, + 26.701210, + 26.702047, + 26.702880, + 26.703709, + 26.704536, + 26.705358, + 26.706178, + 26.706994, + 26.707806, + 26.708615, + 26.709421, + 26.710224, + 26.711023, + 26.711819, + 26.712611, + 26.713401, + 26.714187, + 26.714969, + 26.715749, + 26.716526, + 26.717299, + 26.718069, + 26.718836, + 26.719600, + 26.720361, + 26.721118, + 26.721873, + 26.722624, + 26.723373, + 26.724118, + 26.724861, + 26.725600, + 26.726337, + 26.727070, + 26.727801, + 26.728529, + 26.729254, + 26.729975, + 26.730694, + 26.731411, + 26.732124, + 26.732834, + 26.733542, + 26.734247, + 26.734949, + 26.735648, + 26.736345, + 26.737038, + 26.737729, + 26.738418, + 26.739103, + 26.739786, + 26.740467, + 26.741144, + 26.741819, + 26.742491, + 26.743161, + 26.743828, + 26.744493, + 26.745155, + 26.745814, + 26.746471, + 26.747125, + 26.747777, + 26.748426, + 26.749073, + 26.749717, + 26.750359, + 26.750998, + 26.751635, + 26.752269, + 26.752901, + 26.753531, + 26.754158, + 26.754782, + 26.755405, + 26.756025, + 26.756643, + 26.757258, + 26.757871, + 26.758482, + 26.759090, + 26.759696, + 26.760300, + 26.760901, + 26.761501, + 26.762098, + 26.762693, + 26.763285, + 26.763876, + 26.764464, + 26.765050, + 26.765633, + 26.766215, + 26.766794, + 26.767372, + 26.767947, + 26.768520, + 26.769091, + 26.769660, + 26.770226, + 26.770791, + 26.771354, + 26.771914, + 26.772472, + 26.773029, + 26.773583, + 26.774136, + 26.774686, + 26.775234, + 26.775780, + 26.776325, + 26.776867, + 26.777407, + 26.777946, + 26.778482, + 26.779017, + 26.779549, + 26.780080, + 26.780609, + 26.781136, + 26.781661, + 26.782184, + 26.782705, + 26.783224, + 26.783742, + 26.784257, + 26.784771, + 26.785283, + 26.785793, + 26.786301, + 26.786808, + 26.787313, + 26.787816, + 26.788317, + 26.788816, + 26.789314, + 26.789810, + 26.790304, + 26.790796, + 26.791287, + 26.791776, + 26.792263, + 26.792748, + 26.793232, + 26.793714, + 26.794195, + 26.794673, + 26.795150, + 26.795626, + 26.796100, + 26.796572, + 26.797042, + 26.797511, + 26.797978, + 26.798444, + 26.798908, + 26.799370, + 26.799831, + 26.800290, + 26.800748, + 26.801204, + 26.801659, + 26.802112, + 26.802563, + 26.803013, + 26.803461, + 26.803908, + 26.804353, + 26.804797, + 26.805240, + 26.805680, + 26.806120, + 26.806557, + 26.806994, + 26.807429, + 26.807862, + 26.808294, + 26.808724, + 26.809153, + 26.809581, + 26.810007, + 26.810432, + 26.810855, + 26.811277, + 26.811697, + 26.812116, + 26.812534, + 26.812950, + 26.813365, + 26.813779, + 26.814191, + 26.814602, + 26.815011, + 26.815419, + 26.815826, + 26.816231, + 26.816635, + 26.817038, + 26.817440, + 26.817840, + 26.818238, + 26.818636, + 26.819032, + 26.819427, + 26.819820, + 26.820213, + 26.820604, + 26.820993, + 26.821382, + 26.821769, + 26.822155, + 26.822540, + 26.822923, + 26.823305, + 26.823686, + 26.824066, + 26.824445, + 26.824822, + 26.825198, + 26.825573, + 26.825947, + 26.826319, + 26.826690, + 26.827060, + 26.827429, + 26.827797, + 26.828164, + 26.828529, + 26.828893, + 26.829256, + 26.829618, + 26.829979, + 26.830339, + 26.830697, + 26.831054, + 26.831411, + 26.831766, + 26.832120, + 26.832473, + 26.832824, + 26.833175, + 26.833524, + 26.833873, + 26.834220, + 26.834567, + 26.834912, + 26.835256, + 26.835599, + 26.835941, + 26.836282, + 26.836622, + 26.836960, + 26.837298, + 26.837635, + 26.837970, + 26.838305, + 26.838638, + 26.838971, + 26.839303, + 26.839633, + 26.839962, + 26.840291, + 26.840618, + 26.840945, + 26.841270, + 26.841595, + 26.841918, + 26.842241, + 26.842562, + 26.842883, + 26.843202, + 26.843521, + 26.843838, + 26.844155, + 26.844470, + 26.844785, + 26.845099, + 26.845412, + 26.845723, + 26.846034, + 26.846344, + 26.846653, + 26.846961, + 26.847269, + 26.847575, + 26.847880, + 26.848185, + 26.848488, + 26.848791, + 26.849092, + }, + {// The expectations for dimension = 55 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001666, + 4.166666, + 4.334999, + 4.506664, + 4.681662, + 4.859991, + 5.041649, + 5.226636, + 5.414946, + 5.606574, + 5.801512, + 5.999746, + 6.201260, + 6.406027, + 6.614015, + 6.825176, + 7.039453, + 7.256770, + 7.477032, + 7.700123, + 7.925906, + 8.154217, + 8.384866, + 8.617641, + 8.852303, + 9.088591, + 9.326225, + 9.564906, + 9.804326, + 10.044165, + 10.284103, + 10.523819, + 10.762999, + 11.001336, + 11.238540, + 11.474335, + 11.708462, + 11.940686, + 12.170791, + 12.398582, + 12.623886, + 12.846553, + 13.066450, + 13.283467, + 13.497508, + 13.708496, + 13.916370, + 14.121081, + 14.322594, + 14.520884, + 14.715938, + 14.907749, + 15.096321, + 15.281663, + 15.463792, + 15.642729, + 15.818499, + 15.991133, + 16.160663, + 16.327127, + 16.490564, + 16.651014, + 16.808521, + 16.963129, + 17.114884, + 17.263832, + 17.410020, + 17.553497, + 17.694310, + 17.832507, + 17.968138, + 18.101249, + 18.231890, + 18.360107, + 18.485949, + 18.609463, + 18.730694, + 18.849690, + 18.966494, + 19.081153, + 19.193710, + 19.304209, + 19.412691, + 19.519201, + 19.623777, + 19.726462, + 19.827295, + 19.926315, + 20.023560, + 20.119067, + 20.212874, + 20.305016, + 20.395529, + 20.484447, + 20.571803, + 20.657632, + 20.741965, + 20.824833, + 20.906268, + 20.986300, + 21.064958, + 21.142272, + 21.218269, + 21.292976, + 21.366422, + 21.438633, + 21.509633, + 21.579448, + 21.648103, + 21.715622, + 21.782028, + 21.847343, + 21.911592, + 21.974794, + 22.036972, + 22.098146, + 22.158337, + 22.217565, + 22.275849, + 22.333207, + 22.389659, + 22.445223, + 22.499917, + 22.553756, + 22.606760, + 22.658943, + 22.710322, + 22.760914, + 22.810732, + 22.859793, + 22.908110, + 22.955699, + 23.002574, + 23.048747, + 23.094233, + 23.139044, + 23.183194, + 23.226694, + 23.269558, + 23.311796, + 23.353422, + 23.394445, + 23.434878, + 23.474731, + 23.514015, + 23.552741, + 23.590918, + 23.628557, + 23.665667, + 23.702259, + 23.738341, + 23.773922, + 23.809012, + 23.843619, + 23.877752, + 23.911419, + 23.944629, + 23.977389, + 24.009707, + 24.041592, + 24.073050, + 24.104090, + 24.134718, + 24.164941, + 24.194766, + 24.224200, + 24.253251, + 24.281923, + 24.310224, + 24.338160, + 24.365737, + 24.392961, + 24.419838, + 24.446374, + 24.472573, + 24.498443, + 24.523988, + 24.549213, + 24.574124, + 24.598726, + 24.623024, + 24.647023, + 24.670727, + 24.694141, + 24.717271, + 24.740119, + 24.762692, + 24.784993, + 24.807026, + 24.828796, + 24.850307, + 24.871562, + 24.892567, + 24.913324, + 24.933837, + 24.954111, + 24.974149, + 24.993954, + 25.013530, + 25.032880, + 25.052009, + 25.070918, + 25.089612, + 25.108094, + 25.126367, + 25.144434, + 25.162297, + 25.179961, + 25.197427, + 25.214699, + 25.231780, + 25.248673, + 25.265379, + 25.281903, + 25.298245, + 25.314410, + 25.330400, + 25.346216, + 25.361862, + 25.377340, + 25.392653, + 25.407802, + 25.422790, + 25.437619, + 25.452291, + 25.466809, + 25.481175, + 25.495391, + 25.509458, + 25.523379, + 25.537157, + 25.550792, + 25.564287, + 25.577643, + 25.590863, + 25.603949, + 25.616901, + 25.629723, + 25.642415, + 25.654980, + 25.667419, + 25.679733, + 25.691925, + 25.703996, + 25.715948, + 25.727781, + 25.739499, + 25.751101, + 25.762590, + 25.773967, + 25.785234, + 25.796392, + 25.807442, + 25.818386, + 25.829225, + 25.839960, + 25.850593, + 25.861125, + 25.871557, + 25.881890, + 25.892127, + 25.902267, + 25.912312, + 25.922264, + 25.932123, + 25.941891, + 25.951568, + 25.961156, + 25.970656, + 25.980069, + 25.989396, + 25.998638, + 26.007796, + 26.016871, + 26.025864, + 26.034776, + 26.043608, + 26.052361, + 26.061036, + 26.069633, + 26.078155, + 26.086601, + 26.094972, + 26.103270, + 26.111495, + 26.119648, + 26.127729, + 26.135741, + 26.143683, + 26.151556, + 26.159362, + 26.167100, + 26.174772, + 26.182378, + 26.189919, + 26.197396, + 26.204810, + 26.212161, + 26.219450, + 26.226677, + 26.233844, + 26.240951, + 26.247999, + 26.254988, + 26.261919, + 26.268792, + 26.275609, + 26.282370, + 26.289075, + 26.295725, + 26.302321, + 26.308863, + 26.315352, + 26.321789, + 26.328173, + 26.334506, + 26.340788, + 26.347019, + 26.353201, + 26.359333, + 26.365417, + 26.371452, + 26.377440, + 26.383380, + 26.389274, + 26.395121, + 26.400922, + 26.406678, + 26.412389, + 26.418056, + 26.423679, + 26.429258, + 26.434794, + 26.440288, + 26.445739, + 26.451149, + 26.456517, + 26.461845, + 26.467132, + 26.472378, + 26.477586, + 26.482753, + 26.487882, + 26.492973, + 26.498025, + 26.503040, + 26.508017, + 26.512957, + 26.517860, + 26.522728, + 26.527559, + 26.532354, + 26.537115, + 26.541841, + 26.546532, + 26.551188, + 26.555811, + 26.560401, + 26.564957, + 26.569480, + 26.573970, + 26.578429, + 26.582855, + 26.587250, + 26.591613, + 26.595945, + 26.600247, + 26.604517, + 26.608758, + 26.612969, + 26.617150, + 26.621302, + 26.625424, + 26.629518, + 26.633583, + 26.637620, + 26.641629, + 26.645610, + 26.649563, + 26.653490, + 26.657389, + 26.661262, + 26.665107, + 26.668927, + 26.672721, + 26.676488, + 26.680231, + 26.683947, + 26.687639, + 26.691306, + 26.694948, + 26.698566, + 26.702159, + 26.705729, + 26.709274, + 26.712796, + 26.716295, + 26.719770, + 26.723222, + 26.726652, + 26.730059, + 26.733444, + 26.736806, + 26.740147, + 26.743465, + 26.746762, + 26.750038, + 26.753292, + 26.756525, + 26.759738, + 26.762929, + 26.766101, + 26.769251, + 26.772382, + 26.775493, + 26.778583, + 26.781654, + 26.784706, + 26.787738, + 26.790751, + 26.793745, + 26.796720, + 26.799677, + 26.802615, + 26.805534, + 26.808436, + 26.811319, + 26.814184, + 26.817032, + 26.819861, + 26.822674, + 26.825469, + 26.828247, + 26.831007, + 26.833751, + 26.836478, + 26.839188, + 26.841882, + 26.844559, + 26.847221, + 26.849866, + 26.852495, + 26.855108, + 26.857705, + 26.860287, + 26.862853, + 26.865404, + 26.867940, + 26.870460, + 26.872966, + 26.875457, + 26.877932, + 26.880394, + 26.882840, + 26.885273, + 26.887691, + 26.890094, + 26.892484, + 26.894860, + 26.897221, + 26.899570, + 26.901904, + 26.904225, + 26.906532, + 26.908826, + 26.911107, + 26.913375, + 26.915629, + 26.917871, + 26.920100, + 26.922316, + 26.924519, + 26.926710, + 26.928889, + 26.931055, + 26.933209, + 26.935350, + 26.937480, + 26.939598, + 26.941703, + 26.943797, + 26.945879, + 26.947950, + 26.950009, + 26.952056, + 26.954092, + 26.956117, + 26.958130, + 26.960133, + 26.962124, + 26.964105, + 26.966074, + 26.968033, + 26.969981, + 26.971918, + 26.973845, + 26.975761, + 26.977667, + 26.979562, + 26.981447, + 26.983322, + 26.985187, + 26.987042, + 26.988887, + 26.990722, + 26.992547, + 26.994362, + 26.996167, + 26.997963, + 26.999750, + 27.001527, + 27.003294, + 27.005052, + 27.006801, + 27.008540, + 27.010271, + 27.011992, + 27.013704, + 27.015408, + 27.017102, + 27.018788, + 27.020464, + 27.022132, + 27.023792, + 27.025442, + 27.027084, + 27.028718, + 27.030343, + 27.031960, + 27.033569, + 27.035169, + 27.036761, + 27.038345, + 27.039921, + 27.041489, + 27.043048, + 27.044600, + 27.046144, + 27.047680, + 27.049209, + 27.050729, + 27.052242, + 27.053748, + 27.055246, + 27.056736, + 27.058219, + 27.059694, + 27.061162, + 27.062623, + 27.064077, + 27.065523, + 27.066962, + 27.068394, + 27.069819, + 27.071237, + 27.072648, + 27.074052, + 27.075449, + 27.076839, + 27.078222, + 27.079599, + 27.080969, + 27.082332, + 27.083689, + 27.085039, + 27.086382, + 27.087719, + 27.089050, + 27.090374, + 27.091691, + 27.093003, + 27.094308, + 27.095607, + 27.096899, + 27.098186, + 27.099466, + 27.100740, + 27.102008, + 27.103271, + 27.104527, + 27.105777, + 27.107021, + 27.108260, + 27.109492, + 27.110719, + 27.111940, + 27.113155, + 27.114365, + 27.115569, + 27.116767, + 27.117960, + 27.119147, + 27.120329, + 27.121505, + 27.122676, + 27.123841, + 27.125001, + 27.126156, + 27.127305, + 27.128449, + 27.129588, + 27.130721, + 27.131849, + 27.132973, + 27.134091, + 27.135204, + 27.136312, + 27.137414, + 27.138512, + 27.139605, + 27.140693, + 27.141776, + 27.142854, + 27.143928, + 27.144996, + 27.146060, + 27.147119, + 27.148173, + 27.149222, + 27.150267, + 27.151307, + 27.152343, + 27.153374, + 27.154400, + 27.155422, + 27.156439, + 27.157452, + 27.158460, + 27.159464, + 27.160464, + 27.161459, + 27.162450, + 27.163436, + 27.164418, + 27.165396, + 27.166369, + 27.167339, + 27.168304, + 27.169265, + 27.170221, + 27.171174, + 27.172122, + 27.173067, + 27.174007, + 27.174943, + 27.175876, + 27.176804, + 27.177728, + 27.178649, + 27.179565, + 27.180477, + 27.181386, + 27.182291, + 27.183192, + 27.184089, + 27.184982, + 27.185871, + 27.186757, + 27.187639, + 27.188517, + 27.189392, + 27.190263, + 27.191130, + 27.191994, + 27.192854, + 27.193710, + 27.194563, + 27.195412, + 27.196258, + 27.197100, + 27.197939, + 27.198774, + 27.199606, + 27.200435, + 27.201260, + 27.202081, + 27.202899, + 27.203714, + 27.204526, + 27.205334, + 27.206139, + 27.206940, + 27.207739, + 27.208534, + 27.209325, + 27.210114, + 27.210899, + 27.211682, + 27.212461, + 27.213237, + 27.214009, + 27.214779, + 27.215545, + 27.216309, + 27.217069, + 27.217827, + 27.218581, + 27.219332, + 27.220081, + 27.220826, + 27.221568, + 27.222308, + 27.223044, + 27.223778, + 27.224508, + 27.225236, + 27.225961, + 27.226683, + 27.227402, + 27.228118, + 27.228832, + 27.229542, + 27.230250, + 27.230955, + 27.231658, + 27.232357, + 27.233054, + 27.233749, + 27.234440, + 27.235129, + 27.235815, + 27.236498, + 27.237179, + 27.237857, + 27.238533, + 27.239206, + 27.239876, + 27.240544, + 27.241209, + 27.241872, + 27.242532, + 27.243190, + 27.243845, + 27.244498, + 27.245148, + 27.245795, + 27.246440, + 27.247083, + 27.247723, + 27.248361, + 27.248997, + 27.249630, + 27.250260, + 27.250889, + 27.251515, + 27.252138, + 27.252759, + 27.253378, + 27.253995, + 27.254609, + 27.255221, + 27.255831, + 27.256438, + 27.257043, + 27.257646, + 27.258247, + 27.258845, + 27.259441, + 27.260036, + 27.260627, + 27.261217, + 27.261804, + 27.262390, + 27.262973, + 27.263554, + 27.264133, + 27.264709, + 27.265284, + 27.265857, + 27.266427, + 27.266995, + 27.267562, + 27.268126, + 27.268688, + 27.269248, + 27.269806, + 27.270362, + 27.270917, + 27.271469, + 27.272019, + 27.272567, + 27.273113, + 27.273657, + 27.274199, + 27.274740, + 27.275278, + 27.275814, + 27.276349, + 27.276881, + 27.277412, + 27.277941, + 27.278468, + 27.278993, + 27.279516, + 27.280037, + 27.280557, + 27.281075, + 27.281590, + 27.282104, + 27.282617, + 27.283127, + 27.283636, + 27.284142, + 27.284647, + 27.285151, + 27.285652, + 27.286152, + 27.286650, + 27.287146, + 27.287641, + 27.288134, + 27.288625, + 27.289114, + 27.289602, + 27.290088, + 27.290572, + 27.291055, + 27.291536, + 27.292015, + 27.292493, + 27.292969, + 27.293443, + 27.293916, + 27.294387, + 27.294857, + 27.295325, + 27.295791, + 27.296256, + 27.296719, + 27.297181, + 27.297641, + 27.298099, + 27.298556, + 27.299012, + 27.299465, + 27.299918, + 27.300368, + 27.300818, + 27.301265, + 27.301712, + 27.302156, + 27.302600, + 27.303041, + 27.303482, + 27.303920, + 27.304358, + 27.304794, + 27.305228, + 27.305661, + 27.306093, + 27.306523, + 27.306951, + 27.307379, + 27.307804, + 27.308229, + 27.308652, + 27.309073, + 27.309494, + 27.309913, + 27.310330, + 27.310746, + 27.311161, + 27.311574, + 27.311986, + 27.312397, + 27.312806, + 27.313214, + 27.313621, + 27.314026, + 27.314430, + 27.314833, + 27.315234, + 27.315634, + 27.316033, + 27.316431, + 27.316827, + 27.317222, + 27.317615, + 27.318008, + 27.318399, + 27.318789, + 27.319177, + 27.319565, + 27.319951, + 27.320336, + 27.320719, + 27.321102, + 27.321483, + 27.321863, + 27.322242, + 27.322619, + 27.322996, + 27.323371, + 27.323745, + 27.324118, + 27.324489, + 27.324860, + 27.325229, + 27.325597, + 27.325964, + 27.326330, + 27.326694, + 27.327058, + 27.327420, + 27.327781, + 27.328141, + 27.328500, + 27.328858, + 27.329215, + 27.329570, + 27.329925, + 27.330278, + 27.330631, + 27.330982, + 27.331332, + 27.331681, + 27.332029, + 27.332376, + 27.332721, + 27.333066, + 27.333410, + 27.333752, + 27.334094, + 27.334434, + 27.334774, + 27.335112, + 27.335450, + 27.335786, + 27.336121, + 27.336455, + 27.336789, + 27.337121, + 27.337452, + 27.337782, + 27.338112, + 27.338440, + 27.338767, + 27.339093, + 27.339418, + 27.339743, + 27.340066, + 27.340388, + 27.340710, + 27.341030, + 27.341349, + 27.341668, + 27.341985, + 27.342302, + 27.342617, + 27.342932, + 27.343246, + 27.343558, + }, + {// The expectations for dimension = 56 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001666, + 4.166666, + 4.334999, + 4.506665, + 4.681663, + 4.859994, + 5.041655, + 5.226646, + 5.414963, + 5.606602, + 5.801557, + 5.999818, + 6.201371, + 6.406196, + 6.614266, + 6.825543, + 7.039977, + 7.257506, + 7.478048, + 7.701502, + 7.927748, + 8.156638, + 8.388002, + 8.621645, + 8.857345, + 9.094858, + 9.333917, + 9.574237, + 9.815517, + 10.057444, + 10.299700, + 10.541963, + 10.783915, + 11.025244, + 11.265649, + 11.504843, + 11.742556, + 11.978535, + 12.212551, + 12.444393, + 12.673873, + 12.900824, + 13.125100, + 13.346576, + 13.565143, + 13.780711, + 13.993208, + 14.202574, + 14.408764, + 14.611745, + 14.811493, + 15.007998, + 15.201255, + 15.391268, + 15.578048, + 15.761611, + 15.941979, + 16.119178, + 16.293239, + 16.464195, + 16.632082, + 16.796940, + 16.958810, + 17.117734, + 17.273757, + 17.426924, + 17.577281, + 17.724876, + 17.869755, + 18.011967, + 18.151559, + 18.288580, + 18.423077, + 18.555099, + 18.684692, + 18.811904, + 18.936781, + 19.059370, + 19.179716, + 19.297865, + 19.413861, + 19.527748, + 19.639569, + 19.749366, + 19.857182, + 19.963058, + 20.067033, + 20.169148, + 20.269441, + 20.367950, + 20.464713, + 20.559767, + 20.653147, + 20.744888, + 20.835025, + 20.923591, + 21.010620, + 21.096143, + 21.180192, + 21.262799, + 21.343992, + 21.423802, + 21.502258, + 21.579388, + 21.655218, + 21.729777, + 21.803091, + 21.875184, + 21.946083, + 22.015812, + 22.084395, + 22.151855, + 22.218216, + 22.283500, + 22.347728, + 22.410922, + 22.473102, + 22.534290, + 22.594506, + 22.653768, + 22.712095, + 22.769507, + 22.826021, + 22.881656, + 22.936428, + 22.990354, + 23.043452, + 23.095737, + 23.147224, + 23.197931, + 23.247870, + 23.297058, + 23.345509, + 23.393237, + 23.440255, + 23.486578, + 23.532217, + 23.577187, + 23.621500, + 23.665167, + 23.708202, + 23.750616, + 23.792420, + 23.833625, + 23.874244, + 23.914285, + 23.953761, + 23.992680, + 24.031054, + 24.068893, + 24.106205, + 24.143000, + 24.179288, + 24.215077, + 24.250377, + 24.285195, + 24.319542, + 24.353423, + 24.386849, + 24.419827, + 24.452364, + 24.484469, + 24.516148, + 24.547409, + 24.578260, + 24.608706, + 24.638756, + 24.668415, + 24.697691, + 24.726590, + 24.755117, + 24.783280, + 24.811084, + 24.838535, + 24.865640, + 24.892403, + 24.918831, + 24.944928, + 24.970701, + 24.996154, + 25.021293, + 25.046123, + 25.070648, + 25.094874, + 25.118805, + 25.142446, + 25.165802, + 25.188876, + 25.211675, + 25.234201, + 25.256459, + 25.278453, + 25.300188, + 25.321666, + 25.342893, + 25.363873, + 25.384608, + 25.405102, + 25.425360, + 25.445385, + 25.465180, + 25.484749, + 25.504095, + 25.523221, + 25.542131, + 25.560828, + 25.579316, + 25.597596, + 25.615673, + 25.633548, + 25.651226, + 25.668709, + 25.686000, + 25.703101, + 25.720015, + 25.736746, + 25.753295, + 25.769665, + 25.785859, + 25.801879, + 25.817728, + 25.833408, + 25.848921, + 25.864270, + 25.879457, + 25.894484, + 25.909354, + 25.924068, + 25.938629, + 25.953039, + 25.967300, + 25.981414, + 25.995383, + 26.009209, + 26.022893, + 26.036438, + 26.049846, + 26.063119, + 26.076257, + 26.089264, + 26.102140, + 26.114888, + 26.127509, + 26.140005, + 26.152377, + 26.164627, + 26.176757, + 26.188768, + 26.200662, + 26.212440, + 26.224103, + 26.235654, + 26.247094, + 26.258423, + 26.269644, + 26.280758, + 26.291766, + 26.302669, + 26.313470, + 26.324168, + 26.334765, + 26.345263, + 26.355663, + 26.365966, + 26.376173, + 26.386286, + 26.396305, + 26.406232, + 26.416067, + 26.425813, + 26.435469, + 26.445038, + 26.454519, + 26.463915, + 26.473226, + 26.482454, + 26.491598, + 26.500660, + 26.509642, + 26.518544, + 26.527367, + 26.536112, + 26.544779, + 26.553371, + 26.561887, + 26.570328, + 26.578696, + 26.586991, + 26.595215, + 26.603367, + 26.611449, + 26.619461, + 26.627405, + 26.635280, + 26.643089, + 26.650831, + 26.658507, + 26.666119, + 26.673666, + 26.681150, + 26.688571, + 26.695930, + 26.703228, + 26.710464, + 26.717641, + 26.724759, + 26.731817, + 26.738818, + 26.745761, + 26.752647, + 26.759477, + 26.766251, + 26.772971, + 26.779636, + 26.786247, + 26.792804, + 26.799309, + 26.805762, + 26.812163, + 26.818514, + 26.824813, + 26.831063, + 26.837263, + 26.843415, + 26.849518, + 26.855572, + 26.861580, + 26.867541, + 26.873455, + 26.879323, + 26.885146, + 26.890923, + 26.896656, + 26.902345, + 26.907990, + 26.913592, + 26.919152, + 26.924669, + 26.930144, + 26.935577, + 26.940969, + 26.946321, + 26.951632, + 26.956904, + 26.962136, + 26.967329, + 26.972483, + 26.977599, + 26.982677, + 26.987718, + 26.992721, + 26.997687, + 27.002617, + 27.007511, + 27.012369, + 27.017192, + 27.021979, + 27.026732, + 27.031451, + 27.036135, + 27.040786, + 27.045403, + 27.049987, + 27.054538, + 27.059057, + 27.063543, + 27.067998, + 27.072421, + 27.076813, + 27.081173, + 27.085503, + 27.089803, + 27.094073, + 27.098312, + 27.102522, + 27.106703, + 27.110855, + 27.114978, + 27.119073, + 27.123139, + 27.127177, + 27.131188, + 27.135171, + 27.139127, + 27.143056, + 27.146958, + 27.150834, + 27.154683, + 27.158506, + 27.162304, + 27.166076, + 27.169823, + 27.173544, + 27.177241, + 27.180913, + 27.184561, + 27.188184, + 27.191784, + 27.195359, + 27.198911, + 27.202440, + 27.205945, + 27.209428, + 27.212888, + 27.216325, + 27.219739, + 27.223132, + 27.226502, + 27.229851, + 27.233178, + 27.236484, + 27.239768, + 27.243032, + 27.246274, + 27.249496, + 27.252697, + 27.255878, + 27.259038, + 27.262179, + 27.265299, + 27.268400, + 27.271482, + 27.274544, + 27.277587, + 27.280611, + 27.283616, + 27.286602, + 27.289570, + 27.292519, + 27.295450, + 27.298363, + 27.301257, + 27.304135, + 27.306994, + 27.309836, + 27.312660, + 27.315467, + 27.318257, + 27.321031, + 27.323787, + 27.326526, + 27.329249, + 27.331956, + 27.334646, + 27.337320, + 27.339978, + 27.342620, + 27.345247, + 27.347857, + 27.350453, + 27.353032, + 27.355597, + 27.358146, + 27.360680, + 27.363200, + 27.365704, + 27.368194, + 27.370669, + 27.373130, + 27.375576, + 27.378008, + 27.380426, + 27.382830, + 27.385220, + 27.387596, + 27.389958, + 27.392307, + 27.394642, + 27.396964, + 27.399273, + 27.401568, + 27.403851, + 27.406120, + 27.408376, + 27.410620, + 27.412851, + 27.415069, + 27.417275, + 27.419468, + 27.421649, + 27.423818, + 27.425975, + 27.428119, + 27.430252, + 27.432373, + 27.434482, + 27.436579, + 27.438664, + 27.440739, + 27.442801, + 27.444852, + 27.446893, + 27.448921, + 27.450939, + 27.452946, + 27.454941, + 27.456926, + 27.458900, + 27.460864, + 27.462816, + 27.464758, + 27.466690, + 27.468611, + 27.470522, + 27.472423, + 27.474313, + 27.476193, + 27.478064, + 27.479924, + 27.481774, + 27.483615, + 27.485446, + 27.487267, + 27.489078, + 27.490880, + 27.492672, + 27.494455, + 27.496229, + 27.497993, + 27.499748, + 27.501494, + 27.503231, + 27.504959, + 27.506677, + 27.508387, + 27.510088, + 27.511780, + 27.513464, + 27.515139, + 27.516805, + 27.518462, + 27.520112, + 27.521752, + 27.523385, + 27.525008, + 27.526624, + 27.528232, + 27.529831, + 27.531422, + 27.533005, + 27.534581, + 27.536148, + 27.537707, + 27.539259, + 27.540802, + 27.542338, + 27.543867, + 27.545388, + 27.546901, + 27.548406, + 27.549904, + 27.551395, + 27.552878, + 27.554354, + 27.555823, + 27.557285, + 27.558739, + 27.560186, + 27.561626, + 27.563059, + 27.564485, + 27.565904, + 27.567316, + 27.568721, + 27.570120, + 27.571511, + 27.572896, + 27.574275, + 27.575646, + 27.577011, + 27.578370, + 27.579722, + 27.581067, + 27.582406, + 27.583738, + 27.585065, + 27.586385, + 27.587698, + 27.589006, + 27.590307, + 27.591602, + 27.592891, + 27.594174, + 27.595450, + 27.596721, + 27.597986, + 27.599245, + 27.600498, + 27.601745, + 27.602986, + 27.604222, + 27.605452, + 27.606676, + 27.607894, + 27.609107, + 27.610314, + 27.611515, + 27.612711, + 27.613902, + 27.615087, + 27.616267, + 27.617441, + 27.618610, + 27.619773, + 27.620931, + 27.622084, + 27.623232, + 27.624374, + 27.625512, + 27.626644, + 27.627771, + 27.628893, + 27.630010, + 27.631121, + 27.632228, + 27.633330, + 27.634427, + 27.635519, + 27.636606, + 27.637688, + 27.638766, + 27.639839, + 27.640907, + 27.641970, + 27.643028, + 27.644082, + 27.645131, + 27.646176, + 27.647216, + 27.648251, + 27.649282, + 27.650308, + 27.651330, + 27.652347, + 27.653360, + 27.654369, + 27.655373, + 27.656372, + 27.657368, + 27.658359, + 27.659346, + 27.660328, + 27.661306, + 27.662280, + 27.663250, + 27.664216, + 27.665178, + 27.666135, + 27.667088, + 27.668038, + 27.668983, + 27.669924, + 27.670861, + 27.671795, + 27.672724, + 27.673649, + 27.674571, + 27.675488, + 27.676402, + 27.677312, + 27.678218, + 27.679120, + 27.680018, + 27.680913, + 27.681804, + 27.682691, + 27.683574, + 27.684454, + 27.685330, + 27.686203, + 27.687072, + 27.687937, + 27.688799, + 27.689657, + 27.690511, + 27.691363, + 27.692210, + 27.693054, + 27.693895, + 27.694732, + 27.695566, + 27.696396, + 27.697223, + 27.698047, + 27.698867, + 27.699684, + 27.700497, + 27.701308, + 27.702115, + 27.702919, + 27.703719, + 27.704516, + 27.705310, + 27.706101, + 27.706889, + 27.707674, + 27.708455, + 27.709233, + 27.710008, + 27.710780, + 27.711549, + 27.712315, + 27.713078, + 27.713838, + 27.714595, + 27.715349, + 27.716100, + 27.716848, + 27.717593, + 27.718335, + 27.719074, + 27.719810, + 27.720543, + 27.721274, + 27.722002, + 27.722726, + 27.723448, + 27.724167, + 27.724884, + 27.725597, + 27.726308, + 27.727016, + 27.727721, + 27.728424, + 27.729124, + 27.729821, + 27.730515, + 27.731207, + 27.731896, + 27.732583, + 27.733267, + 27.733948, + 27.734626, + 27.735303, + 27.735976, + 27.736647, + 27.737315, + 27.737981, + 27.738644, + 27.739305, + 27.739963, + 27.740619, + 27.741272, + 27.741923, + 27.742572, + 27.743218, + 27.743861, + 27.744502, + 27.745141, + 27.745777, + 27.746411, + 27.747043, + 27.747672, + 27.748299, + 27.748924, + 27.749546, + 27.750166, + 27.750783, + 27.751399, + 27.752012, + 27.752623, + 27.753231, + 27.753838, + 27.754442, + 27.755044, + 27.755643, + 27.756241, + 27.756836, + 27.757429, + 27.758020, + 27.758609, + 27.759195, + 27.759780, + 27.760362, + 27.760943, + 27.761521, + 27.762097, + 27.762671, + 27.763243, + 27.763813, + 27.764380, + 27.764946, + 27.765510, + 27.766072, + 27.766631, + 27.767189, + 27.767745, + 27.768298, + 27.768850, + 27.769400, + 27.769948, + 27.770494, + 27.771038, + 27.771580, + 27.772120, + 27.772658, + 27.773194, + 27.773728, + 27.774261, + 27.774792, + 27.775320, + 27.775847, + 27.776372, + 27.776895, + 27.777417, + 27.777936, + 27.778454, + 27.778970, + 27.779484, + 27.779996, + 27.780507, + 27.781016, + 27.781523, + 27.782028, + 27.782531, + 27.783033, + 27.783533, + 27.784031, + 27.784528, + 27.785023, + 27.785516, + 27.786008, + 27.786497, + 27.786985, + 27.787472, + 27.787957, + 27.788440, + 27.788921, + 27.789401, + 27.789879, + 27.790356, + 27.790831, + 27.791304, + 27.791776, + 27.792246, + 27.792715, + 27.793182, + 27.793647, + 27.794111, + 27.794573, + 27.795034, + 27.795493, + 27.795951, + 27.796407, + 27.796861, + 27.797314, + 27.797766, + 27.798216, + 27.798665, + 27.799112, + 27.799557, + 27.800001, + 27.800444, + 27.800885, + 27.801325, + 27.801763, + 27.802200, + 27.802635, + 27.803069, + 27.803501, + 27.803932, + 27.804362, + 27.804790, + 27.805217, + 27.805643, + 27.806067, + 27.806489, + 27.806911, + 27.807330, + 27.807749, + 27.808166, + 27.808582, + 27.808996, + 27.809410, + 27.809821, + 27.810232, + 27.810641, + 27.811049, + 27.811455, + 27.811860, + 27.812264, + 27.812667, + 27.813068, + 27.813468, + 27.813867, + 27.814264, + 27.814660, + 27.815055, + 27.815449, + 27.815841, + 27.816233, + 27.816622, + 27.817011, + 27.817399, + 27.817785, + 27.818170, + 27.818553, + 27.818936, + 27.819317, + 27.819697, + 27.820076, + 27.820454, + 27.820831, + 27.821206, + 27.821580, + 27.821953, + 27.822325, + 27.822696, + 27.823065, + 27.823434, + 27.823801, + 27.824167, + 27.824532, + 27.824896, + 27.825259, + 27.825620, + 27.825981, + 27.826340, + 27.826698, + 27.827055, + 27.827411, + 27.827766, + 27.828120, + 27.828473, + 27.828824, + 27.829175, + 27.829524, + 27.829873, + 27.830220, + 27.830567, + 27.830912, + 27.831256, + 27.831599, + 27.831941, + 27.832282, + 27.832622, + 27.832961, + 27.833299, + 27.833636, + 27.833972, + 27.834307, + 27.834641, + 27.834974, + 27.835305, + 27.835636, + 27.835966, + 27.836295, + 27.836623, + 27.836950, + 27.837276, + 27.837601, + 27.837925, + }, + {// The expectations for dimension = 57 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166666, + 4.335000, + 4.506666, + 4.681665, + 4.859996, + 5.041659, + 5.226653, + 5.414975, + 5.606622, + 5.801590, + 5.999871, + 6.201454, + 6.406323, + 6.614456, + 6.825824, + 7.040384, + 7.258084, + 7.478855, + 7.702611, + 7.929244, + 8.158625, + 8.390602, + 8.624997, + 8.861605, + 9.100201, + 9.340531, + 9.582324, + 9.825290, + 10.069126, + 10.313515, + 10.558141, + 10.802681, + 11.046820, + 11.290248, + 11.532670, + 11.773803, + 12.013383, + 12.251163, + 12.486920, + 12.720449, + 12.951569, + 13.180119, + 13.405957, + 13.628963, + 13.849034, + 14.066085, + 14.280044, + 14.490856, + 14.698480, + 14.902884, + 15.104048, + 15.301960, + 15.496620, + 15.688031, + 15.876205, + 16.061160, + 16.242918, + 16.421505, + 16.596952, + 16.769292, + 16.938563, + 17.104803, + 17.268053, + 17.428356, + 17.585756, + 17.740297, + 17.892027, + 18.040991, + 18.187237, + 18.330812, + 18.471764, + 18.610141, + 18.745990, + 18.879358, + 19.010294, + 19.138843, + 19.265052, + 19.388967, + 19.510634, + 19.630097, + 19.747400, + 19.862588, + 19.975703, + 20.086787, + 20.195883, + 20.303030, + 20.408269, + 20.511640, + 20.613181, + 20.712931, + 20.810925, + 20.907202, + 21.001796, + 21.094742, + 21.186076, + 21.275830, + 21.364038, + 21.450731, + 21.535941, + 21.619699, + 21.702035, + 21.782978, + 21.862557, + 21.940801, + 22.017736, + 22.093391, + 22.167791, + 22.240961, + 22.312928, + 22.383715, + 22.453346, + 22.521846, + 22.589237, + 22.655541, + 22.720781, + 22.784977, + 22.848151, + 22.910323, + 22.971513, + 23.031741, + 23.091025, + 23.149385, + 23.206838, + 23.263402, + 23.319096, + 23.373935, + 23.427936, + 23.481116, + 23.533490, + 23.585074, + 23.635883, + 23.685933, + 23.735236, + 23.783809, + 23.831664, + 23.878814, + 23.925274, + 23.971056, + 24.016174, + 24.060638, + 24.104461, + 24.147656, + 24.190233, + 24.232205, + 24.273582, + 24.314374, + 24.354594, + 24.394250, + 24.433353, + 24.471914, + 24.509941, + 24.547444, + 24.584433, + 24.620917, + 24.656904, + 24.692403, + 24.727424, + 24.761973, + 24.796060, + 24.829693, + 24.862879, + 24.895625, + 24.927940, + 24.959831, + 24.991306, + 25.022370, + 25.053031, + 25.083296, + 25.113172, + 25.142664, + 25.171780, + 25.200526, + 25.228907, + 25.256930, + 25.284600, + 25.311925, + 25.338908, + 25.365555, + 25.391873, + 25.417866, + 25.443539, + 25.468899, + 25.493948, + 25.518694, + 25.543140, + 25.567291, + 25.591151, + 25.614727, + 25.638020, + 25.661038, + 25.683782, + 25.706258, + 25.728470, + 25.750422, + 25.772118, + 25.793562, + 25.814757, + 25.835707, + 25.856417, + 25.876889, + 25.897128, + 25.917136, + 25.936917, + 25.956475, + 25.975813, + 25.994934, + 26.013841, + 26.032537, + 26.051026, + 26.069310, + 26.087393, + 26.105277, + 26.122965, + 26.140461, + 26.157766, + 26.174884, + 26.191817, + 26.208567, + 26.225138, + 26.241532, + 26.257751, + 26.273798, + 26.289675, + 26.305385, + 26.320930, + 26.336312, + 26.351533, + 26.366596, + 26.381502, + 26.396255, + 26.410855, + 26.425306, + 26.439608, + 26.453765, + 26.467777, + 26.481648, + 26.495378, + 26.508971, + 26.522426, + 26.535747, + 26.548935, + 26.561992, + 26.574920, + 26.587720, + 26.600393, + 26.612942, + 26.625369, + 26.637674, + 26.649859, + 26.661927, + 26.673877, + 26.685713, + 26.697434, + 26.709044, + 26.720542, + 26.731931, + 26.743212, + 26.754387, + 26.765455, + 26.776420, + 26.787282, + 26.798042, + 26.808703, + 26.819264, + 26.829727, + 26.840093, + 26.850364, + 26.860541, + 26.870625, + 26.880616, + 26.890517, + 26.900327, + 26.910049, + 26.919684, + 26.929231, + 26.938693, + 26.948071, + 26.957364, + 26.966575, + 26.975705, + 26.984753, + 26.993722, + 27.002612, + 27.011424, + 27.020159, + 27.028818, + 27.037402, + 27.045911, + 27.054346, + 27.062709, + 27.071000, + 27.079220, + 27.087370, + 27.095450, + 27.103462, + 27.111406, + 27.119282, + 27.127092, + 27.134836, + 27.142516, + 27.150131, + 27.157683, + 27.165172, + 27.172598, + 27.179964, + 27.187268, + 27.194513, + 27.201698, + 27.208824, + 27.215892, + 27.222902, + 27.229856, + 27.236753, + 27.243595, + 27.250381, + 27.257113, + 27.263791, + 27.270415, + 27.276987, + 27.283507, + 27.289974, + 27.296391, + 27.302757, + 27.309073, + 27.315339, + 27.321556, + 27.327725, + 27.333845, + 27.339918, + 27.345944, + 27.351924, + 27.357857, + 27.363744, + 27.369587, + 27.375384, + 27.381138, + 27.386847, + 27.392514, + 27.398137, + 27.403718, + 27.409256, + 27.414753, + 27.420209, + 27.425624, + 27.430999, + 27.436333, + 27.441628, + 27.446883, + 27.452100, + 27.457278, + 27.462418, + 27.467520, + 27.472585, + 27.477613, + 27.482605, + 27.487560, + 27.492479, + 27.497362, + 27.502210, + 27.507023, + 27.511802, + 27.516547, + 27.521257, + 27.525934, + 27.530577, + 27.535188, + 27.539766, + 27.544311, + 27.548825, + 27.553306, + 27.557756, + 27.562175, + 27.566564, + 27.570921, + 27.575248, + 27.579545, + 27.583813, + 27.588051, + 27.592259, + 27.596439, + 27.600590, + 27.604713, + 27.608807, + 27.612874, + 27.616913, + 27.620924, + 27.624908, + 27.628866, + 27.632796, + 27.636701, + 27.640579, + 27.644431, + 27.648257, + 27.652058, + 27.655833, + 27.659584, + 27.663309, + 27.667010, + 27.670687, + 27.674339, + 27.677968, + 27.681572, + 27.685153, + 27.688711, + 27.692245, + 27.695757, + 27.699245, + 27.702711, + 27.706155, + 27.709577, + 27.712976, + 27.716354, + 27.719710, + 27.723045, + 27.726358, + 27.729651, + 27.732922, + 27.736173, + 27.739403, + 27.742613, + 27.745803, + 27.748972, + 27.752122, + 27.755252, + 27.758362, + 27.761453, + 27.764525, + 27.767578, + 27.770612, + 27.773627, + 27.776623, + 27.779601, + 27.782561, + 27.785502, + 27.788426, + 27.791332, + 27.794220, + 27.797090, + 27.799943, + 27.802779, + 27.805598, + 27.808399, + 27.811184, + 27.813952, + 27.816703, + 27.819438, + 27.822157, + 27.824859, + 27.827546, + 27.830216, + 27.832870, + 27.835509, + 27.838133, + 27.840740, + 27.843333, + 27.845910, + 27.848472, + 27.851019, + 27.853551, + 27.856069, + 27.858572, + 27.861060, + 27.863534, + 27.865994, + 27.868439, + 27.870870, + 27.873288, + 27.875691, + 27.878081, + 27.880457, + 27.882820, + 27.885169, + 27.887504, + 27.889827, + 27.892136, + 27.894433, + 27.896716, + 27.898986, + 27.901244, + 27.903489, + 27.905722, + 27.907942, + 27.910149, + 27.912344, + 27.914528, + 27.916699, + 27.918857, + 27.921005, + 27.923140, + 27.925263, + 27.927375, + 27.929475, + 27.931564, + 27.933641, + 27.935707, + 27.937761, + 27.939805, + 27.941837, + 27.943859, + 27.945869, + 27.947869, + 27.949857, + 27.951836, + 27.953803, + 27.955760, + 27.957706, + 27.959642, + 27.961568, + 27.963484, + 27.965389, + 27.967284, + 27.969169, + 27.971044, + 27.972910, + 27.974765, + 27.976611, + 27.978447, + 27.980273, + 27.982090, + 27.983897, + 27.985695, + 27.987484, + 27.989263, + 27.991033, + 27.992794, + 27.994546, + 27.996288, + 27.998022, + 27.999747, + 28.001463, + 28.003170, + 28.004868, + 28.006558, + 28.008239, + 28.009912, + 28.011576, + 28.013232, + 28.014879, + 28.016518, + 28.018148, + 28.019771, + 28.021385, + 28.022991, + 28.024589, + 28.026179, + 28.027762, + 28.029336, + 28.030902, + 28.032461, + 28.034012, + 28.035555, + 28.037090, + 28.038618, + 28.040139, + 28.041652, + 28.043157, + 28.044655, + 28.046146, + 28.047629, + 28.049106, + 28.050575, + 28.052037, + 28.053491, + 28.054939, + 28.056380, + 28.057813, + 28.059240, + 28.060660, + 28.062073, + 28.063479, + 28.064879, + 28.066272, + 28.067658, + 28.069037, + 28.070410, + 28.071777, + 28.073137, + 28.074490, + 28.075837, + 28.077178, + 28.078512, + 28.079840, + 28.081162, + 28.082477, + 28.083787, + 28.085090, + 28.086387, + 28.087678, + 28.088963, + 28.090242, + 28.091515, + 28.092783, + 28.094044, + 28.095299, + 28.096549, + 28.097793, + 28.099031, + 28.100264, + 28.101490, + 28.102712, + 28.103927, + 28.105137, + 28.106342, + 28.107541, + 28.108734, + 28.109922, + 28.111105, + 28.112282, + 28.113454, + 28.114621, + 28.115783, + 28.116939, + 28.118090, + 28.119236, + 28.120376, + 28.121512, + 28.122643, + 28.123768, + 28.124888, + 28.126004, + 28.127114, + 28.128220, + 28.129321, + 28.130416, + 28.131507, + 28.132593, + 28.133675, + 28.134751, + 28.135823, + 28.136890, + 28.137953, + 28.139011, + 28.140064, + 28.141113, + 28.142157, + 28.143196, + 28.144231, + 28.145261, + 28.146288, + 28.147309, + 28.148326, + 28.149339, + 28.150347, + 28.151352, + 28.152351, + 28.153347, + 28.154338, + 28.155325, + 28.156308, + 28.157286, + 28.158261, + 28.159231, + 28.160197, + 28.161159, + 28.162117, + 28.163071, + 28.164021, + 28.164967, + 28.165909, + 28.166847, + 28.167781, + 28.168711, + 28.169637, + 28.170559, + 28.171478, + 28.172392, + 28.173303, + 28.174210, + 28.175114, + 28.176013, + 28.176909, + 28.177801, + 28.178689, + 28.179574, + 28.180455, + 28.181333, + 28.182207, + 28.183077, + 28.183944, + 28.184807, + 28.185666, + 28.186522, + 28.187375, + 28.188224, + 28.189070, + 28.189912, + 28.190751, + 28.191587, + 28.192419, + 28.193248, + 28.194073, + 28.194895, + 28.195714, + 28.196529, + 28.197342, + 28.198151, + 28.198956, + 28.199759, + 28.200558, + 28.201354, + 28.202147, + 28.202937, + 28.203724, + 28.204507, + 28.205288, + 28.206065, + 28.206840, + 28.207611, + 28.208379, + 28.209144, + 28.209906, + 28.210666, + 28.211422, + 28.212175, + 28.212925, + 28.213673, + 28.214417, + 28.215159, + 28.215898, + 28.216634, + 28.217367, + 28.218097, + 28.218824, + 28.219549, + 28.220270, + 28.220989, + 28.221706, + 28.222419, + 28.223130, + 28.223838, + 28.224543, + 28.225246, + 28.225946, + 28.226643, + 28.227337, + 28.228029, + 28.228719, + 28.229405, + 28.230089, + 28.230771, + 28.231450, + 28.232126, + 28.232800, + 28.233471, + 28.234140, + 28.234806, + 28.235470, + 28.236131, + 28.236790, + 28.237446, + 28.238100, + 28.238752, + 28.239401, + 28.240047, + 28.240692, + 28.241333, + 28.241973, + 28.242610, + 28.243245, + 28.243877, + 28.244507, + 28.245135, + 28.245760, + 28.246383, + 28.247004, + 28.247623, + 28.248239, + 28.248853, + 28.249465, + 28.250075, + 28.250682, + 28.251287, + 28.251890, + 28.252491, + 28.253089, + 28.253686, + 28.254280, + 28.254872, + 28.255462, + 28.256050, + 28.256636, + 28.257219, + 28.257801, + 28.258380, + 28.258958, + 28.259533, + 28.260106, + 28.260677, + 28.261247, + 28.261814, + 28.262379, + 28.262942, + 28.263503, + 28.264062, + 28.264619, + 28.265175, + 28.265728, + 28.266279, + 28.266829, + 28.267376, + 28.267921, + 28.268465, + 28.269007, + 28.269546, + 28.270084, + 28.270620, + 28.271154, + 28.271687, + 28.272217, + 28.272746, + 28.273272, + 28.273797, + 28.274320, + 28.274842, + 28.275361, + 28.275879, + 28.276395, + 28.276909, + 28.277421, + 28.277932, + 28.278441, + 28.278948, + 28.279453, + 28.279957, + 28.280459, + 28.280959, + 28.281457, + 28.281954, + 28.282449, + 28.282943, + 28.283434, + 28.283924, + 28.284413, + 28.284900, + 28.285385, + 28.285868, + 28.286350, + 28.286830, + 28.287309, + 28.287786, + 28.288261, + 28.288735, + 28.289207, + 28.289678, + 28.290147, + 28.290614, + 28.291080, + 28.291545, + 28.292007, + 28.292469, + 28.292929, + 28.293387, + 28.293843, + 28.294299, + 28.294752, + 28.295205, + 28.295655, + 28.296105, + 28.296552, + 28.296999, + 28.297443, + 28.297887, + 28.298329, + 28.298769, + 28.299208, + 28.299646, + 28.300082, + 28.300517, + 28.300950, + 28.301382, + 28.301812, + 28.302241, + 28.302669, + 28.303095, + 28.303520, + 28.303944, + 28.304366, + 28.304787, + 28.305207, + 28.305625, + 28.306042, + 28.306457, + 28.306871, + 28.307284, + 28.307695, + 28.308106, + 28.308514, + 28.308922, + 28.309328, + 28.309733, + 28.310137, + 28.310539, + 28.310940, + 28.311340, + 28.311739, + 28.312136, + 28.312532, + 28.312927, + 28.313321, + 28.313713, + 28.314104, + 28.314494, + 28.314882, + 28.315270, + 28.315656, + 28.316041, + 28.316425, + 28.316807, + 28.317189, + 28.317569, + 28.317948, + 28.318326, + 28.318703, + 28.319078, + 28.319452, + 28.319826, + 28.320198, + 28.320569, + 28.320938, + 28.321307, + 28.321674, + 28.322041, + 28.322406, + 28.322770, + 28.323133, + 28.323495, + 28.323855, + 28.324215, + 28.324574, + 28.324931, + 28.325287, + 28.325643, + 28.325997, + 28.326350, + 28.326702, + 28.327053, + 28.327403, + 28.327752, + 28.328099, + 28.328446, + 28.328792, + 28.329136, + 28.329480, + 28.329823, + 28.330164, + 28.330505, + 28.330844, + 28.331183, + 28.331520, + 28.331856, + 28.332192, + }, + {// The expectations for dimension = 58 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506666, + 4.681665, + 4.859997, + 5.041662, + 5.226657, + 5.414983, + 5.606636, + 5.801613, + 5.999908, + 6.201514, + 6.406417, + 6.614599, + 6.826038, + 7.040698, + 7.258536, + 7.479494, + 7.703497, + 7.930453, + 8.160249, + 8.392748, + 8.627790, + 8.865189, + 9.104735, + 9.346193, + 9.589305, + 9.833794, + 10.079365, + 10.325712, + 10.572518, + 10.819465, + 11.066233, + 11.312508, + 11.557986, + 11.802373, + 12.045395, + 12.286790, + 12.526321, + 12.763770, + 12.998937, + 13.231649, + 13.461749, + 13.689102, + 13.913592, + 14.135121, + 14.353607, + 14.568984, + 14.781199, + 14.990213, + 15.195997, + 15.398532, + 15.597810, + 15.793830, + 15.986597, + 16.176125, + 16.362431, + 16.545537, + 16.725472, + 16.902265, + 17.075951, + 17.246566, + 17.414150, + 17.578742, + 17.740386, + 17.899125, + 18.055004, + 18.208070, + 18.358368, + 18.505945, + 18.650849, + 18.793126, + 18.932825, + 19.069993, + 19.204676, + 19.336922, + 19.466776, + 19.594286, + 19.719497, + 19.842454, + 19.963202, + 20.081784, + 20.198244, + 20.312625, + 20.424968, + 20.535316, + 20.643709, + 20.750187, + 20.854788, + 20.957553, + 21.058517, + 21.157719, + 21.255196, + 21.350981, + 21.445111, + 21.537619, + 21.628540, + 21.717905, + 21.805747, + 21.892098, + 21.976988, + 22.060446, + 22.142504, + 22.223188, + 22.302528, + 22.380551, + 22.457284, + 22.532753, + 22.606984, + 22.680002, + 22.751831, + 22.822496, + 22.892020, + 22.960426, + 23.027737, + 23.093974, + 23.159159, + 23.223313, + 23.286456, + 23.348608, + 23.409789, + 23.470018, + 23.529314, + 23.587694, + 23.645178, + 23.701781, + 23.757522, + 23.812416, + 23.866481, + 23.919732, + 23.972184, + 24.023854, + 24.074755, + 24.124902, + 24.174310, + 24.222993, + 24.270964, + 24.318236, + 24.364823, + 24.410736, + 24.455989, + 24.500594, + 24.544563, + 24.587907, + 24.630638, + 24.672766, + 24.714303, + 24.755260, + 24.795647, + 24.835473, + 24.874750, + 24.913487, + 24.951693, + 24.989377, + 25.026550, + 25.063220, + 25.099395, + 25.135085, + 25.170298, + 25.205041, + 25.239324, + 25.273154, + 25.306539, + 25.339485, + 25.372002, + 25.404096, + 25.435774, + 25.467043, + 25.497911, + 25.528383, + 25.558466, + 25.588167, + 25.617492, + 25.646448, + 25.675039, + 25.703273, + 25.731155, + 25.758691, + 25.785886, + 25.812746, + 25.839277, + 25.865482, + 25.891369, + 25.916941, + 25.942204, + 25.967162, + 25.991821, + 26.016185, + 26.040259, + 26.064047, + 26.087553, + 26.110782, + 26.133739, + 26.156427, + 26.178850, + 26.201014, + 26.222920, + 26.244574, + 26.265979, + 26.287139, + 26.308058, + 26.328738, + 26.349185, + 26.369401, + 26.389389, + 26.409153, + 26.428697, + 26.448023, + 26.467134, + 26.486035, + 26.504727, + 26.523214, + 26.541498, + 26.559584, + 26.577473, + 26.595168, + 26.612672, + 26.629989, + 26.647119, + 26.664067, + 26.680834, + 26.697423, + 26.713837, + 26.730078, + 26.746148, + 26.762050, + 26.777786, + 26.793359, + 26.808770, + 26.824022, + 26.839117, + 26.854056, + 26.868843, + 26.883480, + 26.897967, + 26.912308, + 26.926504, + 26.940557, + 26.954469, + 26.968242, + 26.981877, + 26.995377, + 27.008743, + 27.021978, + 27.035081, + 27.048057, + 27.060905, + 27.073628, + 27.086228, + 27.098705, + 27.111062, + 27.123299, + 27.135420, + 27.147424, + 27.159313, + 27.171090, + 27.182755, + 27.194309, + 27.205754, + 27.217092, + 27.228324, + 27.239451, + 27.250474, + 27.261394, + 27.272214, + 27.282934, + 27.293555, + 27.304078, + 27.314505, + 27.324837, + 27.335075, + 27.345221, + 27.355274, + 27.365237, + 27.375110, + 27.384895, + 27.394592, + 27.404203, + 27.413728, + 27.423169, + 27.432526, + 27.441801, + 27.450995, + 27.460108, + 27.469141, + 27.478096, + 27.486972, + 27.495772, + 27.504496, + 27.513145, + 27.521719, + 27.530220, + 27.538648, + 27.547005, + 27.555290, + 27.563505, + 27.571651, + 27.579728, + 27.587737, + 27.595679, + 27.603555, + 27.611365, + 27.619110, + 27.626791, + 27.634409, + 27.641963, + 27.649456, + 27.656886, + 27.664257, + 27.671567, + 27.678817, + 27.686009, + 27.693142, + 27.700218, + 27.707237, + 27.714199, + 27.721106, + 27.727957, + 27.734754, + 27.741497, + 27.748187, + 27.754823, + 27.761407, + 27.767939, + 27.774421, + 27.780851, + 27.787231, + 27.793561, + 27.799843, + 27.806075, + 27.812260, + 27.818396, + 27.824486, + 27.830529, + 27.836525, + 27.842476, + 27.848382, + 27.854242, + 27.860059, + 27.865831, + 27.871560, + 27.877245, + 27.882888, + 27.888489, + 27.894048, + 27.899566, + 27.905042, + 27.910478, + 27.915874, + 27.921230, + 27.926547, + 27.931824, + 27.937063, + 27.942264, + 27.947427, + 27.952552, + 27.957640, + 27.962691, + 27.967706, + 27.972685, + 27.977628, + 27.982535, + 27.987407, + 27.992245, + 27.997048, + 28.001817, + 28.006552, + 28.011254, + 28.015923, + 28.020559, + 28.025162, + 28.029733, + 28.034272, + 28.038779, + 28.043255, + 28.047700, + 28.052114, + 28.056498, + 28.060852, + 28.065175, + 28.069469, + 28.073734, + 28.077969, + 28.082175, + 28.086353, + 28.090503, + 28.094624, + 28.098718, + 28.102784, + 28.106822, + 28.110834, + 28.114819, + 28.118777, + 28.122708, + 28.126614, + 28.130493, + 28.134347, + 28.138176, + 28.141979, + 28.145757, + 28.149510, + 28.153239, + 28.156943, + 28.160623, + 28.164280, + 28.167912, + 28.171521, + 28.175107, + 28.178669, + 28.182208, + 28.185725, + 28.189219, + 28.192691, + 28.196141, + 28.199568, + 28.202974, + 28.206358, + 28.209721, + 28.213063, + 28.216383, + 28.219683, + 28.222961, + 28.226220, + 28.229458, + 28.232675, + 28.235873, + 28.239050, + 28.242209, + 28.245347, + 28.248466, + 28.251566, + 28.254647, + 28.257708, + 28.260751, + 28.263776, + 28.266782, + 28.269769, + 28.272739, + 28.275690, + 28.278624, + 28.281540, + 28.284438, + 28.287319, + 28.290182, + 28.293029, + 28.295858, + 28.298670, + 28.301466, + 28.304245, + 28.307007, + 28.309754, + 28.312483, + 28.315197, + 28.317895, + 28.320577, + 28.323243, + 28.325894, + 28.328529, + 28.331148, + 28.333753, + 28.336342, + 28.338916, + 28.341476, + 28.344020, + 28.346550, + 28.349065, + 28.351566, + 28.354053, + 28.356525, + 28.358983, + 28.361427, + 28.363857, + 28.366274, + 28.368676, + 28.371065, + 28.373441, + 28.375803, + 28.378152, + 28.380488, + 28.382810, + 28.385120, + 28.387417, + 28.389700, + 28.391972, + 28.394230, + 28.396476, + 28.398710, + 28.400931, + 28.403140, + 28.405337, + 28.407521, + 28.409694, + 28.411855, + 28.414004, + 28.416141, + 28.418267, + 28.420381, + 28.422483, + 28.424575, + 28.426655, + 28.428723, + 28.430781, + 28.432827, + 28.434863, + 28.436887, + 28.438901, + 28.440904, + 28.442896, + 28.444878, + 28.446849, + 28.448810, + 28.450760, + 28.452700, + 28.454630, + 28.456549, + 28.458459, + 28.460358, + 28.462248, + 28.464127, + 28.465997, + 28.467857, + 28.469708, + 28.471548, + 28.473380, + 28.475201, + 28.477014, + 28.478817, + 28.480610, + 28.482395, + 28.484170, + 28.485936, + 28.487693, + 28.489442, + 28.491181, + 28.492911, + 28.494633, + 28.496346, + 28.498050, + 28.499746, + 28.501433, + 28.503111, + 28.504781, + 28.506443, + 28.508096, + 28.509742, + 28.511378, + 28.513007, + 28.514628, + 28.516240, + 28.517845, + 28.519441, + 28.521030, + 28.522611, + 28.524184, + 28.525749, + 28.527307, + 28.528857, + 28.530399, + 28.531934, + 28.533461, + 28.534981, + 28.536493, + 28.537998, + 28.539496, + 28.540987, + 28.542470, + 28.543946, + 28.545415, + 28.546877, + 28.548332, + 28.549780, + 28.551221, + 28.552655, + 28.554083, + 28.555503, + 28.556917, + 28.558324, + 28.559724, + 28.561118, + 28.562505, + 28.563885, + 28.565259, + 28.566627, + 28.567988, + 28.569342, + 28.570691, + 28.572033, + 28.573369, + 28.574698, + 28.576022, + 28.577339, + 28.578650, + 28.579955, + 28.581254, + 28.582547, + 28.583834, + 28.585115, + 28.586390, + 28.587659, + 28.588923, + 28.590180, + 28.591432, + 28.592678, + 28.593919, + 28.595154, + 28.596383, + 28.597607, + 28.598825, + 28.600037, + 28.601244, + 28.602446, + 28.603642, + 28.604833, + 28.606019, + 28.607199, + 28.608374, + 28.609544, + 28.610708, + 28.611867, + 28.613021, + 28.614170, + 28.615314, + 28.616453, + 28.617587, + 28.618715, + 28.619839, + 28.620958, + 28.622072, + 28.623181, + 28.624285, + 28.625384, + 28.626479, + 28.627568, + 28.628653, + 28.629734, + 28.630809, + 28.631880, + 28.632946, + 28.634008, + 28.635065, + 28.636117, + 28.637165, + 28.638208, + 28.639247, + 28.640282, + 28.641311, + 28.642337, + 28.643358, + 28.644375, + 28.645388, + 28.646396, + 28.647400, + 28.648399, + 28.649395, + 28.650386, + 28.651373, + 28.652355, + 28.653334, + 28.654309, + 28.655279, + 28.656245, + 28.657208, + 28.658166, + 28.659120, + 28.660071, + 28.661017, + 28.661959, + 28.662898, + 28.663832, + 28.664763, + 28.665690, + 28.666613, + 28.667532, + 28.668448, + 28.669359, + 28.670267, + 28.671171, + 28.672072, + 28.672968, + 28.673862, + 28.674751, + 28.675637, + 28.676519, + 28.677398, + 28.678273, + 28.679144, + 28.680012, + 28.680877, + 28.681738, + 28.682595, + 28.683449, + 28.684300, + 28.685147, + 28.685991, + 28.686831, + 28.687668, + 28.688502, + 28.689332, + 28.690159, + 28.690983, + 28.691803, + 28.692620, + 28.693434, + 28.694245, + 28.695053, + 28.695857, + 28.696658, + 28.697456, + 28.698251, + 28.699043, + 28.699831, + 28.700617, + 28.701399, + 28.702179, + 28.702955, + 28.703728, + 28.704499, + 28.705266, + 28.706030, + 28.706792, + 28.707550, + 28.708306, + 28.709058, + 28.709808, + 28.710555, + 28.711299, + 28.712040, + 28.712778, + 28.713513, + 28.714246, + 28.714975, + 28.715702, + 28.716427, + 28.717148, + 28.717867, + 28.718583, + 28.719296, + 28.720006, + 28.720714, + 28.721419, + 28.722122, + 28.722822, + 28.723519, + 28.724213, + 28.724905, + 28.725595, + 28.726281, + 28.726966, + 28.727647, + 28.728326, + 28.729003, + 28.729677, + 28.730348, + 28.731018, + 28.731684, + 28.732348, + 28.733010, + 28.733669, + 28.734326, + 28.734980, + 28.735632, + 28.736281, + 28.736929, + 28.737573, + 28.738216, + 28.738856, + 28.739493, + 28.740129, + 28.740762, + 28.741392, + 28.742021, + 28.742647, + 28.743271, + 28.743892, + 28.744512, + 28.745129, + 28.745744, + 28.746356, + 28.746967, + 28.747575, + 28.748181, + 28.748785, + 28.749387, + 28.749986, + 28.750584, + 28.751179, + 28.751772, + 28.752363, + 28.752952, + 28.753539, + 28.754124, + 28.754706, + 28.755287, + 28.755865, + 28.756442, + 28.757016, + 28.757589, + 28.758159, + 28.758728, + 28.759294, + 28.759858, + 28.760421, + 28.760981, + 28.761540, + 28.762096, + 28.762651, + 28.763204, + 28.763754, + 28.764303, + 28.764850, + 28.765395, + 28.765938, + 28.766479, + 28.767019, + 28.767556, + 28.768092, + 28.768626, + 28.769158, + 28.769688, + 28.770216, + 28.770743, + 28.771267, + 28.771790, + 28.772311, + 28.772831, + 28.773348, + 28.773864, + 28.774378, + 28.774890, + 28.775401, + 28.775910, + 28.776417, + 28.776922, + 28.777426, + 28.777928, + 28.778428, + 28.778926, + 28.779423, + 28.779918, + 28.780412, + 28.780904, + 28.781394, + 28.781883, + 28.782370, + 28.782855, + 28.783339, + 28.783821, + 28.784301, + 28.784780, + 28.785258, + 28.785733, + 28.786207, + 28.786680, + 28.787151, + 28.787620, + 28.788088, + 28.788555, + 28.789020, + 28.789483, + 28.789945, + 28.790405, + 28.790864, + 28.791321, + 28.791777, + 28.792231, + 28.792684, + 28.793135, + 28.793585, + 28.794033, + 28.794480, + 28.794925, + 28.795369, + 28.795812, + 28.796253, + 28.796693, + 28.797131, + 28.797568, + 28.798003, + 28.798437, + 28.798870, + 28.799301, + 28.799731, + 28.800160, + 28.800587, + 28.801013, + 28.801437, + 28.801860, + 28.802282, + 28.802702, + 28.803121, + 28.803539, + 28.803955, + 28.804370, + 28.804784, + 28.805196, + 28.805608, + 28.806017, + 28.806426, + 28.806833, + 28.807239, + 28.807644, + 28.808047, + 28.808449, + 28.808850, + 28.809250, + 28.809648, + 28.810045, + 28.810441, + 28.810836, + 28.811229, + 28.811621, + 28.812012, + 28.812402, + 28.812791, + 28.813178, + 28.813564, + 28.813949, + 28.814333, + 28.814715, + 28.815097, + 28.815477, + 28.815856, + 28.816234, + 28.816610, + 28.816986, + 28.817360, + 28.817734, + 28.818106, + 28.818477, + 28.818847, + 28.819215, + 28.819583, + 28.819949, + 28.820315, + 28.820679, + 28.821042, + 28.821404, + 28.821765, + 28.822125, + 28.822484, + 28.822841, + 28.823198, + 28.823554, + 28.823908, + 28.824261, + 28.824614, + 28.824965, + 28.825315, + 28.825664, + 28.826013, + 28.826360, + }, + {// The expectations for dimension = 59 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506666, + 4.681666, + 4.859998, + 5.041663, + 5.226660, + 5.414988, + 5.606646, + 5.801630, + 5.999936, + 6.201558, + 6.406486, + 6.614707, + 6.826200, + 7.040939, + 7.258887, + 7.479996, + 7.704202, + 7.931426, + 8.161569, + 8.394510, + 8.630107, + 8.868190, + 9.108568, + 9.351020, + 9.595307, + 9.841163, + 10.088307, + 10.336440, + 10.585253, + 10.834429, + 11.083648, + 11.332594, + 11.580955, + 11.828430, + 12.074732, + 12.319591, + 12.562752, + 12.803984, + 13.043074, + 13.279831, + 13.514086, + 13.745689, + 13.974511, + 14.200439, + 14.423381, + 14.643259, + 14.860010, + 15.073584, + 15.283945, + 15.491067, + 15.694932, + 15.895534, + 16.092873, + 16.286956, + 16.477796, + 16.665413, + 16.849829, + 17.031072, + 17.209173, + 17.384166, + 17.556087, + 17.724976, + 17.890874, + 18.053822, + 18.213864, + 18.371045, + 18.525412, + 18.677008, + 18.825883, + 18.972081, + 19.115651, + 19.256639, + 19.395092, + 19.531058, + 19.664582, + 19.795712, + 19.924492, + 20.050969, + 20.175186, + 20.297190, + 20.417022, + 20.534726, + 20.650346, + 20.763922, + 20.875496, + 20.985108, + 21.092799, + 21.198606, + 21.302569, + 21.404725, + 21.505112, + 21.603764, + 21.700719, + 21.796010, + 21.889671, + 21.981737, + 22.072239, + 22.161210, + 22.248681, + 22.334683, + 22.419246, + 22.502399, + 22.584170, + 22.664589, + 22.743681, + 22.821475, + 22.897997, + 22.973272, + 23.047325, + 23.120181, + 23.191864, + 23.262398, + 23.331805, + 23.400108, + 23.467329, + 23.533489, + 23.598609, + 23.662710, + 23.725811, + 23.787934, + 23.849095, + 23.909315, + 23.968611, + 24.027002, + 24.084504, + 24.141136, + 24.196913, + 24.251853, + 24.305970, + 24.359281, + 24.411801, + 24.463545, + 24.514527, + 24.564762, + 24.614264, + 24.663046, + 24.711123, + 24.758505, + 24.805208, + 24.851243, + 24.896622, + 24.941357, + 24.985460, + 25.028943, + 25.071817, + 25.114092, + 25.155780, + 25.196891, + 25.237434, + 25.277421, + 25.316862, + 25.355765, + 25.394140, + 25.431996, + 25.469343, + 25.506190, + 25.542544, + 25.578415, + 25.613811, + 25.648739, + 25.683209, + 25.717227, + 25.750801, + 25.783940, + 25.816650, + 25.848938, + 25.880811, + 25.912277, + 25.943342, + 25.974013, + 26.004296, + 26.034197, + 26.063723, + 26.092881, + 26.121675, + 26.150112, + 26.178198, + 26.205938, + 26.233338, + 26.260403, + 26.287138, + 26.313550, + 26.339642, + 26.365420, + 26.390889, + 26.416054, + 26.440919, + 26.465489, + 26.489769, + 26.513763, + 26.537475, + 26.560910, + 26.584072, + 26.606966, + 26.629595, + 26.651963, + 26.674074, + 26.695932, + 26.717541, + 26.738905, + 26.760027, + 26.780910, + 26.801559, + 26.821977, + 26.842166, + 26.862132, + 26.881876, + 26.901401, + 26.920712, + 26.939812, + 26.958702, + 26.977387, + 26.995868, + 27.014150, + 27.032235, + 27.050125, + 27.067824, + 27.085334, + 27.102658, + 27.119798, + 27.136757, + 27.153537, + 27.170141, + 27.186571, + 27.202830, + 27.218921, + 27.234844, + 27.250603, + 27.266200, + 27.281637, + 27.296916, + 27.312040, + 27.327009, + 27.341828, + 27.356496, + 27.371017, + 27.385393, + 27.399625, + 27.413715, + 27.427665, + 27.441477, + 27.455152, + 27.468693, + 27.482101, + 27.495378, + 27.508526, + 27.521546, + 27.534440, + 27.547209, + 27.559856, + 27.572381, + 27.584786, + 27.597073, + 27.609243, + 27.621297, + 27.633238, + 27.645066, + 27.656783, + 27.668390, + 27.679889, + 27.691281, + 27.702567, + 27.713749, + 27.724827, + 27.735804, + 27.746679, + 27.757456, + 27.768134, + 27.778715, + 27.789200, + 27.799590, + 27.809886, + 27.820091, + 27.830203, + 27.840225, + 27.850158, + 27.860003, + 27.869760, + 27.879432, + 27.889018, + 27.898520, + 27.907938, + 27.917275, + 27.926530, + 27.935704, + 27.944800, + 27.953816, + 27.962755, + 27.971618, + 27.980404, + 27.989115, + 27.997752, + 28.006316, + 28.014807, + 28.023227, + 28.031575, + 28.039853, + 28.048063, + 28.056203, + 28.064275, + 28.072281, + 28.080220, + 28.088094, + 28.095902, + 28.103647, + 28.111327, + 28.118945, + 28.126501, + 28.133996, + 28.141429, + 28.148803, + 28.156117, + 28.163372, + 28.170569, + 28.177708, + 28.184790, + 28.191816, + 28.198786, + 28.205700, + 28.212560, + 28.219366, + 28.226119, + 28.232818, + 28.239465, + 28.246060, + 28.252604, + 28.259097, + 28.265539, + 28.271932, + 28.278276, + 28.284571, + 28.290817, + 28.297016, + 28.303167, + 28.309272, + 28.315330, + 28.321343, + 28.327310, + 28.333232, + 28.339109, + 28.344942, + 28.350732, + 28.356479, + 28.362182, + 28.367844, + 28.373463, + 28.379041, + 28.384578, + 28.390074, + 28.395530, + 28.400946, + 28.406322, + 28.411659, + 28.416957, + 28.422217, + 28.427439, + 28.432623, + 28.437770, + 28.442879, + 28.447953, + 28.452990, + 28.457991, + 28.462956, + 28.467886, + 28.472781, + 28.477642, + 28.482468, + 28.487261, + 28.492020, + 28.496745, + 28.501438, + 28.506097, + 28.510725, + 28.515320, + 28.519883, + 28.524415, + 28.528916, + 28.533386, + 28.537825, + 28.542233, + 28.546612, + 28.550961, + 28.555280, + 28.559570, + 28.563830, + 28.568063, + 28.572266, + 28.576441, + 28.580589, + 28.584708, + 28.588800, + 28.592865, + 28.596902, + 28.600913, + 28.604897, + 28.608855, + 28.612787, + 28.616693, + 28.620574, + 28.624429, + 28.628258, + 28.632063, + 28.635843, + 28.639598, + 28.643329, + 28.647036, + 28.650719, + 28.654379, + 28.658015, + 28.661627, + 28.665216, + 28.668783, + 28.672327, + 28.675848, + 28.679347, + 28.682823, + 28.686278, + 28.689711, + 28.693122, + 28.696512, + 28.699881, + 28.703228, + 28.706555, + 28.709861, + 28.713146, + 28.716411, + 28.719656, + 28.722881, + 28.726086, + 28.729271, + 28.732437, + 28.735583, + 28.738710, + 28.741818, + 28.744906, + 28.747977, + 28.751028, + 28.754061, + 28.757076, + 28.760072, + 28.763051, + 28.766011, + 28.768954, + 28.771879, + 28.774787, + 28.777678, + 28.780551, + 28.783407, + 28.786246, + 28.789069, + 28.791875, + 28.794664, + 28.797437, + 28.800193, + 28.802934, + 28.805658, + 28.808367, + 28.811059, + 28.813737, + 28.816398, + 28.819044, + 28.821675, + 28.824291, + 28.826892, + 28.829477, + 28.832048, + 28.834604, + 28.837146, + 28.839673, + 28.842186, + 28.844684, + 28.847168, + 28.849638, + 28.852095, + 28.854537, + 28.856965, + 28.859380, + 28.861782, + 28.864170, + 28.866544, + 28.868906, + 28.871254, + 28.873589, + 28.875912, + 28.878221, + 28.880518, + 28.882801, + 28.885073, + 28.887332, + 28.889578, + 28.891812, + 28.894034, + 28.896244, + 28.898442, + 28.900628, + 28.902802, + 28.904964, + 28.907115, + 28.909254, + 28.911381, + 28.913497, + 28.915602, + 28.917695, + 28.919777, + 28.921848, + 28.923908, + 28.925957, + 28.927995, + 28.930022, + 28.932039, + 28.934045, + 28.936040, + 28.938025, + 28.939999, + 28.941963, + 28.943917, + 28.945861, + 28.947794, + 28.949717, + 28.951630, + 28.953534, + 28.955427, + 28.957311, + 28.959185, + 28.961049, + 28.962904, + 28.964749, + 28.966584, + 28.968411, + 28.970228, + 28.972035, + 28.973834, + 28.975623, + 28.977403, + 28.979174, + 28.980936, + 28.982689, + 28.984434, + 28.986169, + 28.987896, + 28.989615, + 28.991324, + 28.993025, + 28.994718, + 28.996402, + 28.998077, + 28.999745, + 29.001404, + 29.003055, + 29.004697, + 29.006332, + 29.007959, + 29.009577, + 29.011188, + 29.012790, + 29.014385, + 29.015972, + 29.017551, + 29.019123, + 29.020687, + 29.022243, + 29.023792, + 29.025333, + 29.026867, + 29.028393, + 29.029912, + 29.031424, + 29.032928, + 29.034425, + 29.035915, + 29.037398, + 29.038874, + 29.040343, + 29.041805, + 29.043259, + 29.044707, + 29.046148, + 29.047583, + 29.049010, + 29.050431, + 29.051845, + 29.053252, + 29.054653, + 29.056047, + 29.057435, + 29.058816, + 29.060191, + 29.061559, + 29.062921, + 29.064277, + 29.065626, + 29.066970, + 29.068307, + 29.069637, + 29.070962, + 29.072280, + 29.073593, + 29.074899, + 29.076200, + 29.077494, + 29.078783, + 29.080066, + 29.081343, + 29.082614, + 29.083879, + 29.085139, + 29.086392, + 29.087641, + 29.088883, + 29.090120, + 29.091352, + 29.092577, + 29.093798, + 29.095013, + 29.096222, + 29.097426, + 29.098625, + 29.099818, + 29.101007, + 29.102189, + 29.103367, + 29.104539, + 29.105706, + 29.106868, + 29.108025, + 29.109177, + 29.110324, + 29.111465, + 29.112602, + 29.113734, + 29.114861, + 29.115983, + 29.117100, + 29.118212, + 29.119319, + 29.120421, + 29.121519, + 29.122612, + 29.123700, + 29.124784, + 29.125863, + 29.126937, + 29.128007, + 29.129072, + 29.130132, + 29.131188, + 29.132240, + 29.133287, + 29.134329, + 29.135367, + 29.136401, + 29.137430, + 29.138455, + 29.139476, + 29.140492, + 29.141504, + 29.142511, + 29.143515, + 29.144514, + 29.145509, + 29.146500, + 29.147487, + 29.148470, + 29.149448, + 29.150423, + 29.151393, + 29.152360, + 29.153322, + 29.154280, + 29.155235, + 29.156185, + 29.157132, + 29.158075, + 29.159013, + 29.159948, + 29.160880, + 29.161807, + 29.162730, + 29.163650, + 29.164566, + 29.165478, + 29.166387, + 29.167292, + 29.168193, + 29.169090, + 29.169984, + 29.170875, + 29.171761, + 29.172644, + 29.173524, + 29.174400, + 29.175273, + 29.176142, + 29.177007, + 29.177869, + 29.178728, + 29.179583, + 29.180435, + 29.181283, + 29.182128, + 29.182970, + 29.183808, + 29.184643, + 29.185475, + 29.186304, + 29.187129, + 29.187951, + 29.188769, + 29.189585, + 29.190397, + 29.191206, + 29.192012, + 29.192815, + 29.193615, + 29.194411, + 29.195205, + 29.195995, + 29.196783, + 29.197567, + 29.198348, + 29.199126, + 29.199901, + 29.200674, + 29.201443, + 29.202209, + 29.202973, + 29.203733, + 29.204491, + 29.205245, + 29.205997, + 29.206746, + 29.207492, + 29.208235, + 29.208975, + 29.209713, + 29.210447, + 29.211179, + 29.211909, + 29.212635, + 29.213359, + 29.214080, + 29.214798, + 29.215513, + 29.216226, + 29.216936, + 29.217644, + 29.218349, + 29.219051, + 29.219751, + 29.220448, + 29.221142, + 29.221834, + 29.222523, + 29.223210, + 29.223894, + 29.224576, + 29.225255, + 29.225932, + 29.226606, + 29.227277, + 29.227946, + 29.228613, + 29.229277, + 29.229939, + 29.230599, + 29.231256, + 29.231910, + 29.232563, + 29.233212, + 29.233860, + 29.234505, + 29.235148, + 29.235788, + 29.236426, + 29.237062, + 29.237696, + 29.238327, + 29.238956, + 29.239583, + 29.240207, + 29.240829, + 29.241449, + 29.242067, + 29.242683, + 29.243296, + 29.243907, + 29.244516, + 29.245123, + 29.245728, + 29.246330, + 29.246931, + 29.247529, + 29.248125, + 29.248719, + 29.249311, + 29.249901, + 29.250489, + 29.251075, + 29.251658, + 29.252240, + 29.252819, + 29.253397, + 29.253972, + 29.254546, + 29.255117, + 29.255687, + 29.256254, + 29.256820, + 29.257384, + 29.257945, + 29.258505, + 29.259063, + 29.259619, + 29.260172, + 29.260724, + 29.261275, + 29.261823, + 29.262369, + 29.262914, + 29.263456, + 29.263997, + 29.264536, + 29.265073, + 29.265608, + 29.266141, + 29.266673, + 29.267203, + 29.267731, + 29.268257, + 29.268781, + 29.269304, + 29.269824, + 29.270344, + 29.270861, + 29.271376, + 29.271890, + 29.272402, + 29.272913, + 29.273421, + 29.273928, + 29.274434, + 29.274937, + 29.275439, + 29.275939, + 29.276438, + 29.276935, + 29.277430, + 29.277924, + 29.278415, + 29.278906, + 29.279394, + 29.279882, + 29.280367, + 29.280851, + 29.281333, + 29.281814, + 29.282293, + 29.282770, + 29.283246, + 29.283721, + 29.284194, + 29.284665, + 29.285135, + 29.285603, + 29.286070, + 29.286535, + 29.286998, + 29.287461, + 29.287921, + 29.288380, + 29.288838, + 29.289294, + 29.289749, + 29.290202, + 29.290654, + 29.291104, + 29.291553, + 29.292000, + 29.292446, + 29.292891, + 29.293334, + 29.293776, + 29.294216, + 29.294655, + 29.295092, + 29.295529, + 29.295963, + 29.296397, + 29.296829, + 29.297259, + 29.297688, + 29.298116, + 29.298543, + 29.298968, + 29.299392, + 29.299814, + 29.300235, + 29.300655, + 29.301073, + 29.301491, + 29.301906, + 29.302321, + 29.302734, + 29.303146, + 29.303557, + 29.303966, + 29.304374, + 29.304781, + 29.305187, + 29.305591, + 29.305994, + 29.306396, + 29.306796, + 29.307196, + 29.307594, + 29.307991, + 29.308386, + 29.308781, + 29.309174, + 29.309566, + 29.309957, + 29.310346, + 29.310734, + 29.311122, + 29.311508, + 29.311892, + 29.312276, + 29.312659, + 29.313040, + 29.313420, + 29.313799, + 29.314177, + 29.314553, + 29.314929, + 29.315303, + 29.315677, + 29.316049, + 29.316420, + 29.316790, + 29.317158, + 29.317526, + 29.317893, + 29.318258, + 29.318622, + 29.318986, + 29.319348, + 29.319709, + 29.320069, + 29.320428, + }, + {// The expectations for dimension = 60 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506666, + 4.681666, + 4.859999, + 5.041665, + 5.226663, + 5.414992, + 5.606652, + 5.801641, + 5.999955, + 6.201589, + 6.406537, + 6.614786, + 6.826322, + 7.041123, + 7.259159, + 7.480388, + 7.704759, + 7.932204, + 8.162636, + 8.395950, + 8.632020, + 8.870692, + 9.111792, + 9.355118, + 9.600446, + 9.847525, + 10.096087, + 10.345844, + 10.596495, + 10.847727, + 11.099223, + 11.350665, + 11.601738, + 11.852133, + 12.101555, + 12.349720, + 12.596365, + 12.841241, + 13.084124, + 13.324807, + 13.563106, + 13.798858, + 14.031917, + 14.262162, + 14.489484, + 14.713795, + 14.935020, + 15.153102, + 15.367993, + 15.579660, + 15.788077, + 15.993231, + 16.195117, + 16.393735, + 16.589094, + 16.781208, + 16.970096, + 17.155783, + 17.338297, + 17.517667, + 17.693930, + 17.867120, + 18.037279, + 18.204445, + 18.368661, + 18.529971, + 18.688420, + 18.844052, + 18.996914, + 19.147051, + 19.294511, + 19.439340, + 19.581585, + 19.721293, + 19.858510, + 19.993282, + 20.125656, + 20.255677, + 20.383390, + 20.508840, + 20.632070, + 20.753125, + 20.872046, + 20.988877, + 21.103660, + 21.216434, + 21.327240, + 21.436118, + 21.543107, + 21.648245, + 21.751569, + 21.853116, + 21.952923, + 22.051024, + 22.147454, + 22.242247, + 22.335437, + 22.427056, + 22.517136, + 22.605708, + 22.692803, + 22.778450, + 22.862680, + 22.945520, + 23.027000, + 23.107145, + 23.185983, + 23.263541, + 23.339844, + 23.414917, + 23.488784, + 23.561470, + 23.632998, + 23.703392, + 23.772673, + 23.840863, + 23.907985, + 23.974058, + 24.039104, + 24.103142, + 24.166193, + 24.228275, + 24.289407, + 24.349608, + 24.408895, + 24.467285, + 24.524797, + 24.581447, + 24.637250, + 24.692224, + 24.746384, + 24.799745, + 24.852322, + 24.904130, + 24.955184, + 25.005496, + 25.055081, + 25.103953, + 25.152124, + 25.199608, + 25.246416, + 25.292562, + 25.338057, + 25.382912, + 25.427141, + 25.470752, + 25.513759, + 25.556172, + 25.598000, + 25.639255, + 25.679946, + 25.720085, + 25.759679, + 25.798739, + 25.837274, + 25.875293, + 25.912805, + 25.949819, + 25.986343, + 26.022386, + 26.057956, + 26.093060, + 26.127708, + 26.161906, + 26.195662, + 26.228983, + 26.261877, + 26.294351, + 26.326412, + 26.358066, + 26.389321, + 26.420182, + 26.450657, + 26.480751, + 26.510471, + 26.539823, + 26.568812, + 26.597445, + 26.625727, + 26.653664, + 26.681261, + 26.708523, + 26.735457, + 26.762067, + 26.788358, + 26.814335, + 26.840003, + 26.865368, + 26.890432, + 26.915202, + 26.939681, + 26.963875, + 26.987787, + 27.011422, + 27.034783, + 27.057876, + 27.080704, + 27.103271, + 27.125581, + 27.147638, + 27.169445, + 27.191006, + 27.212326, + 27.233407, + 27.254252, + 27.274867, + 27.295252, + 27.315413, + 27.335352, + 27.355073, + 27.374578, + 27.393871, + 27.412955, + 27.431832, + 27.450506, + 27.468979, + 27.487255, + 27.505336, + 27.523225, + 27.540924, + 27.558436, + 27.575764, + 27.592910, + 27.609877, + 27.626667, + 27.643283, + 27.659727, + 27.676001, + 27.692107, + 27.708049, + 27.723828, + 27.739446, + 27.754906, + 27.770209, + 27.785357, + 27.800354, + 27.815200, + 27.829898, + 27.844449, + 27.858856, + 27.873121, + 27.887245, + 27.901230, + 27.915077, + 27.928790, + 27.942369, + 27.955816, + 27.969133, + 27.982321, + 27.995382, + 28.008319, + 28.021131, + 28.033821, + 28.046391, + 28.058842, + 28.071174, + 28.083391, + 28.095493, + 28.107482, + 28.119359, + 28.131125, + 28.142783, + 28.154332, + 28.165775, + 28.177112, + 28.188346, + 28.199477, + 28.210506, + 28.221436, + 28.232266, + 28.242998, + 28.253634, + 28.264174, + 28.274620, + 28.284972, + 28.295232, + 28.305401, + 28.315480, + 28.325470, + 28.335372, + 28.345187, + 28.354917, + 28.364561, + 28.374121, + 28.383599, + 28.392994, + 28.402308, + 28.411542, + 28.420697, + 28.429773, + 28.438772, + 28.447694, + 28.456540, + 28.465312, + 28.474009, + 28.482634, + 28.491185, + 28.499666, + 28.508075, + 28.516414, + 28.524684, + 28.532886, + 28.541019, + 28.549086, + 28.557087, + 28.565021, + 28.572891, + 28.580697, + 28.588439, + 28.596119, + 28.603736, + 28.611292, + 28.618787, + 28.626222, + 28.633597, + 28.640914, + 28.648172, + 28.655373, + 28.662516, + 28.669603, + 28.676634, + 28.683610, + 28.690532, + 28.697399, + 28.704212, + 28.710973, + 28.717681, + 28.724337, + 28.730941, + 28.737495, + 28.743998, + 28.750452, + 28.756856, + 28.763211, + 28.769518, + 28.775777, + 28.781989, + 28.788154, + 28.794272, + 28.800345, + 28.806371, + 28.812353, + 28.818290, + 28.824183, + 28.830032, + 28.835838, + 28.841601, + 28.847322, + 28.853000, + 28.858637, + 28.864232, + 28.869787, + 28.875301, + 28.880775, + 28.886210, + 28.891605, + 28.896961, + 28.902279, + 28.907558, + 28.912800, + 28.918004, + 28.923171, + 28.928301, + 28.933395, + 28.938453, + 28.943475, + 28.948462, + 28.953413, + 28.958330, + 28.963213, + 28.968061, + 28.972875, + 28.977657, + 28.982405, + 28.987120, + 28.991802, + 28.996452, + 29.001071, + 29.005657, + 29.010212, + 29.014737, + 29.019230, + 29.023693, + 29.028125, + 29.032528, + 29.036900, + 29.041244, + 29.045558, + 29.049843, + 29.054099, + 29.058327, + 29.062527, + 29.066699, + 29.070844, + 29.074960, + 29.079050, + 29.083113, + 29.087149, + 29.091158, + 29.095141, + 29.099098, + 29.103030, + 29.106936, + 29.110816, + 29.114671, + 29.118502, + 29.122307, + 29.126088, + 29.129845, + 29.133578, + 29.137287, + 29.140972, + 29.144634, + 29.148272, + 29.151887, + 29.155480, + 29.159050, + 29.162597, + 29.166122, + 29.169624, + 29.173105, + 29.176564, + 29.180002, + 29.183418, + 29.186813, + 29.190187, + 29.193539, + 29.196872, + 29.200183, + 29.203475, + 29.206746, + 29.209997, + 29.213228, + 29.216439, + 29.219631, + 29.222803, + 29.225957, + 29.229091, + 29.232206, + 29.235302, + 29.238380, + 29.241439, + 29.244480, + 29.247503, + 29.250508, + 29.253494, + 29.256464, + 29.259415, + 29.262349, + 29.265265, + 29.268165, + 29.271047, + 29.273912, + 29.276761, + 29.279593, + 29.282408, + 29.285207, + 29.287989, + 29.290756, + 29.293506, + 29.296241, + 29.298959, + 29.301662, + 29.304349, + 29.307021, + 29.309678, + 29.312319, + 29.314946, + 29.317557, + 29.320154, + 29.322735, + 29.325303, + 29.327855, + 29.330393, + 29.332917, + 29.335427, + 29.337922, + 29.340404, + 29.342871, + 29.345325, + 29.347766, + 29.350192, + 29.352605, + 29.355005, + 29.357392, + 29.359765, + 29.362125, + 29.364472, + 29.366806, + 29.369128, + 29.371437, + 29.373733, + 29.376017, + 29.378288, + 29.380547, + 29.382793, + 29.385028, + 29.387250, + 29.389460, + 29.391659, + 29.393845, + 29.396020, + 29.398183, + 29.400335, + 29.402475, + 29.404604, + 29.406721, + 29.408828, + 29.410923, + 29.413006, + 29.415079, + 29.417141, + 29.419192, + 29.421233, + 29.423262, + 29.425281, + 29.427290, + 29.429288, + 29.431275, + 29.433252, + 29.435219, + 29.437176, + 29.439123, + 29.441059, + 29.442986, + 29.444902, + 29.446809, + 29.448706, + 29.450593, + 29.452471, + 29.454339, + 29.456197, + 29.458046, + 29.459886, + 29.461716, + 29.463537, + 29.465349, + 29.467152, + 29.468945, + 29.470730, + 29.472506, + 29.474272, + 29.476030, + 29.477779, + 29.479520, + 29.481251, + 29.482974, + 29.484689, + 29.486395, + 29.488093, + 29.489782, + 29.491463, + 29.493135, + 29.494800, + 29.496456, + 29.498104, + 29.499744, + 29.501376, + 29.503000, + 29.504616, + 29.506225, + 29.507825, + 29.509418, + 29.511003, + 29.512580, + 29.514150, + 29.515712, + 29.517267, + 29.518814, + 29.520354, + 29.521887, + 29.523412, + 29.524930, + 29.526440, + 29.527944, + 29.529440, + 29.530930, + 29.532412, + 29.533887, + 29.535355, + 29.536817, + 29.538271, + 29.539719, + 29.541160, + 29.542594, + 29.544021, + 29.545442, + 29.546856, + 29.548264, + 29.549665, + 29.551059, + 29.552447, + 29.553829, + 29.555204, + 29.556573, + 29.557936, + 29.559292, + 29.560642, + 29.561986, + 29.563324, + 29.564656, + 29.565981, + 29.567301, + 29.568615, + 29.569922, + 29.571224, + 29.572520, + 29.573810, + 29.575094, + 29.576372, + 29.577645, + 29.578912, + 29.580173, + 29.581429, + 29.582679, + 29.583923, + 29.585162, + 29.586395, + 29.587623, + 29.588845, + 29.590062, + 29.591274, + 29.592480, + 29.593681, + 29.594877, + 29.596067, + 29.597252, + 29.598432, + 29.599607, + 29.600776, + 29.601941, + 29.603100, + 29.604255, + 29.605404, + 29.606548, + 29.607688, + 29.608822, + 29.609952, + 29.611076, + 29.612196, + 29.613311, + 29.614421, + 29.615527, + 29.616627, + 29.617723, + 29.618815, + 29.619901, + 29.620983, + 29.622061, + 29.623134, + 29.624202, + 29.625266, + 29.626325, + 29.627380, + 29.628430, + 29.629476, + 29.630517, + 29.631554, + 29.632587, + 29.633615, + 29.634640, + 29.635659, + 29.636675, + 29.637686, + 29.638693, + 29.639696, + 29.640695, + 29.641690, + 29.642680, + 29.643667, + 29.644649, + 29.645627, + 29.646602, + 29.647572, + 29.648538, + 29.649500, + 29.650459, + 29.651413, + 29.652364, + 29.653310, + 29.654253, + 29.655192, + 29.656127, + 29.657059, + 29.657986, + 29.658910, + 29.659830, + 29.660747, + 29.661659, + 29.662568, + 29.663474, + 29.664375, + 29.665274, + 29.666168, + 29.667059, + 29.667946, + 29.668830, + 29.669711, + 29.670587, + 29.671461, + 29.672331, + 29.673197, + 29.674060, + 29.674920, + 29.675776, + 29.676629, + 29.677478, + 29.678324, + 29.679167, + 29.680007, + 29.680843, + 29.681676, + 29.682506, + 29.683332, + 29.684155, + 29.684975, + 29.685792, + 29.686606, + 29.687417, + 29.688224, + 29.689028, + 29.689829, + 29.690627, + 29.691423, + 29.692214, + 29.693003, + 29.693789, + 29.694572, + 29.695352, + 29.696129, + 29.696903, + 29.697674, + 29.698442, + 29.699207, + 29.699969, + 29.700729, + 29.701485, + 29.702239, + 29.702990, + 29.703738, + 29.704483, + 29.705225, + 29.705964, + 29.706701, + 29.707435, + 29.708166, + 29.708895, + 29.709621, + 29.710344, + 29.711064, + 29.711782, + 29.712497, + 29.713209, + 29.713919, + 29.714626, + 29.715331, + 29.716032, + 29.716732, + 29.717428, + 29.718123, + 29.718814, + 29.719503, + 29.720190, + 29.720874, + 29.721555, + 29.722234, + 29.722911, + 29.723585, + 29.724257, + 29.724926, + 29.725593, + 29.726257, + 29.726919, + 29.727578, + 29.728235, + 29.728890, + 29.729543, + 29.730193, + 29.730840, + 29.731486, + 29.732129, + 29.732770, + 29.733408, + 29.734044, + 29.734678, + 29.735310, + 29.735939, + 29.736567, + 29.737192, + 29.737814, + 29.738435, + 29.739053, + 29.739669, + 29.740283, + 29.740895, + 29.741505, + 29.742112, + 29.742717, + 29.743321, + 29.743922, + 29.744521, + 29.745118, + 29.745713, + 29.746305, + 29.746896, + 29.747485, + 29.748071, + 29.748656, + 29.749238, + 29.749819, + 29.750397, + 29.750974, + 29.751548, + 29.752120, + 29.752691, + 29.753259, + 29.753826, + 29.754391, + 29.754953, + 29.755514, + 29.756073, + 29.756630, + 29.757185, + 29.757738, + 29.758289, + 29.758839, + 29.759386, + 29.759932, + 29.760476, + 29.761018, + 29.761558, + 29.762096, + 29.762633, + 29.763167, + 29.763700, + 29.764231, + 29.764760, + 29.765288, + 29.765814, + 29.766338, + 29.766860, + 29.767380, + 29.767899, + 29.768416, + 29.768931, + 29.769445, + 29.769957, + 29.770467, + 29.770975, + 29.771482, + 29.771987, + 29.772490, + 29.772992, + 29.773492, + 29.773991, + 29.774487, + 29.774983, + 29.775476, + 29.775968, + 29.776458, + 29.776947, + 29.777434, + 29.777920, + 29.778404, + 29.778886, + 29.779367, + 29.779846, + 29.780324, + 29.780800, + 29.781274, + 29.781747, + 29.782219, + 29.782689, + 29.783157, + 29.783624, + 29.784089, + 29.784553, + 29.785016, + 29.785477, + 29.785936, + 29.786394, + 29.786851, + 29.787306, + 29.787759, + 29.788211, + 29.788662, + 29.789111, + 29.789559, + 29.790006, + 29.790451, + 29.790894, + 29.791337, + 29.791777, + 29.792217, + 29.792655, + 29.793091, + 29.793527, + 29.793960, + 29.794393, + 29.794824, + 29.795254, + 29.795682, + 29.796109, + 29.796535, + 29.796960, + 29.797383, + 29.797805, + 29.798225, + 29.798644, + 29.799062, + 29.799479, + 29.799894, + 29.800308, + 29.800721, + 29.801132, + 29.801542, + 29.801951, + 29.802359, + 29.802765, + 29.803170, + 29.803574, + 29.803977, + 29.804378, + 29.804778, + 29.805177, + 29.805575, + 29.805972, + 29.806367, + 29.806761, + 29.807154, + 29.807545, + 29.807936, + 29.808325, + 29.808713, + 29.809100, + 29.809486, + 29.809871, + 29.810254, + 29.810637, + 29.811018, + 29.811398, + 29.811777, + 29.812154, + 29.812531, + 29.812906, + 29.813281, + 29.813654, + 29.814026, + 29.814397, + }, + {// The expectations for dimension = 61 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681666, + 4.859999, + 5.041665, + 5.226664, + 5.414995, + 5.606657, + 5.801649, + 5.999969, + 6.201612, + 6.406574, + 6.614845, + 6.826414, + 7.041263, + 7.259367, + 7.480694, + 7.705198, + 7.932823, + 8.163495, + 8.397122, + 8.633591, + 8.872768, + 9.114493, + 9.358582, + 9.604827, + 9.852995, + 10.102830, + 10.354057, + 10.606384, + 10.859506, + 11.113110, + 11.366877, + 11.620491, + 11.873639, + 12.126017, + 12.377333, + 12.627310, + 12.875690, + 13.122231, + 13.366716, + 13.608943, + 13.848737, + 14.085938, + 14.320409, + 14.552031, + 14.780702, + 15.006339, + 15.228870, + 15.448241, + 15.664407, + 15.877338, + 16.087012, + 16.293415, + 16.496544, + 16.696402, + 16.892998, + 17.086348, + 17.276470, + 17.463390, + 17.647137, + 17.827740, + 18.005236, + 18.179660, + 18.351051, + 18.519451, + 18.684901, + 18.847444, + 19.007126, + 19.163990, + 19.318083, + 19.469451, + 19.618140, + 19.764197, + 19.907667, + 20.048598, + 20.187036, + 20.323026, + 20.456615, + 20.587847, + 20.716768, + 20.843421, + 20.967851, + 21.090100, + 21.210212, + 21.328229, + 21.444191, + 21.558140, + 21.670115, + 21.780157, + 21.888303, + 21.994592, + 22.099060, + 22.201746, + 22.302684, + 22.401910, + 22.499458, + 22.595362, + 22.689655, + 22.782370, + 22.873539, + 22.963193, + 23.051362, + 23.138076, + 23.223364, + 23.307256, + 23.389778, + 23.470959, + 23.550825, + 23.629402, + 23.706717, + 23.782793, + 23.857657, + 23.931331, + 24.003839, + 24.075204, + 24.145449, + 24.214596, + 24.282665, + 24.349679, + 24.415657, + 24.480619, + 24.544586, + 24.607577, + 24.669609, + 24.730703, + 24.790874, + 24.850142, + 24.908524, + 24.966035, + 25.022693, + 25.078514, + 25.133512, + 25.187705, + 25.241106, + 25.293731, + 25.345593, + 25.396707, + 25.447087, + 25.496746, + 25.545698, + 25.593954, + 25.641529, + 25.688433, + 25.734680, + 25.780281, + 25.825248, + 25.869591, + 25.913323, + 25.956453, + 25.998993, + 26.040953, + 26.082343, + 26.123173, + 26.163453, + 26.203192, + 26.242400, + 26.281086, + 26.319259, + 26.356927, + 26.394100, + 26.430785, + 26.466991, + 26.502726, + 26.537999, + 26.572816, + 26.607185, + 26.641114, + 26.674610, + 26.707681, + 26.740333, + 26.772573, + 26.804407, + 26.835844, + 26.866888, + 26.897547, + 26.927826, + 26.957731, + 26.987270, + 27.016447, + 27.045268, + 27.073739, + 27.101866, + 27.129653, + 27.157106, + 27.184231, + 27.211033, + 27.237516, + 27.263685, + 27.289546, + 27.315103, + 27.340361, + 27.365324, + 27.389996, + 27.414383, + 27.438489, + 27.462317, + 27.485872, + 27.509158, + 27.532179, + 27.554939, + 27.577442, + 27.599692, + 27.621692, + 27.643445, + 27.664957, + 27.686230, + 27.707267, + 27.728072, + 27.748649, + 27.769000, + 27.789129, + 27.809040, + 27.828734, + 27.848216, + 27.867488, + 27.886553, + 27.905414, + 27.924074, + 27.942536, + 27.960803, + 27.978877, + 27.996761, + 28.014457, + 28.031969, + 28.049298, + 28.066447, + 28.083419, + 28.100216, + 28.116840, + 28.133294, + 28.149580, + 28.165700, + 28.181657, + 28.197452, + 28.213089, + 28.228568, + 28.243892, + 28.259063, + 28.274083, + 28.288954, + 28.303678, + 28.318257, + 28.332692, + 28.346986, + 28.361141, + 28.375157, + 28.389038, + 28.402784, + 28.416398, + 28.429881, + 28.443235, + 28.456461, + 28.469560, + 28.482536, + 28.495389, + 28.508120, + 28.520731, + 28.533224, + 28.545600, + 28.557861, + 28.570008, + 28.582042, + 28.593965, + 28.605777, + 28.617482, + 28.629079, + 28.640570, + 28.651956, + 28.663239, + 28.674420, + 28.685499, + 28.696479, + 28.707361, + 28.718145, + 28.728832, + 28.739425, + 28.749923, + 28.760329, + 28.770643, + 28.780866, + 28.790999, + 28.801044, + 28.811001, + 28.820871, + 28.830656, + 28.840355, + 28.849972, + 28.859505, + 28.868957, + 28.878328, + 28.887619, + 28.896830, + 28.905964, + 28.915020, + 28.924000, + 28.932904, + 28.941734, + 28.950490, + 28.959172, + 28.967782, + 28.976321, + 28.984789, + 28.993187, + 29.001516, + 29.009776, + 29.017969, + 29.026095, + 29.034154, + 29.042148, + 29.050077, + 29.057942, + 29.065744, + 29.073483, + 29.081160, + 29.088775, + 29.096329, + 29.103824, + 29.111259, + 29.118635, + 29.125952, + 29.133212, + 29.140415, + 29.147562, + 29.154653, + 29.161688, + 29.168669, + 29.175595, + 29.182468, + 29.189288, + 29.196055, + 29.202770, + 29.209434, + 29.216047, + 29.222609, + 29.229122, + 29.235585, + 29.241999, + 29.248365, + 29.254682, + 29.260953, + 29.267176, + 29.273353, + 29.279483, + 29.285568, + 29.291608, + 29.297604, + 29.303555, + 29.309462, + 29.315325, + 29.321146, + 29.326924, + 29.332660, + 29.338354, + 29.344007, + 29.349618, + 29.355190, + 29.360721, + 29.366212, + 29.371664, + 29.377076, + 29.382450, + 29.387786, + 29.393084, + 29.398344, + 29.403567, + 29.408753, + 29.413903, + 29.419016, + 29.424094, + 29.429136, + 29.434142, + 29.439114, + 29.444051, + 29.448955, + 29.453824, + 29.458659, + 29.463461, + 29.468231, + 29.472967, + 29.477671, + 29.482343, + 29.486983, + 29.491592, + 29.496169, + 29.500716, + 29.505232, + 29.509717, + 29.514172, + 29.518597, + 29.522993, + 29.527359, + 29.531697, + 29.536005, + 29.540285, + 29.544536, + 29.548760, + 29.552955, + 29.557123, + 29.561264, + 29.565377, + 29.569464, + 29.573524, + 29.577558, + 29.581565, + 29.585546, + 29.589502, + 29.593432, + 29.597337, + 29.601217, + 29.605072, + 29.608902, + 29.612708, + 29.616490, + 29.620247, + 29.623981, + 29.627691, + 29.631377, + 29.635041, + 29.638681, + 29.642299, + 29.645894, + 29.649466, + 29.653016, + 29.656544, + 29.660050, + 29.663534, + 29.666997, + 29.670438, + 29.673858, + 29.677257, + 29.680636, + 29.683993, + 29.687330, + 29.690647, + 29.693943, + 29.697220, + 29.700476, + 29.703713, + 29.706930, + 29.710128, + 29.713307, + 29.716466, + 29.719607, + 29.722729, + 29.725832, + 29.728917, + 29.731983, + 29.735031, + 29.738061, + 29.741073, + 29.744068, + 29.747045, + 29.750004, + 29.752946, + 29.755870, + 29.758778, + 29.761669, + 29.764542, + 29.767400, + 29.770240, + 29.773064, + 29.775872, + 29.778664, + 29.781439, + 29.784199, + 29.786943, + 29.789671, + 29.792383, + 29.795080, + 29.797762, + 29.800428, + 29.803080, + 29.805716, + 29.808337, + 29.810944, + 29.813536, + 29.816113, + 29.818676, + 29.821225, + 29.823759, + 29.826280, + 29.828786, + 29.831278, + 29.833757, + 29.836222, + 29.838673, + 29.841110, + 29.843535, + 29.845946, + 29.848343, + 29.850728, + 29.853099, + 29.855458, + 29.857804, + 29.860137, + 29.862457, + 29.864765, + 29.867060, + 29.869343, + 29.871614, + 29.873872, + 29.876118, + 29.878353, + 29.880575, + 29.882785, + 29.884984, + 29.887171, + 29.889346, + 29.891510, + 29.893662, + 29.895803, + 29.897933, + 29.900052, + 29.902159, + 29.904255, + 29.906340, + 29.908415, + 29.910478, + 29.912531, + 29.914573, + 29.916605, + 29.918626, + 29.920636, + 29.922637, + 29.924626, + 29.926606, + 29.928575, + 29.930535, + 29.932484, + 29.934423, + 29.936353, + 29.938272, + 29.940182, + 29.942082, + 29.943972, + 29.945853, + 29.947725, + 29.949587, + 29.951439, + 29.953282, + 29.955116, + 29.956941, + 29.958757, + 29.960563, + 29.962361, + 29.964150, + 29.965929, + 29.967700, + 29.969462, + 29.971216, + 29.972961, + 29.974697, + 29.976424, + 29.978143, + 29.979854, + 29.981556, + 29.983250, + 29.984936, + 29.986613, + 29.988283, + 29.989944, + 29.991597, + 29.993242, + 29.994879, + 29.996509, + 29.998130, + 29.999744, + 30.001349, + 30.002948, + 30.004538, + 30.006121, + 30.007696, + 30.009264, + 30.010824, + 30.012377, + 30.013923, + 30.015461, + 30.016992, + 30.018516, + 30.020032, + 30.021542, + 30.023044, + 30.024539, + 30.026028, + 30.027509, + 30.028983, + 30.030451, + 30.031911, + 30.033365, + 30.034812, + 30.036253, + 30.037687, + 30.039114, + 30.040534, + 30.041948, + 30.043356, + 30.044757, + 30.046151, + 30.047539, + 30.048921, + 30.050297, + 30.051666, + 30.053029, + 30.054386, + 30.055737, + 30.057081, + 30.058420, + 30.059752, + 30.061078, + 30.062399, + 30.063713, + 30.065022, + 30.066325, + 30.067622, + 30.068913, + 30.070198, + 30.071478, + 30.072751, + 30.074020, + 30.075282, + 30.076539, + 30.077791, + 30.079037, + 30.080277, + 30.081512, + 30.082742, + 30.083966, + 30.085184, + 30.086398, + 30.087606, + 30.088809, + 30.090006, + 30.091199, + 30.092386, + 30.093568, + 30.094745, + 30.095917, + 30.097083, + 30.098245, + 30.099402, + 30.100553, + 30.101700, + 30.102842, + 30.103979, + 30.105111, + 30.106238, + 30.107361, + 30.108478, + 30.109591, + 30.110699, + 30.111803, + 30.112901, + 30.113996, + 30.115085, + 30.116170, + 30.117250, + 30.118326, + 30.119397, + 30.120464, + 30.121526, + 30.122584, + 30.123637, + 30.124686, + 30.125731, + 30.126771, + 30.127807, + 30.128839, + 30.129866, + 30.130889, + 30.131908, + 30.132923, + 30.133934, + 30.134940, + 30.135942, + 30.136940, + 30.137934, + 30.138924, + 30.139910, + 30.140892, + 30.141870, + 30.142844, + 30.143813, + 30.144779, + 30.145741, + 30.146700, + 30.147654, + 30.148604, + 30.149551, + 30.150494, + 30.151433, + 30.152368, + 30.153299, + 30.154227, + 30.155151, + 30.156071, + 30.156988, + 30.157901, + 30.158810, + 30.159716, + 30.160618, + 30.161516, + 30.162411, + 30.163303, + 30.164191, + 30.165075, + 30.165956, + 30.166834, + 30.167708, + 30.168578, + 30.169445, + 30.170309, + 30.171170, + 30.172027, + 30.172880, + 30.173731, + 30.174578, + 30.175422, + 30.176262, + 30.177099, + 30.177933, + 30.178764, + 30.179592, + 30.180416, + 30.181237, + 30.182055, + 30.182870, + 30.183682, + 30.184491, + 30.185296, + 30.186099, + 30.186898, + 30.187695, + 30.188488, + 30.189278, + 30.190066, + 30.190850, + 30.191632, + 30.192410, + 30.193186, + 30.193958, + 30.194728, + 30.195495, + 30.196258, + 30.197019, + 30.197778, + 30.198533, + 30.199285, + 30.200035, + 30.200782, + 30.201526, + 30.202268, + 30.203006, + 30.203742, + 30.204475, + 30.205205, + 30.205933, + 30.206658, + 30.207381, + 30.208100, + 30.208817, + 30.209532, + 30.210243, + 30.210953, + 30.211659, + 30.212363, + 30.213065, + 30.213763, + 30.214460, + 30.215153, + 30.215845, + 30.216533, + 30.217220, + 30.217903, + 30.218585, + 30.219263, + 30.219940, + 30.220614, + 30.221285, + 30.221954, + 30.222621, + 30.223285, + 30.223947, + 30.224607, + 30.225264, + 30.225919, + 30.226571, + 30.227221, + 30.227869, + 30.228515, + 30.229158, + 30.229799, + 30.230438, + 30.231074, + 30.231708, + 30.232340, + 30.232970, + 30.233598, + 30.234223, + 30.234846, + 30.235467, + 30.236086, + 30.236702, + 30.237317, + 30.237929, + 30.238539, + 30.239147, + 30.239753, + 30.240357, + 30.240958, + 30.241558, + 30.242156, + 30.242751, + 30.243345, + 30.243936, + 30.244525, + 30.245112, + 30.245698, + 30.246281, + 30.246862, + 30.247442, + 30.248019, + 30.248594, + 30.249167, + 30.249739, + 30.250308, + 30.250876, + 30.251441, + 30.252005, + 30.252567, + 30.253126, + 30.253684, + 30.254240, + 30.254795, + 30.255347, + 30.255897, + 30.256446, + 30.256993, + 30.257537, + 30.258081, + 30.258622, + 30.259161, + 30.259699, + 30.260235, + 30.260769, + 30.261301, + 30.261831, + 30.262360, + 30.262887, + 30.263412, + 30.263936, + 30.264458, + 30.264978, + 30.265496, + 30.266012, + 30.266527, + 30.267040, + 30.267552, + 30.268062, + 30.268570, + 30.269076, + 30.269581, + 30.270084, + 30.270586, + 30.271086, + 30.271584, + 30.272081, + 30.272576, + 30.273069, + 30.273561, + 30.274051, + 30.274540, + 30.275027, + 30.275512, + 30.275996, + 30.276478, + 30.276959, + 30.277438, + 30.277916, + 30.278392, + 30.278867, + 30.279340, + 30.279811, + 30.280281, + 30.280750, + 30.281217, + 30.281683, + 30.282147, + 30.282609, + 30.283071, + 30.283530, + 30.283988, + 30.284445, + 30.284901, + 30.285354, + 30.285807, + 30.286258, + 30.286708, + 30.287156, + 30.287603, + 30.288048, + 30.288492, + 30.288934, + 30.289376, + 30.289816, + 30.290254, + 30.290691, + 30.291127, + 30.291561, + 30.291994, + 30.292426, + 30.292856, + 30.293285, + 30.293713, + 30.294139, + 30.294564, + 30.294988, + 30.295410, + 30.295831, + 30.296251, + 30.296669, + 30.297087, + 30.297503, + 30.297917, + 30.298331, + 30.298743, + 30.299153, + 30.299563, + 30.299971, + 30.300378, + 30.300784, + 30.301189, + 30.301592, + 30.301994, + 30.302395, + 30.302795, + 30.303194, + 30.303591, + 30.303987, + 30.304382, + 30.304776, + 30.305168, + 30.305560, + 30.305950, + 30.306339, + 30.306727, + 30.307113, + 30.307499, + 30.307883, + 30.308266, + }, + {// The expectations for dimension = 62 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681666, + 4.860000, + 5.041666, + 5.226665, + 5.414997, + 5.606660, + 5.801655, + 5.999978, + 6.201628, + 6.406601, + 6.614888, + 6.826482, + 7.041368, + 7.259526, + 7.480930, + 7.705541, + 7.933313, + 8.164182, + 8.398069, + 8.634876, + 8.874482, + 9.116745, + 9.361498, + 9.608548, + 9.857680, + 10.108652, + 10.361203, + 10.615053, + 10.869904, + 11.125450, + 11.381376, + 11.637364, + 11.893099, + 12.148270, + 12.402579, + 12.655737, + 12.907474, + 13.157538, + 13.405695, + 13.651732, + 13.895456, + 14.136697, + 14.375301, + 14.611138, + 14.844094, + 15.074072, + 15.300992, + 15.524787, + 15.745406, + 15.962807, + 16.176963, + 16.387853, + 16.595466, + 16.799801, + 17.000860, + 17.198656, + 17.393203, + 17.584523, + 17.772640, + 17.957583, + 18.139383, + 18.318076, + 18.493698, + 18.666288, + 18.835887, + 19.002536, + 19.166279, + 19.327160, + 19.485224, + 19.640517, + 19.793083, + 19.942969, + 20.090222, + 20.234887, + 20.377011, + 20.516640, + 20.653818, + 20.788593, + 20.921008, + 21.051108, + 21.178937, + 21.304539, + 21.427957, + 21.549233, + 21.668409, + 21.785526, + 21.900624, + 22.013744, + 22.124925, + 22.234204, + 22.341621, + 22.447212, + 22.551013, + 22.653060, + 22.753389, + 22.852034, + 22.949028, + 23.044405, + 23.138197, + 23.230435, + 23.321151, + 23.410375, + 23.498137, + 23.584466, + 23.669391, + 23.752939, + 23.835139, + 23.916016, + 23.995596, + 24.073907, + 24.150972, + 24.226816, + 24.301463, + 24.374936, + 24.447259, + 24.518454, + 24.588543, + 24.657547, + 24.725488, + 24.792385, + 24.858259, + 24.923131, + 24.987017, + 25.049939, + 25.111914, + 25.172959, + 25.233093, + 25.292333, + 25.350696, + 25.408198, + 25.464855, + 25.520683, + 25.575698, + 25.629914, + 25.683346, + 25.736008, + 25.787916, + 25.839082, + 25.889520, + 25.939244, + 25.988265, + 26.036598, + 26.084254, + 26.131246, + 26.177584, + 26.223282, + 26.268350, + 26.312800, + 26.356642, + 26.399887, + 26.442546, + 26.484628, + 26.526144, + 26.567104, + 26.607516, + 26.647392, + 26.686739, + 26.725567, + 26.763885, + 26.801701, + 26.839024, + 26.875862, + 26.912223, + 26.948116, + 26.983547, + 27.018526, + 27.053058, + 27.087153, + 27.120816, + 27.154055, + 27.186876, + 27.219288, + 27.251295, + 27.282906, + 27.314125, + 27.344961, + 27.375417, + 27.405502, + 27.435220, + 27.464577, + 27.493579, + 27.522233, + 27.550542, + 27.578512, + 27.606150, + 27.633459, + 27.660446, + 27.687114, + 27.713470, + 27.739516, + 27.765260, + 27.790704, + 27.815854, + 27.840714, + 27.865288, + 27.889581, + 27.913596, + 27.937339, + 27.960812, + 27.984021, + 28.006968, + 28.029659, + 28.052095, + 28.074282, + 28.096223, + 28.117921, + 28.139380, + 28.160604, + 28.181595, + 28.202357, + 28.222894, + 28.243208, + 28.263303, + 28.283182, + 28.302847, + 28.322303, + 28.341551, + 28.360595, + 28.379438, + 28.398081, + 28.416529, + 28.434784, + 28.452848, + 28.470724, + 28.488415, + 28.505923, + 28.523250, + 28.540400, + 28.557374, + 28.574175, + 28.590804, + 28.607266, + 28.623561, + 28.639691, + 28.655660, + 28.671469, + 28.687120, + 28.702616, + 28.717958, + 28.733148, + 28.748189, + 28.763082, + 28.777829, + 28.792432, + 28.806893, + 28.821214, + 28.835396, + 28.849442, + 28.863353, + 28.877130, + 28.890776, + 28.904291, + 28.917679, + 28.930940, + 28.944075, + 28.957087, + 28.969977, + 28.982746, + 28.995397, + 29.007930, + 29.020346, + 29.032648, + 29.044836, + 29.056913, + 29.068879, + 29.080735, + 29.092484, + 29.104126, + 29.115663, + 29.127095, + 29.138424, + 29.149652, + 29.160780, + 29.171808, + 29.182738, + 29.193571, + 29.204308, + 29.214950, + 29.225499, + 29.235955, + 29.246320, + 29.256594, + 29.266780, + 29.276876, + 29.286886, + 29.296809, + 29.306646, + 29.316399, + 29.326069, + 29.335657, + 29.345162, + 29.354588, + 29.363933, + 29.373200, + 29.382388, + 29.391500, + 29.400535, + 29.409495, + 29.418380, + 29.427191, + 29.435930, + 29.444596, + 29.453191, + 29.461716, + 29.470170, + 29.478556, + 29.486873, + 29.495123, + 29.503305, + 29.511422, + 29.519473, + 29.527460, + 29.535382, + 29.543241, + 29.551037, + 29.558771, + 29.566444, + 29.574056, + 29.581608, + 29.589101, + 29.596534, + 29.603910, + 29.611227, + 29.618488, + 29.625692, + 29.632841, + 29.639933, + 29.646972, + 29.653956, + 29.660886, + 29.667763, + 29.674588, + 29.681361, + 29.688082, + 29.694752, + 29.701372, + 29.707942, + 29.714462, + 29.720933, + 29.727356, + 29.733731, + 29.740058, + 29.746339, + 29.752572, + 29.758760, + 29.764902, + 29.770998, + 29.777050, + 29.783057, + 29.789021, + 29.794941, + 29.800818, + 29.806652, + 29.812444, + 29.818194, + 29.823902, + 29.829570, + 29.835197, + 29.840783, + 29.846330, + 29.851837, + 29.857305, + 29.862734, + 29.868125, + 29.873477, + 29.878792, + 29.884070, + 29.889311, + 29.894514, + 29.899682, + 29.904814, + 29.909910, + 29.914970, + 29.919996, + 29.924987, + 29.929943, + 29.934866, + 29.939755, + 29.944610, + 29.949432, + 29.954221, + 29.958978, + 29.963703, + 29.968395, + 29.973056, + 29.977686, + 29.982284, + 29.986852, + 29.991389, + 29.995896, + 30.000373, + 30.004820, + 30.009237, + 30.013625, + 30.017985, + 30.022315, + 30.026617, + 30.030891, + 30.035137, + 30.039355, + 30.043546, + 30.047709, + 30.051846, + 30.055955, + 30.060038, + 30.064095, + 30.068126, + 30.072130, + 30.076109, + 30.080063, + 30.083991, + 30.087895, + 30.091773, + 30.095627, + 30.099457, + 30.103262, + 30.107043, + 30.110801, + 30.114535, + 30.118246, + 30.121933, + 30.125597, + 30.129239, + 30.132858, + 30.136454, + 30.140029, + 30.143581, + 30.147111, + 30.150620, + 30.154107, + 30.157573, + 30.161017, + 30.164441, + 30.167843, + 30.171225, + 30.174587, + 30.177928, + 30.181249, + 30.184550, + 30.187831, + 30.191093, + 30.194334, + 30.197557, + 30.200760, + 30.203944, + 30.207109, + 30.210256, + 30.213384, + 30.216493, + 30.219584, + 30.222657, + 30.225711, + 30.228748, + 30.231767, + 30.234769, + 30.237753, + 30.240719, + 30.243668, + 30.246600, + 30.249516, + 30.252414, + 30.255296, + 30.258161, + 30.261009, + 30.263842, + 30.266658, + 30.269458, + 30.272242, + 30.275010, + 30.277763, + 30.280499, + 30.283221, + 30.285927, + 30.288618, + 30.291293, + 30.293954, + 30.296600, + 30.299231, + 30.301847, + 30.304448, + 30.307036, + 30.309608, + 30.312167, + 30.314711, + 30.317242, + 30.319758, + 30.322260, + 30.324749, + 30.327224, + 30.329686, + 30.332134, + 30.334569, + 30.336990, + 30.339399, + 30.341794, + 30.344176, + 30.346546, + 30.348902, + 30.351246, + 30.353577, + 30.355896, + 30.358203, + 30.360497, + 30.362779, + 30.365048, + 30.367306, + 30.369551, + 30.371785, + 30.374007, + 30.376217, + 30.378416, + 30.380603, + 30.382778, + 30.384942, + 30.387095, + 30.389236, + 30.391366, + 30.393485, + 30.395594, + 30.397691, + 30.399777, + 30.401853, + 30.403917, + 30.405971, + 30.408015, + 30.410048, + 30.412071, + 30.414083, + 30.416085, + 30.418077, + 30.420058, + 30.422030, + 30.423991, + 30.425943, + 30.427885, + 30.429816, + 30.431739, + 30.433651, + 30.435554, + 30.437447, + 30.439331, + 30.441205, + 30.443070, + 30.444926, + 30.446772, + 30.448610, + 30.450438, + 30.452257, + 30.454067, + 30.455868, + 30.457660, + 30.459444, + 30.461218, + 30.462984, + 30.464742, + 30.466491, + 30.468231, + 30.469962, + 30.471686, + 30.473401, + 30.475107, + 30.476806, + 30.478496, + 30.480178, + 30.481851, + 30.483517, + 30.485175, + 30.486825, + 30.488467, + 30.490101, + 30.491727, + 30.493346, + 30.494957, + 30.496560, + 30.498155, + 30.499743, + 30.501324, + 30.502897, + 30.504462, + 30.506021, + 30.507572, + 30.509115, + 30.510652, + 30.512181, + 30.513703, + 30.515218, + 30.516726, + 30.518227, + 30.519721, + 30.521208, + 30.522688, + 30.524161, + 30.525627, + 30.527087, + 30.528540, + 30.529987, + 30.531426, + 30.532859, + 30.534286, + 30.535706, + 30.537120, + 30.538527, + 30.539927, + 30.541322, + 30.542710, + 30.544092, + 30.545467, + 30.546837, + 30.548200, + 30.549557, + 30.550908, + 30.552253, + 30.553592, + 30.554924, + 30.556251, + 30.557572, + 30.558887, + 30.560197, + 30.561500, + 30.562798, + 30.564090, + 30.565376, + 30.566657, + 30.567932, + 30.569201, + 30.570465, + 30.571723, + 30.572976, + 30.574223, + 30.575465, + 30.576701, + 30.577932, + 30.579158, + 30.580378, + 30.581593, + 30.582803, + 30.584007, + 30.585206, + 30.586401, + 30.587590, + 30.588773, + 30.589952, + 30.591126, + 30.592295, + 30.593458, + 30.594617, + 30.595771, + 30.596920, + 30.598064, + 30.599203, + 30.600337, + 30.601467, + 30.602592, + 30.603712, + 30.604827, + 30.605938, + 30.607044, + 30.608145, + 30.609242, + 30.610334, + 30.611421, + 30.612504, + 30.613583, + 30.614657, + 30.615726, + 30.616791, + 30.617852, + 30.618908, + 30.619960, + 30.621008, + 30.622051, + 30.623090, + 30.624124, + 30.625155, + 30.626181, + 30.627203, + 30.628221, + 30.629235, + 30.630244, + 30.631249, + 30.632251, + 30.633248, + 30.634241, + 30.635230, + 30.636216, + 30.637197, + 30.638174, + 30.639147, + 30.640117, + 30.641082, + 30.642044, + 30.643002, + 30.643956, + 30.644906, + 30.645852, + 30.646795, + 30.647733, + 30.648668, + 30.649600, + 30.650527, + 30.651451, + 30.652372, + 30.653288, + 30.654201, + 30.655111, + 30.656017, + 30.656919, + 30.657818, + 30.658713, + 30.659605, + 30.660493, + 30.661378, + 30.662260, + 30.663137, + 30.664012, + 30.664883, + 30.665751, + 30.666615, + 30.667476, + 30.668334, + 30.669188, + 30.670040, + 30.670887, + 30.671732, + 30.672573, + 30.673411, + 30.674246, + 30.675078, + 30.675906, + 30.676732, + 30.677554, + 30.678373, + 30.679189, + 30.680002, + 30.680812, + 30.681619, + 30.682422, + 30.683223, + 30.684020, + 30.684815, + 30.685607, + 30.686395, + 30.687181, + 30.687964, + 30.688744, + 30.689521, + 30.690295, + 30.691066, + 30.691834, + 30.692599, + 30.693362, + 30.694121, + 30.694878, + 30.695632, + 30.696384, + 30.697132, + 30.697878, + 30.698621, + 30.699361, + 30.700099, + 30.700834, + 30.701566, + 30.702295, + 30.703022, + 30.703746, + 30.704468, + 30.705187, + 30.705903, + 30.706617, + 30.707328, + 30.708036, + 30.708742, + 30.709445, + 30.710146, + 30.710845, + 30.711540, + 30.712234, + 30.712924, + 30.713613, + 30.714298, + 30.714982, + 30.715663, + 30.716341, + 30.717017, + 30.717691, + 30.718362, + 30.719031, + 30.719698, + 30.720362, + 30.721023, + 30.721683, + 30.722340, + 30.722995, + 30.723647, + 30.724297, + 30.724945, + 30.725591, + 30.726234, + 30.726875, + 30.727514, + 30.728151, + 30.728785, + 30.729417, + 30.730047, + 30.730675, + 30.731300, + 30.731924, + 30.732545, + 30.733164, + 30.733781, + 30.734396, + 30.735008, + 30.735619, + 30.736227, + 30.736834, + 30.737438, + 30.738040, + 30.738640, + 30.739238, + 30.739834, + 30.740428, + 30.741020, + 30.741610, + 30.742198, + 30.742784, + 30.743368, + 30.743950, + 30.744529, + 30.745107, + 30.745683, + 30.746258, + 30.746830, + 30.747400, + 30.747968, + 30.748535, + 30.749099, + 30.749662, + 30.750222, + 30.750781, + 30.751338, + 30.751893, + 30.752446, + 30.752998, + 30.753547, + 30.754095, + 30.754641, + 30.755185, + 30.755727, + 30.756267, + 30.756806, + 30.757343, + 30.757878, + 30.758411, + 30.758943, + 30.759473, + 30.760001, + 30.760527, + 30.761052, + 30.761575, + 30.762096, + 30.762615, + 30.763133, + 30.763649, + 30.764164, + 30.764677, + 30.765188, + 30.765697, + 30.766205, + 30.766711, + 30.767215, + 30.767718, + 30.768219, + 30.768719, + 30.769217, + 30.769713, + 30.770208, + 30.770701, + 30.771193, + 30.771683, + 30.772171, + 30.772658, + 30.773143, + 30.773627, + 30.774109, + 30.774590, + 30.775069, + 30.775547, + 30.776023, + 30.776498, + 30.776971, + 30.777442, + 30.777912, + 30.778381, + 30.778848, + 30.779314, + 30.779778, + 30.780241, + 30.780702, + 30.781162, + 30.781620, + 30.782077, + 30.782533, + 30.782987, + 30.783440, + 30.783891, + 30.784341, + 30.784789, + 30.785236, + 30.785682, + 30.786126, + 30.786569, + 30.787010, + 30.787451, + 30.787889, + 30.788327, + 30.788763, + 30.789198, + 30.789631, + 30.790063, + 30.790494, + 30.790923, + 30.791351, + 30.791778, + 30.792204, + 30.792628, + 30.793051, + 30.793472, + 30.793893, + 30.794312, + 30.794729, + 30.795146, + 30.795561, + 30.795975, + 30.796388, + 30.796799, + 30.797209, + 30.797618, + 30.798026, + 30.798433, + 30.798838, + 30.799242, + 30.799645, + 30.800046, + 30.800447, + 30.800846, + 30.801244, + 30.801641, + 30.802036, + }, + {// The expectations for dimension = 63 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041666, + 5.226666, + 5.414998, + 5.606662, + 5.801659, + 5.999985, + 6.201640, + 6.406620, + 6.614920, + 6.826533, + 7.041447, + 7.259647, + 7.481111, + 7.705809, + 7.933699, + 8.164730, + 8.398833, + 8.635922, + 8.875891, + 9.118615, + 9.363941, + 9.611694, + 9.861675, + 10.113659, + 10.367398, + 10.622624, + 10.879053, + 11.136382, + 11.394304, + 11.652502, + 11.910659, + 12.168462, + 12.425604, + 12.681790, + 12.936738, + 13.190185, + 13.441883, + 13.691605, + 13.939146, + 14.184319, + 14.426960, + 14.666924, + 14.904083, + 15.138329, + 15.369571, + 15.597732, + 15.822751, + 16.044577, + 16.263174, + 16.478515, + 16.690583, + 16.899369, + 17.104871, + 17.307095, + 17.506053, + 17.701762, + 17.894243, + 18.083521, + 18.269625, + 18.452587, + 18.632443, + 18.809229, + 18.982983, + 19.153747, + 19.321563, + 19.486473, + 19.648521, + 19.807752, + 19.964212, + 20.117945, + 20.268998, + 20.417417, + 20.563247, + 20.706534, + 20.847324, + 20.985662, + 21.121594, + 21.255164, + 21.386416, + 21.515394, + 21.642142, + 21.766702, + 21.889116, + 22.009426, + 22.127672, + 22.243896, + 22.358136, + 22.470432, + 22.580822, + 22.689344, + 22.796034, + 22.900929, + 23.004064, + 23.105475, + 23.205195, + 23.303259, + 23.399699, + 23.494548, + 23.587836, + 23.679596, + 23.769856, + 23.858648, + 23.946000, + 24.031941, + 24.116498, + 24.199699, + 24.281571, + 24.362139, + 24.441430, + 24.519468, + 24.596277, + 24.671882, + 24.746307, + 24.819573, + 24.891704, + 24.962722, + 25.032647, + 25.101502, + 25.169306, + 25.236080, + 25.301843, + 25.366614, + 25.430413, + 25.493257, + 25.555166, + 25.616155, + 25.676243, + 25.735447, + 25.793783, + 25.851266, + 25.907914, + 25.963741, + 26.018762, + 26.072992, + 26.126446, + 26.179138, + 26.231082, + 26.282291, + 26.332779, + 26.382558, + 26.431641, + 26.480041, + 26.527769, + 26.574839, + 26.621261, + 26.667047, + 26.712208, + 26.756755, + 26.800698, + 26.844049, + 26.886818, + 26.929014, + 26.970648, + 27.011728, + 27.052266, + 27.092269, + 27.131747, + 27.170709, + 27.209163, + 27.247119, + 27.284584, + 27.321566, + 27.358074, + 27.394116, + 27.429699, + 27.464831, + 27.499519, + 27.533771, + 27.567593, + 27.600993, + 27.633977, + 27.666552, + 27.698726, + 27.730503, + 27.761890, + 27.792895, + 27.823522, + 27.853778, + 27.883668, + 27.913199, + 27.942376, + 27.971204, + 27.999689, + 28.027837, + 28.055652, + 28.083139, + 28.110304, + 28.137151, + 28.163686, + 28.189913, + 28.215836, + 28.241461, + 28.266792, + 28.291833, + 28.316588, + 28.341062, + 28.365260, + 28.389184, + 28.412839, + 28.436229, + 28.459359, + 28.482231, + 28.504849, + 28.527217, + 28.549340, + 28.571219, + 28.592860, + 28.614264, + 28.635436, + 28.656379, + 28.677096, + 28.697590, + 28.717865, + 28.737923, + 28.757768, + 28.777402, + 28.796829, + 28.816051, + 28.835071, + 28.853892, + 28.872517, + 28.890948, + 28.909188, + 28.927240, + 28.945106, + 28.962788, + 28.980290, + 28.997613, + 29.014760, + 29.031733, + 29.048535, + 29.065167, + 29.081633, + 29.097934, + 29.114073, + 29.130051, + 29.145871, + 29.161534, + 29.177043, + 29.192401, + 29.207607, + 29.222666, + 29.237578, + 29.252345, + 29.266970, + 29.281454, + 29.295798, + 29.310006, + 29.324077, + 29.338015, + 29.351821, + 29.365496, + 29.379041, + 29.392460, + 29.405753, + 29.418921, + 29.431967, + 29.444891, + 29.457696, + 29.470383, + 29.482953, + 29.495407, + 29.507747, + 29.519975, + 29.532091, + 29.544097, + 29.555995, + 29.567786, + 29.579470, + 29.591049, + 29.602525, + 29.613899, + 29.625171, + 29.636344, + 29.647417, + 29.658393, + 29.669273, + 29.680057, + 29.690747, + 29.701343, + 29.711848, + 29.722261, + 29.732585, + 29.742819, + 29.752965, + 29.763025, + 29.772998, + 29.782886, + 29.792691, + 29.802412, + 29.812051, + 29.821608, + 29.831086, + 29.840483, + 29.849802, + 29.859044, + 29.868208, + 29.877297, + 29.886310, + 29.895249, + 29.904114, + 29.912906, + 29.921627, + 29.930276, + 29.938855, + 29.947364, + 29.955804, + 29.964176, + 29.972480, + 29.980718, + 29.988890, + 29.996996, + 30.005038, + 30.013016, + 30.020930, + 30.028782, + 30.036571, + 30.044300, + 30.051968, + 30.059575, + 30.067123, + 30.074613, + 30.082044, + 30.089417, + 30.096734, + 30.103994, + 30.111198, + 30.118347, + 30.125441, + 30.132481, + 30.139467, + 30.146400, + 30.153281, + 30.160109, + 30.166886, + 30.173612, + 30.180288, + 30.186913, + 30.193489, + 30.200016, + 30.206494, + 30.212925, + 30.219307, + 30.225643, + 30.231932, + 30.238175, + 30.244372, + 30.250524, + 30.256630, + 30.262693, + 30.268711, + 30.274686, + 30.280617, + 30.286506, + 30.292353, + 30.298157, + 30.303920, + 30.309642, + 30.315323, + 30.320964, + 30.326565, + 30.332126, + 30.337648, + 30.343130, + 30.348575, + 30.353981, + 30.359349, + 30.364680, + 30.369974, + 30.375231, + 30.380452, + 30.385636, + 30.390785, + 30.395898, + 30.400977, + 30.406020, + 30.411029, + 30.416004, + 30.420944, + 30.425852, + 30.430726, + 30.435567, + 30.440375, + 30.445151, + 30.449895, + 30.454607, + 30.459288, + 30.463937, + 30.468556, + 30.473143, + 30.477701, + 30.482228, + 30.486725, + 30.491193, + 30.495631, + 30.500040, + 30.504421, + 30.508772, + 30.513096, + 30.517391, + 30.521658, + 30.525898, + 30.530110, + 30.534295, + 30.538454, + 30.542585, + 30.546690, + 30.550769, + 30.554822, + 30.558849, + 30.562850, + 30.566826, + 30.570777, + 30.574703, + 30.578604, + 30.582481, + 30.586333, + 30.590162, + 30.593966, + 30.597746, + 30.601503, + 30.605237, + 30.608948, + 30.612635, + 30.616300, + 30.619942, + 30.623562, + 30.627160, + 30.630735, + 30.634289, + 30.637821, + 30.641332, + 30.644821, + 30.648289, + 30.651736, + 30.655163, + 30.658568, + 30.661953, + 30.665318, + 30.668663, + 30.671988, + 30.675292, + 30.678577, + 30.681843, + 30.685089, + 30.688316, + 30.691524, + 30.694713, + 30.697884, + 30.701035, + 30.704168, + 30.707283, + 30.710380, + 30.713458, + 30.716519, + 30.719562, + 30.722587, + 30.725595, + 30.728585, + 30.731558, + 30.734514, + 30.737454, + 30.740376, + 30.743281, + 30.746170, + 30.749043, + 30.751899, + 30.754739, + 30.757562, + 30.760370, + 30.763162, + 30.765938, + 30.768699, + 30.771444, + 30.774174, + 30.776888, + 30.779587, + 30.782272, + 30.784941, + 30.787596, + 30.790235, + 30.792861, + 30.795471, + 30.798067, + 30.800649, + 30.803217, + 30.805771, + 30.808311, + 30.810837, + 30.813349, + 30.815847, + 30.818332, + 30.820803, + 30.823261, + 30.825706, + 30.828138, + 30.830556, + 30.832962, + 30.835354, + 30.837734, + 30.840101, + 30.842455, + 30.844797, + 30.847126, + 30.849443, + 30.851748, + 30.854040, + 30.856321, + 30.858589, + 30.860846, + 30.863090, + 30.865323, + 30.867544, + 30.869754, + 30.871951, + 30.874138, + 30.876313, + 30.878477, + 30.880630, + 30.882771, + 30.884902, + 30.887021, + 30.889129, + 30.891227, + 30.893314, + 30.895390, + 30.897456, + 30.899511, + 30.901556, + 30.903590, + 30.905614, + 30.907627, + 30.909631, + 30.911624, + 30.913607, + 30.915581, + 30.917544, + 30.919497, + 30.921441, + 30.923375, + 30.925299, + 30.927214, + 30.929119, + 30.931015, + 30.932901, + 30.934778, + 30.936646, + 30.938504, + 30.940354, + 30.942194, + 30.944025, + 30.945847, + 30.947661, + 30.949465, + 30.951260, + 30.953047, + 30.954825, + 30.956595, + 30.958356, + 30.960108, + 30.961852, + 30.963588, + 30.965315, + 30.967033, + 30.968744, + 30.970446, + 30.972141, + 30.973827, + 30.975505, + 30.977175, + 30.978837, + 30.980491, + 30.982137, + 30.983776, + 30.985407, + 30.987030, + 30.988645, + 30.990253, + 30.991853, + 30.993446, + 30.995031, + 30.996609, + 30.998180, + 30.999743, + 31.001299, + 31.002848, + 31.004389, + 31.005923, + 31.007451, + 31.008971, + 31.010484, + 31.011990, + 31.013490, + 31.014982, + 31.016468, + 31.017946, + 31.019418, + 31.020884, + 31.022342, + 31.023794, + 31.025239, + 31.026678, + 31.028110, + 31.029536, + 31.030956, + 31.032369, + 31.033775, + 31.035175, + 31.036569, + 31.037957, + 31.039339, + 31.040714, + 31.042083, + 31.043446, + 31.044803, + 31.046154, + 31.047499, + 31.048838, + 31.050171, + 31.051499, + 31.052820, + 31.054136, + 31.055445, + 31.056749, + 31.058048, + 31.059340, + 31.060627, + 31.061908, + 31.063184, + 31.064454, + 31.065719, + 31.066978, + 31.068232, + 31.069480, + 31.070723, + 31.071961, + 31.073193, + 31.074420, + 31.075641, + 31.076858, + 31.078069, + 31.079275, + 31.080476, + 31.081671, + 31.082862, + 31.084047, + 31.085228, + 31.086403, + 31.087574, + 31.088739, + 31.089900, + 31.091056, + 31.092206, + 31.093352, + 31.094494, + 31.095630, + 31.096762, + 31.097889, + 31.099011, + 31.100128, + 31.101241, + 31.102349, + 31.103453, + 31.104552, + 31.105646, + 31.106736, + 31.107822, + 31.108903, + 31.109979, + 31.111051, + 31.112119, + 31.113182, + 31.114241, + 31.115296, + 31.116346, + 31.117392, + 31.118433, + 31.119471, + 31.120504, + 31.121533, + 31.122558, + 31.123579, + 31.124595, + 31.125608, + 31.126616, + 31.127621, + 31.128621, + 31.129617, + 31.130609, + 31.131598, + 31.132582, + 31.133563, + 31.134539, + 31.135512, + 31.136480, + 31.137445, + 31.138406, + 31.139363, + 31.140317, + 31.141267, + 31.142213, + 31.143155, + 31.144093, + 31.145028, + 31.145959, + 31.146887, + 31.147810, + 31.148731, + 31.149647, + 31.150560, + 31.151470, + 31.152376, + 31.153278, + 31.154177, + 31.155072, + 31.155964, + 31.156853, + 31.157738, + 31.158620, + 31.159498, + 31.160373, + 31.161244, + 31.162112, + 31.162977, + 31.163839, + 31.164697, + 31.165552, + 31.166404, + 31.167252, + 31.168097, + 31.168939, + 31.169778, + 31.170614, + 31.171446, + 31.172275, + 31.173102, + 31.173925, + 31.174745, + 31.175561, + 31.176375, + 31.177186, + 31.177994, + 31.178798, + 31.179600, + 31.180399, + 31.181195, + 31.181987, + 31.182777, + 31.183564, + 31.184348, + 31.185129, + 31.185907, + 31.186682, + 31.187455, + 31.188224, + 31.188991, + 31.189755, + 31.190516, + 31.191274, + 31.192030, + 31.192782, + 31.193532, + 31.194280, + 31.195024, + 31.195766, + 31.196505, + 31.197242, + 31.197975, + 31.198706, + 31.199435, + 31.200161, + 31.200884, + 31.201604, + 31.202322, + 31.203038, + 31.203751, + 31.204461, + 31.205169, + 31.205874, + 31.206576, + 31.207276, + 31.207974, + 31.208669, + 31.209362, + 31.210052, + 31.210740, + 31.211425, + 31.212108, + 31.212789, + 31.213467, + 31.214142, + 31.214816, + 31.215486, + 31.216155, + 31.216821, + 31.217485, + 31.218147, + 31.218806, + 31.219463, + 31.220117, + 31.220770, + 31.221420, + 31.222067, + 31.222713, + 31.223356, + 31.223997, + 31.224636, + 31.225273, + 31.225907, + 31.226539, + 31.227169, + 31.227797, + 31.228423, + 31.229046, + 31.229668, + 31.230287, + 31.230904, + 31.231519, + 31.232132, + 31.232743, + 31.233352, + 31.233958, + 31.234563, + 31.235165, + 31.235766, + 31.236364, + 31.236961, + 31.237555, + 31.238147, + 31.238738, + 31.239326, + 31.239913, + 31.240497, + 31.241080, + 31.241660, + 31.242239, + 31.242815, + 31.243390, + 31.243963, + 31.244534, + 31.245103, + 31.245670, + 31.246235, + 31.246798, + 31.247360, + 31.247919, + 31.248477, + 31.249033, + 31.249587, + 31.250139, + 31.250689, + 31.251238, + 31.251785, + 31.252330, + 31.252873, + 31.253414, + 31.253954, + 31.254492, + 31.255028, + 31.255562, + 31.256094, + 31.256625, + 31.257154, + 31.257682, + 31.258207, + 31.258731, + 31.259254, + 31.259774, + 31.260293, + 31.260810, + 31.261326, + 31.261840, + 31.262352, + 31.262863, + 31.263371, + 31.263879, + 31.264384, + 31.264888, + 31.265391, + 31.265892, + 31.266391, + 31.266888, + 31.267385, + 31.267879, + 31.268372, + 31.268863, + 31.269353, + 31.269841, + 31.270328, + 31.270813, + 31.271296, + 31.271779, + 31.272259, + 31.272738, + 31.273216, + 31.273692, + 31.274166, + 31.274639, + 31.275111, + 31.275581, + 31.276049, + 31.276516, + 31.276982, + 31.277446, + 31.277909, + 31.278370, + 31.278830, + 31.279289, + 31.279746, + 31.280201, + 31.280656, + 31.281108, + 31.281560, + 31.282010, + 31.282458, + 31.282906, + 31.283352, + 31.283796, + 31.284239, + 31.284681, + 31.285121, + 31.285560, + 31.285998, + 31.286435, + 31.286870, + 31.287303, + 31.287736, + 31.288167, + 31.288597, + 31.289025, + 31.289452, + 31.289878, + 31.290303, + 31.290726, + 31.291148, + 31.291569, + 31.291988, + 31.292406, + 31.292823, + 31.293239, + 31.293654, + 31.294067, + 31.294479, + 31.294889, + 31.295299, + 31.295707, + }, + {// The expectations for dimension = 64 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041666, + 5.226666, + 5.414999, + 5.606664, + 5.801661, + 5.999990, + 6.201648, + 6.406634, + 6.614943, + 6.826570, + 7.041506, + 7.259739, + 7.481250, + 7.706016, + 7.934002, + 8.165164, + 8.399444, + 8.636768, + 8.877044, + 9.120159, + 9.365979, + 9.614343, + 9.865069, + 10.117948, + 10.372748, + 10.629214, + 10.887073, + 11.146035, + 11.405795, + 11.666042, + 11.926460, + 12.186733, + 12.446551, + 12.705611, + 12.963622, + 13.220309, + 13.475413, + 13.728694, + 13.979933, + 14.228930, + 14.475506, + 14.719502, + 14.960779, + 15.199217, + 15.434712, + 15.667176, + 15.896538, + 16.122740, + 16.345735, + 16.565489, + 16.781977, + 16.995185, + 17.205106, + 17.411739, + 17.615092, + 17.815176, + 18.012011, + 18.205617, + 18.396021, + 18.583252, + 18.767343, + 18.948327, + 19.126243, + 19.301129, + 19.473026, + 19.641975, + 19.808020, + 19.971204, + 20.131571, + 20.289167, + 20.444037, + 20.596226, + 20.745781, + 20.892746, + 21.037167, + 21.179090, + 21.318560, + 21.455621, + 21.590319, + 21.722696, + 21.852796, + 21.980664, + 22.106340, + 22.229866, + 22.351285, + 22.470637, + 22.587962, + 22.703299, + 22.816687, + 22.928165, + 23.037769, + 23.145536, + 23.251503, + 23.355705, + 23.458177, + 23.558953, + 23.658066, + 23.755550, + 23.851436, + 23.945755, + 24.038539, + 24.129819, + 24.219623, + 24.307980, + 24.394919, + 24.480469, + 24.564655, + 24.647505, + 24.729045, + 24.809300, + 24.888295, + 24.966055, + 25.042604, + 25.117965, + 25.192161, + 25.265215, + 25.337148, + 25.407981, + 25.477737, + 25.546435, + 25.614095, + 25.680738, + 25.746382, + 25.811047, + 25.874750, + 25.937510, + 25.999344, + 26.060269, + 26.120303, + 26.179463, + 26.237763, + 26.295220, + 26.351850, + 26.407667, + 26.462687, + 26.516924, + 26.570391, + 26.623104, + 26.675076, + 26.726319, + 26.776847, + 26.826673, + 26.875809, + 26.924268, + 26.972061, + 27.019200, + 27.065697, + 27.111562, + 27.156807, + 27.201443, + 27.245480, + 27.288929, + 27.331799, + 27.374101, + 27.415843, + 27.457037, + 27.497690, + 27.537813, + 27.577414, + 27.616502, + 27.655085, + 27.693172, + 27.730771, + 27.767890, + 27.804538, + 27.840721, + 27.876448, + 27.911726, + 27.946562, + 27.980963, + 28.014937, + 28.048490, + 28.081630, + 28.114362, + 28.146693, + 28.178630, + 28.210179, + 28.241345, + 28.272136, + 28.302557, + 28.332613, + 28.362310, + 28.391655, + 28.420651, + 28.449306, + 28.477623, + 28.505609, + 28.533268, + 28.560605, + 28.587625, + 28.614333, + 28.640734, + 28.666831, + 28.692631, + 28.718136, + 28.743352, + 28.768283, + 28.792933, + 28.817306, + 28.841406, + 28.865238, + 28.888804, + 28.912110, + 28.935158, + 28.957953, + 28.980498, + 29.002796, + 29.024852, + 29.046669, + 29.068249, + 29.089597, + 29.110716, + 29.131608, + 29.152278, + 29.172727, + 29.192960, + 29.212980, + 29.232788, + 29.252389, + 29.271784, + 29.290978, + 29.309972, + 29.328769, + 29.347372, + 29.365784, + 29.384007, + 29.402043, + 29.419896, + 29.437568, + 29.455060, + 29.472376, + 29.489518, + 29.506488, + 29.523288, + 29.539921, + 29.556388, + 29.572693, + 29.588837, + 29.604821, + 29.620649, + 29.636322, + 29.651843, + 29.667212, + 29.682433, + 29.697506, + 29.712435, + 29.727220, + 29.741863, + 29.756367, + 29.770733, + 29.784963, + 29.799058, + 29.813020, + 29.826851, + 29.840552, + 29.854126, + 29.867573, + 29.880895, + 29.894093, + 29.907170, + 29.920127, + 29.932965, + 29.945685, + 29.958289, + 29.970778, + 29.983154, + 29.995418, + 30.007572, + 30.019616, + 30.031553, + 30.043382, + 30.055106, + 30.066726, + 30.078243, + 30.089658, + 30.100973, + 30.112188, + 30.123305, + 30.134325, + 30.145248, + 30.156077, + 30.166812, + 30.177454, + 30.188004, + 30.198464, + 30.208834, + 30.219115, + 30.229309, + 30.239416, + 30.249437, + 30.259374, + 30.269227, + 30.278997, + 30.288685, + 30.298293, + 30.307820, + 30.317268, + 30.326637, + 30.335929, + 30.345144, + 30.354284, + 30.363348, + 30.372338, + 30.381255, + 30.390100, + 30.398872, + 30.407574, + 30.416205, + 30.424766, + 30.433259, + 30.441684, + 30.450041, + 30.458332, + 30.466557, + 30.474716, + 30.482811, + 30.490842, + 30.498810, + 30.506716, + 30.514559, + 30.522341, + 30.530063, + 30.537724, + 30.545326, + 30.552870, + 30.560355, + 30.567782, + 30.575153, + 30.582467, + 30.589725, + 30.596928, + 30.604076, + 30.611170, + 30.618211, + 30.625198, + 30.632133, + 30.639015, + 30.645847, + 30.652627, + 30.659356, + 30.666036, + 30.672666, + 30.679247, + 30.685779, + 30.692263, + 30.698700, + 30.705089, + 30.711432, + 30.717729, + 30.723980, + 30.730185, + 30.736345, + 30.742461, + 30.748533, + 30.754561, + 30.760546, + 30.766488, + 30.772388, + 30.778246, + 30.784062, + 30.789837, + 30.795571, + 30.801264, + 30.806918, + 30.812531, + 30.818106, + 30.823641, + 30.829138, + 30.834596, + 30.840017, + 30.845400, + 30.850746, + 30.856055, + 30.861327, + 30.866563, + 30.871764, + 30.876928, + 30.882058, + 30.887152, + 30.892212, + 30.897238, + 30.902230, + 30.907188, + 30.912113, + 30.917004, + 30.921863, + 30.926690, + 30.931484, + 30.936246, + 30.940977, + 30.945676, + 30.950344, + 30.954981, + 30.959588, + 30.964165, + 30.968711, + 30.973228, + 30.977715, + 30.982173, + 30.986603, + 30.991003, + 30.995375, + 30.999718, + 31.004034, + 31.008322, + 31.012582, + 31.016815, + 31.021021, + 31.025200, + 31.029353, + 31.033479, + 31.037579, + 31.041653, + 31.045701, + 31.049724, + 31.053722, + 31.057694, + 31.061642, + 31.065565, + 31.069463, + 31.073337, + 31.077188, + 31.081014, + 31.084816, + 31.088596, + 31.092351, + 31.096084, + 31.099794, + 31.103481, + 31.107146, + 31.110788, + 31.114408, + 31.118006, + 31.121583, + 31.125137, + 31.128671, + 31.132183, + 31.135673, + 31.139143, + 31.142592, + 31.146021, + 31.149429, + 31.152817, + 31.156184, + 31.159532, + 31.162860, + 31.166168, + 31.169456, + 31.172726, + 31.175976, + 31.179207, + 31.182419, + 31.185612, + 31.188787, + 31.191943, + 31.195081, + 31.198201, + 31.201302, + 31.204386, + 31.207452, + 31.210500, + 31.213531, + 31.216545, + 31.219541, + 31.222520, + 31.225482, + 31.228428, + 31.231356, + 31.234268, + 31.237164, + 31.240043, + 31.242906, + 31.245753, + 31.248584, + 31.251399, + 31.254198, + 31.256982, + 31.259750, + 31.262503, + 31.265240, + 31.267962, + 31.270670, + 31.273362, + 31.276039, + 31.278702, + 31.281350, + 31.283984, + 31.286603, + 31.289208, + 31.291798, + 31.294375, + 31.296937, + 31.299486, + 31.302021, + 31.304542, + 31.307050, + 31.309544, + 31.312024, + 31.314492, + 31.316946, + 31.319387, + 31.321815, + 31.324230, + 31.326632, + 31.329022, + 31.331398, + 31.333763, + 31.336114, + 31.338454, + 31.340781, + 31.343095, + 31.345398, + 31.347689, + 31.349967, + 31.352234, + 31.354489, + 31.356732, + 31.358964, + 31.361184, + 31.363392, + 31.365589, + 31.367775, + 31.369949, + 31.372113, + 31.374265, + 31.376406, + 31.378537, + 31.380656, + 31.382765, + 31.384862, + 31.386950, + 31.389026, + 31.391092, + 31.393148, + 31.395193, + 31.397228, + 31.399253, + 31.401268, + 31.403272, + 31.405267, + 31.407252, + 31.409226, + 31.411191, + 31.413146, + 31.415091, + 31.417027, + 31.418953, + 31.420870, + 31.422777, + 31.424675, + 31.426563, + 31.428443, + 31.430313, + 31.432174, + 31.434025, + 31.435868, + 31.437702, + 31.439527, + 31.441343, + 31.443150, + 31.444949, + 31.446738, + 31.448520, + 31.450292, + 31.452056, + 31.453812, + 31.455559, + 31.457298, + 31.459029, + 31.460751, + 31.462465, + 31.464171, + 31.465869, + 31.467559, + 31.469241, + 31.470915, + 31.472581, + 31.474239, + 31.475890, + 31.477532, + 31.479167, + 31.480795, + 31.482414, + 31.484027, + 31.485631, + 31.487228, + 31.488818, + 31.490401, + 31.491976, + 31.493544, + 31.495104, + 31.496658, + 31.498204, + 31.499743, + 31.501275, + 31.502800, + 31.504318, + 31.505829, + 31.507334, + 31.508831, + 31.510322, + 31.511806, + 31.513283, + 31.514753, + 31.516217, + 31.517674, + 31.519125, + 31.520569, + 31.522007, + 31.523438, + 31.524863, + 31.526281, + 31.527694, + 31.529099, + 31.530499, + 31.531892, + 31.533279, + 31.534660, + 31.536035, + 31.537404, + 31.538767, + 31.540124, + 31.541475, + 31.542819, + 31.544158, + 31.545492, + 31.546819, + 31.548140, + 31.549456, + 31.550766, + 31.552070, + 31.553369, + 31.554662, + 31.555949, + 31.557231, + 31.558508, + 31.559778, + 31.561044, + 31.562304, + 31.563558, + 31.564807, + 31.566051, + 31.567290, + 31.568523, + 31.569751, + 31.570973, + 31.572191, + 31.573403, + 31.574610, + 31.575813, + 31.577010, + 31.578202, + 31.579388, + 31.580570, + 31.581747, + 31.582919, + 31.584086, + 31.585249, + 31.586406, + 31.587559, + 31.588706, + 31.589849, + 31.590988, + 31.592121, + 31.593250, + 31.594374, + 31.595493, + 31.596608, + 31.597719, + 31.598824, + 31.599925, + 31.601022, + 31.602114, + 31.603202, + 31.604285, + 31.605364, + 31.606438, + 31.607508, + 31.608574, + 31.609635, + 31.610692, + 31.611745, + 31.612793, + 31.613838, + 31.614878, + 31.615913, + 31.616945, + 31.617973, + 31.618996, + 31.620015, + 31.621031, + 31.622042, + 31.623049, + 31.624052, + 31.625051, + 31.626046, + 31.627038, + 31.628025, + 31.629008, + 31.629988, + 31.630963, + 31.631935, + 31.632903, + 31.633867, + 31.634827, + 31.635784, + 31.636737, + 31.637686, + 31.638631, + 31.639573, + 31.640511, + 31.641445, + 31.642376, + 31.643303, + 31.644227, + 31.645147, + 31.646063, + 31.646976, + 31.647885, + 31.648791, + 31.649693, + 31.650592, + 31.651488, + 31.652380, + 31.653268, + 31.654153, + 31.655035, + 31.655913, + 31.656789, + 31.657660, + 31.658529, + 31.659394, + 31.660256, + 31.661114, + 31.661970, + 31.662822, + 31.663671, + 31.664516, + 31.665359, + 31.666198, + 31.667034, + 31.667868, + 31.668697, + 31.669524, + 31.670348, + 31.671169, + 31.671986, + 31.672801, + 31.673613, + 31.674421, + 31.675227, + 31.676029, + 31.676829, + 31.677625, + 31.678419, + 31.679210, + 31.679998, + 31.680783, + 31.681565, + 31.682344, + 31.683121, + 31.683894, + 31.684665, + 31.685433, + 31.686198, + 31.686960, + 31.687720, + 31.688476, + 31.689230, + 31.689982, + 31.690730, + 31.691476, + 31.692219, + 31.692960, + 31.693698, + 31.694433, + 31.695166, + 31.695896, + 31.696623, + 31.697348, + 31.698070, + 31.698789, + 31.699506, + 31.700221, + 31.700932, + 31.701642, + 31.702349, + 31.703053, + 31.703755, + 31.704454, + 31.705151, + 31.705845, + 31.706537, + 31.707227, + 31.707914, + 31.708599, + 31.709281, + 31.709961, + 31.710638, + 31.711314, + 31.711986, + 31.712657, + 31.713325, + 31.713991, + 31.714654, + 31.715315, + 31.715974, + 31.716631, + 31.717285, + 31.717937, + 31.718587, + 31.719235, + 31.719880, + 31.720523, + 31.721164, + 31.721803, + 31.722439, + 31.723074, + 31.723706, + 31.724336, + 31.724964, + 31.725589, + 31.726213, + 31.726834, + 31.727454, + 31.728071, + 31.728686, + 31.729299, + 31.729910, + 31.730519, + 31.731126, + 31.731731, + 31.732334, + 31.732934, + 31.733533, + 31.734130, + 31.734725, + 31.735317, + 31.735908, + 31.736497, + 31.737084, + 31.737669, + 31.738252, + 31.738833, + 31.739412, + 31.739989, + 31.740564, + 31.741137, + 31.741709, + 31.742278, + 31.742846, + 31.743412, + 31.743976, + 31.744538, + 31.745098, + 31.745656, + 31.746213, + 31.746768, + 31.747321, + 31.747872, + 31.748421, + 31.748969, + 31.749514, + 31.750058, + 31.750600, + 31.751141, + 31.751679, + 31.752216, + 31.752752, + 31.753285, + 31.753817, + 31.754347, + 31.754875, + 31.755402, + 31.755927, + 31.756450, + 31.756971, + 31.757491, + 31.758010, + 31.758526, + 31.759041, + 31.759554, + 31.760066, + 31.760576, + 31.761084, + 31.761591, + 31.762096, + 31.762600, + 31.763102, + 31.763602, + 31.764101, + 31.764598, + 31.765094, + 31.765588, + 31.766080, + 31.766571, + 31.767061, + 31.767548, + 31.768035, + 31.768520, + 31.769003, + 31.769485, + 31.769965, + 31.770444, + 31.770921, + 31.771397, + 31.771871, + 31.772344, + 31.772816, + 31.773286, + 31.773754, + 31.774221, + 31.774687, + 31.775151, + 31.775614, + 31.776075, + 31.776535, + 31.776993, + 31.777450, + 31.777906, + 31.778360, + 31.778813, + 31.779264, + 31.779715, + 31.780163, + 31.780611, + 31.781057, + 31.781501, + 31.781945, + 31.782386, + 31.782827, + 31.783266, + 31.783704, + 31.784141, + 31.784576, + 31.785010, + 31.785443, + 31.785874, + 31.786304, + 31.786733, + 31.787160, + 31.787587, + 31.788012, + 31.788435, + 31.788858, + 31.789279, + }, + {// The expectations for dimension = 65 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041666, + 5.226666, + 5.414999, + 5.606665, + 5.801663, + 5.999993, + 6.201654, + 6.406644, + 6.614960, + 6.826597, + 7.041550, + 7.259807, + 7.481356, + 7.706175, + 7.934238, + 8.165506, + 8.399932, + 8.637451, + 8.877983, + 9.121430, + 9.367672, + 9.616564, + 9.867940, + 10.121607, + 10.377350, + 10.634928, + 10.894081, + 11.154528, + 11.415975, + 11.678116, + 11.940637, + 12.203223, + 12.465560, + 12.727340, + 12.988264, + 13.248047, + 13.506420, + 13.763130, + 14.017945, + 14.270651, + 14.521057, + 14.768989, + 15.014295, + 15.256843, + 15.496516, + 15.733218, + 15.966864, + 16.197387, + 16.424732, + 16.648858, + 16.869730, + 17.087329, + 17.301641, + 17.512660, + 17.720388, + 17.924834, + 18.126011, + 18.323937, + 18.518634, + 18.710131, + 18.898455, + 19.083640, + 19.265720, + 19.444734, + 19.620719, + 19.793716, + 19.963768, + 20.130916, + 20.295204, + 20.456677, + 20.615379, + 20.771356, + 20.924652, + 21.075313, + 21.223385, + 21.368912, + 21.511940, + 21.652514, + 21.790677, + 21.926475, + 22.059951, + 22.191148, + 22.320109, + 22.446876, + 22.571491, + 22.693995, + 22.814428, + 22.932830, + 23.049240, + 23.163698, + 23.276240, + 23.386905, + 23.495728, + 23.602746, + 23.707994, + 23.811506, + 23.913317, + 24.013460, + 24.111968, + 24.208872, + 24.304204, + 24.397994, + 24.490274, + 24.581072, + 24.670418, + 24.758339, + 24.844863, + 24.930019, + 25.013831, + 25.096327, + 25.177531, + 25.257469, + 25.336165, + 25.413643, + 25.489926, + 25.565038, + 25.639000, + 25.711835, + 25.783563, + 25.854207, + 25.923787, + 25.992322, + 26.059832, + 26.126337, + 26.191856, + 26.256406, + 26.320006, + 26.382674, + 26.444427, + 26.505281, + 26.565254, + 26.624361, + 26.682618, + 26.740041, + 26.796645, + 26.852445, + 26.907455, + 26.961690, + 27.015164, + 27.067889, + 27.119880, + 27.171150, + 27.221711, + 27.271575, + 27.320756, + 27.369266, + 27.417115, + 27.464315, + 27.510878, + 27.556816, + 27.602137, + 27.646854, + 27.690976, + 27.734514, + 27.777478, + 27.819877, + 27.861721, + 27.903020, + 27.943782, + 27.984016, + 28.023732, + 28.062938, + 28.101642, + 28.139853, + 28.177578, + 28.214827, + 28.251606, + 28.287923, + 28.323787, + 28.359203, + 28.394180, + 28.428724, + 28.462842, + 28.496542, + 28.529829, + 28.562711, + 28.595193, + 28.627283, + 28.658986, + 28.690308, + 28.721255, + 28.751833, + 28.782049, + 28.811906, + 28.841412, + 28.870571, + 28.899388, + 28.927870, + 28.956020, + 28.983844, + 29.011347, + 29.038534, + 29.065409, + 29.091977, + 29.118243, + 29.144211, + 29.169886, + 29.195271, + 29.220372, + 29.245192, + 29.269735, + 29.294006, + 29.318008, + 29.341746, + 29.365222, + 29.388442, + 29.411408, + 29.434124, + 29.456593, + 29.478820, + 29.500808, + 29.522559, + 29.544078, + 29.565367, + 29.586431, + 29.607271, + 29.627891, + 29.648294, + 29.668483, + 29.688461, + 29.708231, + 29.727796, + 29.747158, + 29.766321, + 29.785286, + 29.804057, + 29.822636, + 29.841026, + 29.859230, + 29.877249, + 29.895086, + 29.912745, + 29.930226, + 29.947532, + 29.964666, + 29.981630, + 29.998427, + 30.015057, + 30.031524, + 30.047829, + 30.063975, + 30.079964, + 30.095798, + 30.111478, + 30.127006, + 30.142386, + 30.157618, + 30.172704, + 30.187646, + 30.202446, + 30.217106, + 30.231627, + 30.246012, + 30.260261, + 30.274377, + 30.288361, + 30.302215, + 30.315940, + 30.329539, + 30.343012, + 30.356360, + 30.369587, + 30.382692, + 30.395678, + 30.408546, + 30.421298, + 30.433934, + 30.446456, + 30.458865, + 30.471163, + 30.483352, + 30.495432, + 30.507404, + 30.519271, + 30.531032, + 30.542690, + 30.554246, + 30.565700, + 30.577054, + 30.588309, + 30.599467, + 30.610528, + 30.621493, + 30.632364, + 30.643142, + 30.653827, + 30.664421, + 30.674925, + 30.685339, + 30.695665, + 30.705904, + 30.716057, + 30.726124, + 30.736107, + 30.746006, + 30.755823, + 30.765559, + 30.775213, + 30.784788, + 30.794284, + 30.803702, + 30.813042, + 30.822306, + 30.831495, + 30.840608, + 30.849648, + 30.858615, + 30.867509, + 30.876331, + 30.885083, + 30.893764, + 30.902376, + 30.910920, + 30.919395, + 30.927804, + 30.936146, + 30.944422, + 30.952633, + 30.960779, + 30.968862, + 30.976881, + 30.984838, + 30.992734, + 31.000568, + 31.008341, + 31.016055, + 31.023709, + 31.031305, + 31.038842, + 31.046322, + 31.053745, + 31.061111, + 31.068422, + 31.075677, + 31.082878, + 31.090025, + 31.097117, + 31.104157, + 31.111144, + 31.118080, + 31.124963, + 31.131796, + 31.138578, + 31.145310, + 31.151993, + 31.158626, + 31.165211, + 31.171748, + 31.178237, + 31.184678, + 31.191074, + 31.197422, + 31.203725, + 31.209983, + 31.216196, + 31.222364, + 31.228488, + 31.234568, + 31.240605, + 31.246599, + 31.252550, + 31.258460, + 31.264327, + 31.270154, + 31.275939, + 31.281684, + 31.287389, + 31.293054, + 31.298680, + 31.304267, + 31.309814, + 31.315324, + 31.320795, + 31.326229, + 31.331626, + 31.336986, + 31.342309, + 31.347595, + 31.352846, + 31.358061, + 31.363241, + 31.368385, + 31.373495, + 31.378571, + 31.383613, + 31.388620, + 31.393595, + 31.398536, + 31.403444, + 31.408320, + 31.413163, + 31.417974, + 31.422754, + 31.427502, + 31.432219, + 31.436905, + 31.441560, + 31.446185, + 31.450780, + 31.455345, + 31.459880, + 31.464386, + 31.468863, + 31.473311, + 31.477730, + 31.482121, + 31.486484, + 31.490819, + 31.495127, + 31.499406, + 31.503659, + 31.507885, + 31.512084, + 31.516257, + 31.520403, + 31.524523, + 31.528618, + 31.532687, + 31.536730, + 31.540748, + 31.544741, + 31.548710, + 31.552653, + 31.556573, + 31.560468, + 31.564339, + 31.568186, + 31.572010, + 31.575811, + 31.579588, + 31.583342, + 31.587073, + 31.590782, + 31.594468, + 31.598132, + 31.601774, + 31.605394, + 31.608992, + 31.612568, + 31.616123, + 31.619657, + 31.623170, + 31.626662, + 31.630133, + 31.633583, + 31.637013, + 31.640423, + 31.643813, + 31.647182, + 31.650532, + 31.653863, + 31.657173, + 31.660465, + 31.663737, + 31.666991, + 31.670225, + 31.673441, + 31.676638, + 31.679816, + 31.682976, + 31.686119, + 31.689243, + 31.692349, + 31.695437, + 31.698508, + 31.701561, + 31.704597, + 31.707616, + 31.710617, + 31.713602, + 31.716570, + 31.719521, + 31.722455, + 31.725373, + 31.728275, + 31.731160, + 31.734030, + 31.736883, + 31.739720, + 31.742542, + 31.745348, + 31.748139, + 31.750914, + 31.753674, + 31.756418, + 31.759148, + 31.761862, + 31.764562, + 31.767247, + 31.769918, + 31.772573, + 31.775215, + 31.777842, + 31.780455, + 31.783054, + 31.785638, + 31.788209, + 31.790766, + 31.793310, + 31.795839, + 31.798355, + 31.800858, + 31.803348, + 31.805824, + 31.808287, + 31.810737, + 31.813174, + 31.815598, + 31.818009, + 31.820408, + 31.822794, + 31.825167, + 31.827529, + 31.829877, + 31.832214, + 31.834538, + 31.836851, + 31.839151, + 31.841439, + 31.843716, + 31.845980, + 31.848234, + 31.850475, + 31.852705, + 31.854924, + 31.857131, + 31.859327, + 31.861511, + 31.863685, + 31.865847, + 31.867999, + 31.870140, + 31.872269, + 31.874388, + 31.876497, + 31.878594, + 31.880682, + 31.882758, + 31.884825, + 31.886881, + 31.888926, + 31.890962, + 31.892987, + 31.895003, + 31.897008, + 31.899003, + 31.900989, + 31.902965, + 31.904930, + 31.906887, + 31.908833, + 31.910771, + 31.912698, + 31.914617, + 31.916525, + 31.918425, + 31.920315, + 31.922196, + 31.924069, + 31.925931, + 31.927785, + 31.929630, + 31.931467, + 31.933294, + 31.935112, + 31.936922, + 31.938723, + 31.940516, + 31.942300, + 31.944075, + 31.945842, + 31.947601, + 31.949351, + 31.951093, + 31.952827, + 31.954552, + 31.956270, + 31.957979, + 31.959680, + 31.961374, + 31.963059, + 31.964737, + 31.966406, + 31.968068, + 31.969722, + 31.971369, + 31.973008, + 31.974639, + 31.976263, + 31.977879, + 31.979488, + 31.981089, + 31.982683, + 31.984270, + 31.985849, + 31.987421, + 31.988986, + 31.990544, + 31.992094, + 31.993638, + 31.995175, + 31.996704, + 31.998227, + 31.999743, + 32.001252, + 32.002754, + 32.004250, + 32.005738, + 32.007220, + 32.008696, + 32.010165, + 32.011627, + 32.013082, + 32.014532, + 32.015974, + 32.017411, + 32.018841, + 32.020264, + 32.021682, + 32.023093, + 32.024498, + 32.025896, + 32.027289, + 32.028675, + 32.030055, + 32.031430, + 32.032798, + 32.034160, + 32.035517, + 32.036867, + 32.038212, + 32.039550, + 32.040883, + 32.042210, + 32.043532, + 32.044848, + 32.046158, + 32.047462, + 32.048761, + 32.050054, + 32.051342, + 32.052624, + 32.053901, + 32.055172, + 32.056438, + 32.057698, + 32.058953, + 32.060203, + 32.061447, + 32.062687, + 32.063921, + 32.065149, + 32.066373, + 32.067591, + 32.068805, + 32.070013, + 32.071216, + 32.072414, + 32.073607, + 32.074795, + 32.075979, + 32.077157, + 32.078330, + 32.079499, + 32.080662, + 32.081821, + 32.082975, + 32.084124, + 32.085269, + 32.086409, + 32.087544, + 32.088674, + 32.089800, + 32.090922, + 32.092038, + 32.093150, + 32.094258, + 32.095361, + 32.096460, + 32.097554, + 32.098643, + 32.099729, + 32.100809, + 32.101886, + 32.102958, + 32.104026, + 32.105089, + 32.106149, + 32.107204, + 32.108255, + 32.109301, + 32.110344, + 32.111382, + 32.112416, + 32.113446, + 32.114472, + 32.115494, + 32.116511, + 32.117525, + 32.118535, + 32.119541, + 32.120542, + 32.121540, + 32.122534, + 32.123524, + 32.124510, + 32.125492, + 32.126471, + 32.127445, + 32.128416, + 32.129383, + 32.130346, + 32.131306, + 32.132262, + 32.133214, + 32.134162, + 32.135107, + 32.136048, + 32.136985, + 32.137919, + 32.138849, + 32.139776, + 32.140699, + 32.141619, + 32.142535, + 32.143447, + 32.144356, + 32.145262, + 32.146164, + 32.147062, + 32.147958, + 32.148850, + 32.149738, + 32.150623, + 32.151505, + 32.152383, + 32.153259, + 32.154130, + 32.154999, + 32.155864, + 32.156726, + 32.157585, + 32.158441, + 32.159293, + 32.160142, + 32.160988, + 32.161831, + 32.162671, + 32.163508, + 32.164341, + 32.165172, + 32.165999, + 32.166823, + 32.167645, + 32.168463, + 32.169278, + 32.170090, + 32.170900, + 32.171706, + 32.172509, + 32.173309, + 32.174107, + 32.174901, + 32.175693, + 32.176482, + 32.177268, + 32.178051, + 32.178831, + 32.179608, + 32.180383, + 32.181155, + 32.181924, + 32.182690, + 32.183453, + 32.184214, + 32.184972, + 32.185727, + 32.186479, + 32.187229, + 32.187976, + 32.188721, + 32.189463, + 32.190202, + 32.190938, + 32.191672, + 32.192403, + 32.193132, + 32.193858, + 32.194582, + 32.195303, + 32.196021, + 32.196737, + 32.197450, + 32.198161, + 32.198869, + 32.199575, + 32.200279, + 32.200980, + 32.201678, + 32.202374, + 32.203068, + 32.203759, + 32.204448, + 32.205134, + 32.205818, + 32.206500, + 32.207179, + 32.207856, + 32.208530, + 32.209203, + 32.209872, + 32.210540, + 32.211205, + 32.211868, + 32.212529, + 32.213188, + 32.213844, + 32.214498, + 32.215149, + 32.215799, + 32.216446, + 32.217091, + 32.217734, + 32.218375, + 32.219013, + 32.219650, + 32.220284, + 32.220916, + 32.221546, + 32.222174, + 32.222799, + 32.223423, + 32.224044, + 32.224664, + 32.225281, + 32.225896, + 32.226509, + 32.227120, + 32.227729, + 32.228336, + 32.228941, + 32.229544, + 32.230145, + 32.230744, + 32.231341, + 32.231936, + 32.232529, + 32.233120, + 32.233709, + 32.234296, + 32.234882, + 32.235465, + 32.236046, + 32.236626, + 32.237203, + 32.237779, + 32.238353, + 32.238925, + 32.239495, + 32.240063, + 32.240629, + 32.241194, + 32.241756, + 32.242317, + 32.242876, + 32.243433, + 32.243988, + 32.244542, + 32.245094, + 32.245644, + 32.246192, + 32.246738, + 32.247283, + 32.247826, + 32.248367, + 32.248906, + 32.249444, + 32.249980, + 32.250514, + 32.251047, + 32.251578, + 32.252107, + 32.252634, + 32.253160, + 32.253684, + 32.254206, + 32.254727, + 32.255246, + 32.255764, + 32.256280, + 32.256794, + 32.257306, + 32.257817, + 32.258327, + 32.258834, + 32.259341, + 32.259845, + 32.260348, + 32.260850, + 32.261349, + 32.261848, + 32.262344, + 32.262840, + 32.263333, + 32.263825, + 32.264316, + 32.264805, + 32.265292, + 32.265778, + 32.266263, + 32.266746, + 32.267227, + 32.267707, + 32.268186, + 32.268663, + 32.269138, + 32.269612, + 32.270085, + 32.270556, + 32.271026, + 32.271494, + 32.271961, + 32.272427, + 32.272891, + 32.273353, + 32.273815, + 32.274274, + 32.274733, + 32.275190, + 32.275645, + 32.276100, + 32.276552, + 32.277004, + 32.277454, + 32.277903, + 32.278350, + 32.278796, + 32.279241, + 32.279684, + 32.280126, + 32.280567, + 32.281006, + 32.281444, + 32.281881, + 32.282317, + 32.282751, + }, + {// The expectations for dimension = 66 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226666, + 5.414999, + 5.606665, + 5.801664, + 5.999995, + 6.201658, + 6.406651, + 6.614971, + 6.826617, + 7.041582, + 7.259859, + 7.481436, + 7.706298, + 7.934421, + 8.165775, + 8.400319, + 8.637998, + 8.878744, + 9.122471, + 9.369071, + 9.618418, + 9.870358, + 10.124717, + 10.381294, + 10.639865, + 10.900181, + 11.161977, + 11.424966, + 11.688850, + 11.953320, + 12.218063, + 12.482764, + 12.747110, + 13.010798, + 13.273533, + 13.535035, + 13.795042, + 14.053308, + 14.309606, + 14.563732, + 14.815499, + 15.064741, + 15.311314, + 15.555089, + 15.795956, + 16.033823, + 16.268611, + 16.500257, + 16.728708, + 16.953925, + 17.175880, + 17.394553, + 17.609933, + 17.822015, + 18.030804, + 18.236308, + 18.438542, + 18.637525, + 18.833281, + 19.025836, + 19.215221, + 19.401468, + 19.584612, + 19.764691, + 19.941744, + 20.115811, + 20.286933, + 20.455154, + 20.620517, + 20.783066, + 20.942845, + 21.099899, + 21.254273, + 21.406013, + 21.555163, + 21.701768, + 21.845874, + 21.987524, + 22.126764, + 22.263636, + 22.398185, + 22.530453, + 22.660482, + 22.788316, + 22.913994, + 23.037559, + 23.159049, + 23.278506, + 23.395967, + 23.511471, + 23.625057, + 23.736760, + 23.846617, + 23.954665, + 24.060938, + 24.165471, + 24.268297, + 24.369450, + 24.468963, + 24.566866, + 24.663192, + 24.757972, + 24.851234, + 24.943009, + 25.033325, + 25.122211, + 25.209695, + 25.295803, + 25.380561, + 25.463997, + 25.546135, + 25.627001, + 25.706618, + 25.785011, + 25.862202, + 25.938216, + 26.013073, + 26.086797, + 26.159408, + 26.230927, + 26.301376, + 26.370773, + 26.439139, + 26.506494, + 26.572855, + 26.638241, + 26.702671, + 26.766162, + 26.828731, + 26.890395, + 26.951171, + 27.011074, + 27.070122, + 27.128329, + 27.185711, + 27.242282, + 27.298057, + 27.353050, + 27.407275, + 27.460747, + 27.513477, + 27.565480, + 27.616768, + 27.667354, + 27.717250, + 27.766468, + 27.815020, + 27.862917, + 27.910172, + 27.956794, + 28.002794, + 28.048184, + 28.092974, + 28.137174, + 28.180794, + 28.223844, + 28.266333, + 28.308270, + 28.349666, + 28.390529, + 28.430868, + 28.470691, + 28.510007, + 28.548825, + 28.587153, + 28.624997, + 28.662368, + 28.699271, + 28.735716, + 28.771708, + 28.807256, + 28.842366, + 28.877045, + 28.911301, + 28.945140, + 28.978569, + 29.011593, + 29.044220, + 29.076456, + 29.108306, + 29.139777, + 29.170875, + 29.201605, + 29.231973, + 29.261984, + 29.291644, + 29.320959, + 29.349933, + 29.378572, + 29.406881, + 29.434864, + 29.462528, + 29.489875, + 29.516911, + 29.543642, + 29.570070, + 29.596201, + 29.622039, + 29.647588, + 29.672853, + 29.697838, + 29.722546, + 29.746982, + 29.771150, + 29.795053, + 29.818695, + 29.842080, + 29.865212, + 29.888094, + 29.910730, + 29.933123, + 29.955277, + 29.977195, + 29.998880, + 30.020335, + 30.041564, + 30.062570, + 30.083356, + 30.103925, + 30.124279, + 30.144423, + 30.164358, + 30.184087, + 30.203614, + 30.222941, + 30.242070, + 30.261005, + 30.279748, + 30.298301, + 30.316667, + 30.334849, + 30.352848, + 30.370668, + 30.388311, + 30.405778, + 30.423073, + 30.440197, + 30.457152, + 30.473942, + 30.490568, + 30.507032, + 30.523336, + 30.539482, + 30.555472, + 30.571309, + 30.586993, + 30.602528, + 30.617915, + 30.633155, + 30.648251, + 30.663205, + 30.678018, + 30.692691, + 30.707228, + 30.721628, + 30.735895, + 30.750029, + 30.764033, + 30.777907, + 30.791654, + 30.805275, + 30.818771, + 30.832145, + 30.845396, + 30.858528, + 30.871541, + 30.884437, + 30.897217, + 30.909882, + 30.922435, + 30.934875, + 30.947205, + 30.959426, + 30.971539, + 30.983545, + 30.995446, + 31.007243, + 31.018936, + 31.030528, + 31.042019, + 31.053411, + 31.064704, + 31.075900, + 31.087000, + 31.098005, + 31.108916, + 31.119734, + 31.130460, + 31.141096, + 31.151641, + 31.162098, + 31.172466, + 31.182748, + 31.192944, + 31.203055, + 31.213082, + 31.223026, + 31.232888, + 31.242668, + 31.252368, + 31.261989, + 31.271531, + 31.280995, + 31.290382, + 31.299692, + 31.308928, + 31.318089, + 31.327176, + 31.336190, + 31.345132, + 31.354002, + 31.362802, + 31.371532, + 31.380193, + 31.388785, + 31.397310, + 31.405767, + 31.414158, + 31.422484, + 31.430744, + 31.438940, + 31.447073, + 31.455142, + 31.463149, + 31.471094, + 31.478979, + 31.486803, + 31.494566, + 31.502271, + 31.509917, + 31.517505, + 31.525036, + 31.532509, + 31.539926, + 31.547288, + 31.554594, + 31.561846, + 31.569043, + 31.576187, + 31.583278, + 31.590316, + 31.597302, + 31.604236, + 31.611120, + 31.617953, + 31.624736, + 31.631470, + 31.638154, + 31.644790, + 31.651378, + 31.657918, + 31.664410, + 31.670856, + 31.677256, + 31.683610, + 31.689918, + 31.696182, + 31.702400, + 31.708575, + 31.714706, + 31.720793, + 31.726838, + 31.732840, + 31.738800, + 31.744718, + 31.750595, + 31.756431, + 31.762226, + 31.767981, + 31.773696, + 31.779372, + 31.785008, + 31.790606, + 31.796165, + 31.801686, + 31.807170, + 31.812616, + 31.818025, + 31.823397, + 31.828733, + 31.834033, + 31.839298, + 31.844526, + 31.849720, + 31.854879, + 31.860003, + 31.865093, + 31.870150, + 31.875173, + 31.880162, + 31.885119, + 31.890043, + 31.894934, + 31.899793, + 31.904621, + 31.909416, + 31.914181, + 31.918915, + 31.923617, + 31.928290, + 31.932932, + 31.937544, + 31.942126, + 31.946679, + 31.951203, + 31.955697, + 31.960163, + 31.964601, + 31.969010, + 31.973391, + 31.977745, + 31.982071, + 31.986370, + 31.990641, + 31.994886, + 31.999104, + 32.003296, + 32.007461, + 32.011601, + 32.015715, + 32.019803, + 32.023866, + 32.027904, + 32.031917, + 32.035905, + 32.039869, + 32.043808, + 32.047724, + 32.051615, + 32.055483, + 32.059327, + 32.063148, + 32.066946, + 32.070720, + 32.074472, + 32.078201, + 32.081908, + 32.085593, + 32.089256, + 32.092896, + 32.096515, + 32.100113, + 32.103689, + 32.107244, + 32.110778, + 32.114291, + 32.117783, + 32.121255, + 32.124706, + 32.128137, + 32.131548, + 32.134939, + 32.138310, + 32.141662, + 32.144995, + 32.148307, + 32.151601, + 32.154876, + 32.158132, + 32.161369, + 32.164588, + 32.167788, + 32.170970, + 32.174134, + 32.177280, + 32.180407, + 32.183517, + 32.186610, + 32.189685, + 32.192743, + 32.195783, + 32.198806, + 32.201813, + 32.204802, + 32.207775, + 32.210731, + 32.213671, + 32.216594, + 32.219502, + 32.222393, + 32.225268, + 32.228127, + 32.230970, + 32.233798, + 32.236610, + 32.239407, + 32.242189, + 32.244955, + 32.247707, + 32.250443, + 32.253164, + 32.255871, + 32.258563, + 32.261241, + 32.263904, + 32.266553, + 32.269187, + 32.271808, + 32.274414, + 32.277006, + 32.279585, + 32.282150, + 32.284701, + 32.287239, + 32.289763, + 32.292274, + 32.294771, + 32.297256, + 32.299727, + 32.302186, + 32.304631, + 32.307064, + 32.309484, + 32.311891, + 32.314286, + 32.316669, + 32.319039, + 32.321396, + 32.323742, + 32.326075, + 32.328397, + 32.330706, + 32.333004, + 32.335290, + 32.337564, + 32.339826, + 32.342077, + 32.344317, + 32.346545, + 32.348762, + 32.350967, + 32.353162, + 32.355345, + 32.357517, + 32.359679, + 32.361829, + 32.363969, + 32.366098, + 32.368216, + 32.370324, + 32.372421, + 32.374508, + 32.376585, + 32.378651, + 32.380707, + 32.382753, + 32.384788, + 32.386814, + 32.388830, + 32.390835, + 32.392831, + 32.394817, + 32.396794, + 32.398761, + 32.400718, + 32.402666, + 32.404604, + 32.406533, + 32.408452, + 32.410363, + 32.412264, + 32.414155, + 32.416038, + 32.417912, + 32.419777, + 32.421632, + 32.423479, + 32.425317, + 32.427147, + 32.428967, + 32.430779, + 32.432583, + 32.434378, + 32.436164, + 32.437942, + 32.439712, + 32.441473, + 32.443226, + 32.444971, + 32.446707, + 32.448436, + 32.450156, + 32.451868, + 32.453573, + 32.455269, + 32.456958, + 32.458639, + 32.460312, + 32.461977, + 32.463635, + 32.465285, + 32.466927, + 32.468562, + 32.470189, + 32.471809, + 32.473421, + 32.475027, + 32.476624, + 32.478215, + 32.479798, + 32.481374, + 32.482943, + 32.484505, + 32.486060, + 32.487608, + 32.489149, + 32.490683, + 32.492210, + 32.493730, + 32.495243, + 32.496750, + 32.498250, + 32.499743, + 32.501230, + 32.502710, + 32.504183, + 32.505650, + 32.507110, + 32.508564, + 32.510012, + 32.511453, + 32.512888, + 32.514316, + 32.515739, + 32.517155, + 32.518565, + 32.519968, + 32.521366, + 32.522757, + 32.524143, + 32.525522, + 32.526896, + 32.528263, + 32.529625, + 32.530980, + 32.532330, + 32.533674, + 32.535013, + 32.536345, + 32.537672, + 32.538993, + 32.540309, + 32.541619, + 32.542923, + 32.544222, + 32.545515, + 32.546803, + 32.548085, + 32.549362, + 32.550633, + 32.551899, + 32.553160, + 32.554416, + 32.555666, + 32.556911, + 32.558150, + 32.559385, + 32.560614, + 32.561839, + 32.563058, + 32.564272, + 32.565481, + 32.566685, + 32.567884, + 32.569078, + 32.570267, + 32.571451, + 32.572631, + 32.573805, + 32.574975, + 32.576140, + 32.577300, + 32.578455, + 32.579606, + 32.580752, + 32.581893, + 32.583029, + 32.584161, + 32.585289, + 32.586412, + 32.587530, + 32.588644, + 32.589753, + 32.590858, + 32.591958, + 32.593054, + 32.594145, + 32.595232, + 32.596315, + 32.597394, + 32.598468, + 32.599538, + 32.600603, + 32.601664, + 32.602722, + 32.603774, + 32.604823, + 32.605868, + 32.606908, + 32.607944, + 32.608977, + 32.610005, + 32.611029, + 32.612049, + 32.613065, + 32.614077, + 32.615086, + 32.616090, + 32.617090, + 32.618087, + 32.619079, + 32.620068, + 32.621053, + 32.622034, + 32.623011, + 32.623984, + 32.624954, + 32.625920, + 32.626882, + 32.627841, + 32.628795, + 32.629747, + 32.630694, + 32.631638, + 32.632578, + 32.633515, + 32.634448, + 32.635378, + 32.636304, + 32.637226, + 32.638145, + 32.639061, + 32.639973, + 32.640881, + 32.641787, + 32.642688, + 32.643587, + 32.644482, + 32.645373, + 32.646262, + 32.647146, + 32.648028, + 32.648906, + 32.649782, + 32.650653, + 32.651522, + 32.652387, + 32.653249, + 32.654108, + 32.654964, + 32.655816, + 32.656666, + 32.657512, + 32.658355, + 32.659195, + 32.660032, + 32.660866, + 32.661697, + 32.662525, + 32.663349, + 32.664171, + 32.664990, + 32.665806, + 32.666618, + 32.667428, + 32.668235, + 32.669039, + 32.669840, + 32.670638, + 32.671433, + 32.672226, + 32.673015, + 32.673802, + 32.674586, + 32.675367, + 32.676145, + 32.676920, + 32.677693, + 32.678463, + 32.679230, + 32.679994, + 32.680756, + 32.681515, + 32.682271, + 32.683024, + 32.683775, + 32.684524, + 32.685269, + 32.686012, + 32.686752, + 32.687490, + 32.688225, + 32.688958, + 32.689687, + 32.690415, + 32.691140, + 32.691862, + 32.692582, + 32.693299, + 32.694014, + 32.694726, + 32.695436, + 32.696143, + 32.696848, + 32.697550, + 32.698250, + 32.698947, + 32.699642, + 32.700335, + 32.701025, + 32.701713, + 32.702399, + 32.703082, + 32.703763, + 32.704441, + 32.705118, + 32.705792, + 32.706463, + 32.707132, + 32.707799, + 32.708464, + 32.709127, + 32.709787, + 32.710445, + 32.711100, + 32.711754, + 32.712405, + 32.713054, + 32.713701, + 32.714346, + 32.714988, + 32.715629, + 32.716267, + 32.716903, + 32.717537, + 32.718169, + 32.718798, + 32.719426, + 32.720052, + 32.720675, + 32.721296, + 32.721916, + 32.722533, + 32.723148, + 32.723761, + 32.724372, + 32.724981, + 32.725588, + 32.726193, + 32.726796, + 32.727397, + 32.727996, + 32.728593, + 32.729189, + 32.729782, + 32.730373, + 32.730962, + 32.731550, + 32.732135, + 32.732719, + 32.733300, + 32.733880, + 32.734458, + 32.735034, + 32.735608, + 32.736180, + 32.736751, + 32.737319, + 32.737886, + 32.738451, + 32.739014, + 32.739575, + 32.740135, + 32.740692, + 32.741248, + 32.741802, + 32.742354, + 32.742905, + 32.743454, + 32.744001, + 32.744546, + 32.745089, + 32.745631, + 32.746171, + 32.746710, + 32.747246, + 32.747781, + 32.748314, + 32.748846, + 32.749376, + 32.749904, + 32.750431, + 32.750955, + 32.751479, + 32.752000, + 32.752520, + 32.753038, + 32.753555, + 32.754070, + 32.754584, + 32.755095, + 32.755606, + 32.756114, + 32.756621, + 32.757127, + 32.757631, + 32.758133, + 32.758634, + 32.759133, + 32.759631, + 32.760127, + 32.760622, + 32.761115, + 32.761606, + 32.762096, + 32.762585, + 32.763072, + 32.763558, + 32.764042, + 32.764524, + 32.765005, + 32.765485, + 32.765963, + 32.766440, + 32.766915, + 32.767389, + 32.767861, + 32.768332, + 32.768802, + 32.769270, + 32.769736, + 32.770202, + 32.770665, + 32.771128, + 32.771589, + 32.772048, + 32.772507, + 32.772964, + 32.773419, + 32.773873, + 32.774326, + 32.774777, + 32.775228, + 32.775676, + 32.776124, + }, + {// The expectations for dimension = 67 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226666, + 5.415000, + 5.606666, + 5.801665, + 5.999997, + 6.201661, + 6.406656, + 6.614980, + 6.826631, + 7.041606, + 7.259897, + 7.481496, + 7.706391, + 7.934562, + 8.165985, + 8.400624, + 8.638435, + 8.879358, + 9.123319, + 9.370224, + 9.619959, + 9.872387, + 10.127350, + 10.384661, + 10.644113, + 10.905473, + 11.168486, + 11.432879, + 11.698362, + 11.964633, + 12.231381, + 12.498293, + 12.765054, + 13.031355, + 13.296896, + 13.561388, + 13.824557, + 14.086145, + 14.345916, + 14.603649, + 14.859146, + 15.112228, + 15.362737, + 15.610532, + 15.855492, + 16.097512, + 16.336505, + 16.572395, + 16.805125, + 17.034644, + 17.260918, + 17.483919, + 17.703630, + 17.920042, + 18.133153, + 18.342968, + 18.549497, + 18.752755, + 18.952763, + 19.149544, + 19.343126, + 19.533539, + 19.720816, + 19.904993, + 20.086106, + 20.264196, + 20.439302, + 20.611466, + 20.780730, + 20.947137, + 21.110732, + 21.271559, + 21.429662, + 21.585087, + 21.737877, + 21.888078, + 22.035734, + 22.180891, + 22.323592, + 22.463881, + 22.601802, + 22.737398, + 22.870712, + 23.001786, + 23.130662, + 23.257380, + 23.381982, + 23.504507, + 23.624995, + 23.743485, + 23.860014, + 23.974620, + 24.087341, + 24.198212, + 24.307269, + 24.414547, + 24.520080, + 24.623902, + 24.726046, + 24.826545, + 24.925429, + 25.022731, + 25.118481, + 25.212708, + 25.305443, + 25.396713, + 25.486548, + 25.574974, + 25.662018, + 25.747708, + 25.832069, + 25.915126, + 25.996904, + 26.077428, + 26.156721, + 26.234807, + 26.311708, + 26.387448, + 26.462047, + 26.535527, + 26.607910, + 26.679215, + 26.749463, + 26.818673, + 26.886865, + 26.954057, + 27.020268, + 27.085517, + 27.149819, + 27.213194, + 27.275658, + 27.337227, + 27.397918, + 27.457746, + 27.516728, + 27.574878, + 27.632211, + 27.688742, + 27.744484, + 27.799453, + 27.853662, + 27.907124, + 27.959853, + 28.011860, + 28.063159, + 28.113763, + 28.163682, + 28.212930, + 28.261517, + 28.309456, + 28.356756, + 28.403429, + 28.449486, + 28.494938, + 28.539793, + 28.584063, + 28.627757, + 28.670885, + 28.713457, + 28.755481, + 28.796967, + 28.837923, + 28.878359, + 28.918282, + 28.957702, + 28.996626, + 29.035063, + 29.073020, + 29.110505, + 29.147526, + 29.184091, + 29.220205, + 29.255877, + 29.291114, + 29.325923, + 29.360309, + 29.394281, + 29.427844, + 29.461005, + 29.493770, + 29.526145, + 29.558136, + 29.589750, + 29.620991, + 29.651866, + 29.682380, + 29.712539, + 29.742348, + 29.771813, + 29.800938, + 29.829728, + 29.858190, + 29.886326, + 29.914144, + 29.941646, + 29.968838, + 29.995725, + 30.022310, + 30.048598, + 30.074594, + 30.100302, + 30.125726, + 30.150870, + 30.175737, + 30.200333, + 30.224661, + 30.248725, + 30.272528, + 30.296074, + 30.319367, + 30.342410, + 30.365207, + 30.387762, + 30.410077, + 30.432156, + 30.454003, + 30.475620, + 30.497010, + 30.518177, + 30.539124, + 30.559854, + 30.580370, + 30.600674, + 30.620770, + 30.640660, + 30.660347, + 30.679834, + 30.699123, + 30.718218, + 30.737120, + 30.755832, + 30.774357, + 30.792697, + 30.810855, + 30.828833, + 30.846632, + 30.864257, + 30.881709, + 30.898989, + 30.916101, + 30.933046, + 30.949827, + 30.966446, + 30.982904, + 30.999204, + 31.015348, + 31.031338, + 31.047175, + 31.062862, + 31.078401, + 31.093793, + 31.109039, + 31.124143, + 31.139106, + 31.153929, + 31.168614, + 31.183163, + 31.197577, + 31.211859, + 31.226009, + 31.240030, + 31.253923, + 31.267689, + 31.281330, + 31.294847, + 31.308242, + 31.321517, + 31.334673, + 31.347710, + 31.360632, + 31.373438, + 31.386131, + 31.398711, + 31.411180, + 31.423540, + 31.435791, + 31.447934, + 31.459972, + 31.471905, + 31.483735, + 31.495462, + 31.507088, + 31.518613, + 31.530040, + 31.541369, + 31.552602, + 31.563739, + 31.574781, + 31.585730, + 31.596586, + 31.607351, + 31.618025, + 31.628610, + 31.639107, + 31.649516, + 31.659839, + 31.670076, + 31.680229, + 31.690298, + 31.700284, + 31.710189, + 31.720012, + 31.729756, + 31.739420, + 31.749005, + 31.758514, + 31.767945, + 31.777301, + 31.786581, + 31.795787, + 31.804920, + 31.813980, + 31.822968, + 31.831884, + 31.840731, + 31.849507, + 31.858215, + 31.866854, + 31.875425, + 31.883930, + 31.892369, + 31.900742, + 31.909050, + 31.917294, + 31.925474, + 31.933592, + 31.941647, + 31.949641, + 31.957573, + 31.965446, + 31.973258, + 31.981012, + 31.988707, + 31.996344, + 32.003923, + 32.011446, + 32.018912, + 32.026322, + 32.033678, + 32.040979, + 32.048225, + 32.055419, + 32.062559, + 32.069646, + 32.076682, + 32.083666, + 32.090599, + 32.097482, + 32.104314, + 32.111097, + 32.117831, + 32.124516, + 32.131153, + 32.137743, + 32.144285, + 32.150781, + 32.157230, + 32.163633, + 32.169991, + 32.176304, + 32.182572, + 32.188796, + 32.194976, + 32.201113, + 32.207206, + 32.213258, + 32.219267, + 32.225234, + 32.231160, + 32.237045, + 32.242889, + 32.248693, + 32.254457, + 32.260181, + 32.265866, + 32.271513, + 32.277120, + 32.282690, + 32.288222, + 32.293717, + 32.299174, + 32.304595, + 32.309979, + 32.315327, + 32.320639, + 32.325916, + 32.331157, + 32.336364, + 32.341536, + 32.346674, + 32.351778, + 32.356848, + 32.361885, + 32.366888, + 32.371859, + 32.376798, + 32.381704, + 32.386578, + 32.391421, + 32.396232, + 32.401012, + 32.405761, + 32.410480, + 32.415168, + 32.419827, + 32.424455, + 32.429054, + 32.433623, + 32.438164, + 32.442676, + 32.447159, + 32.451613, + 32.456040, + 32.460439, + 32.464810, + 32.469153, + 32.473470, + 32.477760, + 32.482022, + 32.486259, + 32.490469, + 32.494653, + 32.498811, + 32.502943, + 32.507050, + 32.511132, + 32.515189, + 32.519221, + 32.523228, + 32.527211, + 32.531169, + 32.535104, + 32.539015, + 32.542902, + 32.546766, + 32.550606, + 32.554423, + 32.558218, + 32.561990, + 32.565739, + 32.569466, + 32.573170, + 32.576853, + 32.580514, + 32.584153, + 32.587771, + 32.591367, + 32.594942, + 32.598496, + 32.602030, + 32.605542, + 32.609035, + 32.612506, + 32.615958, + 32.619390, + 32.622801, + 32.626193, + 32.629566, + 32.632919, + 32.636253, + 32.639567, + 32.642863, + 32.646140, + 32.649398, + 32.652637, + 32.655858, + 32.659061, + 32.662246, + 32.665413, + 32.668562, + 32.671693, + 32.674806, + 32.677902, + 32.680981, + 32.684042, + 32.687087, + 32.690114, + 32.693125, + 32.696119, + 32.699096, + 32.702057, + 32.705001, + 32.707930, + 32.710842, + 32.713738, + 32.716618, + 32.719483, + 32.722332, + 32.725165, + 32.727983, + 32.730786, + 32.733574, + 32.736346, + 32.739104, + 32.741846, + 32.744574, + 32.747287, + 32.749986, + 32.752670, + 32.755340, + 32.757995, + 32.760637, + 32.763264, + 32.765878, + 32.768477, + 32.771063, + 32.773635, + 32.776194, + 32.778739, + 32.781271, + 32.783789, + 32.786295, + 32.788787, + 32.791266, + 32.793733, + 32.796186, + 32.798627, + 32.801055, + 32.803471, + 32.805874, + 32.808265, + 32.810643, + 32.813010, + 32.815364, + 32.817706, + 32.820036, + 32.822354, + 32.824660, + 32.826955, + 32.829238, + 32.831510, + 32.833770, + 32.836018, + 32.838255, + 32.840481, + 32.842696, + 32.844900, + 32.847092, + 32.849274, + 32.851445, + 32.853605, + 32.855754, + 32.857892, + 32.860020, + 32.862138, + 32.864245, + 32.866341, + 32.868427, + 32.870503, + 32.872569, + 32.874625, + 32.876670, + 32.878706, + 32.880731, + 32.882747, + 32.884753, + 32.886749, + 32.888736, + 32.890713, + 32.892680, + 32.894638, + 32.896586, + 32.898525, + 32.900455, + 32.902375, + 32.904287, + 32.906189, + 32.908082, + 32.909966, + 32.911841, + 32.913707, + 32.915565, + 32.917413, + 32.919253, + 32.921084, + 32.922907, + 32.924721, + 32.926526, + 32.928323, + 32.930111, + 32.931892, + 32.933663, + 32.935427, + 32.937182, + 32.938930, + 32.940669, + 32.942400, + 32.944123, + 32.945838, + 32.947545, + 32.949244, + 32.950936, + 32.952620, + 32.954296, + 32.955964, + 32.957625, + 32.959278, + 32.960924, + 32.962562, + 32.964192, + 32.965816, + 32.967432, + 32.969040, + 32.970642, + 32.972236, + 32.973823, + 32.975402, + 32.976975, + 32.978541, + 32.980100, + 32.981651, + 32.983196, + 32.984734, + 32.986265, + 32.987789, + 32.989307, + 32.990818, + 32.992322, + 32.993819, + 32.995310, + 32.996794, + 32.998272, + 32.999743, + 33.001208, + 33.002667, + 33.004119, + 33.005564, + 33.007004, + 33.008437, + 33.009864, + 33.011285, + 33.012699, + 33.014108, + 33.015510, + 33.016906, + 33.018296, + 33.019681, + 33.021059, + 33.022432, + 33.023798, + 33.025159, + 33.026514, + 33.027863, + 33.029206, + 33.030544, + 33.031876, + 33.033202, + 33.034523, + 33.035838, + 33.037147, + 33.038451, + 33.039750, + 33.041043, + 33.042331, + 33.043613, + 33.044890, + 33.046161, + 33.047427, + 33.048688, + 33.049944, + 33.051194, + 33.052440, + 33.053680, + 33.054915, + 33.056144, + 33.057369, + 33.058589, + 33.059804, + 33.061013, + 33.062218, + 33.063418, + 33.064612, + 33.065802, + 33.066987, + 33.068168, + 33.069343, + 33.070514, + 33.071680, + 33.072841, + 33.073997, + 33.075149, + 33.076296, + 33.077439, + 33.078576, + 33.079710, + 33.080838, + 33.081963, + 33.083082, + 33.084197, + 33.085308, + 33.086414, + 33.087516, + 33.088614, + 33.089707, + 33.090796, + 33.091880, + 33.092960, + 33.094036, + 33.095108, + 33.096175, + 33.097238, + 33.098297, + 33.099352, + 33.100403, + 33.101449, + 33.102492, + 33.103530, + 33.104564, + 33.105595, + 33.106621, + 33.107643, + 33.108662, + 33.109676, + 33.110686, + 33.111693, + 33.112695, + 33.113694, + 33.114689, + 33.115680, + 33.116667, + 33.117651, + 33.118630, + 33.119606, + 33.120579, + 33.121547, + 33.122512, + 33.123473, + 33.124430, + 33.125384, + 33.126334, + 33.127281, + 33.128224, + 33.129163, + 33.130099, + 33.131031, + 33.131960, + 33.132885, + 33.133807, + 33.134725, + 33.135640, + 33.136552, + 33.137460, + 33.138364, + 33.139266, + 33.140164, + 33.141058, + 33.141950, + 33.142837, + 33.143722, + 33.144604, + 33.145482, + 33.146356, + 33.147228, + 33.148097, + 33.148962, + 33.149824, + 33.150683, + 33.151538, + 33.152391, + 33.153240, + 33.154087, + 33.154930, + 33.155770, + 33.156607, + 33.157441, + 33.158272, + 33.159100, + 33.159925, + 33.160748, + 33.161567, + 33.162383, + 33.163196, + 33.164006, + 33.164813, + 33.165618, + 33.166419, + 33.167218, + 33.168014, + 33.168807, + 33.169597, + 33.170384, + 33.171169, + 33.171950, + 33.172729, + 33.173505, + 33.174279, + 33.175049, + 33.175817, + 33.176582, + 33.177345, + 33.178105, + 33.178862, + 33.179616, + 33.180368, + 33.181117, + 33.181864, + 33.182608, + 33.183349, + 33.184088, + 33.184824, + 33.185557, + 33.186288, + 33.187017, + 33.187743, + 33.188466, + 33.189187, + 33.189906, + 33.190622, + 33.191335, + 33.192046, + 33.192755, + 33.193461, + 33.194164, + 33.194866, + 33.195564, + 33.196261, + 33.196955, + 33.197647, + 33.198336, + 33.199023, + 33.199708, + 33.200390, + 33.201070, + 33.201748, + 33.202423, + 33.203096, + 33.203767, + 33.204436, + 33.205102, + 33.205766, + 33.206428, + 33.207087, + 33.207745, + 33.208400, + 33.209053, + 33.209703, + 33.210352, + 33.210998, + 33.211643, + 33.212285, + 33.212925, + 33.213563, + 33.214198, + 33.214832, + 33.215463, + 33.216093, + 33.216720, + 33.217345, + 33.217969, + 33.218590, + 33.219209, + 33.219826, + 33.220441, + 33.221054, + 33.221665, + 33.222274, + 33.222881, + 33.223486, + 33.224089, + 33.224690, + 33.225289, + 33.225886, + 33.226481, + 33.227074, + 33.227666, + 33.228255, + 33.228843, + 33.229428, + 33.230012, + 33.230594, + 33.231174, + 33.231752, + 33.232328, + 33.232902, + 33.233475, + 33.234046, + 33.234615, + 33.235182, + 33.235747, + 33.236310, + 33.236872, + 33.237432, + 33.237990, + 33.238546, + 33.239100, + 33.239653, + 33.240204, + 33.240753, + 33.241301, + 33.241847, + 33.242391, + 33.242933, + 33.243474, + 33.244013, + 33.244550, + 33.245085, + 33.245619, + 33.246151, + 33.246682, + 33.247211, + 33.247738, + 33.248263, + 33.248787, + 33.249310, + 33.249830, + 33.250349, + 33.250867, + 33.251383, + 33.251897, + 33.252409, + 33.252920, + 33.253430, + 33.253938, + 33.254444, + 33.254949, + 33.255452, + 33.255954, + 33.256454, + 33.256952, + 33.257450, + 33.257945, + 33.258439, + 33.258932, + 33.259423, + 33.259912, + 33.260400, + 33.260887, + 33.261372, + 33.261855, + 33.262337, + 33.262818, + 33.263297, + 33.263775, + 33.264251, + 33.264726, + 33.265200, + 33.265672, + 33.266142, + 33.266611, + 33.267079, + 33.267546, + 33.268011, + 33.268474, + 33.268936, + 33.269397, + }, + {// The expectations for dimension = 68 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606666, + 5.801666, + 5.999998, + 6.201663, + 6.406659, + 6.614986, + 6.826642, + 7.041623, + 7.259925, + 7.481542, + 7.706461, + 7.934670, + 8.166147, + 8.400864, + 8.638782, + 8.879851, + 9.124007, + 9.371168, + 9.621234, + 9.874082, + 10.129568, + 10.387524, + 10.647756, + 10.910046, + 11.174155, + 11.439821, + 11.706765, + 11.974693, + 12.243299, + 12.512272, + 12.781297, + 13.050063, + 13.318264, + 13.585604, + 13.851799, + 14.116581, + 14.379701, + 14.640926, + 14.900045, + 15.156866, + 15.411218, + 15.662948, + 15.911923, + 16.158026, + 16.401159, + 16.641238, + 16.878193, + 17.111969, + 17.342520, + 17.569814, + 17.793825, + 18.014540, + 18.231951, + 18.446057, + 18.656865, + 18.864385, + 19.068635, + 19.269635, + 19.467410, + 19.661987, + 19.853397, + 20.041673, + 20.226852, + 20.408970, + 20.588066, + 20.764182, + 20.937357, + 21.107635, + 21.275059, + 21.439672, + 21.601519, + 21.760643, + 21.917090, + 22.070903, + 22.222129, + 22.370810, + 22.516991, + 22.660717, + 22.802030, + 22.940975, + 23.077594, + 23.211929, + 23.344023, + 23.473917, + 23.601652, + 23.727268, + 23.850805, + 23.972302, + 24.091798, + 24.209331, + 24.324937, + 24.438655, + 24.550519, + 24.660565, + 24.768828, + 24.875342, + 24.980140, + 25.083256, + 25.184722, + 25.284570, + 25.382829, + 25.479532, + 25.574707, + 25.668384, + 25.760592, + 25.851358, + 25.940711, + 26.028676, + 26.115282, + 26.200552, + 26.284513, + 26.367190, + 26.448606, + 26.528785, + 26.607752, + 26.685528, + 26.762136, + 26.837598, + 26.911934, + 26.985167, + 27.057317, + 27.128403, + 27.198445, + 27.267463, + 27.335476, + 27.402501, + 27.468557, + 27.533661, + 27.597832, + 27.661085, + 27.723437, + 27.784905, + 27.845505, + 27.905251, + 27.964160, + 28.022246, + 28.079524, + 28.136008, + 28.191712, + 28.246650, + 28.300835, + 28.354281, + 28.407000, + 28.459005, + 28.510308, + 28.560922, + 28.610859, + 28.660129, + 28.708744, + 28.756716, + 28.804056, + 28.850773, + 28.896879, + 28.942385, + 28.987299, + 29.031632, + 29.075393, + 29.118593, + 29.161240, + 29.203343, + 29.244912, + 29.285955, + 29.326480, + 29.366497, + 29.406013, + 29.445037, + 29.483576, + 29.521639, + 29.559232, + 29.596364, + 29.633041, + 29.669271, + 29.705061, + 29.740418, + 29.775349, + 29.809860, + 29.843957, + 29.877649, + 29.910939, + 29.943836, + 29.976344, + 30.008470, + 30.040220, + 30.071599, + 30.102613, + 30.133268, + 30.163568, + 30.193520, + 30.223128, + 30.252398, + 30.281335, + 30.309943, + 30.338227, + 30.366193, + 30.393845, + 30.421187, + 30.448224, + 30.474961, + 30.501401, + 30.527550, + 30.553410, + 30.578988, + 30.604286, + 30.629308, + 30.654059, + 30.678541, + 30.702760, + 30.726719, + 30.750421, + 30.773871, + 30.797070, + 30.820024, + 30.842735, + 30.865207, + 30.887443, + 30.909446, + 30.931220, + 30.952768, + 30.974092, + 30.995196, + 31.016083, + 31.036755, + 31.057216, + 31.077468, + 31.097514, + 31.117358, + 31.137001, + 31.156446, + 31.175696, + 31.194753, + 31.213621, + 31.232301, + 31.250796, + 31.269108, + 31.287240, + 31.305193, + 31.322971, + 31.340576, + 31.358009, + 31.375274, + 31.392371, + 31.409304, + 31.426074, + 31.442683, + 31.459134, + 31.475428, + 31.491568, + 31.507555, + 31.523391, + 31.539078, + 31.554618, + 31.570012, + 31.585263, + 31.600373, + 31.615342, + 31.630173, + 31.644867, + 31.659427, + 31.673853, + 31.688147, + 31.702311, + 31.716347, + 31.730255, + 31.744038, + 31.757697, + 31.771233, + 31.784648, + 31.797944, + 31.811121, + 31.824181, + 31.837126, + 31.849956, + 31.862674, + 31.875280, + 31.887776, + 31.900162, + 31.912441, + 31.924614, + 31.936681, + 31.948644, + 31.960504, + 31.972262, + 31.983920, + 31.995479, + 32.006938, + 32.018301, + 32.029568, + 32.040739, + 32.051817, + 32.062801, + 32.073694, + 32.084495, + 32.095207, + 32.105830, + 32.116364, + 32.126812, + 32.137174, + 32.147450, + 32.157643, + 32.167752, + 32.177778, + 32.187724, + 32.197588, + 32.207373, + 32.217079, + 32.226706, + 32.236257, + 32.245731, + 32.255129, + 32.264453, + 32.273702, + 32.282879, + 32.291982, + 32.301014, + 32.309975, + 32.318866, + 32.327688, + 32.336440, + 32.345124, + 32.353741, + 32.362291, + 32.370776, + 32.379194, + 32.387549, + 32.395839, + 32.404065, + 32.412229, + 32.420331, + 32.428372, + 32.436351, + 32.444270, + 32.452130, + 32.459930, + 32.467672, + 32.475357, + 32.482983, + 32.490553, + 32.498067, + 32.505525, + 32.512929, + 32.520277, + 32.527572, + 32.534812, + 32.542000, + 32.549136, + 32.556219, + 32.563252, + 32.570233, + 32.577163, + 32.584044, + 32.590875, + 32.597657, + 32.604390, + 32.611075, + 32.617713, + 32.624303, + 32.630847, + 32.637344, + 32.643795, + 32.650201, + 32.656562, + 32.662878, + 32.669150, + 32.675378, + 32.681563, + 32.687705, + 32.693804, + 32.699861, + 32.705876, + 32.711849, + 32.717782, + 32.723674, + 32.729525, + 32.735337, + 32.741109, + 32.746842, + 32.752535, + 32.758191, + 32.763808, + 32.769387, + 32.774929, + 32.780433, + 32.785901, + 32.791332, + 32.796727, + 32.802086, + 32.807410, + 32.812698, + 32.817951, + 32.823170, + 32.828354, + 32.833504, + 32.838621, + 32.843704, + 32.848754, + 32.853771, + 32.858756, + 32.863708, + 32.868628, + 32.873516, + 32.878373, + 32.883199, + 32.887994, + 32.892758, + 32.897491, + 32.902195, + 32.906868, + 32.911512, + 32.916127, + 32.920712, + 32.925268, + 32.929796, + 32.934295, + 32.938766, + 32.943209, + 32.947625, + 32.952012, + 32.956373, + 32.960706, + 32.965013, + 32.969293, + 32.973547, + 32.977774, + 32.981976, + 32.986151, + 32.990302, + 32.994426, + 32.998526, + 33.002601, + 33.006651, + 33.010677, + 33.014678, + 33.018655, + 33.022608, + 33.026537, + 33.030443, + 33.034325, + 33.038185, + 33.042021, + 33.045834, + 33.049625, + 33.053393, + 33.057139, + 33.060863, + 33.064565, + 33.068245, + 33.071904, + 33.075541, + 33.079157, + 33.082751, + 33.086325, + 33.089878, + 33.093411, + 33.096922, + 33.100414, + 33.103886, + 33.107337, + 33.110769, + 33.114181, + 33.117573, + 33.120946, + 33.124300, + 33.127635, + 33.130950, + 33.134247, + 33.137526, + 33.140785, + 33.144027, + 33.147250, + 33.150455, + 33.153642, + 33.156811, + 33.159962, + 33.163096, + 33.166213, + 33.169312, + 33.172394, + 33.175459, + 33.178506, + 33.181538, + 33.184552, + 33.187550, + 33.190531, + 33.193496, + 33.196445, + 33.199378, + 33.202294, + 33.205195, + 33.208080, + 33.210950, + 33.213804, + 33.216642, + 33.219465, + 33.222273, + 33.225066, + 33.227844, + 33.230607, + 33.233356, + 33.236089, + 33.238809, + 33.241513, + 33.244203, + 33.246880, + 33.249541, + 33.252189, + 33.254823, + 33.257443, + 33.260050, + 33.262642, + 33.265221, + 33.267787, + 33.270339, + 33.272878, + 33.275404, + 33.277916, + 33.280416, + 33.282903, + 33.285377, + 33.287838, + 33.290286, + 33.292722, + 33.295145, + 33.297556, + 33.299955, + 33.302342, + 33.304716, + 33.307078, + 33.309428, + 33.311767, + 33.314093, + 33.316408, + 33.318711, + 33.321002, + 33.323282, + 33.325551, + 33.327808, + 33.330054, + 33.332289, + 33.334512, + 33.336725, + 33.338926, + 33.341117, + 33.343296, + 33.345465, + 33.347623, + 33.349771, + 33.351908, + 33.354035, + 33.356151, + 33.358257, + 33.360352, + 33.362437, + 33.364512, + 33.366577, + 33.368632, + 33.370677, + 33.372713, + 33.374738, + 33.376753, + 33.378759, + 33.380755, + 33.382742, + 33.384719, + 33.386687, + 33.388645, + 33.390594, + 33.392533, + 33.394463, + 33.396385, + 33.398297, + 33.400200, + 33.402094, + 33.403979, + 33.405855, + 33.407722, + 33.409581, + 33.411431, + 33.413272, + 33.415105, + 33.416929, + 33.418744, + 33.420551, + 33.422350, + 33.424140, + 33.425922, + 33.427696, + 33.429462, + 33.431219, + 33.432969, + 33.434710, + 33.436443, + 33.438169, + 33.439886, + 33.441596, + 33.443298, + 33.444992, + 33.446678, + 33.448357, + 33.450028, + 33.451692, + 33.453348, + 33.454996, + 33.456637, + 33.458271, + 33.459898, + 33.461517, + 33.463129, + 33.464733, + 33.466331, + 33.467921, + 33.469504, + 33.471080, + 33.472650, + 33.474212, + 33.475767, + 33.477316, + 33.478857, + 33.480392, + 33.481920, + 33.483442, + 33.484956, + 33.486464, + 33.487966, + 33.489460, + 33.490949, + 33.492431, + 33.493906, + 33.495375, + 33.496838, + 33.498294, + 33.499744, + 33.501188, + 33.502625, + 33.504056, + 33.505481, + 33.506900, + 33.508313, + 33.509720, + 33.511121, + 33.512516, + 33.513905, + 33.515288, + 33.516665, + 33.518036, + 33.519401, + 33.520761, + 33.522115, + 33.523463, + 33.524806, + 33.526142, + 33.527474, + 33.528799, + 33.530119, + 33.531434, + 33.532743, + 33.534046, + 33.535344, + 33.536637, + 33.537924, + 33.539206, + 33.540483, + 33.541754, + 33.543021, + 33.544281, + 33.545537, + 33.546788, + 33.548033, + 33.549273, + 33.550508, + 33.551738, + 33.552963, + 33.554183, + 33.555399, + 33.556609, + 33.557814, + 33.559014, + 33.560209, + 33.561400, + 33.562586, + 33.563767, + 33.564943, + 33.566114, + 33.567281, + 33.568443, + 33.569600, + 33.570753, + 33.571901, + 33.573045, + 33.574184, + 33.575318, + 33.576448, + 33.577573, + 33.578694, + 33.579811, + 33.580923, + 33.582030, + 33.583133, + 33.584232, + 33.585327, + 33.586417, + 33.587503, + 33.588585, + 33.589662, + 33.590735, + 33.591805, + 33.592869, + 33.593930, + 33.594987, + 33.596039, + 33.597087, + 33.598132, + 33.599172, + 33.600208, + 33.601240, + 33.602269, + 33.603293, + 33.604313, + 33.605329, + 33.606342, + 33.607351, + 33.608355, + 33.609356, + 33.610353, + 33.611346, + 33.612336, + 33.613322, + 33.614303, + 33.615282, + 33.616256, + 33.617227, + 33.618194, + 33.619158, + 33.620117, + 33.621074, + 33.622026, + 33.622975, + 33.623921, + 33.624863, + 33.625801, + 33.626736, + 33.627667, + 33.628595, + 33.629520, + 33.630441, + 33.631358, + 33.632272, + 33.633183, + 33.634090, + 33.634994, + 33.635895, + 33.636793, + 33.637687, + 33.638577, + 33.639465, + 33.640349, + 33.641230, + 33.642108, + 33.642982, + 33.643854, + 33.644722, + 33.645587, + 33.646449, + 33.647307, + 33.648163, + 33.649015, + 33.649865, + 33.650711, + 33.651554, + 33.652395, + 33.653232, + 33.654066, + 33.654897, + 33.655725, + 33.656550, + 33.657373, + 33.658192, + 33.659008, + 33.659822, + 33.660632, + 33.661440, + 33.662245, + 33.663047, + 33.663846, + 33.664642, + 33.665435, + 33.666226, + 33.667014, + 33.667799, + 33.668581, + 33.669360, + 33.670137, + 33.670911, + 33.671682, + 33.672451, + 33.673217, + 33.673980, + 33.674741, + 33.675499, + 33.676254, + 33.677006, + 33.677756, + 33.678504, + 33.679249, + 33.679991, + 33.680731, + 33.681468, + 33.682202, + 33.682934, + 33.683664, + 33.684391, + 33.685115, + 33.685837, + 33.686557, + 33.687274, + 33.687988, + 33.688700, + 33.689410, + 33.690117, + 33.690822, + 33.691525, + 33.692225, + 33.692922, + 33.693618, + 33.694311, + 33.695001, + 33.695690, + 33.696376, + 33.697059, + 33.697741, + 33.698420, + 33.699097, + 33.699771, + 33.700443, + 33.701113, + 33.701781, + 33.702447, + 33.703110, + 33.703771, + 33.704430, + 33.705086, + 33.705741, + 33.706393, + 33.707043, + 33.707691, + 33.708337, + 33.708981, + 33.709623, + 33.710262, + 33.710899, + 33.711535, + 33.712168, + 33.712799, + 33.713428, + 33.714055, + 33.714680, + 33.715303, + 33.715924, + 33.716542, + 33.717159, + 33.717774, + 33.718387, + 33.718998, + 33.719606, + 33.720213, + 33.720818, + 33.721421, + 33.722022, + 33.722621, + 33.723218, + 33.723813, + 33.724406, + 33.724998, + 33.725587, + 33.726175, + 33.726760, + 33.727344, + 33.727926, + 33.728506, + 33.729084, + 33.729661, + 33.730235, + 33.730808, + 33.731379, + 33.731948, + 33.732515, + 33.733081, + 33.733644, + 33.734206, + 33.734766, + 33.735325, + 33.735881, + 33.736436, + 33.736989, + 33.737541, + 33.738090, + 33.738638, + 33.739184, + 33.739729, + 33.740272, + 33.740813, + 33.741352, + 33.741890, + 33.742426, + 33.742960, + 33.743493, + 33.744024, + 33.744554, + 33.745081, + 33.745608, + 33.746132, + 33.746655, + 33.747176, + 33.747696, + 33.748214, + 33.748730, + 33.749245, + 33.749759, + 33.750270, + 33.750781, + 33.751289, + 33.751796, + 33.752302, + 33.752806, + 33.753308, + 33.753809, + 33.754309, + 33.754807, + 33.755303, + 33.755798, + 33.756291, + 33.756783, + 33.757273, + 33.757762, + 33.758250, + 33.758736, + 33.759220, + 33.759703, + 33.760185, + 33.760665, + 33.761144, + 33.761621, + 33.762097, + 33.762571, + }, + {// The expectations for dimension = 69 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606666, + 5.801666, + 5.999999, + 6.201664, + 6.406661, + 6.614990, + 6.826649, + 7.041636, + 7.259946, + 7.481575, + 7.706515, + 7.934753, + 8.166273, + 8.401052, + 8.639056, + 8.880245, + 9.124563, + 9.371939, + 9.622284, + 9.875492, + 10.131431, + 10.389949, + 10.650867, + 10.913984, + 11.179075, + 11.445891, + 11.714165, + 11.983611, + 12.253932, + 12.524820, + 12.795963, + 13.067047, + 13.337763, + 13.607808, + 13.876892, + 14.144735, + 14.411078, + 14.675677, + 14.938307, + 15.198764, + 15.456863, + 15.712440, + 15.965348, + 16.215460, + 16.462666, + 16.706872, + 16.947999, + 17.185982, + 17.420767, + 17.652314, + 17.880593, + 18.105581, + 18.327265, + 18.545641, + 18.760710, + 18.972478, + 19.180958, + 19.386167, + 19.588128, + 19.786865, + 19.982406, + 20.174783, + 20.364029, + 20.550179, + 20.733272, + 20.913346, + 21.090442, + 21.264600, + 21.435864, + 21.604276, + 21.769879, + 21.932718, + 22.092836, + 22.250279, + 22.405089, + 22.557312, + 22.706992, + 22.854173, + 22.998898, + 23.141211, + 23.281155, + 23.418772, + 23.554105, + 23.687196, + 23.818085, + 23.946813, + 24.073421, + 24.197947, + 24.320432, + 24.440913, + 24.559427, + 24.676013, + 24.790706, + 24.903543, + 25.014558, + 25.123786, + 25.231262, + 25.337018, + 25.441088, + 25.543503, + 25.644295, + 25.743495, + 25.841133, + 25.937239, + 26.031842, + 26.124971, + 26.216653, + 26.306916, + 26.395787, + 26.483293, + 26.569458, + 26.654308, + 26.737868, + 26.820163, + 26.901215, + 26.981048, + 27.059686, + 27.137149, + 27.213461, + 27.288641, + 27.362712, + 27.435694, + 27.507607, + 27.578469, + 27.648302, + 27.717123, + 27.784951, + 27.851804, + 27.917699, + 27.982655, + 28.046687, + 28.109813, + 28.172048, + 28.233409, + 28.293912, + 28.353570, + 28.412400, + 28.470416, + 28.527633, + 28.584064, + 28.639722, + 28.694623, + 28.748778, + 28.802201, + 28.854904, + 28.906900, + 28.958201, + 29.008819, + 29.058765, + 29.108051, + 29.156687, + 29.204686, + 29.252058, + 29.298813, + 29.344961, + 29.390514, + 29.435480, + 29.479869, + 29.523691, + 29.566955, + 29.609670, + 29.651846, + 29.693491, + 29.734614, + 29.775223, + 29.815326, + 29.854932, + 29.894049, + 29.932684, + 29.970845, + 30.008540, + 30.045775, + 30.082559, + 30.118899, + 30.154800, + 30.190271, + 30.225317, + 30.259946, + 30.294164, + 30.327977, + 30.361391, + 30.394413, + 30.427049, + 30.459303, + 30.491183, + 30.522694, + 30.553841, + 30.584631, + 30.615067, + 30.645155, + 30.674902, + 30.704311, + 30.733388, + 30.762137, + 30.790563, + 30.818672, + 30.846468, + 30.873955, + 30.901137, + 30.928020, + 30.954607, + 30.980903, + 31.006912, + 31.032637, + 31.058084, + 31.083256, + 31.108156, + 31.132790, + 31.157159, + 31.181269, + 31.205122, + 31.228723, + 31.252074, + 31.275180, + 31.298043, + 31.320667, + 31.343055, + 31.365211, + 31.387137, + 31.408837, + 31.430314, + 31.451571, + 31.472610, + 31.493435, + 31.514048, + 31.534453, + 31.554651, + 31.574647, + 31.594442, + 31.614039, + 31.633441, + 31.652650, + 31.671669, + 31.690500, + 31.709146, + 31.727608, + 31.745891, + 31.763995, + 31.781923, + 31.799677, + 31.817260, + 31.834673, + 31.851919, + 31.869000, + 31.885918, + 31.902675, + 31.919274, + 31.935715, + 31.952001, + 31.968134, + 31.984116, + 31.999948, + 32.015633, + 32.031172, + 32.046568, + 32.061821, + 32.076933, + 32.091907, + 32.106744, + 32.121446, + 32.136013, + 32.150449, + 32.164753, + 32.178929, + 32.192977, + 32.206900, + 32.220697, + 32.234372, + 32.247925, + 32.261358, + 32.274672, + 32.287868, + 32.300949, + 32.313915, + 32.326767, + 32.339508, + 32.352137, + 32.364657, + 32.377069, + 32.389374, + 32.401573, + 32.413667, + 32.425658, + 32.437547, + 32.449335, + 32.461022, + 32.472611, + 32.484102, + 32.495496, + 32.506795, + 32.517999, + 32.529110, + 32.540128, + 32.551055, + 32.561891, + 32.572638, + 32.583296, + 32.593867, + 32.604351, + 32.614750, + 32.625064, + 32.635294, + 32.645441, + 32.655506, + 32.665490, + 32.675393, + 32.685218, + 32.694963, + 32.704631, + 32.714222, + 32.723737, + 32.733176, + 32.742541, + 32.751832, + 32.761050, + 32.770196, + 32.779270, + 32.788274, + 32.797208, + 32.806072, + 32.814868, + 32.823595, + 32.832256, + 32.840850, + 32.849378, + 32.857841, + 32.866239, + 32.874574, + 32.882845, + 32.891054, + 32.899201, + 32.907286, + 32.915311, + 32.923275, + 32.931180, + 32.939026, + 32.946814, + 32.954544, + 32.962216, + 32.969832, + 32.977392, + 32.984896, + 32.992346, + 32.999740, + 33.007081, + 33.014368, + 33.021603, + 33.028784, + 33.035914, + 33.042993, + 33.050021, + 33.056998, + 33.063925, + 33.070803, + 33.077631, + 33.084411, + 33.091143, + 33.097828, + 33.104465, + 33.111055, + 33.117599, + 33.124097, + 33.130550, + 33.136957, + 33.143320, + 33.149639, + 33.155913, + 33.162145, + 33.168333, + 33.174479, + 33.180582, + 33.186644, + 33.192664, + 33.198643, + 33.204582, + 33.210480, + 33.216337, + 33.222156, + 33.227935, + 33.233675, + 33.239376, + 33.245040, + 33.250665, + 33.256253, + 33.261803, + 33.267317, + 33.272794, + 33.278235, + 33.283640, + 33.289009, + 33.294343, + 33.299642, + 33.304906, + 33.310136, + 33.315331, + 33.320493, + 33.325621, + 33.330717, + 33.335779, + 33.340808, + 33.345805, + 33.350770, + 33.355703, + 33.360605, + 33.365475, + 33.370315, + 33.375123, + 33.379901, + 33.384649, + 33.389366, + 33.394054, + 33.398713, + 33.403342, + 33.407942, + 33.412514, + 33.417057, + 33.421571, + 33.426058, + 33.430516, + 33.434947, + 33.439351, + 33.443728, + 33.448077, + 33.452400, + 33.456697, + 33.460967, + 33.465211, + 33.469429, + 33.473622, + 33.477789, + 33.481931, + 33.486047, + 33.490139, + 33.494207, + 33.498250, + 33.502269, + 33.506263, + 33.510234, + 33.514181, + 33.518105, + 33.522005, + 33.525882, + 33.529737, + 33.533568, + 33.537377, + 33.541164, + 33.544928, + 33.548671, + 33.552391, + 33.556090, + 33.559767, + 33.563423, + 33.567057, + 33.570671, + 33.574264, + 33.577835, + 33.581387, + 33.584918, + 33.588428, + 33.591919, + 33.595390, + 33.598841, + 33.602272, + 33.605684, + 33.609076, + 33.612449, + 33.615803, + 33.619138, + 33.622455, + 33.625753, + 33.629032, + 33.632293, + 33.635535, + 33.638760, + 33.641967, + 33.645156, + 33.648327, + 33.651480, + 33.654616, + 33.657735, + 33.660837, + 33.663922, + 33.666989, + 33.670040, + 33.673074, + 33.676092, + 33.679093, + 33.682078, + 33.685047, + 33.687999, + 33.690936, + 33.693857, + 33.696762, + 33.699651, + 33.702525, + 33.705383, + 33.708227, + 33.711054, + 33.713867, + 33.716665, + 33.719448, + 33.722217, + 33.724970, + 33.727709, + 33.730434, + 33.733144, + 33.735840, + 33.738522, + 33.741190, + 33.743844, + 33.746483, + 33.749110, + 33.751722, + 33.754321, + 33.756907, + 33.759479, + 33.762038, + 33.764583, + 33.767116, + 33.769635, + 33.772141, + 33.774635, + 33.777116, + 33.779584, + 33.782040, + 33.784483, + 33.786914, + 33.789332, + 33.791738, + 33.794132, + 33.796514, + 33.798884, + 33.801242, + 33.803588, + 33.805922, + 33.808245, + 33.810556, + 33.812855, + 33.815143, + 33.817420, + 33.819685, + 33.821939, + 33.824182, + 33.826414, + 33.828635, + 33.830845, + 33.833044, + 33.835232, + 33.837410, + 33.839577, + 33.841733, + 33.843879, + 33.846014, + 33.848139, + 33.850254, + 33.852358, + 33.854452, + 33.856536, + 33.858610, + 33.860674, + 33.862728, + 33.864773, + 33.866807, + 33.868832, + 33.870847, + 33.872852, + 33.874848, + 33.876834, + 33.878811, + 33.880779, + 33.882737, + 33.884686, + 33.886626, + 33.888556, + 33.890478, + 33.892390, + 33.894294, + 33.896189, + 33.898075, + 33.899952, + 33.901820, + 33.903679, + 33.905530, + 33.907373, + 33.909206, + 33.911032, + 33.912849, + 33.914657, + 33.916457, + 33.918249, + 33.920033, + 33.921808, + 33.923576, + 33.925335, + 33.927086, + 33.928830, + 33.930565, + 33.932293, + 33.934012, + 33.935724, + 33.937428, + 33.939125, + 33.940813, + 33.942495, + 33.944168, + 33.945834, + 33.947493, + 33.949144, + 33.950788, + 33.952425, + 33.954054, + 33.955676, + 33.957291, + 33.958898, + 33.960499, + 33.962092, + 33.963679, + 33.965258, + 33.966830, + 33.968396, + 33.969955, + 33.971506, + 33.973052, + 33.974590, + 33.976121, + 33.977646, + 33.979165, + 33.980676, + 33.982181, + 33.983680, + 33.985172, + 33.986658, + 33.988137, + 33.989610, + 33.991076, + 33.992536, + 33.993990, + 33.995438, + 33.996880, + 33.998315, + 33.999744, + 34.001167, + 34.002585, + 34.003996, + 34.005401, + 34.006800, + 34.008193, + 34.009580, + 34.010962, + 34.012338, + 34.013708, + 34.015072, + 34.016430, + 34.017783, + 34.019130, + 34.020471, + 34.021807, + 34.023137, + 34.024462, + 34.025781, + 34.027095, + 34.028403, + 34.029706, + 34.031004, + 34.032296, + 34.033583, + 34.034864, + 34.036141, + 34.037412, + 34.038678, + 34.039938, + 34.041194, + 34.042444, + 34.043689, + 34.044930, + 34.046165, + 34.047395, + 34.048620, + 34.049840, + 34.051056, + 34.052266, + 34.053472, + 34.054672, + 34.055868, + 34.057059, + 34.058245, + 34.059427, + 34.060603, + 34.061775, + 34.062943, + 34.064106, + 34.065264, + 34.066417, + 34.067566, + 34.068710, + 34.069850, + 34.070986, + 34.072116, + 34.073243, + 34.074365, + 34.075482, + 34.076595, + 34.077704, + 34.078809, + 34.079909, + 34.081005, + 34.082096, + 34.083183, + 34.084266, + 34.085345, + 34.086420, + 34.087490, + 34.088557, + 34.089619, + 34.090677, + 34.091731, + 34.092781, + 34.093827, + 34.094869, + 34.095907, + 34.096941, + 34.097971, + 34.098997, + 34.100019, + 34.101037, + 34.102052, + 34.103062, + 34.104069, + 34.105072, + 34.106071, + 34.107066, + 34.108057, + 34.109045, + 34.110029, + 34.111009, + 34.111986, + 34.112959, + 34.113928, + 34.114894, + 34.115856, + 34.116815, + 34.117769, + 34.118721, + 34.119669, + 34.120613, + 34.121554, + 34.122491, + 34.123425, + 34.124355, + 34.125282, + 34.126205, + 34.127125, + 34.128042, + 34.128955, + 34.129865, + 34.130772, + 34.131675, + 34.132575, + 34.133472, + 34.134365, + 34.135256, + 34.136143, + 34.137026, + 34.137907, + 34.138784, + 34.139658, + 34.140529, + 34.141397, + 34.142262, + 34.143123, + 34.143981, + 34.144837, + 34.145689, + 34.146538, + 34.147384, + 34.148228, + 34.149068, + 34.149905, + 34.150739, + 34.151570, + 34.152398, + 34.153224, + 34.154046, + 34.154865, + 34.155682, + 34.156495, + 34.157306, + 34.158114, + 34.158919, + 34.159721, + 34.160520, + 34.161317, + 34.162111, + 34.162902, + 34.163690, + 34.164475, + 34.165258, + 34.166038, + 34.166815, + 34.167590, + 34.168361, + 34.169131, + 34.169897, + 34.170661, + 34.171422, + 34.172181, + 34.172937, + 34.173690, + 34.174441, + 34.175189, + 34.175934, + 34.176677, + 34.177418, + 34.178156, + 34.178891, + 34.179624, + 34.180354, + 34.181082, + 34.181808, + 34.182530, + 34.183251, + 34.183969, + 34.184685, + 34.185398, + 34.186108, + 34.186817, + 34.187523, + 34.188226, + 34.188927, + 34.189626, + 34.190323, + 34.191017, + 34.191709, + 34.192398, + 34.193085, + 34.193770, + 34.194453, + 34.195133, + 34.195811, + 34.196487, + 34.197161, + 34.197832, + 34.198501, + 34.199168, + 34.199833, + 34.200495, + 34.201155, + 34.201813, + 34.202469, + 34.203123, + 34.203775, + 34.204424, + 34.205072, + 34.205717, + 34.206360, + 34.207001, + 34.207640, + 34.208277, + 34.208911, + 34.209544, + 34.210175, + 34.210803, + 34.211430, + 34.212054, + 34.212677, + 34.213297, + 34.213916, + 34.214532, + 34.215147, + 34.215759, + 34.216370, + 34.216978, + 34.217585, + 34.218190, + 34.218792, + 34.219393, + 34.219992, + 34.220589, + 34.221184, + 34.221777, + 34.222368, + 34.222958, + 34.223545, + 34.224131, + 34.224715, + 34.225297, + 34.225877, + 34.226455, + 34.227031, + 34.227606, + 34.228179, + 34.228750, + 34.229319, + 34.229886, + 34.230452, + 34.231016, + 34.231578, + 34.232138, + 34.232697, + 34.233254, + 34.233809, + 34.234362, + 34.234914, + 34.235464, + 34.236012, + 34.236559, + 34.237104, + 34.237647, + 34.238188, + 34.238728, + 34.239266, + 34.239803, + 34.240337, + 34.240871, + 34.241402, + 34.241932, + 34.242460, + 34.242987, + 34.243512, + 34.244035, + 34.244557, + 34.245078, + 34.245596, + 34.246113, + 34.246629, + 34.247143, + 34.247655, + 34.248166, + 34.248675, + 34.249183, + 34.249689, + 34.250194, + 34.250697, + 34.251199, + 34.251699, + 34.252197, + 34.252694, + 34.253190, + 34.253684, + 34.254177, + 34.254668, + 34.255158, + 34.255646, + }, + {// The expectations for dimension = 70 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606666, + 5.801666, + 5.999999, + 6.201665, + 6.406663, + 6.614993, + 6.826654, + 7.041645, + 7.259961, + 7.481600, + 7.706555, + 7.934816, + 8.166370, + 8.401198, + 8.639272, + 8.880559, + 9.125010, + 9.372565, + 9.623146, + 9.876660, + 10.132988, + 10.391994, + 10.653514, + 10.917363, + 11.183329, + 11.451179, + 11.720658, + 11.991492, + 12.263390, + 12.536052, + 12.809168, + 13.082425, + 13.355512, + 13.628121, + 13.899956, + 14.170728, + 14.440167, + 14.708018, + 14.974045, + 15.238031, + 15.499778, + 15.759109, + 16.015866, + 16.269910, + 16.521118, + 16.769387, + 17.014627, + 17.256764, + 17.495737, + 17.731497, + 17.964005, + 18.193234, + 18.419165, + 18.641786, + 18.861094, + 19.077093, + 19.289789, + 19.499198, + 19.705336, + 19.908227, + 20.107896, + 20.304372, + 20.497685, + 20.687871, + 20.874964, + 21.059003, + 21.240026, + 21.418074, + 21.593187, + 21.765409, + 21.934781, + 22.101348, + 22.265152, + 22.426238, + 22.584649, + 22.740431, + 22.893626, + 23.044280, + 23.192434, + 23.338134, + 23.481422, + 23.622341, + 23.760933, + 23.897240, + 24.031304, + 24.163166, + 24.292865, + 24.420443, + 24.545937, + 24.669387, + 24.790832, + 24.910308, + 25.027852, + 25.143501, + 25.257290, + 25.369255, + 25.479430, + 25.587848, + 25.694543, + 25.799548, + 25.902894, + 26.004614, + 26.104736, + 26.203293, + 26.300313, + 26.395825, + 26.489859, + 26.582441, + 26.673599, + 26.763360, + 26.851751, + 26.938796, + 27.024521, + 27.108951, + 27.192109, + 27.274020, + 27.354707, + 27.434192, + 27.512498, + 27.589647, + 27.665659, + 27.740556, + 27.814358, + 27.887085, + 27.958756, + 28.029392, + 28.099011, + 28.167631, + 28.235270, + 28.301946, + 28.367676, + 28.432477, + 28.496367, + 28.559360, + 28.621473, + 28.682722, + 28.743121, + 28.802686, + 28.861432, + 28.919372, + 28.976521, + 29.032892, + 29.088500, + 29.143357, + 29.197476, + 29.250870, + 29.303551, + 29.355531, + 29.406823, + 29.457438, + 29.507387, + 29.556682, + 29.605334, + 29.653353, + 29.700751, + 29.747537, + 29.793721, + 29.839314, + 29.884325, + 29.928763, + 29.972639, + 30.015962, + 30.058739, + 30.100981, + 30.142696, + 30.183892, + 30.224577, + 30.264761, + 30.304450, + 30.343653, + 30.382378, + 30.420631, + 30.458421, + 30.495755, + 30.532639, + 30.569081, + 30.605088, + 30.640666, + 30.675822, + 30.710563, + 30.744894, + 30.778823, + 30.812355, + 30.845497, + 30.878253, + 30.910631, + 30.942635, + 30.974272, + 31.005547, + 31.036464, + 31.067031, + 31.097251, + 31.127130, + 31.156672, + 31.185884, + 31.214769, + 31.243332, + 31.271579, + 31.299513, + 31.327139, + 31.354462, + 31.381485, + 31.408214, + 31.434652, + 31.460804, + 31.486673, + 31.512264, + 31.537580, + 31.562625, + 31.587404, + 31.611919, + 31.636175, + 31.660175, + 31.683922, + 31.707421, + 31.730674, + 31.753684, + 31.776456, + 31.798992, + 31.821296, + 31.843371, + 31.865219, + 31.886844, + 31.908249, + 31.929436, + 31.950410, + 31.971171, + 31.991724, + 32.012071, + 32.032215, + 32.052158, + 32.071903, + 32.091453, + 32.110810, + 32.129976, + 32.148955, + 32.167748, + 32.186358, + 32.204787, + 32.223037, + 32.241112, + 32.259012, + 32.276741, + 32.294300, + 32.311691, + 32.328917, + 32.345980, + 32.362882, + 32.379624, + 32.396209, + 32.412638, + 32.428915, + 32.445039, + 32.461014, + 32.476841, + 32.492522, + 32.508058, + 32.523452, + 32.538705, + 32.553819, + 32.568796, + 32.583636, + 32.598343, + 32.612917, + 32.627359, + 32.641673, + 32.655858, + 32.669917, + 32.683851, + 32.697661, + 32.711349, + 32.724917, + 32.738365, + 32.751696, + 32.764910, + 32.778009, + 32.790994, + 32.803866, + 32.816627, + 32.829278, + 32.841821, + 32.854256, + 32.866584, + 32.878808, + 32.890928, + 32.902944, + 32.914860, + 32.926674, + 32.938390, + 32.950007, + 32.961527, + 32.972951, + 32.984280, + 32.995515, + 33.006657, + 33.017707, + 33.028666, + 33.039535, + 33.050315, + 33.061007, + 33.071612, + 33.082130, + 33.092564, + 33.102913, + 33.113179, + 33.123362, + 33.133464, + 33.143485, + 33.153426, + 33.163288, + 33.173071, + 33.182778, + 33.192407, + 33.201961, + 33.211440, + 33.220844, + 33.230175, + 33.239433, + 33.248619, + 33.257734, + 33.266779, + 33.275753, + 33.284659, + 33.293496, + 33.302265, + 33.310968, + 33.319604, + 33.328174, + 33.336680, + 33.345121, + 33.353498, + 33.361812, + 33.370064, + 33.378254, + 33.386383, + 33.394451, + 33.402460, + 33.410408, + 33.418298, + 33.426130, + 33.433904, + 33.441621, + 33.449281, + 33.456886, + 33.464434, + 33.471928, + 33.479368, + 33.486753, + 33.494085, + 33.501364, + 33.508591, + 33.515766, + 33.522890, + 33.529963, + 33.536985, + 33.543957, + 33.550880, + 33.557754, + 33.564580, + 33.571357, + 33.578087, + 33.584769, + 33.591405, + 33.597994, + 33.604538, + 33.611036, + 33.617489, + 33.623897, + 33.630261, + 33.636581, + 33.642858, + 33.649092, + 33.655283, + 33.661432, + 33.667539, + 33.673604, + 33.679629, + 33.685612, + 33.691555, + 33.697459, + 33.703322, + 33.709146, + 33.714932, + 33.720678, + 33.726386, + 33.732057, + 33.737689, + 33.743285, + 33.748843, + 33.754365, + 33.759851, + 33.765300, + 33.770714, + 33.776093, + 33.781436, + 33.786745, + 33.792019, + 33.797259, + 33.802465, + 33.807638, + 33.812777, + 33.817883, + 33.822957, + 33.827998, + 33.833006, + 33.837983, + 33.842929, + 33.847843, + 33.852725, + 33.857577, + 33.862399, + 33.867190, + 33.871951, + 33.876682, + 33.881384, + 33.886056, + 33.890699, + 33.895313, + 33.899899, + 33.904456, + 33.908985, + 33.913486, + 33.917960, + 33.922406, + 33.926824, + 33.931216, + 33.935581, + 33.939920, + 33.944232, + 33.948517, + 33.952777, + 33.957011, + 33.961220, + 33.965403, + 33.969561, + 33.973695, + 33.977803, + 33.981887, + 33.985947, + 33.989982, + 33.993994, + 33.997981, + 34.001946, + 34.005886, + 34.009804, + 34.013698, + 34.017570, + 34.021419, + 34.025246, + 34.029050, + 34.032832, + 34.036592, + 34.040330, + 34.044047, + 34.047742, + 34.051416, + 34.055068, + 34.058700, + 34.062311, + 34.065901, + 34.069470, + 34.073020, + 34.076549, + 34.080058, + 34.083547, + 34.087016, + 34.090466, + 34.093897, + 34.097308, + 34.100699, + 34.104072, + 34.107426, + 34.110761, + 34.114078, + 34.117376, + 34.120656, + 34.123918, + 34.127161, + 34.130387, + 34.133595, + 34.136785, + 34.139958, + 34.143113, + 34.146251, + 34.149372, + 34.152475, + 34.155562, + 34.158632, + 34.161686, + 34.164723, + 34.167743, + 34.170747, + 34.173735, + 34.176707, + 34.179663, + 34.182603, + 34.185527, + 34.188436, + 34.191329, + 34.194207, + 34.197070, + 34.199917, + 34.202749, + 34.205566, + 34.208369, + 34.211157, + 34.213930, + 34.216688, + 34.219432, + 34.222162, + 34.224877, + 34.227578, + 34.230265, + 34.232939, + 34.235598, + 34.238243, + 34.240875, + 34.243494, + 34.246098, + 34.248690, + 34.251268, + 34.253833, + 34.256385, + 34.258923, + 34.261449, + 34.263962, + 34.266462, + 34.268950, + 34.271425, + 34.273887, + 34.276337, + 34.278775, + 34.281200, + 34.283613, + 34.286014, + 34.288403, + 34.290780, + 34.293145, + 34.295499, + 34.297841, + 34.300171, + 34.302489, + 34.304796, + 34.307092, + 34.309376, + 34.311649, + 34.313911, + 34.316162, + 34.318402, + 34.320631, + 34.322849, + 34.325056, + 34.327252, + 34.329438, + 34.331613, + 34.333777, + 34.335931, + 34.338075, + 34.340208, + 34.342331, + 34.344444, + 34.346547, + 34.348640, + 34.350722, + 34.352795, + 34.354858, + 34.356911, + 34.358954, + 34.360987, + 34.363011, + 34.365025, + 34.367030, + 34.369025, + 34.371011, + 34.372988, + 34.374955, + 34.376913, + 34.378862, + 34.380802, + 34.382732, + 34.384654, + 34.386567, + 34.388471, + 34.390366, + 34.392252, + 34.394130, + 34.395998, + 34.397859, + 34.399710, + 34.401554, + 34.403388, + 34.405215, + 34.407033, + 34.408842, + 34.410644, + 34.412437, + 34.414222, + 34.415999, + 34.417768, + 34.419529, + 34.421281, + 34.423026, + 34.424764, + 34.426493, + 34.428214, + 34.429928, + 34.431634, + 34.433333, + 34.435024, + 34.436707, + 34.438383, + 34.440051, + 34.441712, + 34.443366, + 34.445012, + 34.446651, + 34.448283, + 34.449908, + 34.451525, + 34.453136, + 34.454739, + 34.456335, + 34.457925, + 34.459507, + 34.461082, + 34.462651, + 34.464213, + 34.465767, + 34.467316, + 34.468857, + 34.470392, + 34.471920, + 34.473442, + 34.474957, + 34.476465, + 34.477967, + 34.479463, + 34.480952, + 34.482435, + 34.483911, + 34.485382, + 34.486846, + 34.488303, + 34.489755, + 34.491200, + 34.492639, + 34.494072, + 34.495500, + 34.496921, + 34.498336, + 34.499745, + 34.501148, + 34.502545, + 34.503937, + 34.505322, + 34.506702, + 34.508076, + 34.509445, + 34.510807, + 34.512164, + 34.513516, + 34.514862, + 34.516202, + 34.517537, + 34.518866, + 34.520190, + 34.521508, + 34.522821, + 34.524128, + 34.525430, + 34.526727, + 34.528018, + 34.529305, + 34.530586, + 34.531861, + 34.533132, + 34.534397, + 34.535658, + 34.536913, + 34.538163, + 34.539408, + 34.540648, + 34.541883, + 34.543113, + 34.544338, + 34.545558, + 34.546774, + 34.547984, + 34.549190, + 34.550391, + 34.551587, + 34.552778, + 34.553965, + 34.555146, + 34.556324, + 34.557496, + 34.558664, + 34.559827, + 34.560986, + 34.562140, + 34.563289, + 34.564435, + 34.565575, + 34.566711, + 34.567843, + 34.568970, + 34.570093, + 34.571211, + 34.572325, + 34.573435, + 34.574541, + 34.575642, + 34.576739, + 34.577831, + 34.578920, + 34.580004, + 34.581084, + 34.582160, + 34.583232, + 34.584300, + 34.585363, + 34.586423, + 34.587478, + 34.588530, + 34.589577, + 34.590620, + 34.591660, + 34.592695, + 34.593727, + 34.594755, + 34.595778, + 34.596798, + 34.597814, + 34.598827, + 34.599835, + 34.600840, + 34.601841, + 34.602838, + 34.603831, + 34.604821, + 34.605807, + 34.606789, + 34.607768, + 34.608743, + 34.609714, + 34.610682, + 34.611646, + 34.612606, + 34.613563, + 34.614517, + 34.615467, + 34.616413, + 34.617356, + 34.618296, + 34.619232, + 34.620164, + 34.621094, + 34.622019, + 34.622942, + 34.623861, + 34.624777, + 34.625689, + 34.626598, + 34.627504, + 34.628406, + 34.629305, + 34.630201, + 34.631094, + 34.631983, + 34.632870, + 34.633753, + 34.634633, + 34.635509, + 34.636383, + 34.637253, + 34.638121, + 34.638985, + 34.639846, + 34.640704, + 34.641559, + 34.642411, + 34.643260, + 34.644106, + 34.644949, + 34.645788, + 34.646625, + 34.647459, + 34.648290, + 34.649119, + 34.649944, + 34.650766, + 34.651585, + 34.652402, + 34.653216, + 34.654026, + 34.654834, + 34.655639, + 34.656442, + 34.657241, + 34.658038, + 34.658832, + 34.659623, + 34.660412, + 34.661197, + 34.661980, + 34.662761, + 34.663538, + 34.664313, + 34.665085, + 34.665855, + 34.666622, + 34.667386, + 34.668148, + 34.668907, + 34.669664, + 34.670417, + 34.671169, + 34.671918, + 34.672664, + 34.673407, + 34.674149, + 34.674887, + 34.675623, + 34.676357, + 34.677088, + 34.677817, + 34.678543, + 34.679267, + 34.679988, + 34.680707, + 34.681423, + 34.682137, + 34.682849, + 34.683558, + 34.684265, + 34.684970, + 34.685672, + 34.686372, + 34.687069, + 34.687765, + 34.688457, + 34.689148, + 34.689836, + 34.690522, + 34.691206, + 34.691888, + 34.692567, + 34.693244, + 34.693918, + 34.694591, + 34.695261, + 34.695929, + 34.696595, + 34.697259, + 34.697921, + 34.698580, + 34.699237, + 34.699892, + 34.700545, + 34.701196, + 34.701845, + 34.702492, + 34.703136, + 34.703779, + 34.704419, + 34.705057, + 34.705693, + 34.706328, + 34.706960, + 34.707590, + 34.708218, + 34.708844, + 34.709468, + 34.710090, + 34.710710, + 34.711328, + 34.711944, + 34.712558, + 34.713170, + 34.713780, + 34.714389, + 34.714995, + 34.715599, + 34.716202, + 34.716802, + 34.717401, + 34.717998, + 34.718592, + 34.719185, + 34.719777, + 34.720366, + 34.720953, + 34.721539, + 34.722122, + 34.722704, + 34.723284, + 34.723863, + 34.724439, + 34.725014, + 34.725587, + 34.726158, + 34.726727, + 34.727294, + 34.727860, + 34.728424, + 34.728986, + 34.729547, + 34.730106, + 34.730663, + 34.731218, + 34.731771, + 34.732323, + 34.732873, + 34.733422, + 34.733969, + 34.734514, + 34.735057, + 34.735599, + 34.736139, + 34.736678, + 34.737215, + 34.737750, + 34.738283, + 34.738815, + 34.739345, + 34.739874, + 34.740401, + 34.740927, + 34.741451, + 34.741973, + 34.742494, + 34.743013, + 34.743530, + 34.744047, + 34.744561, + 34.745074, + 34.745585, + 34.746095, + 34.746603, + 34.747110, + 34.747616, + 34.748119, + 34.748622, + }, + {// The expectations for dimension = 71 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801666, + 5.999999, + 6.201665, + 6.406664, + 6.614995, + 6.826658, + 7.041651, + 7.259972, + 7.481618, + 7.706585, + 7.934863, + 8.166444, + 8.401310, + 8.639441, + 8.880807, + 9.125367, + 9.373071, + 9.623850, + 9.877623, + 10.134285, + 10.393712, + 10.655758, + 10.920250, + 11.186995, + 11.455771, + 11.726338, + 11.998434, + 12.271778, + 12.546077, + 12.821026, + 13.096314, + 13.371629, + 13.646662, + 13.921109, + 14.194675, + 14.467082, + 14.738063, + 15.007370, + 15.274775, + 15.540067, + 15.803058, + 16.063575, + 16.321469, + 16.576606, + 16.828870, + 17.078163, + 17.324399, + 17.567510, + 17.807437, + 18.044136, + 18.277571, + 18.507717, + 18.734557, + 18.958083, + 19.178292, + 19.395189, + 19.608783, + 19.819089, + 20.026127, + 20.229918, + 20.430489, + 20.627869, + 20.822091, + 21.013188, + 21.201195, + 21.386152, + 21.568096, + 21.747068, + 21.923109, + 22.096262, + 22.266568, + 22.434071, + 22.598814, + 22.760842, + 22.920197, + 23.076924, + 23.231067, + 23.382669, + 23.531773, + 23.678424, + 23.822663, + 23.964533, + 24.104077, + 24.241335, + 24.376350, + 24.509161, + 24.639810, + 24.768335, + 24.894776, + 25.019171, + 25.141559, + 25.261975, + 25.380458, + 25.497043, + 25.611766, + 25.724661, + 25.835763, + 25.945105, + 26.052721, + 26.158643, + 26.262903, + 26.365532, + 26.466560, + 26.566019, + 26.663936, + 26.760342, + 26.855264, + 26.948730, + 27.040768, + 27.131404, + 27.220665, + 27.308575, + 27.395161, + 27.480446, + 27.564455, + 27.647211, + 27.728738, + 27.809058, + 27.888194, + 27.966166, + 28.042998, + 28.118708, + 28.193318, + 28.266848, + 28.339318, + 28.410745, + 28.481150, + 28.550551, + 28.618966, + 28.686412, + 28.752907, + 28.818467, + 28.883110, + 28.946852, + 29.009707, + 29.071693, + 29.132824, + 29.193115, + 29.252582, + 29.311237, + 29.369096, + 29.426172, + 29.482478, + 29.538029, + 29.592836, + 29.646913, + 29.700272, + 29.752925, + 29.804884, + 29.856160, + 29.906766, + 29.956713, + 30.006011, + 30.054672, + 30.102705, + 30.150122, + 30.196932, + 30.243146, + 30.288773, + 30.333823, + 30.378305, + 30.422228, + 30.465602, + 30.508436, + 30.550737, + 30.592515, + 30.633778, + 30.674535, + 30.714792, + 30.754559, + 30.793842, + 30.832650, + 30.870989, + 30.908868, + 30.946293, + 30.983272, + 31.019811, + 31.055917, + 31.091597, + 31.126857, + 31.161703, + 31.196143, + 31.230182, + 31.263826, + 31.297081, + 31.329953, + 31.362448, + 31.394571, + 31.426328, + 31.457724, + 31.488765, + 31.519456, + 31.549802, + 31.579808, + 31.609479, + 31.638820, + 31.667835, + 31.696530, + 31.724909, + 31.752976, + 31.780737, + 31.808195, + 31.835354, + 31.862219, + 31.888795, + 31.915084, + 31.941092, + 31.966822, + 31.992278, + 32.017464, + 32.042383, + 32.067039, + 32.091437, + 32.115579, + 32.139468, + 32.163109, + 32.186505, + 32.209659, + 32.232574, + 32.255254, + 32.277701, + 32.299920, + 32.321912, + 32.343681, + 32.365230, + 32.386562, + 32.407680, + 32.428586, + 32.449283, + 32.469775, + 32.490063, + 32.510150, + 32.530039, + 32.549733, + 32.569234, + 32.588544, + 32.607667, + 32.626603, + 32.645357, + 32.663929, + 32.682323, + 32.700540, + 32.718583, + 32.736454, + 32.754156, + 32.771689, + 32.789057, + 32.806261, + 32.823304, + 32.840187, + 32.856913, + 32.873483, + 32.889899, + 32.906163, + 32.922277, + 32.938243, + 32.954063, + 32.969737, + 32.985269, + 33.000660, + 33.015911, + 33.031024, + 33.046002, + 33.060844, + 33.075554, + 33.090132, + 33.104580, + 33.118899, + 33.133092, + 33.147160, + 33.161103, + 33.174924, + 33.188624, + 33.202205, + 33.215667, + 33.229012, + 33.242241, + 33.255356, + 33.268358, + 33.281249, + 33.294029, + 33.306699, + 33.319262, + 33.331718, + 33.344069, + 33.356315, + 33.368458, + 33.380499, + 33.392438, + 33.404278, + 33.416020, + 33.427663, + 33.439211, + 33.450662, + 33.462019, + 33.473283, + 33.484454, + 33.495534, + 33.506523, + 33.517423, + 33.528235, + 33.538959, + 33.549596, + 33.560147, + 33.570614, + 33.580997, + 33.591297, + 33.601514, + 33.611651, + 33.621707, + 33.631683, + 33.641581, + 33.651401, + 33.661144, + 33.670810, + 33.680401, + 33.689917, + 33.699359, + 33.708728, + 33.718025, + 33.727250, + 33.736404, + 33.745487, + 33.754501, + 33.763446, + 33.772323, + 33.781133, + 33.789875, + 33.798552, + 33.807163, + 33.815709, + 33.824192, + 33.832610, + 33.840966, + 33.849259, + 33.857491, + 33.865662, + 33.873772, + 33.881822, + 33.889813, + 33.897746, + 33.905620, + 33.913437, + 33.921196, + 33.928900, + 33.936547, + 33.944139, + 33.951676, + 33.959158, + 33.966587, + 33.973963, + 33.981286, + 33.988556, + 33.995775, + 34.002942, + 34.010059, + 34.017125, + 34.024141, + 34.031108, + 34.038026, + 34.044895, + 34.051716, + 34.058490, + 34.065217, + 34.071896, + 34.078530, + 34.085118, + 34.091660, + 34.098157, + 34.104609, + 34.111018, + 34.117382, + 34.123703, + 34.129981, + 34.136216, + 34.142409, + 34.148560, + 34.154670, + 34.160738, + 34.166766, + 34.172753, + 34.178701, + 34.184608, + 34.190476, + 34.196306, + 34.202096, + 34.207848, + 34.213563, + 34.219239, + 34.224878, + 34.230481, + 34.236046, + 34.241576, + 34.247069, + 34.252526, + 34.257948, + 34.263335, + 34.268687, + 34.274005, + 34.279288, + 34.284538, + 34.289753, + 34.294936, + 34.300085, + 34.305202, + 34.310286, + 34.315337, + 34.320357, + 34.325345, + 34.330302, + 34.335227, + 34.340122, + 34.344986, + 34.349819, + 34.354622, + 34.359396, + 34.364139, + 34.368854, + 34.373539, + 34.378195, + 34.382823, + 34.387422, + 34.391993, + 34.396535, + 34.401050, + 34.405538, + 34.409998, + 34.414431, + 34.418837, + 34.423217, + 34.427570, + 34.431897, + 34.436197, + 34.440472, + 34.444721, + 34.448945, + 34.453144, + 34.457318, + 34.461467, + 34.465591, + 34.469690, + 34.473766, + 34.477817, + 34.481845, + 34.485849, + 34.489829, + 34.493787, + 34.497721, + 34.501632, + 34.505520, + 34.509386, + 34.513229, + 34.517050, + 34.520849, + 34.524626, + 34.528381, + 34.532115, + 34.535827, + 34.539519, + 34.543189, + 34.546838, + 34.550466, + 34.554074, + 34.557661, + 34.561228, + 34.564775, + 34.568301, + 34.571808, + 34.575296, + 34.578763, + 34.582212, + 34.585641, + 34.589050, + 34.592441, + 34.595813, + 34.599167, + 34.602502, + 34.605818, + 34.609116, + 34.612396, + 34.615658, + 34.618902, + 34.622128, + 34.625337, + 34.628528, + 34.631702, + 34.634858, + 34.637997, + 34.641120, + 34.644225, + 34.647314, + 34.650386, + 34.653441, + 34.656481, + 34.659503, + 34.662510, + 34.665501, + 34.668475, + 34.671434, + 34.674377, + 34.677305, + 34.680217, + 34.683113, + 34.685995, + 34.688861, + 34.691712, + 34.694548, + 34.697369, + 34.700176, + 34.702967, + 34.705745, + 34.708507, + 34.711256, + 34.713990, + 34.716710, + 34.719416, + 34.722108, + 34.724786, + 34.727451, + 34.730102, + 34.732739, + 34.735362, + 34.737973, + 34.740570, + 34.743153, + 34.745724, + 34.748281, + 34.750826, + 34.753358, + 34.755877, + 34.758383, + 34.760877, + 34.763358, + 34.765827, + 34.768283, + 34.770727, + 34.773159, + 34.775578, + 34.777986, + 34.780382, + 34.782766, + 34.785138, + 34.787498, + 34.789847, + 34.792184, + 34.794510, + 34.796824, + 34.799127, + 34.801419, + 34.803699, + 34.805968, + 34.808227, + 34.810474, + 34.812710, + 34.814936, + 34.817151, + 34.819355, + 34.821548, + 34.823731, + 34.825903, + 34.828065, + 34.830217, + 34.832358, + 34.834489, + 34.836610, + 34.838721, + 34.840822, + 34.842913, + 34.844994, + 34.847065, + 34.849126, + 34.851177, + 34.853219, + 34.855252, + 34.857274, + 34.859288, + 34.861291, + 34.863286, + 34.865271, + 34.867247, + 34.869214, + 34.871171, + 34.873120, + 34.875059, + 34.876990, + 34.878911, + 34.880824, + 34.882728, + 34.884623, + 34.886510, + 34.888387, + 34.890257, + 34.892117, + 34.893970, + 34.895813, + 34.897649, + 34.899476, + 34.901295, + 34.903105, + 34.904908, + 34.906702, + 34.908488, + 34.910266, + 34.912036, + 34.913798, + 34.915553, + 34.917299, + 34.919038, + 34.920768, + 34.922492, + 34.924207, + 34.925915, + 34.927615, + 34.929308, + 34.930993, + 34.932671, + 34.934342, + 34.936005, + 34.937661, + 34.939309, + 34.940950, + 34.942585, + 34.944212, + 34.945831, + 34.947444, + 34.949050, + 34.950649, + 34.952241, + 34.953826, + 34.955404, + 34.956975, + 34.958540, + 34.960098, + 34.961649, + 34.963193, + 34.964731, + 34.966262, + 34.967787, + 34.969305, + 34.970817, + 34.972322, + 34.973821, + 34.975313, + 34.976799, + 34.978279, + 34.979753, + 34.981220, + 34.982681, + 34.984136, + 34.985585, + 34.987028, + 34.988465, + 34.989896, + 34.991321, + 34.992739, + 34.994152, + 34.995559, + 34.996960, + 34.998356, + 34.999745, + 35.001129, + 35.002507, + 35.003880, + 35.005246, + 35.006607, + 35.007963, + 35.009313, + 35.010657, + 35.011996, + 35.013330, + 35.014657, + 35.015980, + 35.017297, + 35.018609, + 35.019915, + 35.021217, + 35.022512, + 35.023803, + 35.025088, + 35.026369, + 35.027644, + 35.028914, + 35.030178, + 35.031438, + 35.032693, + 35.033943, + 35.035187, + 35.036427, + 35.037662, + 35.038891, + 35.040116, + 35.041336, + 35.042552, + 35.043762, + 35.044968, + 35.046169, + 35.047365, + 35.048556, + 35.049743, + 35.050925, + 35.052102, + 35.053275, + 35.054443, + 35.055607, + 35.056766, + 35.057920, + 35.059071, + 35.060216, + 35.061357, + 35.062494, + 35.063626, + 35.064754, + 35.065878, + 35.066997, + 35.068112, + 35.069222, + 35.070329, + 35.071431, + 35.072529, + 35.073622, + 35.074712, + 35.075797, + 35.076878, + 35.077955, + 35.079028, + 35.080097, + 35.081162, + 35.082222, + 35.083279, + 35.084332, + 35.085381, + 35.086425, + 35.087466, + 35.088503, + 35.089536, + 35.090565, + 35.091591, + 35.092612, + 35.093630, + 35.094644, + 35.095654, + 35.096660, + 35.097662, + 35.098661, + 35.099656, + 35.100648, + 35.101635, + 35.102619, + 35.103600, + 35.104577, + 35.105550, + 35.106520, + 35.107486, + 35.108448, + 35.109407, + 35.110363, + 35.111315, + 35.112263, + 35.113208, + 35.114150, + 35.115088, + 35.116022, + 35.116954, + 35.117882, + 35.118806, + 35.119728, + 35.120646, + 35.121560, + 35.122471, + 35.123379, + 35.124284, + 35.125186, + 35.126084, + 35.126979, + 35.127871, + 35.128760, + 35.129645, + 35.130527, + 35.131406, + 35.132282, + 35.133155, + 35.134025, + 35.134892, + 35.135756, + 35.136616, + 35.137474, + 35.138328, + 35.139180, + 35.140028, + 35.140874, + 35.141716, + 35.142556, + 35.143393, + 35.144226, + 35.145057, + 35.145885, + 35.146710, + 35.147532, + 35.148352, + 35.149168, + 35.149982, + 35.150792, + 35.151600, + 35.152405, + 35.153208, + 35.154007, + 35.154804, + 35.155598, + 35.156390, + 35.157178, + 35.157964, + 35.158747, + 35.159528, + 35.160306, + 35.161081, + 35.161854, + 35.162624, + 35.163391, + 35.164156, + 35.164918, + 35.165677, + 35.166434, + 35.167189, + 35.167940, + 35.168690, + 35.169436, + 35.170181, + 35.170922, + 35.171662, + 35.172398, + 35.173133, + 35.173864, + 35.174594, + 35.175321, + 35.176045, + 35.176767, + 35.177487, + 35.178204, + 35.178919, + 35.179631, + 35.180341, + 35.181049, + 35.181755, + 35.182458, + 35.183158, + 35.183857, + 35.184553, + 35.185247, + 35.185938, + 35.186628, + 35.187315, + 35.187999, + 35.188682, + 35.189362, + 35.190040, + 35.190716, + 35.191390, + 35.192061, + 35.192731, + 35.193398, + 35.194062, + 35.194725, + 35.195386, + 35.196044, + 35.196701, + 35.197355, + 35.198007, + 35.198657, + 35.199305, + 35.199951, + 35.200594, + 35.201236, + 35.201876, + 35.202513, + 35.203149, + 35.203782, + 35.204414, + 35.205043, + 35.205671, + 35.206296, + 35.206920, + 35.207541, + 35.208160, + 35.208778, + 35.209394, + 35.210007, + 35.210619, + 35.211229, + 35.211837, + 35.212442, + 35.213046, + 35.213649, + 35.214249, + 35.214847, + 35.215444, + 35.216038, + 35.216631, + 35.217222, + 35.217811, + 35.218398, + 35.218983, + 35.219567, + 35.220149, + 35.220729, + 35.221307, + 35.221883, + 35.222458, + 35.223031, + 35.223602, + 35.224171, + 35.224738, + 35.225304, + 35.225868, + 35.226430, + 35.226991, + 35.227550, + 35.228107, + 35.228662, + 35.229216, + 35.229768, + 35.230318, + 35.230867, + 35.231414, + 35.231959, + 35.232503, + 35.233045, + 35.233585, + 35.234124, + 35.234661, + 35.235197, + 35.235730, + 35.236263, + 35.236793, + 35.237322, + 35.237850, + 35.238376, + 35.238900, + 35.239423, + 35.239944, + 35.240463, + 35.240981, + 35.241498, + }, + {// The expectations for dimension = 72 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801666, + 6.000000, + 6.201666, + 6.406665, + 6.614997, + 6.826661, + 7.041656, + 7.259980, + 7.481632, + 7.706607, + 7.934899, + 8.166500, + 8.401397, + 8.639573, + 8.881002, + 9.125652, + 9.373478, + 9.624423, + 9.878414, + 10.135360, + 10.395150, + 10.657652, + 10.922709, + 11.190141, + 11.459744, + 11.731290, + 12.004530, + 12.279195, + 12.554999, + 12.831644, + 13.108824, + 13.386228, + 13.663545, + 13.940466, + 14.216693, + 14.491936, + 14.765922, + 15.038391, + 15.309102, + 15.577835, + 15.844387, + 16.108574, + 16.370234, + 16.629222, + 16.885411, + 17.138691, + 17.388968, + 17.636164, + 17.880212, + 18.121059, + 18.358663, + 18.592991, + 18.824021, + 19.051739, + 19.276138, + 19.497216, + 19.714981, + 19.929442, + 20.140616, + 20.348523, + 20.553185, + 20.754630, + 20.952887, + 21.147988, + 21.339967, + 21.528862, + 21.714708, + 21.897546, + 22.077416, + 22.254358, + 22.428415, + 22.599629, + 22.768043, + 22.933700, + 23.096643, + 23.256917, + 23.414565, + 23.569631, + 23.722157, + 23.872187, + 24.019764, + 24.164931, + 24.307730, + 24.448202, + 24.586390, + 24.722333, + 24.856073, + 24.987649, + 25.117101, + 25.244467, + 25.369787, + 25.493096, + 25.614434, + 25.733835, + 25.851337, + 25.966973, + 26.080780, + 26.192791, + 26.303039, + 26.411558, + 26.518379, + 26.623535, + 26.727057, + 26.828974, + 26.929317, + 27.028116, + 27.125399, + 27.221194, + 27.315529, + 27.408431, + 27.499927, + 27.590043, + 27.678804, + 27.766236, + 27.852363, + 27.937208, + 28.020797, + 28.103151, + 28.184293, + 28.264245, + 28.343030, + 28.420668, + 28.497180, + 28.572586, + 28.646908, + 28.720163, + 28.792372, + 28.863552, + 28.933724, + 29.002903, + 29.071109, + 29.138358, + 29.204668, + 29.270055, + 29.334534, + 29.398123, + 29.460837, + 29.522691, + 29.583699, + 29.643877, + 29.703240, + 29.761800, + 29.819572, + 29.876570, + 29.932806, + 29.988294, + 30.043046, + 30.097075, + 30.150393, + 30.203012, + 30.254944, + 30.306200, + 30.356791, + 30.406729, + 30.456024, + 30.504687, + 30.552729, + 30.600159, + 30.646988, + 30.693225, + 30.738880, + 30.783963, + 30.828482, + 30.872447, + 30.915867, + 30.958750, + 31.001105, + 31.042941, + 31.084265, + 31.125086, + 31.165411, + 31.205249, + 31.244606, + 31.283491, + 31.321911, + 31.359873, + 31.397384, + 31.434451, + 31.471081, + 31.507281, + 31.543056, + 31.578414, + 31.613361, + 31.647903, + 31.682046, + 31.715797, + 31.749160, + 31.782142, + 31.814748, + 31.846985, + 31.878857, + 31.910369, + 31.941528, + 31.972338, + 32.002805, + 32.032932, + 32.062726, + 32.092191, + 32.121332, + 32.150153, + 32.178660, + 32.206856, + 32.234745, + 32.262333, + 32.289624, + 32.316621, + 32.343329, + 32.369751, + 32.395893, + 32.421757, + 32.447348, + 32.472670, + 32.497725, + 32.522518, + 32.547052, + 32.571332, + 32.595359, + 32.619138, + 32.642673, + 32.665965, + 32.689020, + 32.711839, + 32.734426, + 32.756784, + 32.778916, + 32.800826, + 32.822515, + 32.843987, + 32.865245, + 32.886292, + 32.907130, + 32.927761, + 32.948190, + 32.968418, + 32.988448, + 33.008282, + 33.027923, + 33.047374, + 33.066636, + 33.085713, + 33.104606, + 33.123319, + 33.141852, + 33.160209, + 33.178391, + 33.196401, + 33.214242, + 33.231914, + 33.249420, + 33.266763, + 33.283944, + 33.300964, + 33.317828, + 33.334535, + 33.351088, + 33.367489, + 33.383739, + 33.399841, + 33.415796, + 33.431607, + 33.447274, + 33.462799, + 33.478185, + 33.493432, + 33.508543, + 33.523519, + 33.538361, + 33.553072, + 33.567652, + 33.582104, + 33.596428, + 33.610627, + 33.624701, + 33.638652, + 33.652482, + 33.666192, + 33.679783, + 33.693257, + 33.706614, + 33.719857, + 33.732987, + 33.746004, + 33.758910, + 33.771707, + 33.784396, + 33.796977, + 33.809452, + 33.821823, + 33.834090, + 33.846254, + 33.858317, + 33.870279, + 33.882143, + 33.893908, + 33.905576, + 33.917149, + 33.928626, + 33.940010, + 33.951300, + 33.962499, + 33.973607, + 33.984625, + 33.995554, + 34.006395, + 34.017149, + 34.027817, + 34.038399, + 34.048897, + 34.059312, + 34.069644, + 34.079894, + 34.090064, + 34.100153, + 34.110163, + 34.120095, + 34.129950, + 34.139727, + 34.149429, + 34.159055, + 34.168607, + 34.178086, + 34.187491, + 34.196824, + 34.206086, + 34.215277, + 34.224398, + 34.233450, + 34.242433, + 34.251348, + 34.260196, + 34.268977, + 34.277693, + 34.286343, + 34.294929, + 34.303450, + 34.311909, + 34.320304, + 34.328638, + 34.336910, + 34.345121, + 34.353271, + 34.361362, + 34.369394, + 34.377368, + 34.385283, + 34.393141, + 34.400942, + 34.408687, + 34.416375, + 34.424009, + 34.431588, + 34.439112, + 34.446583, + 34.454001, + 34.461365, + 34.468678, + 34.475939, + 34.483149, + 34.490308, + 34.497416, + 34.504475, + 34.511484, + 34.518445, + 34.525357, + 34.532221, + 34.539037, + 34.545807, + 34.552529, + 34.559206, + 34.565836, + 34.572421, + 34.578961, + 34.585457, + 34.591908, + 34.598315, + 34.604679, + 34.611000, + 34.617279, + 34.623515, + 34.629709, + 34.635861, + 34.641973, + 34.648044, + 34.654074, + 34.660064, + 34.666014, + 34.671926, + 34.677798, + 34.683631, + 34.689426, + 34.695183, + 34.700902, + 34.706584, + 34.712229, + 34.717838, + 34.723410, + 34.728945, + 34.734445, + 34.739910, + 34.745339, + 34.750734, + 34.756094, + 34.761419, + 34.766711, + 34.771969, + 34.777194, + 34.782385, + 34.787544, + 34.792670, + 34.797763, + 34.802825, + 34.807855, + 34.812853, + 34.817820, + 34.822757, + 34.827662, + 34.832537, + 34.837382, + 34.842196, + 34.846982, + 34.851737, + 34.856463, + 34.861161, + 34.865829, + 34.870469, + 34.875081, + 34.879665, + 34.884220, + 34.888748, + 34.893249, + 34.897723, + 34.902169, + 34.906589, + 34.910982, + 34.915349, + 34.919690, + 34.924005, + 34.928294, + 34.932558, + 34.936796, + 34.941010, + 34.945198, + 34.949362, + 34.953501, + 34.957616, + 34.961707, + 34.965773, + 34.969816, + 34.973836, + 34.977832, + 34.981805, + 34.985754, + 34.989681, + 34.993585, + 34.997467, + 35.001327, + 35.005164, + 35.008979, + 35.012772, + 35.016544, + 35.020294, + 35.024023, + 35.027731, + 35.031418, + 35.035083, + 35.038728, + 35.042353, + 35.045957, + 35.049541, + 35.053105, + 35.056649, + 35.060173, + 35.063677, + 35.067162, + 35.070628, + 35.074074, + 35.077501, + 35.080910, + 35.084299, + 35.087670, + 35.091023, + 35.094357, + 35.097672, + 35.100970, + 35.104250, + 35.107511, + 35.110755, + 35.113982, + 35.117191, + 35.120382, + 35.123557, + 35.126714, + 35.129854, + 35.132978, + 35.136085, + 35.139175, + 35.142248, + 35.145305, + 35.148346, + 35.151371, + 35.154380, + 35.157373, + 35.160350, + 35.163311, + 35.166257, + 35.169187, + 35.172102, + 35.175001, + 35.177886, + 35.180755, + 35.183609, + 35.186449, + 35.189274, + 35.192084, + 35.194879, + 35.197660, + 35.200427, + 35.203180, + 35.205918, + 35.208642, + 35.211353, + 35.214049, + 35.216732, + 35.219401, + 35.222057, + 35.224699, + 35.227327, + 35.229942, + 35.232544, + 35.235133, + 35.237709, + 35.240272, + 35.242822, + 35.245360, + 35.247884, + 35.250396, + 35.252895, + 35.255382, + 35.257857, + 35.260319, + 35.262769, + 35.265207, + 35.267633, + 35.270047, + 35.272449, + 35.274840, + 35.277218, + 35.279585, + 35.281940, + 35.284284, + 35.286617, + 35.288938, + 35.291247, + 35.293546, + 35.295833, + 35.298110, + 35.300375, + 35.302629, + 35.304873, + 35.307106, + 35.309328, + 35.311539, + 35.313740, + 35.315930, + 35.318110, + 35.320280, + 35.322439, + 35.324588, + 35.326727, + 35.328855, + 35.330974, + 35.333082, + 35.335181, + 35.337270, + 35.339349, + 35.341418, + 35.343477, + 35.345527, + 35.347568, + 35.349599, + 35.351620, + 35.353632, + 35.355635, + 35.357628, + 35.359612, + 35.361587, + 35.363553, + 35.365510, + 35.367458, + 35.369397, + 35.371327, + 35.373248, + 35.375161, + 35.377064, + 35.378959, + 35.380846, + 35.382724, + 35.384593, + 35.386454, + 35.388307, + 35.390151, + 35.391986, + 35.393814, + 35.395633, + 35.397445, + 35.399248, + 35.401043, + 35.402830, + 35.404609, + 35.406380, + 35.408143, + 35.409898, + 35.411646, + 35.413386, + 35.415118, + 35.416843, + 35.418560, + 35.420269, + 35.421971, + 35.423665, + 35.425352, + 35.427032, + 35.428704, + 35.430369, + 35.432027, + 35.433677, + 35.435321, + 35.436957, + 35.438586, + 35.440208, + 35.441823, + 35.443431, + 35.445032, + 35.446626, + 35.448214, + 35.449795, + 35.451368, + 35.452935, + 35.454496, + 35.456050, + 35.457597, + 35.459137, + 35.460671, + 35.462199, + 35.463720, + 35.465235, + 35.466743, + 35.468245, + 35.469740, + 35.471229, + 35.472712, + 35.474189, + 35.475660, + 35.477124, + 35.478583, + 35.480035, + 35.481481, + 35.482921, + 35.484355, + 35.485784, + 35.487206, + 35.488622, + 35.490033, + 35.491438, + 35.492837, + 35.494230, + 35.495618, + 35.496999, + 35.498375, + 35.499746, + 35.501111, + 35.502470, + 35.503824, + 35.505172, + 35.506515, + 35.507853, + 35.509185, + 35.510511, + 35.511832, + 35.513148, + 35.514459, + 35.515764, + 35.517064, + 35.518359, + 35.519649, + 35.520933, + 35.522212, + 35.523487, + 35.524756, + 35.526020, + 35.527279, + 35.528533, + 35.529782, + 35.531026, + 35.532265, + 35.533500, + 35.534729, + 35.535954, + 35.537173, + 35.538388, + 35.539599, + 35.540804, + 35.542005, + 35.543201, + 35.544392, + 35.545579, + 35.546761, + 35.547938, + 35.549111, + 35.550280, + 35.551444, + 35.552603, + 35.553758, + 35.554908, + 35.556054, + 35.557196, + 35.558333, + 35.559466, + 35.560594, + 35.561718, + 35.562838, + 35.563953, + 35.565065, + 35.566172, + 35.567275, + 35.568373, + 35.569468, + 35.570558, + 35.571644, + 35.572726, + 35.573804, + 35.574878, + 35.575948, + 35.577014, + 35.578075, + 35.579133, + 35.580187, + 35.581237, + 35.582283, + 35.583325, + 35.584363, + 35.585398, + 35.586428, + 35.587455, + 35.588478, + 35.589497, + 35.590512, + 35.591523, + 35.592531, + 35.593535, + 35.594535, + 35.595532, + 35.596525, + 35.597514, + 35.598500, + 35.599482, + 35.600461, + 35.601436, + 35.602407, + 35.603375, + 35.604339, + 35.605300, + 35.606257, + 35.607211, + 35.608161, + 35.609108, + 35.610052, + 35.610992, + 35.611929, + 35.612862, + 35.613792, + 35.614719, + 35.615642, + 35.616562, + 35.617479, + 35.618392, + 35.619302, + 35.620209, + 35.621113, + 35.622013, + 35.622910, + 35.623805, + 35.624695, + 35.625583, + 35.626468, + 35.627349, + 35.628228, + 35.629103, + 35.629975, + 35.630844, + 35.631710, + 35.632573, + 35.633433, + 35.634290, + 35.635144, + 35.635995, + 35.636843, + 35.637688, + 35.638530, + 35.639369, + 35.640206, + 35.641039, + 35.641870, + 35.642697, + 35.643522, + 35.644344, + 35.645163, + 35.645979, + 35.646793, + 35.647603, + 35.648411, + 35.649216, + 35.650018, + 35.650818, + 35.651615, + 35.652409, + 35.653200, + 35.653989, + 35.654775, + 35.655558, + 35.656339, + 35.657117, + 35.657893, + 35.658665, + 35.659435, + 35.660203, + 35.660968, + 35.661730, + 35.662490, + 35.663248, + 35.664002, + 35.664754, + 35.665504, + 35.666251, + 35.666996, + 35.667738, + 35.668478, + 35.669215, + 35.669950, + 35.670682, + 35.671412, + 35.672140, + 35.672865, + 35.673588, + 35.674308, + 35.675026, + 35.675741, + 35.676454, + 35.677165, + 35.677874, + 35.678580, + 35.679284, + 35.679985, + 35.680685, + 35.681382, + 35.682076, + 35.682769, + 35.683459, + 35.684147, + 35.684833, + 35.685516, + 35.686197, + 35.686876, + 35.687553, + 35.688228, + 35.688900, + 35.689570, + 35.690239, + 35.690905, + 35.691568, + 35.692230, + 35.692890, + 35.693547, + 35.694203, + 35.694856, + 35.695507, + 35.696156, + 35.696803, + 35.697448, + 35.698091, + 35.698732, + 35.699371, + 35.700007, + 35.700642, + 35.701275, + 35.701906, + 35.702534, + 35.703161, + 35.703786, + 35.704409, + 35.705030, + 35.705649, + 35.706265, + 35.706881, + 35.707494, + 35.708105, + 35.708714, + 35.709321, + 35.709927, + 35.710531, + 35.711132, + 35.711732, + 35.712330, + 35.712926, + 35.713520, + 35.714113, + 35.714703, + 35.715292, + 35.715879, + 35.716464, + 35.717048, + 35.717629, + 35.718209, + 35.718787, + 35.719363, + 35.719937, + 35.720510, + 35.721081, + 35.721650, + 35.722218, + 35.722783, + 35.723347, + 35.723910, + 35.724470, + 35.725029, + 35.725586, + 35.726141, + 35.726695, + 35.727247, + 35.727798, + 35.728346, + 35.728894, + 35.729439, + 35.729983, + 35.730525, + 35.731066, + 35.731604, + 35.732142, + 35.732677, + 35.733212, + 35.733744, + 35.734275, + }, + {// The expectations for dimension = 73 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201666, + 6.406666, + 6.614998, + 6.826663, + 7.041659, + 7.259986, + 7.481642, + 7.706623, + 7.934926, + 8.166543, + 8.401464, + 8.639675, + 8.881156, + 9.125878, + 9.373804, + 9.624886, + 9.879060, + 10.136247, + 10.396348, + 10.659244, + 10.924794, + 11.192832, + 11.463169, + 11.735592, + 12.009865, + 12.285731, + 12.562914, + 12.841125, + 13.120062, + 13.399418, + 13.678880, + 13.958140, + 14.236892, + 14.514842, + 14.791706, + 15.067216, + 15.341120, + 15.613185, + 15.883196, + 16.150959, + 16.416297, + 16.679056, + 16.939096, + 17.196296, + 17.450554, + 17.701779, + 17.949897, + 18.194848, + 18.436579, + 18.675054, + 18.910243, + 19.142126, + 19.370690, + 19.595930, + 19.817848, + 20.036451, + 20.251750, + 20.463763, + 20.672509, + 20.878014, + 21.080304, + 21.279410, + 21.475363, + 21.668198, + 21.857952, + 22.044662, + 22.228367, + 22.409108, + 22.586925, + 22.761861, + 22.933956, + 23.103256, + 23.269801, + 23.433636, + 23.594805, + 23.753349, + 23.909313, + 24.062740, + 24.213673, + 24.362154, + 24.508226, + 24.651930, + 24.793309, + 24.932403, + 25.069253, + 25.203900, + 25.336382, + 25.466740, + 25.595011, + 25.721235, + 25.845447, + 25.967685, + 26.087986, + 26.206385, + 26.322917, + 26.437617, + 26.550518, + 26.661654, + 26.771058, + 26.878761, + 26.984796, + 27.089193, + 27.191983, + 27.293195, + 27.392859, + 27.491003, + 27.587656, + 27.682844, + 27.776596, + 27.868937, + 27.959894, + 28.049492, + 28.137756, + 28.224710, + 28.310379, + 28.394786, + 28.477953, + 28.559905, + 28.640661, + 28.720246, + 28.798678, + 28.875980, + 28.952171, + 29.027272, + 29.101303, + 29.174281, + 29.246227, + 29.317157, + 29.387092, + 29.456047, + 29.524041, + 29.591089, + 29.657210, + 29.722419, + 29.786732, + 29.850164, + 29.912731, + 29.974448, + 30.035330, + 30.095391, + 30.154644, + 30.213104, + 30.270785, + 30.327699, + 30.383860, + 30.439280, + 30.493972, + 30.547948, + 30.601219, + 30.653799, + 30.705698, + 30.756927, + 30.807498, + 30.857422, + 30.906709, + 30.955369, + 31.003413, + 31.050851, + 31.097692, + 31.143947, + 31.189625, + 31.234735, + 31.279285, + 31.323286, + 31.366746, + 31.409673, + 31.452076, + 31.493963, + 31.535342, + 31.576222, + 31.616609, + 31.656512, + 31.695939, + 31.734895, + 31.773390, + 31.811429, + 31.849020, + 31.886170, + 31.922885, + 31.959173, + 31.995038, + 32.030489, + 32.065531, + 32.100169, + 32.134411, + 32.168262, + 32.201728, + 32.234815, + 32.267528, + 32.299872, + 32.331853, + 32.363477, + 32.394749, + 32.425673, + 32.456255, + 32.486499, + 32.516411, + 32.545995, + 32.575256, + 32.604199, + 32.632828, + 32.661147, + 32.689161, + 32.716874, + 32.744291, + 32.771415, + 32.798251, + 32.824802, + 32.851073, + 32.877067, + 32.902789, + 32.928241, + 32.953428, + 32.978353, + 33.003020, + 33.027433, + 33.051594, + 33.075507, + 33.099175, + 33.122603, + 33.145792, + 33.168746, + 33.191469, + 33.213963, + 33.236231, + 33.258276, + 33.280102, + 33.301711, + 33.323105, + 33.344288, + 33.365263, + 33.386031, + 33.406597, + 33.426962, + 33.447128, + 33.467099, + 33.486877, + 33.506465, + 33.525864, + 33.545077, + 33.564107, + 33.582956, + 33.601625, + 33.620118, + 33.638437, + 33.656583, + 33.674559, + 33.692367, + 33.710008, + 33.727486, + 33.744802, + 33.761957, + 33.778955, + 33.795796, + 33.812483, + 33.829018, + 33.845402, + 33.861637, + 33.877725, + 33.893668, + 33.909467, + 33.925124, + 33.940642, + 33.956020, + 33.971262, + 33.986369, + 34.001342, + 34.016182, + 34.030892, + 34.045473, + 34.059926, + 34.074254, + 34.088456, + 34.102535, + 34.116492, + 34.130329, + 34.144047, + 34.157647, + 34.171130, + 34.184499, + 34.197753, + 34.210896, + 34.223926, + 34.236847, + 34.249659, + 34.262363, + 34.274961, + 34.287454, + 34.299843, + 34.312128, + 34.324312, + 34.336395, + 34.348379, + 34.360264, + 34.372051, + 34.383743, + 34.395338, + 34.406840, + 34.418248, + 34.429564, + 34.440788, + 34.451923, + 34.462967, + 34.473924, + 34.484792, + 34.495575, + 34.506271, + 34.516883, + 34.527411, + 34.537855, + 34.548218, + 34.558499, + 34.568700, + 34.578821, + 34.588864, + 34.598828, + 34.608715, + 34.618526, + 34.628261, + 34.637921, + 34.647507, + 34.657020, + 34.666460, + 34.675829, + 34.685126, + 34.694352, + 34.703509, + 34.712597, + 34.721617, + 34.730569, + 34.739454, + 34.748272, + 34.757025, + 34.765713, + 34.774336, + 34.782896, + 34.791392, + 34.799826, + 34.808198, + 34.816509, + 34.824759, + 34.832949, + 34.841079, + 34.849150, + 34.857163, + 34.865118, + 34.873016, + 34.880856, + 34.888641, + 34.896370, + 34.904044, + 34.911663, + 34.919228, + 34.926739, + 34.934198, + 34.941603, + 34.948957, + 34.956259, + 34.963509, + 34.970709, + 34.977859, + 34.984959, + 34.992010, + 34.999012, + 35.005965, + 35.012871, + 35.019729, + 35.026540, + 35.033304, + 35.040022, + 35.046694, + 35.053321, + 35.059902, + 35.066440, + 35.072933, + 35.079382, + 35.085788, + 35.092150, + 35.098470, + 35.104748, + 35.110984, + 35.117179, + 35.123332, + 35.129444, + 35.135517, + 35.141549, + 35.147541, + 35.153494, + 35.159408, + 35.165283, + 35.171120, + 35.176918, + 35.182679, + 35.188403, + 35.194090, + 35.199740, + 35.205353, + 35.210930, + 35.216472, + 35.221978, + 35.227449, + 35.232885, + 35.238286, + 35.243653, + 35.248986, + 35.254285, + 35.259551, + 35.264784, + 35.269983, + 35.275150, + 35.280285, + 35.285388, + 35.290459, + 35.295498, + 35.300506, + 35.305483, + 35.310429, + 35.315344, + 35.320230, + 35.325085, + 35.329910, + 35.334706, + 35.339473, + 35.344211, + 35.348919, + 35.353599, + 35.358251, + 35.362875, + 35.367470, + 35.372038, + 35.376579, + 35.381092, + 35.385578, + 35.390037, + 35.394470, + 35.398877, + 35.403257, + 35.407611, + 35.411939, + 35.416242, + 35.420519, + 35.424772, + 35.428999, + 35.433201, + 35.437379, + 35.441533, + 35.445662, + 35.449767, + 35.453848, + 35.457906, + 35.461940, + 35.465951, + 35.469939, + 35.473904, + 35.477846, + 35.481765, + 35.485662, + 35.489537, + 35.493390, + 35.497221, + 35.501030, + 35.504817, + 35.508583, + 35.512328, + 35.516052, + 35.519754, + 35.523436, + 35.527097, + 35.530738, + 35.534359, + 35.537959, + 35.541539, + 35.545099, + 35.548640, + 35.552161, + 35.555663, + 35.559145, + 35.562608, + 35.566052, + 35.569477, + 35.572884, + 35.576271, + 35.579641, + 35.582992, + 35.586325, + 35.589639, + 35.592936, + 35.596215, + 35.599476, + 35.602720, + 35.605946, + 35.609155, + 35.612347, + 35.615521, + 35.618679, + 35.621820, + 35.624944, + 35.628051, + 35.631142, + 35.634217, + 35.637276, + 35.640318, + 35.643344, + 35.646355, + 35.649349, + 35.652328, + 35.655292, + 35.658239, + 35.661172, + 35.664089, + 35.666991, + 35.669878, + 35.672751, + 35.675608, + 35.678450, + 35.681278, + 35.684092, + 35.686891, + 35.689675, + 35.692445, + 35.695202, + 35.697944, + 35.700672, + 35.703386, + 35.706087, + 35.708774, + 35.711447, + 35.714107, + 35.716753, + 35.719387, + 35.722006, + 35.724613, + 35.727207, + 35.729788, + 35.732356, + 35.734911, + 35.737453, + 35.739983, + 35.742500, + 35.745005, + 35.747497, + 35.749977, + 35.752445, + 35.754901, + 35.757345, + 35.759776, + 35.762196, + 35.764604, + 35.767001, + 35.769385, + 35.771758, + 35.774120, + 35.776470, + 35.778809, + 35.781136, + 35.783452, + 35.785757, + 35.788051, + 35.790334, + 35.792606, + 35.794867, + 35.797118, + 35.799357, + 35.801586, + 35.803805, + 35.806013, + 35.808210, + 35.810397, + 35.812574, + 35.814740, + 35.816896, + 35.819042, + 35.821178, + 35.823304, + 35.825420, + 35.827526, + 35.829622, + 35.831709, + 35.833786, + 35.835853, + 35.837911, + 35.839959, + 35.841997, + 35.844026, + 35.846046, + 35.848057, + 35.850058, + 35.852050, + 35.854033, + 35.856007, + 35.857972, + 35.859928, + 35.861875, + 35.863813, + 35.865743, + 35.867663, + 35.869575, + 35.871479, + 35.873373, + 35.875259, + 35.877137, + 35.879006, + 35.880867, + 35.882720, + 35.884564, + 35.886400, + 35.888228, + 35.890048, + 35.891859, + 35.893663, + 35.895458, + 35.897246, + 35.899026, + 35.900798, + 35.902562, + 35.904318, + 35.906066, + 35.907807, + 35.909541, + 35.911266, + 35.912984, + 35.914695, + 35.916398, + 35.918094, + 35.919782, + 35.921464, + 35.923137, + 35.924804, + 35.926463, + 35.928116, + 35.929761, + 35.931399, + 35.933030, + 35.934654, + 35.936271, + 35.937881, + 35.939484, + 35.941080, + 35.942670, + 35.944253, + 35.945829, + 35.947398, + 35.948961, + 35.950517, + 35.952067, + 35.953610, + 35.955147, + 35.956677, + 35.958201, + 35.959718, + 35.961229, + 35.962734, + 35.964232, + 35.965724, + 35.967210, + 35.968690, + 35.970163, + 35.971631, + 35.973092, + 35.974547, + 35.975997, + 35.977440, + 35.978877, + 35.980309, + 35.981735, + 35.983154, + 35.984568, + 35.985976, + 35.987379, + 35.988776, + 35.990167, + 35.991552, + 35.992932, + 35.994306, + 35.995674, + 35.997037, + 35.998395, + 35.999747, + 36.001093, + 36.002434, + 36.003770, + 36.005101, + 36.006426, + 36.007745, + 36.009060, + 36.010369, + 36.011673, + 36.012972, + 36.014265, + 36.015554, + 36.016837, + 36.018116, + 36.019389, + 36.020657, + 36.021920, + 36.023179, + 36.024432, + 36.025680, + 36.026924, + 36.028162, + 36.029396, + 36.030625, + 36.031849, + 36.033068, + 36.034283, + 36.035493, + 36.036698, + 36.037898, + 36.039094, + 36.040285, + 36.041472, + 36.042654, + 36.043831, + 36.045004, + 36.046172, + 36.047336, + 36.048496, + 36.049651, + 36.050801, + 36.051948, + 36.053089, + 36.054227, + 36.055360, + 36.056489, + 36.057613, + 36.058733, + 36.059849, + 36.060961, + 36.062069, + 36.063172, + 36.064272, + 36.065367, + 36.066458, + 36.067545, + 36.068627, + 36.069706, + 36.070781, + 36.071852, + 36.072918, + 36.073981, + 36.075040, + 36.076095, + 36.077146, + 36.078193, + 36.079236, + 36.080275, + 36.081311, + 36.082342, + 36.083370, + 36.084394, + 36.085414, + 36.086431, + 36.087444, + 36.088453, + 36.089458, + 36.090460, + 36.091458, + 36.092452, + 36.093443, + 36.094430, + 36.095414, + 36.096394, + 36.097370, + 36.098343, + 36.099313, + 36.100279, + 36.101241, + 36.102200, + 36.103156, + 36.104108, + 36.105057, + 36.106002, + 36.106944, + 36.107882, + 36.108817, + 36.109749, + 36.110678, + 36.111603, + 36.112525, + 36.113444, + 36.114359, + 36.115271, + 36.116180, + 36.117086, + 36.117988, + 36.118888, + 36.119784, + 36.120677, + 36.121567, + 36.122453, + 36.123337, + 36.124217, + 36.125095, + 36.125969, + 36.126841, + 36.127709, + 36.128574, + 36.129436, + 36.130296, + 36.131152, + 36.132005, + 36.132856, + 36.133703, + 36.134548, + 36.135389, + 36.136228, + 36.137064, + 36.137897, + 36.138727, + 36.139554, + 36.140378, + 36.141200, + 36.142019, + 36.142834, + 36.143648, + 36.144458, + 36.145266, + 36.146071, + 36.146873, + 36.147672, + 36.148469, + 36.149263, + 36.150054, + 36.150843, + 36.151629, + 36.152412, + 36.153193, + 36.153971, + 36.154747, + 36.155520, + 36.156290, + 36.157058, + 36.157823, + 36.158585, + 36.159345, + 36.160103, + 36.160858, + 36.161610, + 36.162360, + 36.163108, + 36.163853, + 36.164596, + 36.165336, + 36.166073, + 36.166809, + 36.167541, + 36.168272, + 36.169000, + 36.169725, + 36.170449, + 36.171169, + 36.171888, + 36.172604, + 36.173318, + 36.174029, + 36.174739, + 36.175445, + 36.176150, + 36.176852, + 36.177552, + 36.178250, + 36.178945, + 36.179638, + 36.180329, + 36.181018, + 36.181705, + 36.182389, + 36.183071, + 36.183751, + 36.184429, + 36.185104, + 36.185778, + 36.186449, + 36.187118, + 36.187785, + 36.188450, + 36.189112, + 36.189773, + 36.190431, + 36.191088, + 36.191742, + 36.192394, + 36.193045, + 36.193693, + 36.194339, + 36.194983, + 36.195625, + 36.196265, + 36.196903, + 36.197539, + 36.198172, + 36.198804, + 36.199434, + 36.200062, + 36.200688, + 36.201313, + 36.201935, + 36.202555, + 36.203173, + 36.203789, + 36.204404, + 36.205016, + 36.205627, + 36.206236, + 36.206843, + 36.207448, + 36.208051, + 36.208652, + 36.209251, + 36.209849, + 36.210445, + 36.211038, + 36.211630, + 36.212221, + 36.212809, + 36.213396, + 36.213981, + 36.214564, + 36.215145, + 36.215724, + 36.216302, + 36.216878, + 36.217452, + 36.218025, + 36.218595, + 36.219164, + 36.219732, + 36.220297, + 36.220861, + 36.221423, + 36.221984, + 36.222542, + 36.223100, + 36.223655, + 36.224209, + 36.224761, + 36.225311, + 36.225860, + 36.226407, + 36.226953, + }, + {// The expectations for dimension = 74 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201666, + 6.406666, + 6.614999, + 6.826664, + 7.041661, + 7.259990, + 7.481649, + 7.706635, + 7.934946, + 8.166575, + 8.401515, + 8.639754, + 8.881275, + 9.126056, + 9.374065, + 9.625260, + 9.879587, + 10.136977, + 10.397342, + 10.660578, + 10.926556, + 11.195125, + 11.466112, + 11.739317, + 12.014519, + 12.291473, + 12.569916, + 12.849566, + 13.130130, + 13.411303, + 13.692776, + 13.974238, + 14.255382, + 14.535907, + 14.815523, + 15.093952, + 15.370932, + 15.646219, + 15.919586, + 16.190827, + 16.459754, + 16.726200, + 16.990013, + 17.251064, + 17.509237, + 17.764433, + 18.016569, + 18.265575, + 18.511392, + 18.753976, + 18.993290, + 19.229307, + 19.462011, + 19.691390, + 19.917442, + 20.140170, + 20.359581, + 20.575689, + 20.788512, + 20.998071, + 21.204390, + 21.407498, + 21.607425, + 21.804203, + 21.997868, + 22.188454, + 22.376002, + 22.560548, + 22.742134, + 22.920801, + 23.096590, + 23.269543, + 23.439703, + 23.607112, + 23.771815, + 23.933853, + 24.093270, + 24.250110, + 24.404414, + 24.556227, + 24.705589, + 24.852543, + 24.997131, + 25.139395, + 25.279374, + 25.417110, + 25.552642, + 25.686011, + 25.817254, + 25.946410, + 26.073517, + 26.198612, + 26.321732, + 26.442913, + 26.562191, + 26.679600, + 26.795174, + 26.908948, + 27.020954, + 27.131226, + 27.239794, + 27.346691, + 27.451947, + 27.555593, + 27.657658, + 27.758171, + 27.857161, + 27.954655, + 28.050683, + 28.145269, + 28.238441, + 28.330224, + 28.420645, + 28.509727, + 28.597496, + 28.683974, + 28.769187, + 28.853155, + 28.935903, + 29.017452, + 29.097823, + 29.177038, + 29.255118, + 29.332083, + 29.407952, + 29.482746, + 29.556483, + 29.629183, + 29.700863, + 29.771541, + 29.841236, + 29.909964, + 29.977742, + 30.044587, + 30.110515, + 30.175543, + 30.239685, + 30.302957, + 30.365374, + 30.426950, + 30.487700, + 30.547639, + 30.606779, + 30.665135, + 30.722719, + 30.779545, + 30.835625, + 30.890973, + 30.945599, + 30.999517, + 31.052737, + 31.105272, + 31.157133, + 31.208331, + 31.258876, + 31.308780, + 31.358053, + 31.406705, + 31.454746, + 31.502186, + 31.549034, + 31.595301, + 31.640996, + 31.686127, + 31.730704, + 31.774735, + 31.818229, + 31.861194, + 31.903640, + 31.945573, + 31.987002, + 32.027934, + 32.068378, + 32.108341, + 32.147830, + 32.186853, + 32.225417, + 32.263528, + 32.301194, + 32.338421, + 32.375216, + 32.411586, + 32.447536, + 32.483074, + 32.518205, + 32.552935, + 32.587271, + 32.621217, + 32.654781, + 32.687967, + 32.720781, + 32.753228, + 32.785314, + 32.817044, + 32.848423, + 32.879456, + 32.910148, + 32.940504, + 32.970529, + 33.000228, + 33.029604, + 33.058663, + 33.087410, + 33.115848, + 33.143982, + 33.171815, + 33.199354, + 33.226600, + 33.253559, + 33.280234, + 33.306630, + 33.332749, + 33.358597, + 33.384176, + 33.409490, + 33.434543, + 33.459339, + 33.483880, + 33.508170, + 33.532213, + 33.556012, + 33.579570, + 33.602890, + 33.625975, + 33.648829, + 33.671455, + 33.693855, + 33.716033, + 33.737991, + 33.759732, + 33.781259, + 33.802575, + 33.823683, + 33.844585, + 33.865283, + 33.885781, + 33.906081, + 33.926185, + 33.946097, + 33.965817, + 33.985350, + 34.004696, + 34.023859, + 34.042841, + 34.061644, + 34.080269, + 34.098721, + 34.116999, + 34.135108, + 34.153048, + 34.170822, + 34.188432, + 34.205879, + 34.223166, + 34.240295, + 34.257268, + 34.274086, + 34.290751, + 34.307266, + 34.323631, + 34.339849, + 34.355922, + 34.371851, + 34.387638, + 34.403284, + 34.418791, + 34.434161, + 34.449396, + 34.464496, + 34.479464, + 34.494302, + 34.509009, + 34.523589, + 34.538042, + 34.552370, + 34.566575, + 34.580657, + 34.594619, + 34.608461, + 34.622185, + 34.635792, + 34.649284, + 34.662661, + 34.675926, + 34.689079, + 34.702121, + 34.715054, + 34.727880, + 34.740598, + 34.753211, + 34.765719, + 34.778124, + 34.790427, + 34.802629, + 34.814730, + 34.826733, + 34.838638, + 34.850446, + 34.862158, + 34.873776, + 34.885300, + 34.896731, + 34.908070, + 34.919319, + 34.930477, + 34.941547, + 34.952529, + 34.963424, + 34.974233, + 34.984956, + 34.995596, + 35.006152, + 35.016625, + 35.027016, + 35.037327, + 35.047557, + 35.057709, + 35.067781, + 35.077777, + 35.087695, + 35.097537, + 35.107304, + 35.116997, + 35.126616, + 35.136161, + 35.145635, + 35.155036, + 35.164367, + 35.173628, + 35.182819, + 35.191942, + 35.200996, + 35.209983, + 35.218904, + 35.227758, + 35.236547, + 35.245270, + 35.253930, + 35.262526, + 35.271059, + 35.279530, + 35.287939, + 35.296287, + 35.304575, + 35.312802, + 35.320970, + 35.329079, + 35.337130, + 35.345124, + 35.353060, + 35.360939, + 35.368762, + 35.376530, + 35.384243, + 35.391901, + 35.399505, + 35.407056, + 35.414553, + 35.421998, + 35.429392, + 35.436733, + 35.444023, + 35.451263, + 35.458453, + 35.465593, + 35.472684, + 35.479726, + 35.486719, + 35.493665, + 35.500563, + 35.507414, + 35.514219, + 35.520977, + 35.527690, + 35.534357, + 35.540980, + 35.547557, + 35.554091, + 35.560581, + 35.567027, + 35.573431, + 35.579791, + 35.586110, + 35.592387, + 35.598622, + 35.604816, + 35.610969, + 35.617082, + 35.623154, + 35.629188, + 35.635181, + 35.641136, + 35.647052, + 35.652929, + 35.658769, + 35.664570, + 35.670335, + 35.676062, + 35.681752, + 35.687406, + 35.693024, + 35.698606, + 35.704153, + 35.709664, + 35.715141, + 35.720582, + 35.725990, + 35.731363, + 35.736703, + 35.742009, + 35.747282, + 35.752521, + 35.757729, + 35.762904, + 35.768046, + 35.773157, + 35.778236, + 35.783284, + 35.788301, + 35.793287, + 35.798242, + 35.803167, + 35.808062, + 35.812927, + 35.817762, + 35.822569, + 35.827345, + 35.832094, + 35.836813, + 35.841504, + 35.846167, + 35.850801, + 35.855408, + 35.859988, + 35.864540, + 35.869065, + 35.873563, + 35.878034, + 35.882479, + 35.886898, + 35.891291, + 35.895657, + 35.899998, + 35.904314, + 35.908604, + 35.912870, + 35.917110, + 35.921326, + 35.925517, + 35.929684, + 35.933827, + 35.937946, + 35.942042, + 35.946113, + 35.950162, + 35.954187, + 35.958189, + 35.962168, + 35.966125, + 35.970059, + 35.973970, + 35.977860, + 35.981727, + 35.985573, + 35.989397, + 35.993200, + 35.996981, + 36.000741, + 36.004480, + 36.008198, + 36.011895, + 36.015572, + 36.019228, + 36.022864, + 36.026480, + 36.030076, + 36.033653, + 36.037209, + 36.040746, + 36.044264, + 36.047762, + 36.051241, + 36.054701, + 36.058143, + 36.061565, + 36.064970, + 36.068355, + 36.071723, + 36.075072, + 36.078403, + 36.081716, + 36.085012, + 36.088290, + 36.091550, + 36.094793, + 36.098018, + 36.101227, + 36.104418, + 36.107593, + 36.110751, + 36.113892, + 36.117016, + 36.120124, + 36.123216, + 36.126291, + 36.129351, + 36.132394, + 36.135421, + 36.138433, + 36.141429, + 36.144409, + 36.147375, + 36.150324, + 36.153259, + 36.156178, + 36.159082, + 36.161972, + 36.164846, + 36.167706, + 36.170551, + 36.173382, + 36.176198, + 36.179000, + 36.181787, + 36.184561, + 36.187320, + 36.190066, + 36.192798, + 36.195516, + 36.198220, + 36.200910, + 36.203588, + 36.206251, + 36.208902, + 36.211539, + 36.214163, + 36.216774, + 36.219373, + 36.221958, + 36.224530, + 36.227090, + 36.229637, + 36.232172, + 36.234694, + 36.237204, + 36.239701, + 36.242186, + 36.244659, + 36.247121, + 36.249570, + 36.252007, + 36.254432, + 36.256846, + 36.259248, + 36.261638, + 36.264017, + 36.266384, + 36.268740, + 36.271085, + 36.273418, + 36.275741, + 36.278052, + 36.280352, + 36.282641, + 36.284919, + 36.287187, + 36.289444, + 36.291690, + 36.293925, + 36.296150, + 36.298365, + 36.300569, + 36.302763, + 36.304946, + 36.307119, + 36.309282, + 36.311435, + 36.313578, + 36.315711, + 36.317834, + 36.319948, + 36.322051, + 36.324145, + 36.326229, + 36.328303, + 36.330368, + 36.332424, + 36.334470, + 36.336506, + 36.338534, + 36.340552, + 36.342561, + 36.344560, + 36.346551, + 36.348532, + 36.350505, + 36.352469, + 36.354424, + 36.356370, + 36.358307, + 36.360235, + 36.362155, + 36.364066, + 36.365969, + 36.367863, + 36.369749, + 36.371626, + 36.373495, + 36.375356, + 36.377208, + 36.379052, + 36.380888, + 36.382716, + 36.384536, + 36.386348, + 36.388151, + 36.389947, + 36.391735, + 36.393516, + 36.395288, + 36.397053, + 36.398810, + 36.400559, + 36.402301, + 36.404035, + 36.405761, + 36.407480, + 36.409192, + 36.410896, + 36.412593, + 36.414283, + 36.415965, + 36.417640, + 36.419308, + 36.420969, + 36.422623, + 36.424270, + 36.425909, + 36.427542, + 36.429168, + 36.430786, + 36.432398, + 36.434003, + 36.435602, + 36.437193, + 36.438778, + 36.440356, + 36.441928, + 36.443493, + 36.445051, + 36.446603, + 36.448149, + 36.449687, + 36.451220, + 36.452746, + 36.454266, + 36.455779, + 36.457287, + 36.458788, + 36.460282, + 36.461771, + 36.463253, + 36.464730, + 36.466200, + 36.467664, + 36.469122, + 36.470575, + 36.472021, + 36.473461, + 36.474896, + 36.476324, + 36.477747, + 36.479164, + 36.480576, + 36.481981, + 36.483381, + 36.484776, + 36.486164, + 36.487547, + 36.488925, + 36.490297, + 36.491663, + 36.493024, + 36.494379, + 36.495730, + 36.497074, + 36.498414, + 36.499748, + 36.501076, + 36.502400, + 36.503718, + 36.505031, + 36.506338, + 36.507641, + 36.508938, + 36.510231, + 36.511518, + 36.512800, + 36.514077, + 36.515349, + 36.516617, + 36.517879, + 36.519136, + 36.520388, + 36.521636, + 36.522878, + 36.524116, + 36.525349, + 36.526577, + 36.527801, + 36.529020, + 36.530234, + 36.531443, + 36.532648, + 36.533848, + 36.535043, + 36.536234, + 36.537420, + 36.538602, + 36.539779, + 36.540952, + 36.542120, + 36.543284, + 36.544444, + 36.545599, + 36.546749, + 36.547895, + 36.549037, + 36.550175, + 36.551308, + 36.552437, + 36.553562, + 36.554683, + 36.555799, + 36.556911, + 36.558019, + 36.559123, + 36.560223, + 36.561318, + 36.562410, + 36.563497, + 36.564581, + 36.565660, + 36.566736, + 36.567807, + 36.568875, + 36.569938, + 36.570998, + 36.572053, + 36.573105, + 36.574153, + 36.575197, + 36.576238, + 36.577274, + 36.578307, + 36.579335, + 36.580361, + 36.581382, + 36.582400, + 36.583414, + 36.584424, + 36.585431, + 36.586434, + 36.587433, + 36.588429, + 36.589421, + 36.590409, + 36.591394, + 36.592376, + 36.593354, + 36.594328, + 36.595299, + 36.596266, + 36.597230, + 36.598191, + 36.599148, + 36.600102, + 36.601052, + 36.601999, + 36.602942, + 36.603883, + 36.604819, + 36.605753, + 36.606683, + 36.607610, + 36.608534, + 36.609454, + 36.610372, + 36.611286, + 36.612196, + 36.613104, + 36.614008, + 36.614910, + 36.615808, + 36.616703, + 36.617595, + 36.618483, + 36.619369, + 36.620252, + 36.621131, + 36.622008, + 36.622881, + 36.623751, + 36.624619, + 36.625483, + 36.626345, + 36.627203, + 36.628059, + 36.628911, + 36.629761, + 36.630608, + 36.631451, + 36.632292, + 36.633130, + 36.633966, + 36.634798, + 36.635628, + 36.636454, + 36.637278, + 36.638099, + 36.638918, + 36.639733, + 36.640546, + 36.641356, + 36.642163, + 36.642968, + 36.643770, + 36.644569, + 36.645366, + 36.646160, + 36.646951, + 36.647739, + 36.648525, + 36.649309, + 36.650089, + 36.650867, + 36.651643, + 36.652416, + 36.653186, + 36.653954, + 36.654719, + 36.655482, + 36.656242, + 36.657000, + 36.657755, + 36.658508, + 36.659258, + 36.660006, + 36.660751, + 36.661494, + 36.662234, + 36.662972, + 36.663708, + 36.664441, + 36.665172, + 36.665900, + 36.666626, + 36.667350, + 36.668071, + 36.668790, + 36.669507, + 36.670221, + 36.670933, + 36.671643, + 36.672350, + 36.673055, + 36.673758, + 36.674459, + 36.675157, + 36.675853, + 36.676547, + 36.677239, + 36.677928, + 36.678615, + 36.679300, + 36.679983, + 36.680664, + 36.681342, + 36.682019, + 36.682693, + 36.683365, + 36.684035, + 36.684703, + 36.685368, + 36.686032, + 36.686693, + 36.687353, + 36.688010, + 36.688665, + 36.689319, + 36.689970, + 36.690619, + 36.691266, + 36.691911, + 36.692554, + 36.693195, + 36.693834, + 36.694471, + 36.695106, + 36.695739, + 36.696370, + 36.697000, + 36.697627, + 36.698252, + 36.698875, + 36.699497, + 36.700116, + 36.700734, + 36.701349, + 36.701963, + 36.702575, + 36.703185, + 36.703793, + 36.704399, + 36.705004, + 36.705606, + 36.706207, + 36.706806, + 36.707403, + 36.707998, + 36.708591, + 36.709183, + 36.709773, + 36.710361, + 36.710947, + 36.711531, + 36.712114, + 36.712695, + 36.713274, + 36.713852, + 36.714427, + 36.715001, + 36.715573, + 36.716144, + 36.716713, + 36.717280, + 36.717845, + 36.718409, + 36.718971, + 36.719531, + }, + {// The expectations for dimension = 75 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201666, + 6.406666, + 6.614999, + 6.826665, + 7.041663, + 7.259993, + 7.481654, + 7.706644, + 7.934961, + 8.166599, + 8.401554, + 8.639814, + 8.881368, + 9.126196, + 9.374272, + 9.625560, + 9.880014, + 10.137574, + 10.398164, + 10.661691, + 10.928039, + 11.197072, + 11.468631, + 11.742531, + 12.018565, + 12.296502, + 12.576090, + 12.857060, + 13.139124, + 13.421985, + 13.705336, + 13.988867, + 14.272271, + 14.555240, + 14.837480, + 15.118704, + 15.398642, + 15.677038, + 15.953655, + 16.228275, + 16.500698, + 16.770744, + 17.038251, + 17.303079, + 17.565099, + 17.824206, + 18.080303, + 18.333314, + 18.583172, + 18.829824, + 19.073226, + 19.313346, + 19.550161, + 19.783655, + 20.013820, + 20.240655, + 20.464163, + 20.684354, + 20.901243, + 21.114849, + 21.325192, + 21.532299, + 21.736198, + 21.936919, + 22.134496, + 22.328963, + 22.520357, + 22.708716, + 22.894079, + 23.076485, + 23.255977, + 23.432594, + 23.606380, + 23.777376, + 23.945626, + 24.111172, + 24.274057, + 24.434324, + 24.592016, + 24.747176, + 24.899845, + 25.050066, + 25.197881, + 25.343331, + 25.486458, + 25.627302, + 25.765902, + 25.902300, + 26.036534, + 26.168642, + 26.298663, + 26.426635, + 26.552594, + 26.676577, + 26.798619, + 26.918757, + 27.037024, + 27.153455, + 27.268084, + 27.380943, + 27.492065, + 27.601482, + 27.709224, + 27.815323, + 27.919809, + 28.022710, + 28.124057, + 28.223878, + 28.322200, + 28.419050, + 28.514457, + 28.608445, + 28.701041, + 28.792270, + 28.882157, + 28.970727, + 29.058002, + 29.144007, + 29.228764, + 29.312295, + 29.394624, + 29.475770, + 29.555756, + 29.634602, + 29.712329, + 29.788955, + 29.864502, + 29.938987, + 30.012430, + 30.084848, + 30.156261, + 30.226684, + 30.296137, + 30.364635, + 30.432195, + 30.498833, + 30.564566, + 30.629409, + 30.693377, + 30.756484, + 30.818747, + 30.880179, + 30.940794, + 31.000606, + 31.059629, + 31.117875, + 31.175359, + 31.232092, + 31.288088, + 31.343357, + 31.397914, + 31.451768, + 31.504933, + 31.557418, + 31.609236, + 31.660397, + 31.710912, + 31.760791, + 31.810044, + 31.858682, + 31.906715, + 31.954152, + 32.001003, + 32.047277, + 32.092983, + 32.138130, + 32.182727, + 32.226783, + 32.270306, + 32.313305, + 32.355787, + 32.397761, + 32.439234, + 32.480214, + 32.520709, + 32.560727, + 32.600274, + 32.639357, + 32.677985, + 32.716162, + 32.753898, + 32.791197, + 32.828067, + 32.864514, + 32.900544, + 32.936163, + 32.971378, + 33.006195, + 33.040619, + 33.074656, + 33.108312, + 33.141592, + 33.174502, + 33.207047, + 33.239232, + 33.271063, + 33.302545, + 33.333682, + 33.364480, + 33.394943, + 33.425076, + 33.454884, + 33.484372, + 33.513543, + 33.542402, + 33.570954, + 33.599203, + 33.627153, + 33.654808, + 33.682173, + 33.709250, + 33.736045, + 33.762561, + 33.788802, + 33.814771, + 33.840472, + 33.865910, + 33.891086, + 33.916006, + 33.940672, + 33.965087, + 33.989256, + 34.013181, + 34.036865, + 34.060312, + 34.083525, + 34.106506, + 34.129260, + 34.151788, + 34.174094, + 34.196181, + 34.218051, + 34.239707, + 34.261152, + 34.282389, + 34.303421, + 34.324249, + 34.344876, + 34.365306, + 34.385540, + 34.405581, + 34.425432, + 34.445094, + 34.464570, + 34.483863, + 34.502975, + 34.521907, + 34.540663, + 34.559243, + 34.577652, + 34.595890, + 34.613959, + 34.631862, + 34.649601, + 34.667177, + 34.684593, + 34.701850, + 34.718951, + 34.735897, + 34.752691, + 34.769333, + 34.785826, + 34.802171, + 34.818371, + 34.834427, + 34.850340, + 34.866112, + 34.881746, + 34.897242, + 34.912602, + 34.927827, + 34.942920, + 34.957882, + 34.972714, + 34.987418, + 35.001995, + 35.016446, + 35.030774, + 35.044979, + 35.059063, + 35.073027, + 35.086872, + 35.100601, + 35.114213, + 35.127712, + 35.141096, + 35.154369, + 35.167531, + 35.180584, + 35.193528, + 35.206365, + 35.219095, + 35.231722, + 35.244244, + 35.256664, + 35.268982, + 35.281200, + 35.293318, + 35.305338, + 35.317262, + 35.329088, + 35.340820, + 35.352458, + 35.364002, + 35.375455, + 35.386816, + 35.398087, + 35.409268, + 35.420362, + 35.431368, + 35.442287, + 35.453121, + 35.463870, + 35.474535, + 35.485117, + 35.495617, + 35.506036, + 35.516374, + 35.526633, + 35.536813, + 35.546914, + 35.556939, + 35.566887, + 35.576759, + 35.586557, + 35.596280, + 35.605930, + 35.615507, + 35.625012, + 35.634446, + 35.643809, + 35.653102, + 35.662326, + 35.671482, + 35.680570, + 35.689591, + 35.698545, + 35.707433, + 35.716256, + 35.725015, + 35.733709, + 35.742340, + 35.750909, + 35.759415, + 35.767860, + 35.776244, + 35.784567, + 35.792831, + 35.801035, + 35.809181, + 35.817269, + 35.825299, + 35.833272, + 35.841189, + 35.849049, + 35.856854, + 35.864605, + 35.872301, + 35.879943, + 35.887531, + 35.895067, + 35.902550, + 35.909982, + 35.917361, + 35.924690, + 35.931969, + 35.939197, + 35.946376, + 35.953505, + 35.960586, + 35.967619, + 35.974603, + 35.981541, + 35.988431, + 35.995275, + 36.002072, + 36.008824, + 36.015531, + 36.022193, + 36.028810, + 36.035383, + 36.041912, + 36.048398, + 36.054841, + 36.061241, + 36.067599, + 36.073916, + 36.080190, + 36.086424, + 36.092617, + 36.098769, + 36.104882, + 36.110955, + 36.116988, + 36.122982, + 36.128938, + 36.134855, + 36.140734, + 36.146575, + 36.152379, + 36.158146, + 36.163876, + 36.169570, + 36.175227, + 36.180849, + 36.186435, + 36.191986, + 36.197502, + 36.202983, + 36.208430, + 36.213843, + 36.219222, + 36.224567, + 36.229879, + 36.235158, + 36.240405, + 36.245619, + 36.250801, + 36.255950, + 36.261069, + 36.266156, + 36.271211, + 36.276236, + 36.281230, + 36.286194, + 36.291128, + 36.296032, + 36.300906, + 36.305751, + 36.310566, + 36.315353, + 36.320110, + 36.324840, + 36.329541, + 36.334214, + 36.338859, + 36.343477, + 36.348067, + 36.352630, + 36.357166, + 36.361675, + 36.366158, + 36.370615, + 36.375045, + 36.379449, + 36.383828, + 36.388181, + 36.392509, + 36.396812, + 36.401090, + 36.405343, + 36.409571, + 36.413775, + 36.417955, + 36.422111, + 36.426243, + 36.430352, + 36.434437, + 36.438498, + 36.442537, + 36.446553, + 36.450546, + 36.454516, + 36.458464, + 36.462390, + 36.466294, + 36.470175, + 36.474035, + 36.477874, + 36.481691, + 36.485486, + 36.489261, + 36.493015, + 36.496747, + 36.500460, + 36.504151, + 36.507823, + 36.511474, + 36.515105, + 36.518716, + 36.522307, + 36.525879, + 36.529432, + 36.532965, + 36.536478, + 36.539973, + 36.543449, + 36.546906, + 36.550344, + 36.553764, + 36.557166, + 36.560549, + 36.563914, + 36.567261, + 36.570590, + 36.573902, + 36.577196, + 36.580472, + 36.583731, + 36.586973, + 36.590197, + 36.593405, + 36.596596, + 36.599770, + 36.602927, + 36.606068, + 36.609192, + 36.612301, + 36.615392, + 36.618468, + 36.621528, + 36.624572, + 36.627600, + 36.630613, + 36.633610, + 36.636592, + 36.639558, + 36.642509, + 36.645445, + 36.648366, + 36.651272, + 36.654163, + 36.657040, + 36.659902, + 36.662749, + 36.665582, + 36.668401, + 36.671205, + 36.673996, + 36.676772, + 36.679534, + 36.682283, + 36.685018, + 36.687739, + 36.690446, + 36.693141, + 36.695821, + 36.698489, + 36.701143, + 36.703784, + 36.706412, + 36.709027, + 36.711629, + 36.714218, + 36.716795, + 36.719359, + 36.721911, + 36.724450, + 36.726976, + 36.729491, + 36.731993, + 36.734483, + 36.736961, + 36.739427, + 36.741881, + 36.744323, + 36.746754, + 36.749172, + 36.751580, + 36.753975, + 36.756359, + 36.758732, + 36.761094, + 36.763444, + 36.765783, + 36.768111, + 36.770428, + 36.772734, + 36.775029, + 36.777314, + 36.779587, + 36.781850, + 36.784102, + 36.786344, + 36.788575, + 36.790796, + 36.793006, + 36.795207, + 36.797396, + 36.799576, + 36.801746, + 36.803905, + 36.806055, + 36.808195, + 36.810324, + 36.812444, + 36.814555, + 36.816655, + 36.818746, + 36.820828, + 36.822900, + 36.824962, + 36.827015, + 36.829059, + 36.831093, + 36.833119, + 36.835135, + 36.837142, + 36.839140, + 36.841129, + 36.843108, + 36.845080, + 36.847042, + 36.848995, + 36.850940, + 36.852876, + 36.854803, + 36.856722, + 36.858633, + 36.860534, + 36.862428, + 36.864313, + 36.866189, + 36.868058, + 36.869918, + 36.871770, + 36.873614, + 36.875449, + 36.877277, + 36.879097, + 36.880909, + 36.882713, + 36.884509, + 36.886297, + 36.888077, + 36.889850, + 36.891615, + 36.893372, + 36.895122, + 36.896864, + 36.898599, + 36.900326, + 36.902046, + 36.903759, + 36.905464, + 36.907162, + 36.908852, + 36.910536, + 36.912212, + 36.913881, + 36.915543, + 36.917198, + 36.918846, + 36.920487, + 36.922121, + 36.923749, + 36.925369, + 36.926982, + 36.928589, + 36.930189, + 36.931783, + 36.933369, + 36.934949, + 36.936523, + 36.938090, + 36.939650, + 36.941204, + 36.942751, + 36.944292, + 36.945827, + 36.947355, + 36.948877, + 36.950393, + 36.951903, + 36.953406, + 36.954903, + 36.956394, + 36.957879, + 36.959358, + 36.960831, + 36.962298, + 36.963759, + 36.965214, + 36.966663, + 36.968106, + 36.969543, + 36.970975, + 36.972400, + 36.973820, + 36.975235, + 36.976643, + 36.978046, + 36.979444, + 36.980835, + 36.982221, + 36.983602, + 36.984977, + 36.986347, + 36.987711, + 36.989070, + 36.990423, + 36.991771, + 36.993114, + 36.994451, + 36.995783, + 36.997110, + 36.998432, + 36.999748, + 37.001060, + 37.002366, + 37.003667, + 37.004963, + 37.006254, + 37.007539, + 37.008820, + 37.010096, + 37.011367, + 37.012633, + 37.013894, + 37.015150, + 37.016401, + 37.017648, + 37.018890, + 37.020126, + 37.021359, + 37.022586, + 37.023809, + 37.025027, + 37.026240, + 37.027449, + 37.028653, + 37.029852, + 37.031047, + 37.032238, + 37.033424, + 37.034605, + 37.035782, + 37.036954, + 37.038122, + 37.039286, + 37.040445, + 37.041600, + 37.042751, + 37.043897, + 37.045039, + 37.046176, + 37.047310, + 37.048439, + 37.049564, + 37.050685, + 37.051801, + 37.052913, + 37.054022, + 37.055126, + 37.056226, + 37.057322, + 37.058414, + 37.059502, + 37.060586, + 37.061666, + 37.062742, + 37.063814, + 37.064882, + 37.065946, + 37.067006, + 37.068063, + 37.069115, + 37.070164, + 37.071209, + 37.072250, + 37.073287, + 37.074321, + 37.075351, + 37.076377, + 37.077399, + 37.078418, + 37.079433, + 37.080444, + 37.081452, + 37.082456, + 37.083456, + 37.084453, + 37.085446, + 37.086436, + 37.087422, + 37.088405, + 37.089384, + 37.090360, + 37.091332, + 37.092301, + 37.093266, + 37.094228, + 37.095187, + 37.096142, + 37.097094, + 37.098042, + 37.098987, + 37.099929, + 37.100868, + 37.101803, + 37.102735, + 37.103663, + 37.104588, + 37.105511, + 37.106430, + 37.107345, + 37.108258, + 37.109167, + 37.110073, + 37.110976, + 37.111876, + 37.112773, + 37.113667, + 37.114557, + 37.115445, + 37.116329, + 37.117211, + 37.118089, + 37.118965, + 37.119837, + 37.120706, + 37.121573, + 37.122436, + 37.123297, + 37.124154, + 37.125009, + 37.125861, + 37.126710, + 37.127556, + 37.128399, + 37.129239, + 37.130076, + 37.130911, + 37.131743, + 37.132572, + 37.133398, + 37.134221, + 37.135042, + 37.135859, + 37.136675, + 37.137487, + 37.138297, + 37.139104, + 37.139908, + 37.140709, + 37.141508, + 37.142305, + 37.143098, + 37.143889, + 37.144677, + 37.145463, + 37.146246, + 37.147027, + 37.147805, + 37.148580, + 37.149353, + 37.150123, + 37.150891, + 37.151656, + 37.152419, + 37.153179, + 37.153937, + 37.154692, + 37.155445, + 37.156195, + 37.156943, + 37.157689, + 37.158432, + 37.159172, + 37.159911, + 37.160646, + 37.161380, + 37.162111, + 37.162840, + 37.163566, + 37.164290, + 37.165012, + 37.165731, + 37.166448, + 37.167163, + 37.167875, + 37.168585, + 37.169293, + 37.169999, + 37.170702, + 37.171403, + 37.172102, + 37.172799, + 37.173494, + 37.174186, + 37.174876, + 37.175564, + 37.176249, + 37.176933, + 37.177614, + 37.178293, + 37.178971, + 37.179645, + 37.180318, + 37.180989, + 37.181658, + 37.182324, + 37.182988, + 37.183651, + 37.184311, + 37.184969, + 37.185625, + 37.186279, + 37.186931, + 37.187581, + 37.188229, + 37.188875, + 37.189519, + 37.190161, + 37.190801, + 37.191439, + 37.192075, + 37.192710, + 37.193342, + 37.193972, + 37.194600, + 37.195226, + 37.195851, + 37.196473, + 37.197094, + 37.197713, + 37.198329, + 37.198944, + 37.199557, + 37.200168, + 37.200778, + 37.201385, + 37.201991, + 37.202594, + 37.203196, + 37.203796, + 37.204395, + 37.204991, + 37.205586, + 37.206179, + 37.206770, + 37.207359, + 37.207947, + 37.208532, + 37.209116, + 37.209699, + 37.210279, + 37.210858, + 37.211435, + 37.212010, + }, + {// The expectations for dimension = 76 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406666, + 6.614999, + 6.826665, + 7.041664, + 7.259995, + 7.481658, + 7.706651, + 7.934971, + 8.166617, + 8.401583, + 8.639861, + 8.881440, + 9.126305, + 9.374435, + 9.625799, + 9.880358, + 10.138061, + 10.398841, + 10.662615, + 10.929282, + 11.198719, + 11.470779, + 11.745294, + 12.022070, + 12.300891, + 12.581519, + 12.863692, + 13.147136, + 13.431558, + 13.716658, + 14.002129, + 14.287660, + 14.572944, + 14.857681, + 15.141576, + 15.424352, + 15.705744, + 15.985502, + 16.263398, + 16.539221, + 16.812778, + 17.083897, + 17.352424, + 17.618223, + 17.881175, + 18.141176, + 18.398139, + 18.651990, + 18.902666, + 19.150118, + 19.394307, + 19.635203, + 19.872784, + 20.107039, + 20.337960, + 20.565548, + 20.789809, + 21.010753, + 21.228395, + 21.442756, + 21.653857, + 21.861725, + 22.066388, + 22.267878, + 22.466228, + 22.661473, + 22.853649, + 23.042795, + 23.228949, + 23.412151, + 23.592442, + 23.769865, + 23.944459, + 24.116269, + 24.285335, + 24.451702, + 24.615411, + 24.776505, + 24.935027, + 25.091019, + 25.244523, + 25.395582, + 25.544236, + 25.690528, + 25.834497, + 25.976184, + 26.115629, + 26.252871, + 26.387951, + 26.520905, + 26.651771, + 26.780588, + 26.907392, + 27.032219, + 27.155105, + 27.276085, + 27.395193, + 27.512463, + 27.627930, + 27.741625, + 27.853580, + 27.963828, + 28.072400, + 28.179326, + 28.284635, + 28.388358, + 28.490523, + 28.591159, + 28.690293, + 28.787953, + 28.884165, + 28.978956, + 29.072351, + 29.164375, + 29.255053, + 29.344410, + 29.432469, + 29.519253, + 29.604786, + 29.689089, + 29.772185, + 29.854095, + 29.934840, + 30.014441, + 30.092917, + 30.170290, + 30.246578, + 30.321801, + 30.395976, + 30.469123, + 30.541259, + 30.612402, + 30.682569, + 30.751777, + 30.820043, + 30.887382, + 30.953811, + 31.019345, + 31.084000, + 31.147790, + 31.210731, + 31.272835, + 31.334119, + 31.394595, + 31.454277, + 31.513178, + 31.571312, + 31.628690, + 31.685327, + 31.741233, + 31.796421, + 31.850902, + 31.904689, + 31.957793, + 32.010224, + 32.061994, + 32.113113, + 32.163592, + 32.213442, + 32.262671, + 32.311291, + 32.359310, + 32.406739, + 32.453587, + 32.499863, + 32.545575, + 32.590733, + 32.635346, + 32.679422, + 32.722968, + 32.765995, + 32.808509, + 32.850518, + 32.892030, + 32.933053, + 32.973594, + 33.013661, + 33.053260, + 33.092400, + 33.131086, + 33.169325, + 33.207124, + 33.244491, + 33.281430, + 33.317949, + 33.354054, + 33.389750, + 33.425044, + 33.459942, + 33.494450, + 33.528572, + 33.562316, + 33.595685, + 33.628686, + 33.661324, + 33.693604, + 33.725532, + 33.757111, + 33.788348, + 33.819246, + 33.849812, + 33.880049, + 33.909962, + 33.939555, + 33.968834, + 33.997801, + 34.026463, + 34.054823, + 34.082884, + 34.110652, + 34.138130, + 34.165322, + 34.192232, + 34.218864, + 34.245221, + 34.271308, + 34.297128, + 34.322684, + 34.347980, + 34.373020, + 34.397806, + 34.422343, + 34.446633, + 34.470680, + 34.494487, + 34.518057, + 34.541393, + 34.564499, + 34.587376, + 34.610029, + 34.632460, + 34.654671, + 34.676666, + 34.698448, + 34.720019, + 34.741382, + 34.762539, + 34.783493, + 34.804247, + 34.824803, + 34.845163, + 34.865331, + 34.885308, + 34.905097, + 34.924700, + 34.944119, + 34.963357, + 34.982416, + 35.001298, + 35.020006, + 35.038540, + 35.056904, + 35.075100, + 35.093129, + 35.110994, + 35.128696, + 35.146238, + 35.163621, + 35.180847, + 35.197919, + 35.214837, + 35.231604, + 35.248222, + 35.264692, + 35.281016, + 35.297196, + 35.313233, + 35.329129, + 35.344886, + 35.360505, + 35.375988, + 35.391336, + 35.406551, + 35.421635, + 35.436589, + 35.451414, + 35.466112, + 35.480685, + 35.495133, + 35.509458, + 35.523662, + 35.537746, + 35.551711, + 35.565559, + 35.579290, + 35.592907, + 35.606410, + 35.619800, + 35.633080, + 35.646249, + 35.659310, + 35.672263, + 35.685110, + 35.697852, + 35.710489, + 35.723024, + 35.735457, + 35.747789, + 35.760021, + 35.772155, + 35.784191, + 35.796131, + 35.807975, + 35.819725, + 35.831381, + 35.842944, + 35.854416, + 35.865798, + 35.877090, + 35.888293, + 35.899408, + 35.910436, + 35.921378, + 35.932236, + 35.943008, + 35.953698, + 35.964305, + 35.974830, + 35.985275, + 35.995639, + 36.005924, + 36.016131, + 36.026260, + 36.036313, + 36.046289, + 36.056190, + 36.066016, + 36.075768, + 36.085448, + 36.095055, + 36.104590, + 36.114054, + 36.123448, + 36.132773, + 36.142028, + 36.151216, + 36.160335, + 36.169388, + 36.178375, + 36.187296, + 36.196152, + 36.204944, + 36.213672, + 36.222337, + 36.230939, + 36.239479, + 36.247959, + 36.256377, + 36.264735, + 36.273034, + 36.281273, + 36.289454, + 36.297577, + 36.305643, + 36.313652, + 36.321604, + 36.329501, + 36.337342, + 36.345129, + 36.352861, + 36.360540, + 36.368165, + 36.375737, + 36.383258, + 36.390726, + 36.398143, + 36.405509, + 36.412825, + 36.420091, + 36.427307, + 36.434474, + 36.441592, + 36.448663, + 36.455685, + 36.462660, + 36.469589, + 36.476471, + 36.483306, + 36.490096, + 36.496841, + 36.503541, + 36.510196, + 36.516808, + 36.523375, + 36.529900, + 36.536381, + 36.542820, + 36.549217, + 36.555571, + 36.561885, + 36.568157, + 36.574388, + 36.580580, + 36.586731, + 36.592842, + 36.598914, + 36.604947, + 36.610941, + 36.616897, + 36.622815, + 36.628695, + 36.634537, + 36.640343, + 36.646111, + 36.651844, + 36.657540, + 36.663200, + 36.668825, + 36.674414, + 36.679969, + 36.685488, + 36.690974, + 36.696425, + 36.701842, + 36.707226, + 36.712577, + 36.717894, + 36.723179, + 36.728431, + 36.733651, + 36.738839, + 36.743996, + 36.749121, + 36.754215, + 36.759278, + 36.764310, + 36.769312, + 36.774283, + 36.779225, + 36.784137, + 36.789020, + 36.793873, + 36.798697, + 36.803493, + 36.808260, + 36.812998, + 36.817709, + 36.822391, + 36.827046, + 36.831674, + 36.836274, + 36.840848, + 36.845394, + 36.849914, + 36.854407, + 36.858875, + 36.863316, + 36.867732, + 36.872122, + 36.876486, + 36.880826, + 36.885140, + 36.889430, + 36.893694, + 36.897935, + 36.902151, + 36.906343, + 36.910512, + 36.914656, + 36.918777, + 36.922875, + 36.926950, + 36.931001, + 36.935030, + 36.939036, + 36.943020, + 36.946981, + 36.950920, + 36.954837, + 36.958733, + 36.962606, + 36.966458, + 36.970289, + 36.974099, + 36.977888, + 36.981655, + 36.985402, + 36.989129, + 36.992835, + 36.996520, + 37.000186, + 37.003831, + 37.007457, + 37.011063, + 37.014650, + 37.018217, + 37.021765, + 37.025293, + 37.028803, + 37.032294, + 37.035766, + 37.039219, + 37.042654, + 37.046071, + 37.049470, + 37.052850, + 37.056212, + 37.059557, + 37.062884, + 37.066193, + 37.069485, + 37.072760, + 37.076017, + 37.079258, + 37.082481, + 37.085687, + 37.088877, + 37.092050, + 37.095207, + 37.098347, + 37.101471, + 37.104579, + 37.107671, + 37.110747, + 37.113807, + 37.116851, + 37.119880, + 37.122893, + 37.125891, + 37.128873, + 37.131840, + 37.134792, + 37.137730, + 37.140652, + 37.143559, + 37.146452, + 37.149330, + 37.152194, + 37.155043, + 37.157878, + 37.160699, + 37.163506, + 37.166299, + 37.169077, + 37.171842, + 37.174593, + 37.177331, + 37.180055, + 37.182765, + 37.185463, + 37.188146, + 37.190817, + 37.193474, + 37.196119, + 37.198750, + 37.201369, + 37.203975, + 37.206568, + 37.209149, + 37.211716, + 37.214272, + 37.216815, + 37.219346, + 37.221865, + 37.224371, + 37.226866, + 37.229348, + 37.231819, + 37.234277, + 37.236724, + 37.239160, + 37.241583, + 37.243995, + 37.246396, + 37.248785, + 37.251163, + 37.253530, + 37.255885, + 37.258230, + 37.260563, + 37.262886, + 37.265197, + 37.267498, + 37.269788, + 37.272067, + 37.274336, + 37.276594, + 37.278841, + 37.281078, + 37.283305, + 37.285521, + 37.287728, + 37.289924, + 37.292110, + 37.294285, + 37.296451, + 37.298607, + 37.300753, + 37.302889, + 37.305016, + 37.307133, + 37.309240, + 37.311337, + 37.313425, + 37.315504, + 37.317573, + 37.319633, + 37.321683, + 37.323725, + 37.325757, + 37.327780, + 37.329794, + 37.331799, + 37.333795, + 37.335782, + 37.337760, + 37.339729, + 37.341690, + 37.343642, + 37.345585, + 37.347520, + 37.349446, + 37.351363, + 37.353272, + 37.355173, + 37.357066, + 37.358950, + 37.360826, + 37.362693, + 37.364553, + 37.366404, + 37.368247, + 37.370083, + 37.371910, + 37.373729, + 37.375541, + 37.377345, + 37.379141, + 37.380929, + 37.382709, + 37.384482, + 37.386247, + 37.388005, + 37.389755, + 37.391498, + 37.393233, + 37.394960, + 37.396681, + 37.398394, + 37.400100, + 37.401798, + 37.403490, + 37.405174, + 37.406851, + 37.408521, + 37.410184, + 37.411840, + 37.413490, + 37.415132, + 37.416767, + 37.418396, + 37.420017, + 37.421632, + 37.423240, + 37.424842, + 37.426437, + 37.428025, + 37.429607, + 37.431182, + 37.432751, + 37.434313, + 37.435868, + 37.437418, + 37.438961, + 37.440497, + 37.442028, + 37.443552, + 37.445070, + 37.446581, + 37.448087, + 37.449586, + 37.451080, + 37.452567, + 37.454048, + 37.455523, + 37.456993, + 37.458456, + 37.459913, + 37.461365, + 37.462811, + 37.464251, + 37.465685, + 37.467113, + 37.468536, + 37.469953, + 37.471364, + 37.472770, + 37.474170, + 37.475565, + 37.476954, + 37.478337, + 37.479715, + 37.481088, + 37.482455, + 37.483817, + 37.485174, + 37.486525, + 37.487871, + 37.489211, + 37.490547, + 37.491877, + 37.493202, + 37.494521, + 37.495836, + 37.497145, + 37.498450, + 37.499749, + 37.501043, + 37.502333, + 37.503617, + 37.504896, + 37.506171, + 37.507440, + 37.508705, + 37.509965, + 37.511220, + 37.512470, + 37.513715, + 37.514956, + 37.516192, + 37.517423, + 37.518649, + 37.519871, + 37.521088, + 37.522301, + 37.523509, + 37.524712, + 37.525911, + 37.527105, + 37.528295, + 37.529481, + 37.530661, + 37.531838, + 37.533010, + 37.534178, + 37.535341, + 37.536500, + 37.537654, + 37.538805, + 37.539951, + 37.541092, + 37.542230, + 37.543363, + 37.544492, + 37.545617, + 37.546738, + 37.547855, + 37.548967, + 37.550076, + 37.551180, + 37.552280, + 37.553377, + 37.554469, + 37.555557, + 37.556641, + 37.557722, + 37.558798, + 37.559871, + 37.560939, + 37.562004, + 37.563065, + 37.564122, + 37.565175, + 37.566224, + 37.567270, + 37.568311, + 37.569349, + 37.570384, + 37.571414, + 37.572441, + 37.573464, + 37.574484, + 37.575500, + 37.576512, + 37.577521, + 37.578526, + 37.579527, + 37.580525, + 37.581520, + 37.582510, + 37.583498, + 37.584482, + 37.585462, + 37.586439, + 37.587412, + 37.588382, + 37.589349, + 37.590312, + 37.591272, + 37.592228, + 37.593182, + 37.594131, + 37.595078, + 37.596021, + 37.596961, + 37.597897, + 37.598831, + 37.599761, + 37.600688, + 37.601611, + 37.602532, + 37.603449, + 37.604363, + 37.605274, + 37.606182, + 37.607087, + 37.607988, + 37.608887, + 37.609782, + 37.610675, + 37.611564, + 37.612450, + 37.613333, + 37.614214, + 37.615091, + 37.615965, + 37.616836, + 37.617705, + 37.618570, + 37.619432, + 37.620292, + 37.621149, + 37.622002, + 37.622853, + 37.623701, + 37.624546, + 37.625389, + 37.626228, + 37.627065, + 37.627898, + 37.628729, + 37.629558, + 37.630383, + 37.631206, + 37.632026, + 37.632843, + 37.633658, + 37.634470, + 37.635279, + 37.636085, + 37.636889, + 37.637690, + 37.638489, + 37.639285, + 37.640078, + 37.640868, + 37.641656, + 37.642442, + 37.643225, + 37.644005, + 37.644783, + 37.645558, + 37.646331, + 37.647101, + 37.647869, + 37.648634, + 37.649396, + 37.650157, + 37.650914, + 37.651670, + 37.652422, + 37.653173, + 37.653921, + 37.654666, + 37.655409, + 37.656150, + 37.656888, + 37.657624, + 37.658358, + 37.659089, + 37.659818, + 37.660545, + 37.661269, + 37.661991, + 37.662711, + 37.663428, + 37.664143, + 37.664856, + 37.665566, + 37.666275, + 37.666981, + 37.667685, + 37.668386, + 37.669086, + 37.669783, + 37.670478, + 37.671170, + 37.671861, + 37.672549, + 37.673236, + 37.673920, + 37.674602, + 37.675281, + 37.675959, + 37.676635, + 37.677308, + 37.677980, + 37.678649, + 37.679316, + 37.679981, + 37.680644, + 37.681305, + 37.681964, + 37.682621, + 37.683276, + 37.683929, + 37.684580, + 37.685228, + 37.685875, + 37.686520, + 37.687163, + 37.687804, + 37.688443, + 37.689080, + 37.689715, + 37.690348, + 37.690979, + 37.691608, + 37.692236, + 37.692861, + 37.693484, + 37.694106, + 37.694726, + 37.695344, + 37.695959, + 37.696574, + 37.697186, + 37.697796, + 37.698405, + 37.699011, + 37.699616, + 37.700219, + 37.700821, + 37.701420, + 37.702018, + 37.702614, + 37.703208, + 37.703800, + 37.704390, + }, + {// The expectations for dimension = 77 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406666, + 6.615000, + 6.826666, + 7.041665, + 7.259997, + 7.481660, + 7.706655, + 7.934979, + 8.166631, + 8.401605, + 8.639896, + 8.881495, + 9.126391, + 9.374564, + 9.625990, + 9.880635, + 10.138456, + 10.399396, + 10.663381, + 10.930321, + 11.200106, + 11.472604, + 11.747661, + 12.025097, + 12.304711, + 12.586275, + 12.869545, + 13.154252, + 13.440115, + 13.726840, + 14.014121, + 14.301651, + 14.589121, + 14.876227, + 15.162670, + 15.448163, + 15.732434, + 16.015224, + 16.296292, + 16.575416, + 16.852392, + 17.127038, + 17.399186, + 17.668690, + 17.935420, + 18.199263, + 18.460123, + 18.717915, + 18.972570, + 19.224032, + 19.472252, + 19.717196, + 19.958837, + 20.197156, + 20.432142, + 20.663791, + 20.892105, + 21.117090, + 21.338759, + 21.557128, + 21.772217, + 21.984050, + 22.192653, + 22.398056, + 22.600289, + 22.799387, + 22.995384, + 23.188318, + 23.378226, + 23.565147, + 23.749121, + 23.930189, + 24.108392, + 24.283773, + 24.456372, + 24.626233, + 24.793397, + 24.957908, + 25.119807, + 25.279137, + 25.435940, + 25.590258, + 25.742133, + 25.891605, + 26.038717, + 26.183508, + 26.326018, + 26.466288, + 26.604356, + 26.740261, + 26.874041, + 27.005734, + 27.135378, + 27.263008, + 27.388661, + 27.512372, + 27.634176, + 27.754107, + 27.872200, + 27.988487, + 28.103001, + 28.215774, + 28.326837, + 28.436222, + 28.543958, + 28.650076, + 28.754605, + 28.857574, + 28.959010, + 29.058942, + 29.157396, + 29.254400, + 29.349979, + 29.444159, + 29.536964, + 29.628421, + 29.718552, + 29.807382, + 29.894933, + 29.981229, + 30.066292, + 30.150143, + 30.232804, + 30.314297, + 30.394641, + 30.473857, + 30.551965, + 30.628983, + 30.704932, + 30.779830, + 30.853695, + 30.926545, + 30.998397, + 31.069269, + 31.139177, + 31.208139, + 31.276170, + 31.343286, + 31.409503, + 31.474836, + 31.539300, + 31.602910, + 31.665679, + 31.727623, + 31.788755, + 31.849088, + 31.908637, + 31.967413, + 32.025429, + 32.082699, + 32.139234, + 32.195047, + 32.250149, + 32.304551, + 32.358266, + 32.411305, + 32.463677, + 32.515395, + 32.566468, + 32.616907, + 32.666722, + 32.715922, + 32.764519, + 32.812520, + 32.859936, + 32.906776, + 32.953048, + 32.998762, + 33.043927, + 33.088550, + 33.132640, + 33.176206, + 33.219255, + 33.261796, + 33.303835, + 33.345382, + 33.386443, + 33.427025, + 33.467136, + 33.506783, + 33.545973, + 33.584712, + 33.623008, + 33.660867, + 33.698295, + 33.735300, + 33.771886, + 33.808060, + 33.843828, + 33.879197, + 33.914172, + 33.948758, + 33.982961, + 34.016787, + 34.050241, + 34.083329, + 34.116055, + 34.148425, + 34.180444, + 34.212117, + 34.243448, + 34.274443, + 34.305106, + 34.335442, + 34.365455, + 34.395150, + 34.424532, + 34.453604, + 34.482371, + 34.510836, + 34.539005, + 34.566881, + 34.594468, + 34.621771, + 34.648792, + 34.675536, + 34.702006, + 34.728206, + 34.754140, + 34.779811, + 34.805222, + 34.830378, + 34.855281, + 34.879935, + 34.904343, + 34.928509, + 34.952434, + 34.976124, + 34.999579, + 35.022805, + 35.045803, + 35.068576, + 35.091128, + 35.113461, + 35.135578, + 35.157481, + 35.179174, + 35.200659, + 35.221939, + 35.243016, + 35.263892, + 35.284571, + 35.305055, + 35.325346, + 35.345446, + 35.365358, + 35.385084, + 35.404627, + 35.423989, + 35.443171, + 35.462177, + 35.481007, + 35.499665, + 35.518153, + 35.536471, + 35.554624, + 35.572612, + 35.590437, + 35.608101, + 35.625607, + 35.642956, + 35.660150, + 35.677191, + 35.694080, + 35.710820, + 35.727412, + 35.743857, + 35.760159, + 35.776317, + 35.792334, + 35.808212, + 35.823951, + 35.839555, + 35.855023, + 35.870359, + 35.885562, + 35.900635, + 35.915580, + 35.930397, + 35.945088, + 35.959654, + 35.974098, + 35.988419, + 36.002621, + 36.016703, + 36.030667, + 36.044515, + 36.058248, + 36.071867, + 36.085373, + 36.098768, + 36.112053, + 36.125228, + 36.138296, + 36.151257, + 36.164112, + 36.176863, + 36.189511, + 36.202056, + 36.214500, + 36.226845, + 36.239090, + 36.251237, + 36.263288, + 36.275243, + 36.287102, + 36.298868, + 36.310541, + 36.322123, + 36.333613, + 36.345013, + 36.356324, + 36.367547, + 36.378682, + 36.389731, + 36.400695, + 36.411574, + 36.422369, + 36.433082, + 36.443712, + 36.454261, + 36.464730, + 36.475119, + 36.485429, + 36.495662, + 36.505817, + 36.515895, + 36.525898, + 36.535826, + 36.545680, + 36.555460, + 36.565167, + 36.574803, + 36.584367, + 36.593860, + 36.603283, + 36.612638, + 36.621923, + 36.631141, + 36.640291, + 36.649375, + 36.658393, + 36.667345, + 36.676233, + 36.685056, + 36.693816, + 36.702514, + 36.711149, + 36.719722, + 36.728234, + 36.736685, + 36.745077, + 36.753409, + 36.761682, + 36.769897, + 36.778054, + 36.786154, + 36.794197, + 36.802185, + 36.810116, + 36.817992, + 36.825814, + 36.833581, + 36.841295, + 36.848956, + 36.856564, + 36.864120, + 36.871624, + 36.879077, + 36.886479, + 36.893831, + 36.901133, + 36.908385, + 36.915589, + 36.922744, + 36.929851, + 36.936910, + 36.943922, + 36.950887, + 36.957806, + 36.964679, + 36.971506, + 36.978287, + 36.985024, + 36.991717, + 36.998366, + 37.004971, + 37.011532, + 37.018051, + 37.024527, + 37.030961, + 37.037354, + 37.043704, + 37.050014, + 37.056283, + 37.062512, + 37.068701, + 37.074849, + 37.080959, + 37.087030, + 37.093061, + 37.099055, + 37.105010, + 37.110928, + 37.116808, + 37.122652, + 37.128458, + 37.134228, + 37.139962, + 37.145660, + 37.151322, + 37.156949, + 37.162541, + 37.168098, + 37.173621, + 37.179110, + 37.184565, + 37.189986, + 37.195374, + 37.200729, + 37.206052, + 37.211341, + 37.216599, + 37.221824, + 37.227018, + 37.232181, + 37.237312, + 37.242412, + 37.247481, + 37.252520, + 37.257529, + 37.262508, + 37.267457, + 37.272376, + 37.277267, + 37.282128, + 37.286960, + 37.291764, + 37.296539, + 37.301287, + 37.306006, + 37.310697, + 37.315362, + 37.319998, + 37.324608, + 37.329191, + 37.333747, + 37.338277, + 37.342781, + 37.347258, + 37.351710, + 37.356136, + 37.360537, + 37.364912, + 37.369262, + 37.373588, + 37.377888, + 37.382165, + 37.386416, + 37.390644, + 37.394848, + 37.399028, + 37.403185, + 37.407318, + 37.411427, + 37.415514, + 37.419578, + 37.423619, + 37.427638, + 37.431634, + 37.435608, + 37.439560, + 37.443490, + 37.447398, + 37.451285, + 37.455150, + 37.458994, + 37.462817, + 37.466619, + 37.470401, + 37.474161, + 37.477901, + 37.481621, + 37.485320, + 37.489000, + 37.492659, + 37.496299, + 37.499919, + 37.503520, + 37.507101, + 37.510663, + 37.514206, + 37.517730, + 37.521235, + 37.524722, + 37.528190, + 37.531640, + 37.535071, + 37.538484, + 37.541879, + 37.545257, + 37.548616, + 37.551958, + 37.555282, + 37.558589, + 37.561879, + 37.565151, + 37.568407, + 37.571645, + 37.574867, + 37.578072, + 37.581260, + 37.584432, + 37.587588, + 37.590727, + 37.593851, + 37.596958, + 37.600049, + 37.603125, + 37.606185, + 37.609229, + 37.612258, + 37.615271, + 37.618269, + 37.621252, + 37.624220, + 37.627173, + 37.630111, + 37.633034, + 37.635942, + 37.638836, + 37.641716, + 37.644581, + 37.647432, + 37.650269, + 37.653091, + 37.655900, + 37.658695, + 37.661475, + 37.664242, + 37.666996, + 37.669736, + 37.672462, + 37.675175, + 37.677875, + 37.680562, + 37.683235, + 37.685896, + 37.688543, + 37.691178, + 37.693800, + 37.696409, + 37.699006, + 37.701590, + 37.704161, + 37.706720, + 37.709267, + 37.711802, + 37.714324, + 37.716835, + 37.719333, + 37.721820, + 37.724295, + 37.726758, + 37.729209, + 37.731649, + 37.734077, + 37.736494, + 37.738899, + 37.741293, + 37.743676, + 37.746047, + 37.748408, + 37.750757, + 37.753096, + 37.755423, + 37.757740, + 37.760046, + 37.762341, + 37.764626, + 37.766900, + 37.769163, + 37.771416, + 37.773659, + 37.775891, + 37.778113, + 37.780325, + 37.782527, + 37.784719, + 37.786900, + 37.789072, + 37.791234, + 37.793386, + 37.795529, + 37.797661, + 37.799784, + 37.801897, + 37.804001, + 37.806096, + 37.808180, + 37.810256, + 37.812322, + 37.814379, + 37.816427, + 37.818466, + 37.820495, + 37.822516, + 37.824527, + 37.826530, + 37.828524, + 37.830509, + 37.832485, + 37.834452, + 37.836411, + 37.838361, + 37.840303, + 37.842236, + 37.844161, + 37.846077, + 37.847985, + 37.849884, + 37.851775, + 37.853659, + 37.855533, + 37.857400, + 37.859259, + 37.861109, + 37.862952, + 37.864787, + 37.866613, + 37.868432, + 37.870243, + 37.872047, + 37.873842, + 37.875630, + 37.877410, + 37.879183, + 37.880948, + 37.882706, + 37.884456, + 37.886199, + 37.887934, + 37.889662, + 37.891383, + 37.893097, + 37.894803, + 37.896502, + 37.898194, + 37.899879, + 37.901557, + 37.903228, + 37.904892, + 37.906549, + 37.908199, + 37.909842, + 37.911478, + 37.913108, + 37.914731, + 37.916347, + 37.917956, + 37.919559, + 37.921155, + 37.922745, + 37.924328, + 37.925904, + 37.927475, + 37.929038, + 37.930596, + 37.932147, + 37.933691, + 37.935230, + 37.936762, + 37.938288, + 37.939808, + 37.941321, + 37.942829, + 37.944330, + 37.945826, + 37.947315, + 37.948798, + 37.950276, + 37.951747, + 37.953213, + 37.954672, + 37.956126, + 37.957574, + 37.959017, + 37.960453, + 37.961884, + 37.963310, + 37.964729, + 37.966143, + 37.967551, + 37.968954, + 37.970352, + 37.971743, + 37.973130, + 37.974511, + 37.975886, + 37.977256, + 37.978621, + 37.979980, + 37.981334, + 37.982683, + 37.984027, + 37.985365, + 37.986698, + 37.988026, + 37.989349, + 37.990667, + 37.991979, + 37.993287, + 37.994590, + 37.995887, + 37.997180, + 37.998467, + 37.999750, + 38.001028, + 38.002301, + 38.003569, + 38.004832, + 38.006090, + 38.007344, + 38.008593, + 38.009837, + 38.011076, + 38.012311, + 38.013541, + 38.014767, + 38.015987, + 38.017204, + 38.018415, + 38.019622, + 38.020825, + 38.022023, + 38.023216, + 38.024406, + 38.025590, + 38.026771, + 38.027946, + 38.029118, + 38.030285, + 38.031448, + 38.032606, + 38.033761, + 38.034911, + 38.036056, + 38.037198, + 38.038335, + 38.039468, + 38.040597, + 38.041722, + 38.042843, + 38.043959, + 38.045072, + 38.046180, + 38.047285, + 38.048385, + 38.049481, + 38.050574, + 38.051662, + 38.052747, + 38.053827, + 38.054904, + 38.055977, + 38.057046, + 38.058111, + 38.059172, + 38.060229, + 38.061283, + 38.062333, + 38.063379, + 38.064421, + 38.065460, + 38.066495, + 38.067526, + 38.068554, + 38.069578, + 38.070598, + 38.071614, + 38.072628, + 38.073637, + 38.074643, + 38.075645, + 38.076644, + 38.077639, + 38.078631, + 38.079619, + 38.080604, + 38.081586, + 38.082564, + 38.083538, + 38.084509, + 38.085477, + 38.086441, + 38.087402, + 38.088360, + 38.089314, + 38.090265, + 38.091213, + 38.092158, + 38.093099, + 38.094037, + 38.094971, + 38.095903, + 38.096831, + 38.097756, + 38.098678, + 38.099597, + 38.100513, + 38.101425, + 38.102334, + 38.103241, + 38.104144, + 38.105044, + 38.105941, + 38.106835, + 38.107726, + 38.108614, + 38.109499, + 38.110380, + 38.111259, + 38.112135, + 38.113008, + 38.113878, + 38.114746, + 38.115610, + 38.116471, + 38.117330, + 38.118185, + 38.119038, + 38.119888, + 38.120735, + 38.121579, + 38.122420, + 38.123259, + 38.124095, + 38.124928, + 38.125758, + 38.126585, + 38.127410, + 38.128232, + 38.129051, + 38.129868, + 38.130682, + 38.131493, + 38.132302, + 38.133108, + 38.133911, + 38.134712, + 38.135510, + 38.136305, + 38.137098, + 38.137888, + 38.138676, + 38.139461, + 38.140243, + 38.141023, + 38.141801, + 38.142576, + 38.143348, + 38.144118, + 38.144886, + 38.145651, + 38.146413, + 38.147173, + 38.147931, + 38.148686, + 38.149439, + 38.150189, + 38.150937, + 38.151682, + 38.152426, + 38.153166, + 38.153905, + 38.154641, + 38.155375, + 38.156106, + 38.156835, + 38.157562, + 38.158286, + 38.159008, + 38.159728, + 38.160446, + 38.161161, + 38.161874, + 38.162585, + 38.163294, + 38.164000, + 38.164704, + 38.165406, + 38.166106, + 38.166803, + 38.167499, + 38.168192, + 38.168883, + 38.169572, + 38.170258, + 38.170943, + 38.171625, + 38.172306, + 38.172984, + 38.173660, + 38.174334, + 38.175006, + 38.175676, + 38.176344, + 38.177010, + 38.177673, + 38.178335, + 38.178995, + 38.179652, + 38.180308, + 38.180961, + 38.181613, + 38.182262, + 38.182910, + 38.183556, + 38.184199, + 38.184841, + 38.185481, + 38.186119, + 38.186754, + 38.187388, + 38.188020, + 38.188651, + 38.189279, + 38.189905, + 38.190529, + 38.191152, + 38.191773, + 38.192391, + 38.193008, + 38.193623, + 38.194237, + 38.194848, + 38.195458, + 38.196065, + 38.196671, + }, + {// The expectations for dimension = 78 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826666, + 7.041665, + 7.259998, + 7.481662, + 7.706659, + 7.934985, + 8.166640, + 8.401621, + 8.639923, + 8.881538, + 9.126457, + 9.374664, + 9.626140, + 9.880857, + 10.138776, + 10.399848, + 10.664011, + 10.931185, + 11.201270, + 11.474150, + 11.749682, + 12.027702, + 12.308022, + 12.590431, + 12.874693, + 13.160555, + 13.447743, + 13.735970, + 14.024937, + 14.314340, + 14.603869, + 14.893218, + 15.182084, + 15.470174, + 15.757207, + 16.042916, + 16.327050, + 16.609375, + 16.889676, + 17.167759, + 17.443447, + 17.716580, + 17.987019, + 18.254641, + 18.519338, + 18.781019, + 19.039606, + 19.295033, + 19.547246, + 19.796204, + 20.041873, + 20.284229, + 20.523256, + 20.758945, + 20.991293, + 21.220305, + 21.445988, + 21.668355, + 21.887424, + 22.103217, + 22.315756, + 22.525069, + 22.731186, + 22.934138, + 23.133959, + 23.330684, + 23.524351, + 23.714998, + 23.902662, + 24.087385, + 24.269207, + 24.448168, + 24.624312, + 24.797678, + 24.968311, + 25.136251, + 25.301541, + 25.464223, + 25.624340, + 25.781933, + 25.937044, + 26.089714, + 26.239984, + 26.387896, + 26.533488, + 26.676802, + 26.817877, + 26.956751, + 27.093462, + 27.228050, + 27.360552, + 27.491003, + 27.619442, + 27.745903, + 27.870421, + 27.993032, + 28.113770, + 28.232667, + 28.349758, + 28.465074, + 28.578648, + 28.690511, + 28.800693, + 28.909225, + 29.016136, + 29.121456, + 29.225213, + 29.327435, + 29.428150, + 29.527385, + 29.625166, + 29.721519, + 29.816471, + 29.910045, + 30.002266, + 30.093159, + 30.182747, + 30.271053, + 30.358099, + 30.443909, + 30.528504, + 30.611905, + 30.694134, + 30.775210, + 30.855154, + 30.933986, + 31.011725, + 31.088390, + 31.164000, + 31.238572, + 31.312126, + 31.384677, + 31.456244, + 31.526844, + 31.596492, + 31.665206, + 31.733000, + 31.799891, + 31.865893, + 31.931023, + 31.995293, + 32.058719, + 32.121316, + 32.183095, + 32.244072, + 32.304260, + 32.363670, + 32.422318, + 32.480214, + 32.537371, + 32.593801, + 32.649516, + 32.704528, + 32.758848, + 32.812487, + 32.865456, + 32.917765, + 32.969426, + 33.020449, + 33.070843, + 33.120619, + 33.169786, + 33.218355, + 33.266334, + 33.313732, + 33.360559, + 33.406824, + 33.452535, + 33.497701, + 33.542329, + 33.586430, + 33.630010, + 33.673077, + 33.715639, + 33.757705, + 33.799281, + 33.840374, + 33.880993, + 33.921143, + 33.960833, + 34.000069, + 34.038857, + 34.077205, + 34.115119, + 34.152604, + 34.189668, + 34.226317, + 34.262556, + 34.298392, + 34.333830, + 34.368876, + 34.403536, + 34.437816, + 34.471720, + 34.505254, + 34.538424, + 34.571234, + 34.603689, + 34.635795, + 34.667557, + 34.698978, + 34.730065, + 34.760822, + 34.791252, + 34.821362, + 34.851154, + 34.880634, + 34.909806, + 34.938673, + 34.967241, + 34.995513, + 35.023493, + 35.051186, + 35.078594, + 35.105722, + 35.132574, + 35.159152, + 35.185462, + 35.211506, + 35.237288, + 35.262811, + 35.288079, + 35.313095, + 35.337863, + 35.362385, + 35.386665, + 35.410705, + 35.434510, + 35.458082, + 35.481423, + 35.504538, + 35.527429, + 35.550098, + 35.572549, + 35.594784, + 35.616806, + 35.638617, + 35.660221, + 35.681620, + 35.702816, + 35.723812, + 35.744611, + 35.765214, + 35.785625, + 35.805845, + 35.825878, + 35.845724, + 35.865387, + 35.884869, + 35.904172, + 35.923297, + 35.942249, + 35.961027, + 35.979635, + 35.998074, + 36.016346, + 36.034454, + 36.052400, + 36.070184, + 36.087810, + 36.105279, + 36.122593, + 36.139753, + 36.156762, + 36.173621, + 36.190332, + 36.206897, + 36.223317, + 36.239594, + 36.255729, + 36.271725, + 36.287583, + 36.303304, + 36.318891, + 36.334343, + 36.349664, + 36.364854, + 36.379916, + 36.394849, + 36.409657, + 36.424339, + 36.438898, + 36.453336, + 36.467652, + 36.481849, + 36.495928, + 36.509891, + 36.523738, + 36.537471, + 36.551090, + 36.564598, + 36.577996, + 36.591284, + 36.604464, + 36.617537, + 36.630504, + 36.643366, + 36.656125, + 36.668781, + 36.681336, + 36.693790, + 36.706145, + 36.718402, + 36.730562, + 36.742625, + 36.754593, + 36.766467, + 36.778248, + 36.789936, + 36.801534, + 36.813040, + 36.824458, + 36.835786, + 36.847028, + 36.858182, + 36.869251, + 36.880234, + 36.891134, + 36.901950, + 36.912684, + 36.923336, + 36.933907, + 36.944399, + 36.954811, + 36.965145, + 36.975401, + 36.985581, + 36.995684, + 37.005712, + 37.015666, + 37.025545, + 37.035352, + 37.045086, + 37.054749, + 37.064340, + 37.073861, + 37.083312, + 37.092695, + 37.102009, + 37.111256, + 37.120435, + 37.129549, + 37.138596, + 37.147579, + 37.156496, + 37.165351, + 37.174141, + 37.182870, + 37.191536, + 37.200140, + 37.208684, + 37.217167, + 37.225591, + 37.233955, + 37.242261, + 37.250509, + 37.258699, + 37.266832, + 37.274908, + 37.282929, + 37.290894, + 37.298804, + 37.306659, + 37.314460, + 37.322208, + 37.329903, + 37.337546, + 37.345136, + 37.352675, + 37.360163, + 37.367600, + 37.374986, + 37.382323, + 37.389611, + 37.396850, + 37.404040, + 37.411183, + 37.418277, + 37.425325, + 37.432326, + 37.439280, + 37.446189, + 37.453052, + 37.459870, + 37.466643, + 37.473371, + 37.480056, + 37.486697, + 37.493295, + 37.499850, + 37.506363, + 37.512833, + 37.519262, + 37.525649, + 37.531996, + 37.538301, + 37.544566, + 37.550792, + 37.556977, + 37.563123, + 37.569231, + 37.575299, + 37.581329, + 37.587321, + 37.593276, + 37.599193, + 37.605073, + 37.610916, + 37.616723, + 37.622493, + 37.628228, + 37.633927, + 37.639591, + 37.645219, + 37.650813, + 37.656373, + 37.661898, + 37.667390, + 37.672848, + 37.678273, + 37.683664, + 37.689023, + 37.694349, + 37.699643, + 37.704906, + 37.710136, + 37.715335, + 37.720502, + 37.725639, + 37.730745, + 37.735820, + 37.740865, + 37.745880, + 37.750865, + 37.755821, + 37.760747, + 37.765645, + 37.770513, + 37.775353, + 37.780164, + 37.784948, + 37.789703, + 37.794430, + 37.799130, + 37.803803, + 37.808448, + 37.813067, + 37.817659, + 37.822224, + 37.826763, + 37.831276, + 37.835764, + 37.840225, + 37.844661, + 37.849071, + 37.853457, + 37.857817, + 37.862153, + 37.866465, + 37.870751, + 37.875014, + 37.879253, + 37.883468, + 37.887659, + 37.891827, + 37.895971, + 37.900092, + 37.904191, + 37.908266, + 37.912319, + 37.916350, + 37.920358, + 37.924344, + 37.928308, + 37.932251, + 37.936171, + 37.940070, + 37.943948, + 37.947805, + 37.951641, + 37.955456, + 37.959250, + 37.963023, + 37.966776, + 37.970509, + 37.974222, + 37.977915, + 37.981588, + 37.985241, + 37.988874, + 37.992489, + 37.996083, + 37.999659, + 38.003216, + 38.006754, + 38.010273, + 38.013774, + 38.017256, + 38.020719, + 38.024165, + 38.027592, + 38.031002, + 38.034393, + 38.037767, + 38.041123, + 38.044462, + 38.047783, + 38.051088, + 38.054375, + 38.057645, + 38.060898, + 38.064134, + 38.067354, + 38.070557, + 38.073744, + 38.076914, + 38.080069, + 38.083207, + 38.086329, + 38.089435, + 38.092526, + 38.095601, + 38.098660, + 38.101704, + 38.104732, + 38.107746, + 38.110744, + 38.113727, + 38.116695, + 38.119648, + 38.122587, + 38.125511, + 38.128420, + 38.131315, + 38.134195, + 38.137062, + 38.139914, + 38.142752, + 38.145576, + 38.148386, + 38.151182, + 38.153965, + 38.156734, + 38.159489, + 38.162231, + 38.164960, + 38.167675, + 38.170377, + 38.173066, + 38.175742, + 38.178405, + 38.181056, + 38.183693, + 38.186318, + 38.188930, + 38.191530, + 38.194117, + 38.196692, + 38.199254, + 38.201805, + 38.204343, + 38.206869, + 38.209383, + 38.211885, + 38.214376, + 38.216854, + 38.219321, + 38.221777, + 38.224221, + 38.226653, + 38.229074, + 38.231484, + 38.233882, + 38.236269, + 38.238645, + 38.241010, + 38.243364, + 38.245707, + 38.248040, + 38.250361, + 38.252672, + 38.254972, + 38.257262, + 38.259541, + 38.261810, + 38.264068, + 38.266316, + 38.268554, + 38.270781, + 38.272998, + 38.275206, + 38.277403, + 38.279590, + 38.281768, + 38.283935, + 38.286093, + 38.288241, + 38.290379, + 38.292508, + 38.294627, + 38.296737, + 38.298838, + 38.300929, + 38.303010, + 38.305083, + 38.307146, + 38.309200, + 38.311245, + 38.313281, + 38.315307, + 38.317325, + 38.319334, + 38.321335, + 38.323326, + 38.325309, + 38.327283, + 38.329248, + 38.331205, + 38.333153, + 38.335093, + 38.337024, + 38.338947, + 38.340862, + 38.342768, + 38.344666, + 38.346556, + 38.348438, + 38.350311, + 38.352177, + 38.354035, + 38.355884, + 38.357726, + 38.359560, + 38.361386, + 38.363204, + 38.365014, + 38.366817, + 38.368612, + 38.370400, + 38.372180, + 38.373952, + 38.375717, + 38.377475, + 38.379225, + 38.380968, + 38.382703, + 38.384431, + 38.386152, + 38.387866, + 38.389572, + 38.391272, + 38.392964, + 38.394650, + 38.396328, + 38.397999, + 38.399664, + 38.401321, + 38.402972, + 38.404616, + 38.406253, + 38.407884, + 38.409508, + 38.411125, + 38.412735, + 38.414339, + 38.415936, + 38.417527, + 38.419112, + 38.420690, + 38.422261, + 38.423826, + 38.425385, + 38.426937, + 38.428484, + 38.430024, + 38.431557, + 38.433085, + 38.434606, + 38.436122, + 38.437631, + 38.439134, + 38.440632, + 38.442123, + 38.443608, + 38.445087, + 38.446561, + 38.448029, + 38.449490, + 38.450946, + 38.452397, + 38.453841, + 38.455280, + 38.456713, + 38.458141, + 38.459563, + 38.460979, + 38.462390, + 38.463795, + 38.465195, + 38.466589, + 38.467978, + 38.469362, + 38.470740, + 38.472113, + 38.473480, + 38.474842, + 38.476199, + 38.477551, + 38.478897, + 38.480238, + 38.481574, + 38.482905, + 38.484231, + 38.485552, + 38.486867, + 38.488178, + 38.489483, + 38.490784, + 38.492080, + 38.493370, + 38.494656, + 38.495937, + 38.497213, + 38.498485, + 38.499751, + 38.501013, + 38.502270, + 38.503522, + 38.504769, + 38.506012, + 38.507250, + 38.508484, + 38.509712, + 38.510937, + 38.512156, + 38.513371, + 38.514582, + 38.515788, + 38.516990, + 38.518187, + 38.519380, + 38.520568, + 38.521752, + 38.522931, + 38.524106, + 38.525277, + 38.526444, + 38.527606, + 38.528764, + 38.529918, + 38.531067, + 38.532213, + 38.533354, + 38.534491, + 38.535623, + 38.536752, + 38.537877, + 38.538997, + 38.540114, + 38.541226, + 38.542334, + 38.543439, + 38.544539, + 38.545635, + 38.546728, + 38.547816, + 38.548901, + 38.549982, + 38.551059, + 38.552132, + 38.553201, + 38.554266, + 38.555328, + 38.556385, + 38.557439, + 38.558490, + 38.559536, + 38.560579, + 38.561618, + 38.562653, + 38.563685, + 38.564713, + 38.565738, + 38.566759, + 38.567776, + 38.568790, + 38.569800, + 38.570806, + 38.571810, + 38.572809, + 38.573805, + 38.574798, + 38.575787, + 38.576773, + 38.577755, + 38.578734, + 38.579709, + 38.580681, + 38.581650, + 38.582616, + 38.583578, + 38.584536, + 38.585492, + 38.586444, + 38.587393, + 38.588339, + 38.589281, + 38.590220, + 38.591156, + 38.592089, + 38.593018, + 38.593945, + 38.594868, + 38.595788, + 38.596705, + 38.597619, + 38.598529, + 38.599437, + 38.600342, + 38.601243, + 38.602142, + 38.603037, + 38.603930, + 38.604819, + 38.605706, + 38.606589, + 38.607470, + 38.608347, + 38.609222, + 38.610093, + 38.610962, + 38.611828, + 38.612691, + 38.613551, + 38.614409, + 38.615263, + 38.616115, + 38.616963, + 38.617809, + 38.618653, + 38.619493, + 38.620331, + 38.621165, + 38.621998, + 38.622827, + 38.623654, + 38.624478, + 38.625299, + 38.626117, + 38.626933, + 38.627746, + 38.628557, + 38.629365, + 38.630170, + 38.630973, + 38.631773, + 38.632570, + 38.633365, + 38.634158, + 38.634947, + 38.635734, + 38.636519, + 38.637301, + 38.638081, + 38.638858, + 38.639633, + 38.640405, + 38.641174, + 38.641941, + 38.642706, + 38.643468, + 38.644228, + 38.644986, + 38.645741, + 38.646493, + 38.647244, + 38.647991, + 38.648737, + 38.649480, + 38.650221, + 38.650959, + 38.651695, + 38.652429, + 38.653160, + 38.653889, + 38.654616, + 38.655341, + 38.656063, + 38.656783, + 38.657501, + 38.658216, + 38.658929, + 38.659640, + 38.660349, + 38.661056, + 38.661760, + 38.662462, + 38.663162, + 38.663860, + 38.664556, + 38.665249, + 38.665941, + 38.666630, + 38.667317, + 38.668002, + 38.668685, + 38.669366, + 38.670045, + 38.670721, + 38.671396, + 38.672068, + 38.672739, + 38.673407, + 38.674073, + 38.674737, + 38.675400, + 38.676060, + 38.676718, + 38.677374, + 38.678029, + 38.678681, + 38.679331, + 38.679979, + 38.680626, + 38.681270, + 38.681912, + 38.682553, + 38.683191, + 38.683828, + 38.684463, + 38.685096, + 38.685727, + 38.686356, + 38.686983, + 38.687608, + 38.688231, + 38.688853, + }, + {// The expectations for dimension = 79 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826666, + 7.041666, + 7.259998, + 7.481664, + 7.706661, + 7.934989, + 8.166648, + 8.401633, + 8.639943, + 8.881570, + 9.126508, + 9.374743, + 9.626259, + 9.881033, + 10.139033, + 10.400217, + 10.664529, + 10.931900, + 11.202244, + 11.475453, + 11.751401, + 12.029936, + 12.310884, + 12.594049, + 12.879208, + 13.166120, + 13.454522, + 13.744135, + 14.034669, + 14.325820, + 14.617283, + 14.908750, + 15.199915, + 15.490481, + 15.780159, + 16.068674, + 16.355765, + 16.641188, + 16.924718, + 17.206149, + 17.485290, + 17.761975, + 18.036051, + 18.307384, + 18.575859, + 18.841373, + 19.103840, + 19.363187, + 19.619352, + 19.872286, + 20.121950, + 20.368314, + 20.611356, + 20.851062, + 21.087426, + 21.320447, + 21.550130, + 21.776484, + 21.999525, + 22.219269, + 22.435738, + 22.648959, + 22.858957, + 23.065764, + 23.269410, + 23.469931, + 23.667361, + 23.861738, + 24.053099, + 24.241484, + 24.426933, + 24.609485, + 24.789183, + 24.966067, + 25.140179, + 25.311561, + 25.480256, + 25.646304, + 25.809749, + 25.970631, + 26.128993, + 26.284876, + 26.438321, + 26.589369, + 26.738061, + 26.884436, + 27.028533, + 27.170393, + 27.310054, + 27.447554, + 27.582931, + 27.716222, + 27.847464, + 27.976693, + 28.103944, + 28.229253, + 28.352654, + 28.474180, + 28.593866, + 28.711744, + 28.827847, + 28.942206, + 29.054852, + 29.165816, + 29.275128, + 29.382817, + 29.488913, + 29.593444, + 29.696438, + 29.797922, + 29.897923, + 29.996468, + 30.093582, + 30.189291, + 30.283621, + 30.376594, + 30.468236, + 30.558569, + 30.647617, + 30.735403, + 30.821948, + 30.907275, + 30.991404, + 31.074357, + 31.156155, + 31.236816, + 31.316361, + 31.394810, + 31.472180, + 31.548492, + 31.623762, + 31.698009, + 31.771250, + 31.843503, + 31.914784, + 31.985110, + 32.054497, + 32.122960, + 32.190516, + 32.257180, + 32.322966, + 32.387889, + 32.451964, + 32.515204, + 32.577624, + 32.639236, + 32.700056, + 32.760094, + 32.819364, + 32.877879, + 32.935651, + 32.992692, + 33.049014, + 33.104628, + 33.159546, + 33.213779, + 33.267338, + 33.320233, + 33.372476, + 33.424076, + 33.475044, + 33.525389, + 33.575122, + 33.624252, + 33.672788, + 33.720740, + 33.768117, + 33.814927, + 33.861179, + 33.906882, + 33.952045, + 33.996675, + 34.040781, + 34.084370, + 34.127451, + 34.170031, + 34.212118, + 34.253718, + 34.294840, + 34.335490, + 34.375676, + 34.415404, + 34.454681, + 34.493513, + 34.531908, + 34.569872, + 34.607410, + 34.644529, + 34.681236, + 34.717535, + 34.753434, + 34.788937, + 34.824051, + 34.858781, + 34.893131, + 34.927109, + 34.960719, + 34.993966, + 35.026855, + 35.059392, + 35.091581, + 35.123427, + 35.154934, + 35.186109, + 35.216954, + 35.247475, + 35.277676, + 35.307562, + 35.337136, + 35.366404, + 35.395368, + 35.424034, + 35.452405, + 35.480485, + 35.508278, + 35.535789, + 35.563020, + 35.589975, + 35.616659, + 35.643074, + 35.669224, + 35.695113, + 35.720744, + 35.746121, + 35.771246, + 35.796123, + 35.820755, + 35.845146, + 35.869298, + 35.893214, + 35.916899, + 35.940353, + 35.963581, + 35.986585, + 36.009369, + 36.031934, + 36.054283, + 36.076420, + 36.098347, + 36.120067, + 36.141581, + 36.162893, + 36.184006, + 36.204921, + 36.225641, + 36.246168, + 36.266506, + 36.286655, + 36.306619, + 36.326399, + 36.345998, + 36.365418, + 36.384661, + 36.403730, + 36.422625, + 36.441350, + 36.459907, + 36.478297, + 36.496522, + 36.514585, + 36.532487, + 36.550230, + 36.567816, + 36.585247, + 36.602524, + 36.619650, + 36.636625, + 36.653453, + 36.670134, + 36.686671, + 36.703064, + 36.719315, + 36.735427, + 36.751401, + 36.767238, + 36.782939, + 36.798507, + 36.813943, + 36.829247, + 36.844423, + 36.859471, + 36.874392, + 36.889189, + 36.903862, + 36.918412, + 36.932842, + 36.947152, + 36.961343, + 36.975418, + 36.989377, + 37.003221, + 37.016953, + 37.030572, + 37.044080, + 37.057479, + 37.070769, + 37.083952, + 37.097029, + 37.110001, + 37.122869, + 37.135634, + 37.148297, + 37.160860, + 37.173323, + 37.185687, + 37.197954, + 37.210124, + 37.222199, + 37.234179, + 37.246066, + 37.257860, + 37.269562, + 37.281174, + 37.292696, + 37.304129, + 37.315474, + 37.326732, + 37.337904, + 37.348991, + 37.359993, + 37.370911, + 37.381747, + 37.392501, + 37.403174, + 37.413766, + 37.424279, + 37.434713, + 37.445069, + 37.455348, + 37.465551, + 37.475677, + 37.485729, + 37.495707, + 37.505611, + 37.515443, + 37.525202, + 37.534890, + 37.544508, + 37.554055, + 37.563533, + 37.572943, + 37.582284, + 37.591559, + 37.600766, + 37.609907, + 37.618983, + 37.627995, + 37.636941, + 37.645825, + 37.654645, + 37.663403, + 37.672099, + 37.680734, + 37.689308, + 37.697822, + 37.706276, + 37.714672, + 37.723009, + 37.731288, + 37.739509, + 37.747674, + 37.755783, + 37.763835, + 37.771832, + 37.779775, + 37.787663, + 37.795497, + 37.803278, + 37.811006, + 37.818682, + 37.826305, + 37.833878, + 37.841399, + 37.848870, + 37.856290, + 37.863661, + 37.870983, + 37.878256, + 37.885480, + 37.892657, + 37.899786, + 37.906868, + 37.913904, + 37.920893, + 37.927836, + 37.934734, + 37.941587, + 37.948395, + 37.955159, + 37.961879, + 37.968555, + 37.975188, + 37.981778, + 37.988326, + 37.994832, + 38.001296, + 38.007719, + 38.014101, + 38.020442, + 38.026743, + 38.033004, + 38.039225, + 38.045407, + 38.051549, + 38.057654, + 38.063720, + 38.069747, + 38.075738, + 38.081690, + 38.087606, + 38.093485, + 38.099328, + 38.105134, + 38.110904, + 38.116639, + 38.122339, + 38.128003, + 38.133633, + 38.139229, + 38.144790, + 38.150317, + 38.155811, + 38.161272, + 38.166699, + 38.172094, + 38.177456, + 38.182785, + 38.188083, + 38.193349, + 38.198584, + 38.203787, + 38.208959, + 38.214100, + 38.219211, + 38.224292, + 38.229342, + 38.234363, + 38.239354, + 38.244316, + 38.249249, + 38.254152, + 38.259028, + 38.263874, + 38.268693, + 38.273483, + 38.278246, + 38.282981, + 38.287688, + 38.292369, + 38.297022, + 38.301649, + 38.306250, + 38.310823, + 38.315371, + 38.319893, + 38.324389, + 38.328860, + 38.333305, + 38.337725, + 38.342120, + 38.346490, + 38.350836, + 38.355157, + 38.359454, + 38.363727, + 38.367976, + 38.372201, + 38.376403, + 38.380581, + 38.384736, + 38.388869, + 38.392978, + 38.397065, + 38.401129, + 38.405171, + 38.409190, + 38.413188, + 38.417164, + 38.421118, + 38.425050, + 38.428962, + 38.432851, + 38.436720, + 38.440568, + 38.444395, + 38.448202, + 38.451988, + 38.455753, + 38.459499, + 38.463224, + 38.466930, + 38.470615, + 38.474281, + 38.477928, + 38.481555, + 38.485163, + 38.488752, + 38.492322, + 38.495873, + 38.499406, + 38.502920, + 38.506415, + 38.509893, + 38.513352, + 38.516793, + 38.520216, + 38.523621, + 38.527009, + 38.530379, + 38.533732, + 38.537067, + 38.540385, + 38.543686, + 38.546970, + 38.550238, + 38.553488, + 38.556722, + 38.559940, + 38.563141, + 38.566326, + 38.569494, + 38.572647, + 38.575784, + 38.578904, + 38.582009, + 38.585099, + 38.588173, + 38.591231, + 38.594274, + 38.597302, + 38.600315, + 38.603313, + 38.606296, + 38.609264, + 38.612217, + 38.615156, + 38.618080, + 38.620990, + 38.623885, + 38.626767, + 38.629634, + 38.632487, + 38.635326, + 38.638151, + 38.640962, + 38.643760, + 38.646544, + 38.649314, + 38.652071, + 38.654815, + 38.657545, + 38.660263, + 38.662967, + 38.665658, + 38.668336, + 38.671002, + 38.673655, + 38.676294, + 38.678922, + 38.681537, + 38.684139, + 38.686729, + 38.689307, + 38.691873, + 38.694426, + 38.696967, + 38.699497, + 38.702014, + 38.704520, + 38.707014, + 38.709496, + 38.711967, + 38.714426, + 38.716873, + 38.719310, + 38.721735, + 38.724148, + 38.726551, + 38.728942, + 38.731322, + 38.733692, + 38.736050, + 38.738398, + 38.740734, + 38.743061, + 38.745376, + 38.747681, + 38.749975, + 38.752259, + 38.754532, + 38.756796, + 38.759048, + 38.761291, + 38.763524, + 38.765746, + 38.767959, + 38.770161, + 38.772354, + 38.774536, + 38.776709, + 38.778872, + 38.781026, + 38.783170, + 38.785304, + 38.787429, + 38.789544, + 38.791651, + 38.793747, + 38.795835, + 38.797913, + 38.799982, + 38.802042, + 38.804093, + 38.806135, + 38.808167, + 38.810191, + 38.812207, + 38.814213, + 38.816211, + 38.818200, + 38.820180, + 38.822151, + 38.824115, + 38.826069, + 38.828015, + 38.829953, + 38.831883, + 38.833804, + 38.835716, + 38.837621, + 38.839518, + 38.841406, + 38.843286, + 38.845158, + 38.847023, + 38.848879, + 38.850728, + 38.852568, + 38.854401, + 38.856226, + 38.858043, + 38.859853, + 38.861655, + 38.863450, + 38.865237, + 38.867016, + 38.868788, + 38.870552, + 38.872310, + 38.874059, + 38.875802, + 38.877537, + 38.879265, + 38.880986, + 38.882700, + 38.884407, + 38.886106, + 38.887799, + 38.889485, + 38.891163, + 38.892835, + 38.894500, + 38.896158, + 38.897809, + 38.899454, + 38.901092, + 38.902723, + 38.904348, + 38.905965, + 38.907577, + 38.909182, + 38.910780, + 38.912372, + 38.913957, + 38.915536, + 38.917109, + 38.918675, + 38.920235, + 38.921789, + 38.923336, + 38.924878, + 38.926413, + 38.927942, + 38.929465, + 38.930982, + 38.932493, + 38.933998, + 38.935497, + 38.936990, + 38.938477, + 38.939958, + 38.941433, + 38.942903, + 38.944366, + 38.945824, + 38.947277, + 38.948723, + 38.950164, + 38.951599, + 38.953029, + 38.954453, + 38.955872, + 38.957285, + 38.958692, + 38.960094, + 38.961491, + 38.962882, + 38.964268, + 38.965649, + 38.967024, + 38.968394, + 38.969759, + 38.971118, + 38.972472, + 38.973821, + 38.975165, + 38.976504, + 38.977837, + 38.979166, + 38.980490, + 38.981808, + 38.983121, + 38.984430, + 38.985733, + 38.987032, + 38.988326, + 38.989614, + 38.990898, + 38.992177, + 38.993452, + 38.994721, + 38.995986, + 38.997246, + 38.998501, + 38.999752, + 39.000998, + 39.002239, + 39.003476, + 39.004708, + 39.005936, + 39.007159, + 39.008377, + 39.009591, + 39.010800, + 39.012005, + 39.013206, + 39.014402, + 39.015594, + 39.016781, + 39.017964, + 39.019143, + 39.020317, + 39.021487, + 39.022653, + 39.023815, + 39.024972, + 39.026125, + 39.027274, + 39.028419, + 39.029559, + 39.030696, + 39.031828, + 39.032956, + 39.034081, + 39.035201, + 39.036317, + 39.037429, + 39.038537, + 39.039641, + 39.040742, + 39.041838, + 39.042930, + 39.044019, + 39.045103, + 39.046184, + 39.047261, + 39.048334, + 39.049403, + 39.050469, + 39.051531, + 39.052588, + 39.053643, + 39.054693, + 39.055740, + 39.056783, + 39.057823, + 39.058858, + 39.059891, + 39.060919, + 39.061944, + 39.062965, + 39.063983, + 39.064998, + 39.066008, + 39.067016, + 39.068019, + 39.069020, + 39.070016, + 39.071010, + 39.072000, + 39.072986, + 39.073969, + 39.074949, + 39.075925, + 39.076898, + 39.077868, + 39.078834, + 39.079797, + 39.080757, + 39.081713, + 39.082666, + 39.083616, + 39.084563, + 39.085506, + 39.086447, + 39.087384, + 39.088318, + 39.089248, + 39.090176, + 39.091100, + 39.092021, + 39.092940, + 39.093855, + 39.094767, + 39.095676, + 39.096582, + 39.097485, + 39.098384, + 39.099281, + 39.100175, + 39.101066, + 39.101954, + 39.102839, + 39.103721, + 39.104600, + 39.105476, + 39.106349, + 39.107220, + 39.108087, + 39.108952, + 39.109813, + 39.110672, + 39.111528, + 39.112382, + 39.113232, + 39.114080, + 39.114924, + 39.115767, + 39.116606, + 39.117443, + 39.118276, + 39.119108, + 39.119936, + 39.120762, + 39.121585, + 39.122405, + 39.123223, + 39.124038, + 39.124850, + 39.125660, + 39.126467, + 39.127272, + 39.128074, + 39.128873, + 39.129670, + 39.130464, + 39.131256, + 39.132045, + 39.132832, + 39.133616, + 39.134398, + 39.135177, + 39.135954, + 39.136728, + 39.137499, + 39.138269, + 39.139036, + 39.139800, + 39.140562, + 39.141321, + 39.142079, + 39.142833, + 39.143586, + 39.144336, + 39.145083, + 39.145829, + 39.146572, + 39.147312, + 39.148050, + 39.148786, + 39.149520, + 39.150251, + 39.150981, + 39.151707, + 39.152432, + 39.153154, + 39.153874, + 39.154592, + 39.155308, + 39.156021, + 39.156732, + 39.157441, + 39.158148, + 39.158852, + 39.159555, + 39.160255, + 39.160953, + 39.161649, + 39.162343, + 39.163035, + 39.163724, + 39.164411, + 39.165097, + 39.165780, + 39.166461, + 39.167140, + 39.167817, + 39.168492, + 39.169165, + 39.169836, + 39.170505, + 39.171171, + 39.171836, + 39.172499, + 39.173160, + 39.173818, + 39.174475, + 39.175130, + 39.175783, + 39.176434, + 39.177083, + 39.177729, + 39.178374, + 39.179018, + 39.179659, + 39.180298, + 39.180935, + }, + {// The expectations for dimension = 80 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826666, + 7.041666, + 7.259999, + 7.481665, + 7.706663, + 7.934992, + 8.166653, + 8.401642, + 8.639958, + 8.881595, + 9.126547, + 9.374804, + 9.626353, + 9.881173, + 10.139239, + 10.400515, + 10.664952, + 10.932491, + 11.203055, + 11.476549, + 11.752857, + 12.031844, + 12.313349, + 12.597189, + 12.883155, + 13.171019, + 13.460530, + 13.751418, + 14.043401, + 14.336181, + 14.629455, + 14.922916, + 15.216259, + 15.509179, + 15.801384, + 16.092591, + 16.382530, + 16.670947, + 16.957607, + 17.242291, + 17.524801, + 17.804955, + 18.082593, + 18.357570, + 18.629758, + 18.899047, + 19.165342, + 19.428560, + 19.688633, + 19.945505, + 20.199129, + 20.449469, + 20.696498, + 20.940197, + 21.180556, + 21.417568, + 21.651235, + 21.881562, + 22.108562, + 22.332250, + 22.552644, + 22.769766, + 22.983644, + 23.194303, + 23.401775, + 23.606093, + 23.807290, + 24.005401, + 24.200465, + 24.392519, + 24.581602, + 24.767754, + 24.951015, + 25.131427, + 25.309030, + 25.483866, + 25.655977, + 25.825404, + 25.992190, + 26.156376, + 26.318004, + 26.477114, + 26.633750, + 26.787950, + 26.939756, + 27.089208, + 27.236346, + 27.381209, + 27.523835, + 27.664265, + 27.802535, + 27.938682, + 28.072745, + 28.204760, + 28.334761, + 28.462785, + 28.588867, + 28.713041, + 28.835340, + 28.955798, + 29.074448, + 29.191321, + 29.306448, + 29.419863, + 29.531593, + 29.641670, + 29.750123, + 29.856980, + 29.962270, + 30.066021, + 30.168261, + 30.269015, + 30.368310, + 30.466172, + 30.562626, + 30.657697, + 30.751410, + 30.843788, + 30.934854, + 31.024633, + 31.113146, + 31.200414, + 31.286461, + 31.371308, + 31.454974, + 31.537481, + 31.618849, + 31.699097, + 31.778244, + 31.856310, + 31.933313, + 32.009271, + 32.084202, + 32.158123, + 32.231052, + 32.303006, + 32.374000, + 32.444051, + 32.513175, + 32.581387, + 32.648703, + 32.715138, + 32.780705, + 32.845420, + 32.909297, + 32.972349, + 33.034589, + 33.096033, + 33.156691, + 33.216577, + 33.275704, + 33.334084, + 33.391729, + 33.448650, + 33.504860, + 33.560370, + 33.615190, + 33.669333, + 33.722808, + 33.775626, + 33.827798, + 33.879333, + 33.930242, + 33.980535, + 34.030220, + 34.079308, + 34.127808, + 34.175729, + 34.223079, + 34.269868, + 34.316104, + 34.361795, + 34.406950, + 34.451577, + 34.495684, + 34.539279, + 34.582369, + 34.624962, + 34.667065, + 34.708686, + 34.749831, + 34.790509, + 34.830725, + 34.870487, + 34.909800, + 34.948673, + 34.987110, + 35.025119, + 35.062706, + 35.099876, + 35.136636, + 35.172992, + 35.208949, + 35.244513, + 35.279689, + 35.314484, + 35.348902, + 35.382949, + 35.416630, + 35.449950, + 35.482915, + 35.515528, + 35.547795, + 35.579722, + 35.611311, + 35.642569, + 35.673499, + 35.704106, + 35.734395, + 35.764370, + 35.794035, + 35.823393, + 35.852451, + 35.881210, + 35.909677, + 35.937853, + 35.965743, + 35.993352, + 36.020682, + 36.047737, + 36.074522, + 36.101039, + 36.127291, + 36.153284, + 36.179019, + 36.204500, + 36.229730, + 36.254714, + 36.279453, + 36.303951, + 36.328210, + 36.352235, + 36.376028, + 36.399592, + 36.422930, + 36.446044, + 36.468938, + 36.491614, + 36.514075, + 36.536324, + 36.558363, + 36.580195, + 36.601822, + 36.623247, + 36.644472, + 36.665501, + 36.686334, + 36.706975, + 36.727426, + 36.747690, + 36.767767, + 36.787662, + 36.807375, + 36.826910, + 36.846267, + 36.865450, + 36.884460, + 36.903300, + 36.921971, + 36.940476, + 36.958816, + 36.976993, + 36.995010, + 37.012867, + 37.030568, + 37.048113, + 37.065504, + 37.082744, + 37.099834, + 37.116776, + 37.133571, + 37.150221, + 37.166728, + 37.183093, + 37.199318, + 37.215405, + 37.231355, + 37.247169, + 37.262850, + 37.278398, + 37.293816, + 37.309103, + 37.324263, + 37.339296, + 37.354204, + 37.368988, + 37.383650, + 37.398191, + 37.412611, + 37.426913, + 37.441098, + 37.455167, + 37.469121, + 37.482962, + 37.496690, + 37.510308, + 37.523815, + 37.537214, + 37.550505, + 37.563689, + 37.576769, + 37.589744, + 37.602616, + 37.615386, + 37.628055, + 37.640624, + 37.653094, + 37.665466, + 37.677742, + 37.689921, + 37.702006, + 37.713997, + 37.725895, + 37.737701, + 37.749416, + 37.761041, + 37.772577, + 37.784024, + 37.795384, + 37.806658, + 37.817846, + 37.828949, + 37.839968, + 37.850904, + 37.861758, + 37.872531, + 37.883222, + 37.893834, + 37.904367, + 37.914822, + 37.925199, + 37.935499, + 37.945723, + 37.955872, + 37.965947, + 37.975947, + 37.985875, + 37.995730, + 38.005514, + 38.015226, + 38.024868, + 38.034441, + 38.043944, + 38.053379, + 38.062747, + 38.072047, + 38.081281, + 38.090450, + 38.099553, + 38.108591, + 38.117566, + 38.126477, + 38.135326, + 38.144112, + 38.152837, + 38.161501, + 38.170104, + 38.178647, + 38.187131, + 38.195557, + 38.203924, + 38.212233, + 38.220485, + 38.228680, + 38.236819, + 38.244903, + 38.252931, + 38.260905, + 38.268825, + 38.276690, + 38.284503, + 38.292263, + 38.299971, + 38.307627, + 38.315231, + 38.322785, + 38.330288, + 38.337742, + 38.345145, + 38.352500, + 38.359806, + 38.367064, + 38.374274, + 38.381436, + 38.388552, + 38.395621, + 38.402643, + 38.409620, + 38.416552, + 38.423439, + 38.430281, + 38.437079, + 38.443832, + 38.450543, + 38.457210, + 38.463835, + 38.470417, + 38.476957, + 38.483456, + 38.489913, + 38.496329, + 38.502705, + 38.509041, + 38.515336, + 38.521592, + 38.527809, + 38.533986, + 38.540125, + 38.546226, + 38.552289, + 38.558314, + 38.564301, + 38.570252, + 38.576166, + 38.582043, + 38.587884, + 38.593690, + 38.599460, + 38.605194, + 38.610894, + 38.616558, + 38.622189, + 38.627785, + 38.633347, + 38.638876, + 38.644371, + 38.649834, + 38.655263, + 38.660660, + 38.666025, + 38.671357, + 38.676658, + 38.681928, + 38.687166, + 38.692373, + 38.697549, + 38.702694, + 38.707810, + 38.712895, + 38.717950, + 38.722976, + 38.727973, + 38.732940, + 38.737878, + 38.742788, + 38.747669, + 38.752522, + 38.757347, + 38.762144, + 38.766913, + 38.771655, + 38.776370, + 38.781058, + 38.785719, + 38.790353, + 38.794961, + 38.799543, + 38.804099, + 38.808629, + 38.813134, + 38.817613, + 38.822066, + 38.826495, + 38.830899, + 38.835279, + 38.839633, + 38.843964, + 38.848270, + 38.852553, + 38.856812, + 38.861047, + 38.865259, + 38.869447, + 38.873613, + 38.877755, + 38.881875, + 38.885972, + 38.890047, + 38.894100, + 38.898130, + 38.902139, + 38.906126, + 38.910091, + 38.914035, + 38.917957, + 38.921859, + 38.925739, + 38.929598, + 38.933437, + 38.937256, + 38.941053, + 38.944831, + 38.948589, + 38.952326, + 38.956044, + 38.959742, + 38.963420, + 38.967079, + 38.970719, + 38.974340, + 38.977941, + 38.981524, + 38.985088, + 38.988633, + 38.992160, + 38.995669, + 38.999159, + 39.002631, + 39.006085, + 39.009522, + 39.012940, + 39.016341, + 39.019725, + 39.023091, + 39.026439, + 39.029771, + 39.033086, + 39.036384, + 39.039665, + 39.042929, + 39.046177, + 39.049408, + 39.052623, + 39.055822, + 39.059004, + 39.062171, + 39.065321, + 39.068456, + 39.071575, + 39.074679, + 39.077767, + 39.080839, + 39.083897, + 39.086939, + 39.089966, + 39.092978, + 39.095975, + 39.098958, + 39.101925, + 39.104879, + 39.107817, + 39.110741, + 39.113651, + 39.116547, + 39.119429, + 39.122296, + 39.125150, + 39.127989, + 39.130815, + 39.133627, + 39.136426, + 39.139211, + 39.141983, + 39.144741, + 39.147487, + 39.150219, + 39.152938, + 39.155643, + 39.158336, + 39.161017, + 39.163684, + 39.166339, + 39.168981, + 39.171611, + 39.174228, + 39.176833, + 39.179425, + 39.182006, + 39.184574, + 39.187130, + 39.189675, + 39.192207, + 39.194727, + 39.197236, + 39.199733, + 39.202219, + 39.204693, + 39.207155, + 39.209606, + 39.212046, + 39.214475, + 39.216892, + 39.219298, + 39.221694, + 39.224078, + 39.226451, + 39.228814, + 39.231165, + 39.233506, + 39.235836, + 39.238156, + 39.240465, + 39.242764, + 39.245052, + 39.247330, + 39.249598, + 39.251856, + 39.254103, + 39.256340, + 39.258568, + 39.260785, + 39.262992, + 39.265190, + 39.267378, + 39.269556, + 39.271724, + 39.273883, + 39.276032, + 39.278171, + 39.280302, + 39.282422, + 39.284534, + 39.286636, + 39.288729, + 39.290813, + 39.292887, + 39.294953, + 39.297009, + 39.299057, + 39.301096, + 39.303125, + 39.305146, + 39.307159, + 39.309162, + 39.311157, + 39.313143, + 39.315121, + 39.317090, + 39.319051, + 39.321003, + 39.322947, + 39.324882, + 39.326810, + 39.328729, + 39.330640, + 39.332543, + 39.334437, + 39.336324, + 39.338203, + 39.340073, + 39.341936, + 39.343791, + 39.345638, + 39.347478, + 39.349309, + 39.351133, + 39.352950, + 39.354758, + 39.356559, + 39.358353, + 39.360139, + 39.361918, + 39.363689, + 39.365453, + 39.367210, + 39.368959, + 39.370701, + 39.372436, + 39.374164, + 39.375885, + 39.377599, + 39.379305, + 39.381005, + 39.382697, + 39.384383, + 39.386062, + 39.387734, + 39.389399, + 39.391058, + 39.392709, + 39.394354, + 39.395992, + 39.397624, + 39.399249, + 39.400868, + 39.402480, + 39.404085, + 39.405684, + 39.407277, + 39.408863, + 39.410443, + 39.412017, + 39.413584, + 39.415145, + 39.416700, + 39.418249, + 39.419791, + 39.421328, + 39.422858, + 39.424383, + 39.425901, + 39.427413, + 39.428919, + 39.430420, + 39.431914, + 39.433403, + 39.434886, + 39.436363, + 39.437834, + 39.439299, + 39.440759, + 39.442213, + 39.443662, + 39.445105, + 39.446542, + 39.447973, + 39.449400, + 39.450820, + 39.452235, + 39.453645, + 39.455049, + 39.456448, + 39.457841, + 39.459230, + 39.460612, + 39.461990, + 39.463362, + 39.464729, + 39.466091, + 39.467448, + 39.468799, + 39.470145, + 39.471487, + 39.472823, + 39.474154, + 39.475480, + 39.476801, + 39.478117, + 39.479428, + 39.480735, + 39.482036, + 39.483332, + 39.484624, + 39.485911, + 39.487193, + 39.488470, + 39.489742, + 39.491010, + 39.492273, + 39.493531, + 39.494785, + 39.496034, + 39.497278, + 39.498518, + 39.499753, + 39.500984, + 39.502210, + 39.503431, + 39.504648, + 39.505861, + 39.507069, + 39.508273, + 39.509472, + 39.510667, + 39.511858, + 39.513044, + 39.514226, + 39.515404, + 39.516578, + 39.517747, + 39.518912, + 39.520073, + 39.521229, + 39.522381, + 39.523530, + 39.524674, + 39.525814, + 39.526950, + 39.528082, + 39.529209, + 39.530333, + 39.531453, + 39.532569, + 39.533680, + 39.534788, + 39.535892, + 39.536992, + 39.538088, + 39.539180, + 39.540269, + 39.541353, + 39.542434, + 39.543511, + 39.544584, + 39.545653, + 39.546718, + 39.547780, + 39.548838, + 39.549893, + 39.550943, + 39.551990, + 39.553034, + 39.554073, + 39.555109, + 39.556142, + 39.557171, + 39.558196, + 39.559218, + 39.560236, + 39.561251, + 39.562262, + 39.563270, + 39.564274, + 39.565275, + 39.566272, + 39.567266, + 39.568257, + 39.569244, + 39.570227, + 39.571208, + 39.572185, + 39.573159, + 39.574129, + 39.575096, + 39.576060, + 39.577020, + 39.577978, + 39.578932, + 39.579883, + 39.580830, + 39.581775, + 39.582716, + 39.583654, + 39.584589, + 39.585521, + 39.586449, + 39.587375, + 39.588297, + 39.589216, + 39.590133, + 39.591046, + 39.591956, + 39.592863, + 39.593767, + 39.594668, + 39.595566, + 39.596462, + 39.597354, + 39.598243, + 39.599129, + 39.600013, + 39.600893, + 39.601770, + 39.602645, + 39.603517, + 39.604386, + 39.605252, + 39.606115, + 39.606975, + 39.607833, + 39.608688, + 39.609540, + 39.610389, + 39.611235, + 39.612079, + 39.612920, + 39.613758, + 39.614594, + 39.615427, + 39.616257, + 39.617084, + 39.617909, + 39.618731, + 39.619551, + 39.620367, + 39.621182, + 39.621993, + 39.622802, + 39.623608, + 39.624412, + 39.625214, + 39.626012, + 39.626808, + 39.627602, + 39.628393, + 39.629182, + 39.629968, + 39.630751, + 39.631532, + 39.632311, + 39.633087, + 39.633861, + 39.634632, + 39.635401, + 39.636167, + 39.636931, + 39.637693, + 39.638452, + 39.639209, + 39.639963, + 39.640715, + 39.641465, + 39.642212, + 39.642957, + 39.643700, + 39.644440, + 39.645179, + 39.645914, + 39.646648, + 39.647379, + 39.648108, + 39.648835, + 39.649559, + 39.650282, + 39.651002, + 39.651719, + 39.652435, + 39.653148, + 39.653860, + 39.654569, + 39.655275, + 39.655980, + 39.656683, + 39.657383, + 39.658081, + 39.658777, + 39.659471, + 39.660163, + 39.660853, + 39.661541, + 39.662226, + 39.662910, + 39.663591, + 39.664271, + 39.664948, + 39.665623, + 39.666296, + 39.666968, + 39.667637, + 39.668304, + 39.668969, + 39.669632, + 39.670293, + 39.670953, + 39.671610, + 39.672265, + 39.672918, + }, + {// The expectations for dimension = 81 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826666, + 7.041666, + 7.259999, + 7.481665, + 7.706664, + 7.934995, + 8.166657, + 8.401649, + 8.639969, + 8.881613, + 9.126577, + 9.374851, + 9.626426, + 9.881284, + 10.139404, + 10.400755, + 10.665297, + 10.932977, + 11.203728, + 11.477466, + 11.754088, + 12.033470, + 12.315465, + 12.599905, + 12.886595, + 13.175319, + 13.465839, + 13.757896, + 14.051215, + 14.345507, + 14.640474, + 14.935809, + 15.231206, + 15.526362, + 15.820975, + 16.114759, + 16.407435, + 16.698740, + 16.988429, + 17.276272, + 17.562060, + 17.845602, + 18.126724, + 18.405272, + 18.681108, + 18.954112, + 19.224178, + 19.491218, + 19.755154, + 20.015921, + 20.273467, + 20.527750, + 20.778737, + 21.026403, + 21.270732, + 21.511715, + 21.749349, + 21.983636, + 22.214583, + 22.442204, + 22.666514, + 22.887533, + 23.105284, + 23.319795, + 23.531092, + 23.739207, + 23.944172, + 24.146022, + 24.344793, + 24.540521, + 24.733246, + 24.923005, + 25.109838, + 25.293787, + 25.474891, + 25.653191, + 25.828730, + 26.001549, + 26.171689, + 26.339192, + 26.504099, + 26.666452, + 26.826291, + 26.983659, + 27.138595, + 27.291140, + 27.441333, + 27.589215, + 27.734824, + 27.878200, + 28.019379, + 28.158401, + 28.295302, + 28.430119, + 28.562888, + 28.693645, + 28.822426, + 28.949264, + 29.074194, + 29.197250, + 29.318464, + 29.437869, + 29.555496, + 29.671378, + 29.785545, + 29.898027, + 30.008854, + 30.118055, + 30.225660, + 30.331695, + 30.436190, + 30.539170, + 30.640663, + 30.740695, + 30.839292, + 30.936478, + 31.032279, + 31.126718, + 31.219820, + 31.311608, + 31.402104, + 31.491332, + 31.579313, + 31.666069, + 31.751621, + 31.835990, + 31.919196, + 32.001259, + 32.082199, + 32.162035, + 32.240786, + 32.318470, + 32.395106, + 32.470712, + 32.545303, + 32.618899, + 32.691516, + 32.763169, + 32.833876, + 32.903651, + 32.972511, + 33.040471, + 33.107545, + 33.173749, + 33.239096, + 33.303601, + 33.367278, + 33.430139, + 33.492199, + 33.553470, + 33.613965, + 33.673696, + 33.732677, + 33.790919, + 33.848433, + 33.905232, + 33.961326, + 34.016728, + 34.071448, + 34.125496, + 34.178884, + 34.231621, + 34.283719, + 34.335186, + 34.386032, + 34.436268, + 34.485903, + 34.534945, + 34.583405, + 34.631290, + 34.678610, + 34.725374, + 34.771589, + 34.817264, + 34.862408, + 34.907027, + 34.951131, + 34.994727, + 35.037821, + 35.080423, + 35.122539, + 35.164176, + 35.205341, + 35.246041, + 35.286283, + 35.326075, + 35.365421, + 35.404329, + 35.442805, + 35.480855, + 35.518486, + 35.555703, + 35.592512, + 35.628919, + 35.664930, + 35.700551, + 35.735786, + 35.770642, + 35.805123, + 35.839235, + 35.872983, + 35.906372, + 35.939407, + 35.972093, + 36.004435, + 36.036437, + 36.068104, + 36.099441, + 36.130452, + 36.161142, + 36.191515, + 36.221574, + 36.251325, + 36.280772, + 36.309918, + 36.338768, + 36.367325, + 36.395594, + 36.423577, + 36.451280, + 36.478706, + 36.505857, + 36.532739, + 36.559354, + 36.585705, + 36.611797, + 36.637633, + 36.663215, + 36.688547, + 36.713633, + 36.738475, + 36.763077, + 36.787441, + 36.811571, + 36.835469, + 36.859139, + 36.882583, + 36.905805, + 36.928806, + 36.951590, + 36.974159, + 36.996516, + 37.018663, + 37.040604, + 37.062341, + 37.083876, + 37.105211, + 37.126349, + 37.147293, + 37.168045, + 37.188607, + 37.208981, + 37.229170, + 37.249176, + 37.269000, + 37.288646, + 37.308115, + 37.327410, + 37.346532, + 37.365484, + 37.384267, + 37.402883, + 37.421335, + 37.439624, + 37.457753, + 37.475722, + 37.493534, + 37.511191, + 37.528694, + 37.546046, + 37.563248, + 37.580301, + 37.597207, + 37.613969, + 37.630587, + 37.647063, + 37.663399, + 37.679597, + 37.695658, + 37.711583, + 37.727374, + 37.743032, + 37.758559, + 37.773957, + 37.789227, + 37.804370, + 37.819387, + 37.834280, + 37.849051, + 37.863700, + 37.878229, + 37.892640, + 37.906933, + 37.921110, + 37.935171, + 37.949119, + 37.962955, + 37.976679, + 37.990293, + 38.003798, + 38.017195, + 38.030486, + 38.043671, + 38.056751, + 38.069728, + 38.082603, + 38.095377, + 38.108050, + 38.120624, + 38.133100, + 38.145479, + 38.157762, + 38.169950, + 38.182043, + 38.194044, + 38.205952, + 38.217768, + 38.229495, + 38.241131, + 38.252680, + 38.264140, + 38.275514, + 38.286802, + 38.298004, + 38.309123, + 38.320158, + 38.331110, + 38.341981, + 38.352770, + 38.363480, + 38.374110, + 38.384661, + 38.395135, + 38.405532, + 38.415852, + 38.426097, + 38.436267, + 38.446362, + 38.456385, + 38.466334, + 38.476212, + 38.486018, + 38.495753, + 38.505419, + 38.515015, + 38.524543, + 38.534003, + 38.543395, + 38.552720, + 38.561980, + 38.571174, + 38.580303, + 38.589367, + 38.598369, + 38.607307, + 38.616182, + 38.624996, + 38.633748, + 38.642439, + 38.651071, + 38.659642, + 38.668155, + 38.676609, + 38.685004, + 38.693343, + 38.701624, + 38.709849, + 38.718018, + 38.726131, + 38.734189, + 38.742193, + 38.750143, + 38.758039, + 38.765883, + 38.773673, + 38.781412, + 38.789099, + 38.796735, + 38.804320, + 38.811855, + 38.819339, + 38.826775, + 38.834162, + 38.841500, + 38.848789, + 38.856032, + 38.863226, + 38.870374, + 38.877476, + 38.884531, + 38.891541, + 38.898505, + 38.905425, + 38.912300, + 38.919130, + 38.925917, + 38.932661, + 38.939362, + 38.946019, + 38.952635, + 38.959209, + 38.965741, + 38.972231, + 38.978681, + 38.985091, + 38.991460, + 38.997789, + 39.004078, + 39.010329, + 39.016540, + 39.022713, + 39.028848, + 39.034944, + 39.041003, + 39.047025, + 39.053010, + 39.058957, + 39.064869, + 39.070744, + 39.076584, + 39.082387, + 39.088156, + 39.093890, + 39.099589, + 39.105253, + 39.110883, + 39.116480, + 39.122043, + 39.127572, + 39.133068, + 39.138532, + 39.143963, + 39.149362, + 39.154728, + 39.160063, + 39.165367, + 39.170639, + 39.175880, + 39.181090, + 39.186270, + 39.191419, + 39.196538, + 39.201627, + 39.206687, + 39.211717, + 39.216719, + 39.221691, + 39.226634, + 39.231549, + 39.236436, + 39.241294, + 39.246125, + 39.250928, + 39.255704, + 39.260452, + 39.265173, + 39.269868, + 39.274536, + 39.279177, + 39.283793, + 39.288382, + 39.292945, + 39.297483, + 39.301995, + 39.306482, + 39.310944, + 39.315381, + 39.319794, + 39.324182, + 39.328545, + 39.332885, + 39.337200, + 39.341491, + 39.345759, + 39.350004, + 39.354225, + 39.358423, + 39.362598, + 39.366751, + 39.370880, + 39.374988, + 39.379073, + 39.383135, + 39.387176, + 39.391195, + 39.395193, + 39.399169, + 39.403123, + 39.407056, + 39.410969, + 39.414860, + 39.418731, + 39.422581, + 39.426410, + 39.430220, + 39.434009, + 39.437778, + 39.441527, + 39.445256, + 39.448966, + 39.452656, + 39.456327, + 39.459979, + 39.463612, + 39.467225, + 39.470820, + 39.474397, + 39.477954, + 39.481494, + 39.485014, + 39.488517, + 39.492002, + 39.495469, + 39.498918, + 39.502349, + 39.505763, + 39.509159, + 39.512538, + 39.515900, + 39.519245, + 39.522573, + 39.525884, + 39.529178, + 39.532455, + 39.535716, + 39.538961, + 39.542189, + 39.545401, + 39.548597, + 39.551777, + 39.554942, + 39.558090, + 39.561223, + 39.564340, + 39.567442, + 39.570528, + 39.573599, + 39.576655, + 39.579696, + 39.582722, + 39.585733, + 39.588729, + 39.591711, + 39.594678, + 39.597630, + 39.600569, + 39.603493, + 39.606402, + 39.609298, + 39.612180, + 39.615047, + 39.617901, + 39.620741, + 39.623568, + 39.626381, + 39.629180, + 39.631966, + 39.634739, + 39.637498, + 39.640244, + 39.642978, + 39.645698, + 39.648405, + 39.651100, + 39.653782, + 39.656451, + 39.659107, + 39.661751, + 39.664383, + 39.667002, + 39.669609, + 39.672204, + 39.674787, + 39.677358, + 39.679916, + 39.682463, + 39.684998, + 39.687521, + 39.690033, + 39.692533, + 39.695022, + 39.697499, + 39.699964, + 39.702419, + 39.704862, + 39.707293, + 39.709714, + 39.712124, + 39.714523, + 39.716911, + 39.719287, + 39.721654, + 39.724009, + 39.726354, + 39.728688, + 39.731012, + 39.733325, + 39.735628, + 39.737921, + 39.740203, + 39.742475, + 39.744737, + 39.746989, + 39.749230, + 39.751462, + 39.753684, + 39.755896, + 39.758098, + 39.760291, + 39.762473, + 39.764647, + 39.766810, + 39.768964, + 39.771109, + 39.773244, + 39.775370, + 39.777486, + 39.779594, + 39.781692, + 39.783781, + 39.785861, + 39.787932, + 39.789994, + 39.792047, + 39.794091, + 39.796126, + 39.798153, + 39.800170, + 39.802180, + 39.804180, + 39.806172, + 39.808155, + 39.810130, + 39.812097, + 39.814055, + 39.816005, + 39.817946, + 39.819880, + 39.821805, + 39.823722, + 39.825631, + 39.827531, + 39.829424, + 39.831309, + 39.833186, + 39.835055, + 39.836916, + 39.838769, + 39.840615, + 39.842453, + 39.844283, + 39.846106, + 39.847921, + 39.849729, + 39.851529, + 39.853321, + 39.855107, + 39.856884, + 39.858655, + 39.860418, + 39.862174, + 39.863923, + 39.865665, + 39.867399, + 39.869126, + 39.870847, + 39.872560, + 39.874266, + 39.875966, + 39.877658, + 39.879344, + 39.881023, + 39.882695, + 39.884360, + 39.886019, + 39.887670, + 39.889316, + 39.890954, + 39.892586, + 39.894212, + 39.895831, + 39.897443, + 39.899049, + 39.900649, + 39.902242, + 39.903829, + 39.905410, + 39.906985, + 39.908553, + 39.910115, + 39.911671, + 39.913220, + 39.914764, + 39.916301, + 39.917833, + 39.919358, + 39.920878, + 39.922391, + 39.923899, + 39.925401, + 39.926896, + 39.928386, + 39.929871, + 39.931349, + 39.932822, + 39.934289, + 39.935750, + 39.937206, + 39.938656, + 39.940101, + 39.941540, + 39.942973, + 39.944401, + 39.945823, + 39.947240, + 39.948652, + 39.950058, + 39.951459, + 39.952855, + 39.954245, + 39.955630, + 39.957009, + 39.958384, + 39.959753, + 39.961117, + 39.962476, + 39.963830, + 39.965178, + 39.966522, + 39.967860, + 39.969194, + 39.970522, + 39.971846, + 39.973165, + 39.974478, + 39.975787, + 39.977091, + 39.978390, + 39.979684, + 39.980974, + 39.982258, + 39.983538, + 39.984813, + 39.986084, + 39.987349, + 39.988610, + 39.989867, + 39.991119, + 39.992366, + 39.993609, + 39.994847, + 39.996080, + 39.997309, + 39.998534, + 39.999754, + 40.000970, + 40.002181, + 40.003388, + 40.004590, + 40.005788, + 40.006982, + 40.008172, + 40.009357, + 40.010538, + 40.011714, + 40.012887, + 40.014055, + 40.015219, + 40.016379, + 40.017535, + 40.018686, + 40.019834, + 40.020977, + 40.022116, + 40.023252, + 40.024383, + 40.025510, + 40.026633, + 40.027752, + 40.028868, + 40.029979, + 40.031086, + 40.032190, + 40.033289, + 40.034385, + 40.035477, + 40.036565, + 40.037649, + 40.038730, + 40.039806, + 40.040879, + 40.041948, + 40.043014, + 40.044076, + 40.045134, + 40.046188, + 40.047239, + 40.048286, + 40.049329, + 40.050369, + 40.051405, + 40.052438, + 40.053467, + 40.054493, + 40.055515, + 40.056533, + 40.057548, + 40.058560, + 40.059568, + 40.060573, + 40.061574, + 40.062572, + 40.063566, + 40.064557, + 40.065545, + 40.066529, + 40.067510, + 40.068488, + 40.069462, + 40.070433, + 40.071401, + 40.072366, + 40.073327, + 40.074285, + 40.075240, + 40.076191, + 40.077140, + 40.078085, + 40.079027, + 40.079966, + 40.080902, + 40.081835, + 40.082764, + 40.083691, + 40.084614, + 40.085534, + 40.086452, + 40.087366, + 40.088277, + 40.089185, + 40.090091, + 40.090993, + 40.091892, + 40.092788, + 40.093682, + 40.094572, + 40.095460, + 40.096344, + 40.097226, + 40.098105, + 40.098981, + 40.099854, + 40.100724, + 40.101591, + 40.102456, + 40.103318, + 40.104177, + 40.105033, + 40.105886, + 40.106737, + 40.107585, + 40.108430, + 40.109273, + 40.110112, + 40.110950, + 40.111784, + 40.112616, + 40.113445, + 40.114271, + 40.115095, + 40.115916, + 40.116734, + 40.117550, + 40.118363, + 40.119174, + 40.119982, + 40.120788, + 40.121591, + 40.122391, + 40.123189, + 40.123984, + 40.124777, + 40.125567, + 40.126355, + 40.127141, + 40.127924, + 40.128704, + 40.129482, + 40.130257, + 40.131031, + 40.131801, + 40.132570, + 40.133335, + 40.134099, + 40.134860, + 40.135619, + 40.136375, + 40.137129, + 40.137881, + 40.138630, + 40.139377, + 40.140122, + 40.140865, + 40.141605, + 40.142343, + 40.143078, + 40.143812, + 40.144543, + 40.145271, + 40.145998, + 40.146722, + 40.147444, + 40.148164, + 40.148882, + 40.149598, + 40.150311, + 40.151022, + 40.151731, + 40.152438, + 40.153143, + 40.153845, + 40.154546, + 40.155244, + 40.155940, + 40.156634, + 40.157326, + 40.158016, + 40.158704, + 40.159390, + 40.160074, + 40.160755, + 40.161435, + 40.162112, + 40.162788, + 40.163461, + 40.164133, + 40.164802, + }, + {// The expectations for dimension = 82 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041666, + 7.260000, + 7.481666, + 7.706665, + 7.934996, + 8.166660, + 8.401654, + 8.639977, + 8.881627, + 9.126599, + 9.374887, + 9.626482, + 9.881371, + 10.139535, + 10.400948, + 10.665576, + 10.933375, + 11.204284, + 11.478231, + 11.755123, + 12.034849, + 12.317275, + 12.602247, + 12.889583, + 13.179082, + 13.470516, + 13.763641, + 14.058190, + 14.353882, + 14.650424, + 14.947514, + 15.244848, + 15.542118, + 15.839023, + 16.135268, + 16.430569, + 16.724655, + 17.017271, + 17.308176, + 17.597152, + 17.883995, + 18.168521, + 18.450566, + 18.729981, + 19.006637, + 19.280418, + 19.551226, + 19.818976, + 20.083596, + 20.345025, + 20.603216, + 20.858128, + 21.109733, + 21.358008, + 21.602940, + 21.844522, + 22.082751, + 22.317632, + 22.549174, + 22.777391, + 23.002299, + 23.223920, + 23.442277, + 23.657397, + 23.869309, + 24.078043, + 24.283634, + 24.486115, + 24.685523, + 24.881894, + 25.075267, + 25.265681, + 25.453174, + 25.637789, + 25.819564, + 25.998542, + 26.174764, + 26.348270, + 26.519102, + 26.687301, + 26.852910, + 27.015968, + 27.176518, + 27.334599, + 27.490251, + 27.643516, + 27.794432, + 27.943040, + 28.089377, + 28.233483, + 28.375395, + 28.515151, + 28.652787, + 28.788341, + 28.921849, + 29.053345, + 29.182865, + 29.310443, + 29.436113, + 29.559909, + 29.681863, + 29.802008, + 29.920375, + 30.036995, + 30.151900, + 30.265119, + 30.376682, + 30.486618, + 30.594955, + 30.701722, + 30.806946, + 30.910654, + 31.012873, + 31.113629, + 31.212947, + 31.310852, + 31.407370, + 31.502523, + 31.596337, + 31.688834, + 31.780037, + 31.869968, + 31.958649, + 32.046103, + 32.132349, + 32.217409, + 32.301304, + 32.384052, + 32.465674, + 32.546188, + 32.625614, + 32.703970, + 32.781274, + 32.857544, + 32.932797, + 33.007050, + 33.080320, + 33.152624, + 33.223977, + 33.294396, + 33.363895, + 33.432490, + 33.500196, + 33.567028, + 33.632999, + 33.698125, + 33.762418, + 33.825892, + 33.888561, + 33.950437, + 34.011534, + 34.071863, + 34.131437, + 34.190269, + 34.248370, + 34.305751, + 34.362424, + 34.418401, + 34.473691, + 34.528307, + 34.582258, + 34.635555, + 34.688209, + 34.740228, + 34.791623, + 34.842403, + 34.892579, + 34.942159, + 34.991152, + 35.039567, + 35.087414, + 35.134700, + 35.181434, + 35.227624, + 35.273280, + 35.318408, + 35.363016, + 35.407113, + 35.450705, + 35.493801, + 35.536407, + 35.578531, + 35.620179, + 35.661360, + 35.702079, + 35.742344, + 35.782160, + 35.821535, + 35.860474, + 35.898984, + 35.937072, + 35.974742, + 36.012002, + 36.048856, + 36.085311, + 36.121372, + 36.157045, + 36.192335, + 36.227247, + 36.261787, + 36.295960, + 36.329771, + 36.363225, + 36.396327, + 36.429082, + 36.461494, + 36.493569, + 36.525310, + 36.556722, + 36.587810, + 36.618578, + 36.649030, + 36.679171, + 36.709004, + 36.738535, + 36.767766, + 36.796702, + 36.825347, + 36.853704, + 36.881777, + 36.909571, + 36.937088, + 36.964332, + 36.991307, + 37.018016, + 37.044463, + 37.070651, + 37.096583, + 37.122263, + 37.147694, + 37.172879, + 37.197821, + 37.222523, + 37.246988, + 37.271219, + 37.295220, + 37.318992, + 37.342539, + 37.365864, + 37.388969, + 37.411858, + 37.434532, + 37.456994, + 37.479247, + 37.501294, + 37.523137, + 37.544778, + 37.566221, + 37.587466, + 37.608517, + 37.629377, + 37.650046, + 37.670529, + 37.690826, + 37.710940, + 37.730873, + 37.750628, + 37.770206, + 37.789609, + 37.808840, + 37.827901, + 37.846793, + 37.865519, + 37.884080, + 37.902478, + 37.920716, + 37.938794, + 37.956716, + 37.974482, + 37.992094, + 38.009555, + 38.026866, + 38.044028, + 38.061044, + 38.077914, + 38.094641, + 38.111226, + 38.127671, + 38.143977, + 38.160146, + 38.176179, + 38.192078, + 38.207845, + 38.223480, + 38.238986, + 38.254363, + 38.269613, + 38.284737, + 38.299738, + 38.314615, + 38.329371, + 38.344007, + 38.358524, + 38.372923, + 38.387205, + 38.401373, + 38.415426, + 38.429367, + 38.443196, + 38.456915, + 38.470524, + 38.484026, + 38.497421, + 38.510709, + 38.523893, + 38.536974, + 38.549951, + 38.562828, + 38.575604, + 38.588280, + 38.600858, + 38.613339, + 38.625723, + 38.638012, + 38.650206, + 38.662307, + 38.674315, + 38.686232, + 38.698058, + 38.709794, + 38.721442, + 38.733001, + 38.744473, + 38.755859, + 38.767160, + 38.778376, + 38.789508, + 38.800558, + 38.811525, + 38.822411, + 38.833217, + 38.843943, + 38.854590, + 38.865159, + 38.875651, + 38.886066, + 38.896405, + 38.906668, + 38.916858, + 38.926974, + 38.937016, + 38.946987, + 38.956885, + 38.966713, + 38.976470, + 38.986158, + 38.995777, + 39.005327, + 39.014810, + 39.024226, + 39.033575, + 39.042859, + 39.052077, + 39.061231, + 39.070321, + 39.079347, + 39.088311, + 39.097212, + 39.106052, + 39.114830, + 39.123548, + 39.132206, + 39.140805, + 39.149345, + 39.157826, + 39.166250, + 39.174616, + 39.182925, + 39.191178, + 39.199375, + 39.207517, + 39.215605, + 39.223638, + 39.231617, + 39.239542, + 39.247415, + 39.255236, + 39.263004, + 39.270721, + 39.278387, + 39.286002, + 39.293568, + 39.301083, + 39.308549, + 39.315967, + 39.323336, + 39.330656, + 39.337930, + 39.345156, + 39.352335, + 39.359468, + 39.366555, + 39.373596, + 39.380593, + 39.387544, + 39.394451, + 39.401314, + 39.408133, + 39.414908, + 39.421641, + 39.428332, + 39.434980, + 39.441586, + 39.448150, + 39.454673, + 39.461156, + 39.467598, + 39.474000, + 39.480362, + 39.486684, + 39.492967, + 39.499212, + 39.505418, + 39.511585, + 39.517715, + 39.523807, + 39.529861, + 39.535879, + 39.541860, + 39.547805, + 39.553713, + 39.559586, + 39.565423, + 39.571225, + 39.576992, + 39.582724, + 39.588421, + 39.594085, + 39.599715, + 39.605311, + 39.610874, + 39.616403, + 39.621900, + 39.627364, + 39.632797, + 39.638196, + 39.643565, + 39.648901, + 39.654207, + 39.659481, + 39.664724, + 39.669937, + 39.675120, + 39.680272, + 39.685395, + 39.690487, + 39.695551, + 39.700585, + 39.705590, + 39.710567, + 39.715515, + 39.720435, + 39.725326, + 39.730190, + 39.735026, + 39.739834, + 39.744616, + 39.749370, + 39.754097, + 39.758798, + 39.763472, + 39.768120, + 39.772742, + 39.777338, + 39.781908, + 39.786453, + 39.790973, + 39.795467, + 39.799937, + 39.804382, + 39.808802, + 39.813198, + 39.817569, + 39.821917, + 39.826241, + 39.830541, + 39.834818, + 39.839071, + 39.843301, + 39.847508, + 39.851692, + 39.855854, + 39.859993, + 39.864110, + 39.868204, + 39.872277, + 39.876327, + 39.880356, + 39.884364, + 39.888350, + 39.892315, + 39.896258, + 39.900181, + 39.904083, + 39.907964, + 39.911825, + 39.915665, + 39.919485, + 39.923285, + 39.927065, + 39.930825, + 39.934566, + 39.938287, + 39.941989, + 39.945671, + 39.949334, + 39.952979, + 39.956604, + 39.960211, + 39.963799, + 39.967368, + 39.970919, + 39.974452, + 39.977967, + 39.981464, + 39.984943, + 39.988404, + 39.991848, + 39.995274, + 39.998683, + 40.002074, + 40.005449, + 40.008806, + 40.012146, + 40.015470, + 40.018777, + 40.022067, + 40.025341, + 40.028598, + 40.031840, + 40.035065, + 40.038274, + 40.041467, + 40.044644, + 40.047805, + 40.050951, + 40.054082, + 40.057197, + 40.060296, + 40.063381, + 40.066450, + 40.069504, + 40.072543, + 40.075568, + 40.078578, + 40.081573, + 40.084553, + 40.087520, + 40.090471, + 40.093409, + 40.096332, + 40.099242, + 40.102137, + 40.105018, + 40.107886, + 40.110740, + 40.113580, + 40.116407, + 40.119220, + 40.122020, + 40.124806, + 40.127580, + 40.130340, + 40.133087, + 40.135821, + 40.138542, + 40.141251, + 40.143947, + 40.146630, + 40.149300, + 40.151958, + 40.154604, + 40.157238, + 40.159859, + 40.162468, + 40.165064, + 40.167649, + 40.170222, + 40.172783, + 40.175332, + 40.177869, + 40.180395, + 40.182909, + 40.185412, + 40.187903, + 40.190383, + 40.192851, + 40.195309, + 40.197755, + 40.200190, + 40.202613, + 40.205026, + 40.207428, + 40.209819, + 40.212200, + 40.214570, + 40.216929, + 40.219277, + 40.221615, + 40.223942, + 40.226259, + 40.228566, + 40.230862, + 40.233149, + 40.235425, + 40.237691, + 40.239947, + 40.242193, + 40.244429, + 40.246655, + 40.248871, + 40.251078, + 40.253275, + 40.255462, + 40.257640, + 40.259808, + 40.261967, + 40.264116, + 40.266256, + 40.268386, + 40.270508, + 40.272620, + 40.274723, + 40.276817, + 40.278902, + 40.280978, + 40.283045, + 40.285103, + 40.287153, + 40.289193, + 40.291225, + 40.293248, + 40.295263, + 40.297269, + 40.299266, + 40.301255, + 40.303235, + 40.305207, + 40.307171, + 40.309126, + 40.311074, + 40.313013, + 40.314943, + 40.316866, + 40.318781, + 40.320687, + 40.322586, + 40.324477, + 40.326360, + 40.328234, + 40.330102, + 40.331961, + 40.333813, + 40.335657, + 40.337493, + 40.339322, + 40.341143, + 40.342957, + 40.344763, + 40.346562, + 40.348353, + 40.350138, + 40.351914, + 40.353684, + 40.355446, + 40.357201, + 40.358949, + 40.360690, + 40.362424, + 40.364151, + 40.365871, + 40.367584, + 40.369290, + 40.370989, + 40.372681, + 40.374366, + 40.376045, + 40.377717, + 40.379382, + 40.381040, + 40.382692, + 40.384338, + 40.385976, + 40.387609, + 40.389234, + 40.390854, + 40.392466, + 40.394073, + 40.395673, + 40.397267, + 40.398854, + 40.400436, + 40.402011, + 40.403580, + 40.405142, + 40.406699, + 40.408249, + 40.409794, + 40.411332, + 40.412865, + 40.414391, + 40.415912, + 40.417426, + 40.418935, + 40.420438, + 40.421935, + 40.423426, + 40.424912, + 40.426391, + 40.427866, + 40.429334, + 40.430797, + 40.432254, + 40.433706, + 40.435152, + 40.436592, + 40.438027, + 40.439457, + 40.440881, + 40.442300, + 40.443713, + 40.445121, + 40.446524, + 40.447921, + 40.449313, + 40.450700, + 40.452082, + 40.453458, + 40.454829, + 40.456195, + 40.457556, + 40.458912, + 40.460263, + 40.461609, + 40.462950, + 40.464285, + 40.465616, + 40.466942, + 40.468263, + 40.469579, + 40.470890, + 40.472196, + 40.473498, + 40.474794, + 40.476086, + 40.477374, + 40.478656, + 40.479934, + 40.481207, + 40.482475, + 40.483739, + 40.484998, + 40.486252, + 40.487502, + 40.488748, + 40.489989, + 40.491225, + 40.492457, + 40.493684, + 40.494907, + 40.496126, + 40.497340, + 40.498550, + 40.499755, + 40.500956, + 40.502153, + 40.503345, + 40.504534, + 40.505718, + 40.506897, + 40.508073, + 40.509244, + 40.510411, + 40.511574, + 40.512733, + 40.513888, + 40.515038, + 40.516185, + 40.517327, + 40.518466, + 40.519600, + 40.520731, + 40.521857, + 40.522980, + 40.524098, + 40.525213, + 40.526324, + 40.527431, + 40.528534, + 40.529633, + 40.530728, + 40.531820, + 40.532907, + 40.533991, + 40.535071, + 40.536148, + 40.537220, + 40.538289, + 40.539355, + 40.540416, + 40.541474, + 40.542528, + 40.543579, + 40.544626, + 40.545670, + 40.546709, + 40.547746, + 40.548779, + 40.549808, + 40.550833, + 40.551856, + 40.552874, + 40.553890, + 40.554902, + 40.555910, + 40.556915, + 40.557916, + 40.558915, + 40.559909, + 40.560901, + 40.561889, + 40.562874, + 40.563855, + 40.564833, + 40.565808, + 40.566780, + 40.567748, + 40.568713, + 40.569675, + 40.570634, + 40.571590, + 40.572542, + 40.573491, + 40.574437, + 40.575380, + 40.576320, + 40.577256, + 40.578190, + 40.579120, + 40.580048, + 40.580972, + 40.581893, + 40.582811, + 40.583726, + 40.584639, + 40.585548, + 40.586454, + 40.587357, + 40.588258, + 40.589155, + 40.590050, + 40.590941, + 40.591830, + 40.592715, + 40.593598, + 40.594478, + 40.595355, + 40.596230, + 40.597101, + 40.597970, + 40.598836, + 40.599699, + 40.600559, + 40.601417, + 40.602271, + 40.603123, + 40.603973, + 40.604819, + 40.605663, + 40.606504, + 40.607343, + 40.608179, + 40.609012, + 40.609842, + 40.610670, + 40.611495, + 40.612318, + 40.613138, + 40.613955, + 40.614770, + 40.615582, + 40.616392, + 40.617199, + 40.618004, + 40.618806, + 40.619605, + 40.620402, + 40.621197, + 40.621989, + 40.622779, + 40.623566, + 40.624350, + 40.625133, + 40.625912, + 40.626690, + 40.627464, + 40.628237, + 40.629007, + 40.629775, + 40.630540, + 40.631303, + 40.632064, + 40.632822, + 40.633578, + 40.634331, + 40.635083, + 40.635832, + 40.636578, + 40.637323, + 40.638065, + 40.638805, + 40.639542, + 40.640277, + 40.641010, + 40.641741, + 40.642470, + 40.643196, + 40.643920, + 40.644642, + 40.645362, + 40.646080, + 40.646795, + 40.647508, + 40.648219, + 40.648928, + 40.649635, + 40.650340, + 40.651042, + 40.651743, + 40.652441, + 40.653137, + 40.653831, + 40.654523, + 40.655213, + 40.655901, + 40.656587, + }, + {// The expectations for dimension = 83 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481666, + 7.706665, + 7.934997, + 8.166662, + 8.401658, + 8.639983, + 8.881638, + 9.126616, + 9.374915, + 9.626526, + 9.881439, + 10.139638, + 10.401102, + 10.665802, + 10.933699, + 11.204742, + 11.478866, + 11.755990, + 12.036015, + 12.318819, + 12.604259, + 12.892171, + 13.182364, + 13.474625, + 13.768722, + 14.064398, + 14.361381, + 14.659387, + 14.958117, + 15.257269, + 15.556536, + 15.855616, + 16.154207, + 16.452022, + 16.748780, + 17.044218, + 17.338088, + 17.630157, + 17.920213, + 18.208062, + 18.493527, + 18.776451, + 19.056693, + 19.334129, + 19.608650, + 19.880164, + 20.148590, + 20.413862, + 20.675922, + 20.934727, + 21.190240, + 21.442435, + 21.691292, + 21.936801, + 22.178954, + 22.417754, + 22.653204, + 22.885317, + 23.114106, + 23.339589, + 23.561788, + 23.780727, + 23.996435, + 24.208939, + 24.418271, + 24.624465, + 24.827556, + 25.027579, + 25.224571, + 25.418572, + 25.609619, + 25.797752, + 25.983012, + 26.165439, + 26.345074, + 26.521957, + 26.696131, + 26.867635, + 27.036512, + 27.202803, + 27.366548, + 27.527787, + 27.686563, + 27.842914, + 27.996880, + 28.148501, + 28.297816, + 28.444863, + 28.589682, + 28.732309, + 28.872781, + 29.011136, + 29.147410, + 29.281639, + 29.413858, + 29.544101, + 29.672403, + 29.798798, + 29.923318, + 30.045997, + 30.166866, + 30.285957, + 30.403302, + 30.518929, + 30.632871, + 30.745155, + 30.855811, + 30.964867, + 31.072352, + 31.178292, + 31.282714, + 31.385646, + 31.487112, + 31.587139, + 31.685751, + 31.782973, + 31.878829, + 31.973342, + 32.066536, + 32.158434, + 32.249057, + 32.338428, + 32.426567, + 32.513497, + 32.599238, + 32.683810, + 32.767233, + 32.849526, + 32.930709, + 33.010800, + 33.089817, + 33.167780, + 33.244705, + 33.320609, + 33.395511, + 33.469426, + 33.542371, + 33.614362, + 33.685415, + 33.755545, + 33.824767, + 33.893097, + 33.960549, + 34.027136, + 34.092874, + 34.157776, + 34.221856, + 34.285126, + 34.347601, + 34.409292, + 34.470211, + 34.530373, + 34.589788, + 34.648468, + 34.706425, + 34.763670, + 34.820215, + 34.876071, + 34.931248, + 34.985756, + 35.039607, + 35.092810, + 35.145376, + 35.197314, + 35.248634, + 35.299345, + 35.349456, + 35.398978, + 35.447918, + 35.496286, + 35.544089, + 35.591338, + 35.638039, + 35.684201, + 35.729833, + 35.774941, + 35.819534, + 35.863620, + 35.907205, + 35.950298, + 35.992904, + 36.035033, + 36.076690, + 36.117882, + 36.158616, + 36.198898, + 36.238736, + 36.278135, + 36.317102, + 36.355642, + 36.393763, + 36.431469, + 36.468767, + 36.505662, + 36.542161, + 36.578268, + 36.613989, + 36.649330, + 36.684295, + 36.718890, + 36.753120, + 36.786990, + 36.820506, + 36.853670, + 36.886490, + 36.918969, + 36.951111, + 36.982922, + 37.014406, + 37.045567, + 37.076409, + 37.106938, + 37.137156, + 37.167068, + 37.196679, + 37.225991, + 37.255010, + 37.283738, + 37.312180, + 37.340340, + 37.368220, + 37.395825, + 37.423158, + 37.450223, + 37.477024, + 37.503562, + 37.529843, + 37.555869, + 37.581643, + 37.607168, + 37.632449, + 37.657487, + 37.682286, + 37.706849, + 37.731178, + 37.755278, + 37.779149, + 37.802796, + 37.826222, + 37.849428, + 37.872417, + 37.895193, + 37.917758, + 37.940113, + 37.962263, + 37.984209, + 38.005954, + 38.027500, + 38.048850, + 38.070006, + 38.090970, + 38.111744, + 38.132332, + 38.152734, + 38.172954, + 38.192993, + 38.212853, + 38.232537, + 38.252047, + 38.271384, + 38.290551, + 38.309550, + 38.328382, + 38.347050, + 38.365555, + 38.383899, + 38.402084, + 38.420112, + 38.437985, + 38.455705, + 38.473272, + 38.490689, + 38.507958, + 38.525080, + 38.542057, + 38.558890, + 38.575582, + 38.592133, + 38.608545, + 38.624821, + 38.640960, + 38.656965, + 38.672837, + 38.688578, + 38.704189, + 38.719672, + 38.735027, + 38.750257, + 38.765362, + 38.780344, + 38.795205, + 38.809945, + 38.824566, + 38.839069, + 38.853455, + 38.867726, + 38.881883, + 38.895927, + 38.909860, + 38.923681, + 38.937393, + 38.950997, + 38.964494, + 38.977885, + 38.991170, + 39.004352, + 39.017431, + 39.030409, + 39.043285, + 39.056062, + 39.068740, + 39.081321, + 39.093805, + 39.106193, + 39.118487, + 39.130687, + 39.142794, + 39.154809, + 39.166733, + 39.178567, + 39.190312, + 39.201969, + 39.213538, + 39.225021, + 39.236418, + 39.247730, + 39.258959, + 39.270104, + 39.281166, + 39.292148, + 39.303048, + 39.313868, + 39.324610, + 39.335272, + 39.345858, + 39.356366, + 39.366798, + 39.377154, + 39.387436, + 39.397644, + 39.407778, + 39.417840, + 39.427830, + 39.437748, + 39.447596, + 39.457374, + 39.467083, + 39.476723, + 39.486296, + 39.495800, + 39.505239, + 39.514611, + 39.523917, + 39.533159, + 39.542336, + 39.551450, + 39.560500, + 39.569488, + 39.578414, + 39.587279, + 39.596082, + 39.604826, + 39.613510, + 39.622134, + 39.630700, + 39.639208, + 39.647658, + 39.656051, + 39.664387, + 39.672667, + 39.680892, + 39.689062, + 39.697177, + 39.705237, + 39.713245, + 39.721199, + 39.729100, + 39.736949, + 39.744746, + 39.752492, + 39.760187, + 39.767832, + 39.775426, + 39.782971, + 39.790467, + 39.797914, + 39.805313, + 39.812664, + 39.819968, + 39.827224, + 39.834434, + 39.841597, + 39.848715, + 39.855787, + 39.862814, + 39.869796, + 39.876734, + 39.883628, + 39.890478, + 39.897285, + 39.904049, + 39.910771, + 39.917450, + 39.924088, + 39.930684, + 39.937239, + 39.943753, + 39.950227, + 39.956660, + 39.963054, + 39.969408, + 39.975724, + 39.982000, + 39.988238, + 39.994437, + 40.000599, + 40.006723, + 40.012810, + 40.018860, + 40.024874, + 40.030850, + 40.036791, + 40.042696, + 40.048566, + 40.054400, + 40.060199, + 40.065964, + 40.071694, + 40.077390, + 40.083052, + 40.088681, + 40.094276, + 40.099838, + 40.105368, + 40.110864, + 40.116329, + 40.121761, + 40.127162, + 40.132531, + 40.137869, + 40.143176, + 40.148452, + 40.153697, + 40.158912, + 40.164097, + 40.169252, + 40.174377, + 40.179473, + 40.184540, + 40.189577, + 40.194586, + 40.199566, + 40.204518, + 40.209442, + 40.214338, + 40.219206, + 40.224047, + 40.228861, + 40.233647, + 40.238407, + 40.243139, + 40.247846, + 40.252526, + 40.257180, + 40.261808, + 40.266410, + 40.270987, + 40.275538, + 40.280065, + 40.284566, + 40.289043, + 40.293495, + 40.297922, + 40.302326, + 40.306705, + 40.311060, + 40.315392, + 40.319700, + 40.323985, + 40.328246, + 40.332485, + 40.336700, + 40.340893, + 40.345064, + 40.349212, + 40.353337, + 40.357441, + 40.361523, + 40.365583, + 40.369621, + 40.373638, + 40.377633, + 40.381608, + 40.385561, + 40.389494, + 40.393406, + 40.397297, + 40.401168, + 40.405019, + 40.408849, + 40.412660, + 40.416450, + 40.420221, + 40.423972, + 40.427704, + 40.431417, + 40.435110, + 40.438784, + 40.442440, + 40.446076, + 40.449694, + 40.453293, + 40.456874, + 40.460437, + 40.463981, + 40.467508, + 40.471016, + 40.474507, + 40.477980, + 40.481435, + 40.484873, + 40.488294, + 40.491698, + 40.495084, + 40.498453, + 40.501806, + 40.505142, + 40.508461, + 40.511763, + 40.515050, + 40.518319, + 40.521573, + 40.524811, + 40.528032, + 40.531238, + 40.534428, + 40.537602, + 40.540761, + 40.543904, + 40.547031, + 40.550144, + 40.553241, + 40.556323, + 40.559390, + 40.562443, + 40.565480, + 40.568503, + 40.571511, + 40.574505, + 40.577484, + 40.580449, + 40.583400, + 40.586337, + 40.589259, + 40.592168, + 40.595062, + 40.597943, + 40.600811, + 40.603664, + 40.606504, + 40.609331, + 40.612144, + 40.614944, + 40.617731, + 40.620505, + 40.623265, + 40.626013, + 40.628748, + 40.631470, + 40.634179, + 40.636876, + 40.639560, + 40.642232, + 40.644891, + 40.647538, + 40.650173, + 40.652796, + 40.655406, + 40.658005, + 40.660591, + 40.663166, + 40.665729, + 40.668280, + 40.670820, + 40.673347, + 40.675864, + 40.678369, + 40.680862, + 40.683345, + 40.685816, + 40.688275, + 40.690724, + 40.693162, + 40.695589, + 40.698005, + 40.700409, + 40.702804, + 40.705187, + 40.707560, + 40.709922, + 40.712274, + 40.714615, + 40.716946, + 40.719267, + 40.721577, + 40.723877, + 40.726167, + 40.728447, + 40.730717, + 40.732976, + 40.735226, + 40.737466, + 40.739696, + 40.741917, + 40.744128, + 40.746329, + 40.748520, + 40.750702, + 40.752875, + 40.755038, + 40.757192, + 40.759336, + 40.761471, + 40.763597, + 40.765714, + 40.767822, + 40.769921, + 40.772010, + 40.774091, + 40.776163, + 40.778226, + 40.780280, + 40.782326, + 40.784363, + 40.786391, + 40.788410, + 40.790422, + 40.792424, + 40.794418, + 40.796404, + 40.798381, + 40.800350, + 40.802311, + 40.804264, + 40.806208, + 40.808144, + 40.810073, + 40.811993, + 40.813905, + 40.815809, + 40.817705, + 40.819594, + 40.821475, + 40.823347, + 40.825213, + 40.827070, + 40.828920, + 40.830762, + 40.832597, + 40.834424, + 40.836244, + 40.838056, + 40.839861, + 40.841658, + 40.843448, + 40.845231, + 40.847007, + 40.848775, + 40.850537, + 40.852291, + 40.854038, + 40.855778, + 40.857511, + 40.859237, + 40.860956, + 40.862668, + 40.864374, + 40.866072, + 40.867764, + 40.869449, + 40.871127, + 40.872799, + 40.874464, + 40.876122, + 40.877774, + 40.879419, + 40.881058, + 40.882690, + 40.884316, + 40.885935, + 40.887548, + 40.889155, + 40.890755, + 40.892350, + 40.893937, + 40.895519, + 40.897095, + 40.898664, + 40.900227, + 40.901784, + 40.903336, + 40.904881, + 40.906420, + 40.907953, + 40.909480, + 40.911002, + 40.912517, + 40.914027, + 40.915531, + 40.917029, + 40.918521, + 40.920008, + 40.921489, + 40.922964, + 40.924434, + 40.925898, + 40.927356, + 40.928809, + 40.930257, + 40.931699, + 40.933135, + 40.934566, + 40.935992, + 40.937412, + 40.938827, + 40.940237, + 40.941641, + 40.943040, + 40.944434, + 40.945823, + 40.947206, + 40.948585, + 40.949958, + 40.951326, + 40.952689, + 40.954046, + 40.955399, + 40.956747, + 40.958090, + 40.959428, + 40.960760, + 40.962088, + 40.963412, + 40.964730, + 40.966043, + 40.967352, + 40.968655, + 40.969954, + 40.971249, + 40.972538, + 40.973823, + 40.975103, + 40.976378, + 40.977649, + 40.978915, + 40.980177, + 40.981434, + 40.982687, + 40.983935, + 40.985178, + 40.986417, + 40.987652, + 40.988882, + 40.990107, + 40.991329, + 40.992545, + 40.993758, + 40.994966, + 40.996170, + 40.997370, + 40.998565, + 40.999756, + 41.000943, + 41.002126, + 41.003304, + 41.004478, + 41.005648, + 41.006814, + 41.007976, + 41.009134, + 41.010288, + 41.011437, + 41.012583, + 41.013724, + 41.014862, + 41.015996, + 41.017125, + 41.018251, + 41.019373, + 41.020490, + 41.021604, + 41.022715, + 41.023821, + 41.024923, + 41.026022, + 41.027116, + 41.028207, + 41.029295, + 41.030378, + 41.031458, + 41.032534, + 41.033606, + 41.034675, + 41.035740, + 41.036801, + 41.037859, + 41.038913, + 41.039964, + 41.041010, + 41.042054, + 41.043094, + 41.044130, + 41.045163, + 41.046192, + 41.047218, + 41.048240, + 41.049259, + 41.050274, + 41.051286, + 41.052295, + 41.053300, + 41.054302, + 41.055300, + 41.056295, + 41.057287, + 41.058275, + 41.059261, + 41.060242, + 41.061221, + 41.062196, + 41.063168, + 41.064137, + 41.065103, + 41.066065, + 41.067025, + 41.067981, + 41.068934, + 41.069883, + 41.070830, + 41.071773, + 41.072714, + 41.073651, + 41.074585, + 41.075517, + 41.076445, + 41.077370, + 41.078292, + 41.079211, + 41.080127, + 41.081040, + 41.081950, + 41.082857, + 41.083762, + 41.084663, + 41.085561, + 41.086457, + 41.087349, + 41.088239, + 41.089126, + 41.090010, + 41.090891, + 41.091769, + 41.092644, + 41.093517, + 41.094387, + 41.095254, + 41.096118, + 41.096980, + 41.097838, + 41.098694, + 41.099548, + 41.100398, + 41.101246, + 41.102091, + 41.102934, + 41.103773, + 41.104611, + 41.105445, + 41.106277, + 41.107106, + 41.107933, + 41.108757, + 41.109578, + 41.110397, + 41.111214, + 41.112027, + 41.112838, + 41.113647, + 41.114453, + 41.115257, + 41.116058, + 41.116856, + 41.117653, + 41.118446, + 41.119237, + 41.120026, + 41.120812, + 41.121596, + 41.122378, + 41.123157, + 41.123933, + 41.124707, + 41.125479, + 41.126249, + 41.127016, + 41.127780, + 41.128543, + 41.129303, + 41.130060, + 41.130816, + 41.131569, + 41.132320, + 41.133068, + 41.133814, + 41.134558, + 41.135300, + 41.136039, + 41.136776, + 41.137511, + 41.138244, + 41.138974, + 41.139703, + 41.140429, + 41.141153, + 41.141874, + 41.142594, + 41.143311, + 41.144026, + 41.144740, + 41.145450, + 41.146159, + 41.146866, + 41.147571, + 41.148273, + }, + {// The expectations for dimension = 84 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481666, + 7.706666, + 7.934998, + 8.166663, + 8.401660, + 8.639988, + 8.881645, + 9.126629, + 9.374936, + 9.626560, + 9.881492, + 10.139720, + 10.401225, + 10.665984, + 10.933962, + 11.205117, + 11.479392, + 11.756715, + 12.036997, + 12.320129, + 12.605983, + 12.894404, + 13.185217, + 13.478224, + 13.773202, + 14.069908, + 14.368080, + 14.667440, + 14.967698, + 15.268553, + 15.569702, + 15.870839, + 16.171663, + 16.471879, + 16.771201, + 17.069357, + 17.366089, + 17.661157, + 17.954337, + 18.245424, + 18.534231, + 18.820590, + 19.104350, + 19.385378, + 19.663556, + 19.938781, + 20.210966, + 20.480036, + 20.745927, + 21.008589, + 21.267978, + 21.524064, + 21.776822, + 22.026234, + 22.272293, + 22.514994, + 22.754339, + 22.990335, + 23.222994, + 23.452331, + 23.678366, + 23.901121, + 24.120621, + 24.336893, + 24.549967, + 24.759876, + 24.966652, + 25.170331, + 25.370948, + 25.568541, + 25.763148, + 25.954808, + 26.143561, + 26.329446, + 26.512504, + 26.692776, + 26.870302, + 27.045123, + 27.217281, + 27.386817, + 27.553770, + 27.718183, + 27.880094, + 28.039546, + 28.196576, + 28.351226, + 28.503534, + 28.653539, + 28.801279, + 28.946793, + 29.090117, + 29.231290, + 29.370347, + 29.507324, + 29.642258, + 29.775183, + 29.906133, + 30.035143, + 30.162247, + 30.287476, + 30.410865, + 30.532443, + 30.652244, + 30.770297, + 30.886634, + 31.001283, + 31.114274, + 31.225637, + 31.335398, + 31.443587, + 31.550230, + 31.655354, + 31.758985, + 31.861149, + 31.961872, + 32.061178, + 32.159093, + 32.255638, + 32.350840, + 32.444719, + 32.537300, + 32.628604, + 32.718652, + 32.807468, + 32.895070, + 32.981481, + 33.066720, + 33.150807, + 33.233761, + 33.315602, + 33.396348, + 33.476018, + 33.554629, + 33.632200, + 33.708747, + 33.784288, + 33.858839, + 33.932416, + 34.005037, + 34.076715, + 34.147467, + 34.217309, + 34.286254, + 34.354317, + 34.421514, + 34.487857, + 34.553360, + 34.618037, + 34.681902, + 34.744967, + 34.807245, + 34.868749, + 34.929490, + 34.989482, + 35.048735, + 35.107261, + 35.165072, + 35.222179, + 35.278593, + 35.334325, + 35.389385, + 35.443784, + 35.497531, + 35.550638, + 35.603113, + 35.654966, + 35.706207, + 35.756846, + 35.806890, + 35.856350, + 35.905234, + 35.953550, + 36.001308, + 36.048515, + 36.095179, + 36.141310, + 36.186914, + 36.231999, + 36.276573, + 36.320644, + 36.364219, + 36.407304, + 36.449908, + 36.492037, + 36.533698, + 36.574898, + 36.615643, + 36.655940, + 36.695795, + 36.735214, + 36.774204, + 36.812771, + 36.850921, + 36.888659, + 36.925992, + 36.962925, + 36.999463, + 37.035612, + 37.071378, + 37.106765, + 37.141780, + 37.176426, + 37.210709, + 37.244635, + 37.278207, + 37.311431, + 37.344312, + 37.376853, + 37.409060, + 37.440937, + 37.472489, + 37.503719, + 37.534633, + 37.565233, + 37.595525, + 37.625513, + 37.655200, + 37.684590, + 37.713687, + 37.742496, + 37.771019, + 37.799261, + 37.827225, + 37.854915, + 37.882334, + 37.909485, + 37.936373, + 37.963000, + 37.989370, + 38.015485, + 38.041350, + 38.066968, + 38.092340, + 38.117472, + 38.142364, + 38.167022, + 38.191446, + 38.215641, + 38.239609, + 38.263353, + 38.286875, + 38.310179, + 38.333267, + 38.356141, + 38.378805, + 38.401260, + 38.423510, + 38.445556, + 38.467402, + 38.489049, + 38.510500, + 38.531757, + 38.552823, + 38.573700, + 38.594390, + 38.614895, + 38.635217, + 38.655359, + 38.675323, + 38.695110, + 38.714723, + 38.734164, + 38.753435, + 38.772537, + 38.791473, + 38.810245, + 38.828854, + 38.847302, + 38.865592, + 38.883724, + 38.901701, + 38.919525, + 38.937196, + 38.954718, + 38.972091, + 38.989317, + 39.006398, + 39.023336, + 39.040132, + 39.056787, + 39.073303, + 39.089682, + 39.105925, + 39.122034, + 39.138010, + 39.153854, + 39.169568, + 39.185154, + 39.200613, + 39.215945, + 39.231154, + 39.246238, + 39.261202, + 39.276044, + 39.290767, + 39.305372, + 39.319861, + 39.334234, + 39.348492, + 39.362637, + 39.376671, + 39.390593, + 39.404406, + 39.418111, + 39.431708, + 39.445199, + 39.458584, + 39.471866, + 39.485044, + 39.498121, + 39.511097, + 39.523972, + 39.536749, + 39.549428, + 39.562010, + 39.574496, + 39.586887, + 39.599184, + 39.611388, + 39.623500, + 39.635521, + 39.647452, + 39.659293, + 39.671045, + 39.682710, + 39.694288, + 39.705780, + 39.717187, + 39.728510, + 39.739749, + 39.750905, + 39.761980, + 39.772974, + 39.783887, + 39.794722, + 39.805477, + 39.816154, + 39.826754, + 39.837278, + 39.847726, + 39.858099, + 39.868397, + 39.878622, + 39.888774, + 39.898854, + 39.908862, + 39.918799, + 39.928666, + 39.938464, + 39.948193, + 39.957853, + 39.967446, + 39.976971, + 39.986431, + 39.995824, + 40.005152, + 40.014416, + 40.023616, + 40.032752, + 40.041826, + 40.050837, + 40.059786, + 40.068675, + 40.077503, + 40.086270, + 40.094979, + 40.103628, + 40.112219, + 40.120752, + 40.129227, + 40.137646, + 40.146008, + 40.154315, + 40.162566, + 40.170762, + 40.178904, + 40.186991, + 40.195026, + 40.203007, + 40.210936, + 40.218812, + 40.226637, + 40.234411, + 40.242134, + 40.249807, + 40.257430, + 40.265004, + 40.272528, + 40.280004, + 40.287432, + 40.294812, + 40.302144, + 40.309430, + 40.316669, + 40.323862, + 40.331009, + 40.338111, + 40.345168, + 40.352180, + 40.359148, + 40.366072, + 40.372952, + 40.379789, + 40.386584, + 40.393336, + 40.400046, + 40.406714, + 40.413341, + 40.419927, + 40.426472, + 40.432976, + 40.439441, + 40.445866, + 40.452251, + 40.458597, + 40.464905, + 40.471174, + 40.477405, + 40.483598, + 40.489753, + 40.495872, + 40.501953, + 40.507998, + 40.514006, + 40.519978, + 40.525915, + 40.531816, + 40.537682, + 40.543512, + 40.549309, + 40.555070, + 40.560798, + 40.566492, + 40.572152, + 40.577779, + 40.583373, + 40.588934, + 40.594463, + 40.599959, + 40.605423, + 40.610856, + 40.616257, + 40.621626, + 40.626965, + 40.632272, + 40.637549, + 40.642796, + 40.648013, + 40.653199, + 40.658356, + 40.663484, + 40.668582, + 40.673652, + 40.678692, + 40.683704, + 40.688688, + 40.693643, + 40.698571, + 40.703471, + 40.708343, + 40.713188, + 40.718006, + 40.722797, + 40.727561, + 40.732299, + 40.737010, + 40.741696, + 40.746355, + 40.750989, + 40.755597, + 40.760179, + 40.764737, + 40.769270, + 40.773777, + 40.778260, + 40.782719, + 40.787154, + 40.791564, + 40.795950, + 40.800313, + 40.804652, + 40.808967, + 40.813260, + 40.817529, + 40.821775, + 40.825999, + 40.830200, + 40.834379, + 40.838535, + 40.842669, + 40.846781, + 40.850872, + 40.854941, + 40.858988, + 40.863014, + 40.867018, + 40.871002, + 40.874965, + 40.878907, + 40.882828, + 40.886729, + 40.890610, + 40.894470, + 40.898310, + 40.902131, + 40.905932, + 40.909713, + 40.913474, + 40.917216, + 40.920939, + 40.924643, + 40.928328, + 40.931994, + 40.935641, + 40.939269, + 40.942880, + 40.946472, + 40.950045, + 40.953601, + 40.957138, + 40.960658, + 40.964160, + 40.967644, + 40.971111, + 40.974560, + 40.977993, + 40.981408, + 40.984806, + 40.988187, + 40.991551, + 40.994898, + 40.998229, + 41.001544, + 41.004842, + 41.008124, + 41.011389, + 41.014639, + 41.017873, + 41.021091, + 41.024293, + 41.027479, + 41.030650, + 41.033805, + 41.036945, + 41.040070, + 41.043180, + 41.046275, + 41.049354, + 41.052419, + 41.055469, + 41.058505, + 41.061526, + 41.064532, + 41.067524, + 41.070502, + 41.073465, + 41.076415, + 41.079350, + 41.082272, + 41.085179, + 41.088073, + 41.090953, + 41.093820, + 41.096673, + 41.099513, + 41.102339, + 41.105152, + 41.107952, + 41.110739, + 41.113513, + 41.116273, + 41.119021, + 41.121757, + 41.124479, + 41.127189, + 41.129887, + 41.132572, + 41.135244, + 41.137905, + 41.140553, + 41.143189, + 41.145812, + 41.148424, + 41.151024, + 41.153612, + 41.156189, + 41.158753, + 41.161306, + 41.163847, + 41.166377, + 41.168896, + 41.171403, + 41.173898, + 41.176383, + 41.178856, + 41.181318, + 41.183769, + 41.186210, + 41.188639, + 41.191057, + 41.193465, + 41.195862, + 41.198249, + 41.200624, + 41.202990, + 41.205344, + 41.207689, + 41.210023, + 41.212347, + 41.214660, + 41.216964, + 41.219257, + 41.221540, + 41.223813, + 41.226077, + 41.228330, + 41.230574, + 41.232808, + 41.235032, + 41.237247, + 41.239452, + 41.241647, + 41.243833, + 41.246010, + 41.248177, + 41.250335, + 41.252484, + 41.254623, + 41.256754, + 41.258875, + 41.260987, + 41.263090, + 41.265185, + 41.267270, + 41.269346, + 41.271414, + 41.273473, + 41.275523, + 41.277565, + 41.279598, + 41.281622, + 41.283638, + 41.285646, + 41.287645, + 41.289636, + 41.291618, + 41.293592, + 41.295558, + 41.297516, + 41.299465, + 41.301407, + 41.303340, + 41.305266, + 41.307183, + 41.309093, + 41.310995, + 41.312889, + 41.314775, + 41.316653, + 41.318524, + 41.320387, + 41.322242, + 41.324090, + 41.325930, + 41.327763, + 41.329588, + 41.331406, + 41.333217, + 41.335020, + 41.336816, + 41.338605, + 41.340386, + 41.342161, + 41.343928, + 41.345688, + 41.347441, + 41.349187, + 41.350926, + 41.352658, + 41.354383, + 41.356101, + 41.357813, + 41.359517, + 41.361215, + 41.362906, + 41.364591, + 41.366269, + 41.367940, + 41.369604, + 41.371262, + 41.372914, + 41.374559, + 41.376197, + 41.377830, + 41.379455, + 41.381075, + 41.382688, + 41.384295, + 41.385895, + 41.387489, + 41.389078, + 41.390659, + 41.392235, + 41.393805, + 41.395369, + 41.396926, + 41.398478, + 41.400024, + 41.401563, + 41.403097, + 41.404625, + 41.406147, + 41.407664, + 41.409174, + 41.410679, + 41.412178, + 41.413671, + 41.415159, + 41.416641, + 41.418117, + 41.419588, + 41.421053, + 41.422513, + 41.423967, + 41.425415, + 41.426859, + 41.428297, + 41.429729, + 41.431156, + 41.432578, + 41.433994, + 41.435405, + 41.436811, + 41.438212, + 41.439607, + 41.440997, + 41.442382, + 41.443762, + 41.445137, + 41.446507, + 41.447872, + 41.449231, + 41.450586, + 41.451935, + 41.453280, + 41.454620, + 41.455955, + 41.457285, + 41.458610, + 41.459930, + 41.461246, + 41.462556, + 41.463862, + 41.465163, + 41.466460, + 41.467751, + 41.469038, + 41.470321, + 41.471598, + 41.472872, + 41.474140, + 41.475404, + 41.476664, + 41.477918, + 41.479169, + 41.480415, + 41.481656, + 41.482893, + 41.484126, + 41.485354, + 41.486578, + 41.487797, + 41.489013, + 41.490223, + 41.491430, + 41.492632, + 41.493830, + 41.495024, + 41.496214, + 41.497399, + 41.498580, + 41.499757, + 41.500930, + 41.502099, + 41.503264, + 41.504424, + 41.505581, + 41.506733, + 41.507882, + 41.509026, + 41.510167, + 41.511304, + 41.512436, + 41.513565, + 41.514690, + 41.515811, + 41.516928, + 41.518041, + 41.519150, + 41.520256, + 41.521357, + 41.522455, + 41.523549, + 41.524640, + 41.525726, + 41.526809, + 41.527889, + 41.528964, + 41.530036, + 41.531104, + 41.532169, + 41.533230, + 41.534287, + 41.535341, + 41.536391, + 41.537438, + 41.538481, + 41.539521, + 41.540557, + 41.541590, + 41.542619, + 41.543645, + 41.544667, + 41.545686, + 41.546701, + 41.547713, + 41.548722, + 41.549727, + 41.550729, + 41.551728, + 41.552723, + 41.553715, + 41.554704, + 41.555689, + 41.556671, + 41.557650, + 41.558626, + 41.559598, + 41.560567, + 41.561533, + 41.562496, + 41.563456, + 41.564412, + 41.565366, + 41.566316, + 41.567263, + 41.568207, + 41.569148, + 41.570086, + 41.571021, + 41.571953, + 41.572882, + 41.573808, + 41.574730, + 41.575650, + 41.576567, + 41.577481, + 41.578392, + 41.579300, + 41.580205, + 41.581107, + 41.582006, + 41.582902, + 41.583796, + 41.584686, + 41.585574, + 41.586459, + 41.587341, + 41.588220, + 41.589097, + 41.589970, + 41.590841, + 41.591709, + 41.592575, + 41.593437, + 41.594297, + 41.595154, + 41.596009, + 41.596861, + 41.597710, + 41.598556, + 41.599400, + 41.600241, + 41.601079, + 41.601915, + 41.602748, + 41.603579, + 41.604407, + 41.605232, + 41.606055, + 41.606875, + 41.607693, + 41.608508, + 41.609320, + 41.610130, + 41.610938, + 41.611743, + 41.612546, + 41.613346, + 41.614143, + 41.614938, + 41.615731, + 41.616521, + 41.617309, + 41.618094, + 41.618877, + 41.619658, + 41.620436, + 41.621212, + 41.621985, + 41.622756, + 41.623525, + 41.624291, + 41.625055, + 41.625817, + 41.626576, + 41.627334, + 41.628088, + 41.628841, + 41.629591, + 41.630339, + 41.631085, + 41.631828, + 41.632569, + 41.633308, + 41.634045, + 41.634779, + 41.635512, + 41.636242, + 41.636970, + 41.637695, + 41.638419, + 41.639140, + 41.639860, + }, + {// The expectations for dimension = 85 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481666, + 7.706666, + 7.934999, + 8.166664, + 8.401662, + 8.639991, + 8.881651, + 9.126639, + 9.374952, + 9.626586, + 9.881534, + 10.139784, + 10.401323, + 10.666129, + 10.934176, + 11.205424, + 11.479826, + 11.757318, + 12.037822, + 12.321239, + 12.607453, + 12.896325, + 13.187691, + 13.481366, + 13.777141, + 14.074785, + 14.374047, + 14.674658, + 14.976334, + 15.278781, + 15.581697, + 15.884778, + 16.187721, + 16.490225, + 16.792001, + 17.092769, + 17.392263, + 17.690232, + 17.986444, + 18.280683, + 18.572751, + 18.862470, + 19.149679, + 19.434234, + 19.716009, + 19.994891, + 20.270785, + 20.543607, + 20.813288, + 21.079768, + 21.343001, + 21.602947, + 21.859578, + 22.112871, + 22.362813, + 22.609397, + 22.852620, + 23.092487, + 23.329005, + 23.562187, + 23.792051, + 24.018615, + 24.241903, + 24.461941, + 24.678757, + 24.892380, + 25.102844, + 25.310181, + 25.514427, + 25.715618, + 25.913791, + 26.108985, + 26.301238, + 26.490590, + 26.677081, + 26.860750, + 27.041640, + 27.219789, + 27.395240, + 27.568032, + 27.738207, + 27.905805, + 28.070867, + 28.233432, + 28.393541, + 28.551234, + 28.706549, + 28.859526, + 29.010204, + 29.158620, + 29.304812, + 29.448817, + 29.590673, + 29.730415, + 29.868080, + 30.003703, + 30.137318, + 30.268960, + 30.398663, + 30.526460, + 30.652383, + 30.776466, + 30.898739, + 31.019235, + 31.137983, + 31.255013, + 31.370357, + 31.484042, + 31.596097, + 31.706550, + 31.815429, + 31.922762, + 32.028574, + 32.132892, + 32.235742, + 32.337149, + 32.437137, + 32.535731, + 32.632955, + 32.728833, + 32.823386, + 32.916639, + 33.008612, + 33.099328, + 33.188808, + 33.277072, + 33.364142, + 33.450038, + 33.534779, + 33.618384, + 33.700874, + 33.782265, + 33.862577, + 33.941828, + 34.020035, + 34.097215, + 34.173386, + 34.248564, + 34.322766, + 34.396006, + 34.468302, + 34.539669, + 34.610121, + 34.679673, + 34.748341, + 34.816137, + 34.883078, + 34.949175, + 35.014443, + 35.078895, + 35.142543, + 35.205401, + 35.267482, + 35.328796, + 35.389357, + 35.449177, + 35.508266, + 35.566636, + 35.624299, + 35.681266, + 35.737546, + 35.793152, + 35.848092, + 35.902378, + 35.956020, + 36.009027, + 36.061408, + 36.113174, + 36.164334, + 36.214896, + 36.264870, + 36.314265, + 36.363089, + 36.411351, + 36.459059, + 36.506222, + 36.552846, + 36.598941, + 36.644514, + 36.689573, + 36.734125, + 36.778177, + 36.821738, + 36.864813, + 36.907410, + 36.949536, + 36.991197, + 37.032401, + 37.073153, + 37.113460, + 37.153329, + 37.192766, + 37.231776, + 37.270365, + 37.308541, + 37.346307, + 37.383671, + 37.420637, + 37.457211, + 37.493399, + 37.529205, + 37.564636, + 37.599695, + 37.634389, + 37.668722, + 37.702699, + 37.736325, + 37.769605, + 37.802543, + 37.835143, + 37.867411, + 37.899351, + 37.930967, + 37.962263, + 37.993243, + 38.023913, + 38.054275, + 38.084334, + 38.114094, + 38.143558, + 38.172731, + 38.201617, + 38.230218, + 38.258539, + 38.286583, + 38.314354, + 38.341855, + 38.369089, + 38.396061, + 38.422773, + 38.449229, + 38.475431, + 38.501384, + 38.527090, + 38.552551, + 38.577772, + 38.602756, + 38.627504, + 38.652021, + 38.676308, + 38.700369, + 38.724207, + 38.747823, + 38.771222, + 38.794405, + 38.817375, + 38.840135, + 38.862687, + 38.885033, + 38.907177, + 38.929120, + 38.950866, + 38.972415, + 38.993771, + 39.014936, + 39.035912, + 39.056701, + 39.077306, + 39.097729, + 39.117971, + 39.138035, + 39.157923, + 39.177637, + 39.197179, + 39.216551, + 39.235754, + 39.254792, + 39.273665, + 39.292375, + 39.310925, + 39.329317, + 39.347551, + 39.365630, + 39.383555, + 39.401329, + 39.418952, + 39.436427, + 39.453755, + 39.470938, + 39.487978, + 39.504875, + 39.521632, + 39.538250, + 39.554731, + 39.571075, + 39.587286, + 39.603363, + 39.619309, + 39.635124, + 39.650811, + 39.666371, + 39.681804, + 39.697113, + 39.712299, + 39.727362, + 39.742305, + 39.757129, + 39.771834, + 39.786422, + 39.800895, + 39.815253, + 39.829498, + 39.843631, + 39.857652, + 39.871564, + 39.885367, + 39.899063, + 39.912652, + 39.926136, + 39.939515, + 39.952792, + 39.965966, + 39.979039, + 39.992011, + 40.004885, + 40.017661, + 40.030339, + 40.042921, + 40.055408, + 40.067801, + 40.080101, + 40.092308, + 40.104424, + 40.116449, + 40.128384, + 40.140231, + 40.151990, + 40.163662, + 40.175247, + 40.186747, + 40.198163, + 40.209495, + 40.220744, + 40.231911, + 40.242997, + 40.254002, + 40.264927, + 40.275774, + 40.286542, + 40.297233, + 40.307847, + 40.318385, + 40.328847, + 40.339235, + 40.349549, + 40.359790, + 40.369959, + 40.380055, + 40.390081, + 40.400036, + 40.409921, + 40.419737, + 40.429484, + 40.439163, + 40.448775, + 40.458321, + 40.467800, + 40.477214, + 40.486563, + 40.495848, + 40.505069, + 40.514227, + 40.523322, + 40.532355, + 40.541327, + 40.550239, + 40.559089, + 40.567880, + 40.576612, + 40.585285, + 40.593900, + 40.602457, + 40.610957, + 40.619400, + 40.627788, + 40.636119, + 40.644395, + 40.652617, + 40.660784, + 40.668898, + 40.676958, + 40.684966, + 40.692921, + 40.700824, + 40.708676, + 40.716477, + 40.724227, + 40.731927, + 40.739577, + 40.747178, + 40.754731, + 40.762234, + 40.769690, + 40.777098, + 40.784459, + 40.791773, + 40.799040, + 40.806262, + 40.813438, + 40.820568, + 40.827654, + 40.834695, + 40.841692, + 40.848645, + 40.855555, + 40.862422, + 40.869245, + 40.876027, + 40.882767, + 40.889465, + 40.896121, + 40.902737, + 40.909312, + 40.915846, + 40.922341, + 40.928796, + 40.935211, + 40.941588, + 40.947926, + 40.954225, + 40.960486, + 40.966710, + 40.972896, + 40.979045, + 40.985157, + 40.991232, + 40.997271, + 41.003274, + 41.009241, + 41.015173, + 41.021069, + 41.026931, + 41.032758, + 41.038551, + 41.044309, + 41.050034, + 41.055725, + 41.061383, + 41.067008, + 41.072600, + 41.078160, + 41.083687, + 41.089182, + 41.094646, + 41.100077, + 41.105478, + 41.110848, + 41.116186, + 41.121494, + 41.126772, + 41.132020, + 41.137237, + 41.142425, + 41.147584, + 41.152713, + 41.157813, + 41.162885, + 41.167928, + 41.172942, + 41.177929, + 41.182887, + 41.187818, + 41.192721, + 41.197597, + 41.202446, + 41.207268, + 41.212063, + 41.216831, + 41.221574, + 41.226290, + 41.230980, + 41.235644, + 41.240283, + 41.244896, + 41.249484, + 41.254048, + 41.258586, + 41.263100, + 41.267589, + 41.272054, + 41.276494, + 41.280911, + 41.285304, + 41.289673, + 41.294019, + 41.298342, + 41.302641, + 41.306918, + 41.311172, + 41.315403, + 41.319611, + 41.323798, + 41.327962, + 41.332104, + 41.336224, + 41.340323, + 41.344400, + 41.348456, + 41.352490, + 41.356504, + 41.360496, + 41.364468, + 41.368419, + 41.372349, + 41.376259, + 41.380149, + 41.384019, + 41.387868, + 41.391698, + 41.395508, + 41.399299, + 41.403070, + 41.406822, + 41.410555, + 41.414269, + 41.417964, + 41.421640, + 41.425297, + 41.428936, + 41.432557, + 41.436159, + 41.439743, + 41.443310, + 41.446858, + 41.450388, + 41.453901, + 41.457396, + 41.460874, + 41.464334, + 41.467777, + 41.471204, + 41.474613, + 41.478005, + 41.481381, + 41.484739, + 41.488082, + 41.491408, + 41.494717, + 41.498011, + 41.501288, + 41.504549, + 41.507795, + 41.511024, + 41.514238, + 41.517436, + 41.520619, + 41.523786, + 41.526938, + 41.530075, + 41.533197, + 41.536304, + 41.539396, + 41.542473, + 41.545535, + 41.548583, + 41.551616, + 41.554634, + 41.557639, + 41.560629, + 41.563605, + 41.566567, + 41.569514, + 41.572448, + 41.575368, + 41.578275, + 41.581168, + 41.584047, + 41.586912, + 41.589765, + 41.592604, + 41.595429, + 41.598242, + 41.601042, + 41.603828, + 41.606602, + 41.609363, + 41.612111, + 41.614846, + 41.617569, + 41.620279, + 41.622977, + 41.625663, + 41.628336, + 41.630997, + 41.633646, + 41.636283, + 41.638908, + 41.641521, + 41.644122, + 41.646711, + 41.649289, + 41.651854, + 41.654409, + 41.656952, + 41.659483, + 41.662003, + 41.664512, + 41.667010, + 41.669496, + 41.671972, + 41.674436, + 41.676889, + 41.679332, + 41.681763, + 41.684184, + 41.686594, + 41.688994, + 41.691383, + 41.693761, + 41.696129, + 41.698487, + 41.700834, + 41.703171, + 41.705498, + 41.707815, + 41.710121, + 41.712418, + 41.714704, + 41.716981, + 41.719247, + 41.721504, + 41.723751, + 41.725989, + 41.728217, + 41.730435, + 41.732644, + 41.734843, + 41.737033, + 41.739213, + 41.741384, + 41.743546, + 41.745699, + 41.747842, + 41.749977, + 41.752102, + 41.754218, + 41.756326, + 41.758424, + 41.760514, + 41.762595, + 41.764667, + 41.766730, + 41.768785, + 41.770831, + 41.772869, + 41.774898, + 41.776918, + 41.778931, + 41.780934, + 41.782930, + 41.784917, + 41.786896, + 41.788867, + 41.790829, + 41.792784, + 41.794730, + 41.796669, + 41.798599, + 41.800522, + 41.802437, + 41.804344, + 41.806243, + 41.808134, + 41.810018, + 41.811894, + 41.813762, + 41.815623, + 41.817476, + 41.819322, + 41.821160, + 41.822991, + 41.824814, + 41.826630, + 41.828439, + 41.830240, + 41.832035, + 41.833822, + 41.835602, + 41.837375, + 41.839140, + 41.840899, + 41.842651, + 41.844396, + 41.846133, + 41.847864, + 41.849589, + 41.851306, + 41.853016, + 41.854720, + 41.856417, + 41.858108, + 41.859791, + 41.861468, + 41.863139, + 41.864803, + 41.866461, + 41.868112, + 41.869756, + 41.871395, + 41.873026, + 41.874652, + 41.876271, + 41.877884, + 41.879491, + 41.881091, + 41.882686, + 41.884274, + 41.885856, + 41.887432, + 41.889002, + 41.890566, + 41.892124, + 41.893676, + 41.895222, + 41.896762, + 41.898296, + 41.899825, + 41.901347, + 41.902864, + 41.904375, + 41.905881, + 41.907381, + 41.908875, + 41.910363, + 41.911846, + 41.913323, + 41.914795, + 41.916261, + 41.917722, + 41.919177, + 41.920627, + 41.922071, + 41.923510, + 41.924944, + 41.926372, + 41.927795, + 41.929213, + 41.930625, + 41.932032, + 41.933434, + 41.934831, + 41.936223, + 41.937609, + 41.938991, + 41.940367, + 41.941739, + 41.943105, + 41.944466, + 41.945822, + 41.947174, + 41.948520, + 41.949862, + 41.951198, + 41.952530, + 41.953857, + 41.955179, + 41.956497, + 41.957809, + 41.959117, + 41.960420, + 41.961719, + 41.963013, + 41.964302, + 41.965586, + 41.966866, + 41.968141, + 41.969412, + 41.970678, + 41.971940, + 41.973197, + 41.974450, + 41.975698, + 41.976942, + 41.978181, + 41.979416, + 41.980647, + 41.981873, + 41.983095, + 41.984313, + 41.985526, + 41.986735, + 41.987940, + 41.989140, + 41.990337, + 41.991529, + 41.992717, + 41.993901, + 41.995080, + 41.996256, + 41.997427, + 41.998595, + 41.999758, + 42.000918, + 42.002073, + 42.003224, + 42.004372, + 42.005515, + 42.006654, + 42.007790, + 42.008921, + 42.010049, + 42.011173, + 42.012293, + 42.013409, + 42.014521, + 42.015630, + 42.016734, + 42.017835, + 42.018933, + 42.020026, + 42.021116, + 42.022202, + 42.023284, + 42.024363, + 42.025438, + 42.026509, + 42.027577, + 42.028641, + 42.029702, + 42.030759, + 42.031812, + 42.032862, + 42.033908, + 42.034951, + 42.035991, + 42.037026, + 42.038059, + 42.039088, + 42.040113, + 42.041136, + 42.042154, + 42.043170, + 42.044182, + 42.045190, + 42.046196, + 42.047198, + 42.048196, + 42.049192, + 42.050184, + 42.051173, + 42.052158, + 42.053141, + 42.054120, + 42.055096, + 42.056068, + 42.057038, + 42.058004, + 42.058967, + 42.059927, + 42.060884, + 42.061838, + 42.062789, + 42.063736, + 42.064681, + 42.065622, + 42.066561, + 42.067496, + 42.068429, + 42.069358, + 42.070284, + 42.071208, + 42.072128, + 42.073046, + 42.073960, + 42.074872, + 42.075781, + 42.076686, + 42.077589, + 42.078489, + 42.079386, + 42.080281, + 42.081172, + 42.082061, + 42.082946, + 42.083829, + 42.084710, + 42.085587, + 42.086461, + 42.087333, + 42.088202, + 42.089069, + 42.089932, + 42.090793, + 42.091651, + 42.092507, + 42.093360, + 42.094210, + 42.095057, + 42.095902, + 42.096744, + 42.097584, + 42.098421, + 42.099255, + 42.100087, + 42.100916, + 42.101743, + 42.102567, + 42.103388, + 42.104207, + 42.105024, + 42.105838, + 42.106649, + 42.107458, + 42.108264, + 42.109068, + 42.109870, + 42.110669, + 42.111465, + 42.112259, + 42.113051, + 42.113840, + 42.114627, + 42.115411, + 42.116193, + 42.116973, + 42.117750, + 42.118525, + 42.119298, + 42.120068, + 42.120836, + 42.121602, + 42.122365, + 42.123126, + 42.123884, + 42.124641, + 42.125395, + 42.126147, + 42.126896, + 42.127644, + 42.128389, + 42.129132, + 42.129872, + 42.130611, + 42.131347, + }, + {// The expectations for dimension = 86 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481666, + 7.706666, + 7.934999, + 8.166665, + 8.401663, + 8.639994, + 8.881655, + 9.126646, + 9.374965, + 9.626606, + 9.881566, + 10.139834, + 10.401400, + 10.666245, + 10.934347, + 11.205674, + 11.480182, + 11.757818, + 12.038511, + 12.322175, + 12.608705, + 12.897972, + 13.189828, + 13.484101, + 13.780594, + 14.079090, + 14.379348, + 14.681109, + 14.984099, + 15.288029, + 15.592602, + 15.897514, + 16.202462, + 16.507144, + 16.811264, + 17.114537, + 17.416690, + 17.717463, + 18.016613, + 18.313916, + 18.609162, + 18.902164, + 19.192749, + 19.480764, + 19.766074, + 20.048556, + 20.328106, + 20.604634, + 20.878060, + 21.148321, + 21.415361, + 21.679135, + 21.939610, + 22.196759, + 22.450562, + 22.701009, + 22.948093, + 23.191815, + 23.432179, + 23.669196, + 23.902879, + 24.133246, + 24.360318, + 24.584118, + 24.804673, + 25.022011, + 25.236162, + 25.447160, + 25.655038, + 25.859831, + 26.061576, + 26.260309, + 26.456070, + 26.648896, + 26.838828, + 27.025905, + 27.210168, + 27.391656, + 27.570410, + 27.746471, + 27.919879, + 28.090675, + 28.258900, + 28.424593, + 28.587794, + 28.748544, + 28.906881, + 29.062844, + 29.216474, + 29.367807, + 29.516881, + 29.663735, + 29.808405, + 29.950928, + 30.091339, + 30.229675, + 30.365971, + 30.500261, + 30.632579, + 30.762959, + 30.891435, + 31.018037, + 31.142800, + 31.265754, + 31.386929, + 31.506358, + 31.624069, + 31.740093, + 31.854457, + 31.967192, + 32.078324, + 32.187881, + 32.295890, + 32.402378, + 32.507370, + 32.610893, + 32.712971, + 32.813630, + 32.912892, + 33.010783, + 33.107325, + 33.202541, + 33.296454, + 33.389085, + 33.480457, + 33.570591, + 33.659507, + 33.747226, + 33.833768, + 33.919153, + 34.003400, + 34.086528, + 34.168555, + 34.249500, + 34.329381, + 34.408215, + 34.486020, + 34.562812, + 34.638608, + 34.713424, + 34.787277, + 34.860182, + 34.932154, + 35.003209, + 35.073360, + 35.142624, + 35.211014, + 35.278544, + 35.345227, + 35.411078, + 35.476110, + 35.540335, + 35.603766, + 35.666416, + 35.728297, + 35.789421, + 35.849800, + 35.909446, + 35.968369, + 36.026582, + 36.084095, + 36.140918, + 36.197063, + 36.252540, + 36.307359, + 36.361529, + 36.415062, + 36.467967, + 36.520252, + 36.571928, + 36.623003, + 36.673486, + 36.723387, + 36.772714, + 36.821475, + 36.869680, + 36.917335, + 36.964449, + 37.011031, + 37.057087, + 37.102626, + 37.147654, + 37.192180, + 37.236211, + 37.279754, + 37.322815, + 37.365402, + 37.407521, + 37.449180, + 37.490384, + 37.531140, + 37.571454, + 37.611333, + 37.650783, + 37.689809, + 37.728418, + 37.766615, + 37.804406, + 37.841797, + 37.878793, + 37.915400, + 37.951622, + 37.987466, + 38.022936, + 38.058037, + 38.092775, + 38.127154, + 38.161179, + 38.194855, + 38.228186, + 38.261178, + 38.293834, + 38.326159, + 38.358158, + 38.389834, + 38.421193, + 38.452237, + 38.482972, + 38.513401, + 38.543528, + 38.573358, + 38.602893, + 38.632138, + 38.661097, + 38.689772, + 38.718169, + 38.746290, + 38.774138, + 38.801718, + 38.829033, + 38.856085, + 38.882879, + 38.909418, + 38.935704, + 38.961741, + 38.987531, + 39.013079, + 39.038387, + 39.063458, + 39.088294, + 39.112900, + 39.137277, + 39.161428, + 39.185356, + 39.209064, + 39.232554, + 39.255829, + 39.278892, + 39.301745, + 39.324391, + 39.346832, + 39.369070, + 39.391108, + 39.412949, + 39.434594, + 39.456046, + 39.477307, + 39.498380, + 39.519266, + 39.539968, + 39.560488, + 39.580828, + 39.600990, + 39.620976, + 39.640788, + 39.660428, + 39.679898, + 39.699201, + 39.718337, + 39.737309, + 39.756119, + 39.774768, + 39.793259, + 39.811592, + 39.829771, + 39.847795, + 39.865669, + 39.883392, + 39.900966, + 39.918394, + 39.935676, + 39.952815, + 39.969812, + 39.986669, + 40.003386, + 40.019967, + 40.036411, + 40.052720, + 40.068897, + 40.084942, + 40.100857, + 40.116643, + 40.132301, + 40.147834, + 40.163242, + 40.178526, + 40.193688, + 40.208729, + 40.223651, + 40.238455, + 40.253141, + 40.267711, + 40.282167, + 40.296510, + 40.310740, + 40.324859, + 40.338868, + 40.352768, + 40.366560, + 40.380246, + 40.393826, + 40.407302, + 40.420674, + 40.433944, + 40.447112, + 40.460181, + 40.473149, + 40.486020, + 40.498793, + 40.511470, + 40.524052, + 40.536539, + 40.548932, + 40.561233, + 40.573442, + 40.585560, + 40.597589, + 40.609528, + 40.621380, + 40.633144, + 40.644821, + 40.656413, + 40.667920, + 40.679344, + 40.690684, + 40.701942, + 40.713118, + 40.724213, + 40.735229, + 40.746165, + 40.757023, + 40.767803, + 40.778506, + 40.789132, + 40.799683, + 40.810160, + 40.820562, + 40.830890, + 40.841146, + 40.851330, + 40.861442, + 40.871484, + 40.881455, + 40.891357, + 40.901190, + 40.910955, + 40.920652, + 40.930283, + 40.939847, + 40.949345, + 40.958778, + 40.968147, + 40.977452, + 40.986693, + 40.995871, + 41.004988, + 41.014042, + 41.023036, + 41.031968, + 41.040841, + 41.049654, + 41.058408, + 41.067104, + 41.075742, + 41.084322, + 41.092846, + 41.101313, + 41.109724, + 41.118079, + 41.126380, + 41.134626, + 41.142818, + 41.150956, + 41.159042, + 41.167074, + 41.175055, + 41.182984, + 41.190861, + 41.198688, + 41.206464, + 41.214191, + 41.221867, + 41.229495, + 41.237074, + 41.244604, + 41.252087, + 41.259522, + 41.266910, + 41.274252, + 41.281547, + 41.288796, + 41.295999, + 41.303158, + 41.310272, + 41.317341, + 41.324366, + 41.331347, + 41.338285, + 41.345181, + 41.352033, + 41.358843, + 41.365612, + 41.372338, + 41.379024, + 41.385668, + 41.392272, + 41.398836, + 41.405360, + 41.411844, + 41.418289, + 41.424695, + 41.431062, + 41.437391, + 41.443682, + 41.449935, + 41.456151, + 41.462329, + 41.468471, + 41.474576, + 41.480645, + 41.486678, + 41.492675, + 41.498637, + 41.504563, + 41.510455, + 41.516312, + 41.522135, + 41.527923, + 41.533678, + 41.539400, + 41.545088, + 41.550743, + 41.556365, + 41.561955, + 41.567512, + 41.573038, + 41.578532, + 41.583994, + 41.589425, + 41.594824, + 41.600193, + 41.605532, + 41.610840, + 41.616118, + 41.621366, + 41.626584, + 41.631773, + 41.636932, + 41.642063, + 41.647165, + 41.652238, + 41.657283, + 41.662300, + 41.667288, + 41.672249, + 41.677183, + 41.682089, + 41.686968, + 41.691820, + 41.696645, + 41.701444, + 41.706216, + 41.710962, + 41.715682, + 41.720377, + 41.725046, + 41.729689, + 41.734307, + 41.738900, + 41.743469, + 41.748012, + 41.752531, + 41.757026, + 41.761497, + 41.765943, + 41.770366, + 41.774765, + 41.779141, + 41.783493, + 41.787822, + 41.792128, + 41.796412, + 41.800672, + 41.804910, + 41.809126, + 41.813320, + 41.817491, + 41.821641, + 41.825769, + 41.829875, + 41.833960, + 41.838024, + 41.842066, + 41.846088, + 41.850089, + 41.854069, + 41.858028, + 41.861967, + 41.865886, + 41.869784, + 41.873663, + 41.877522, + 41.881361, + 41.885180, + 41.888980, + 41.892760, + 41.896522, + 41.900264, + 41.903987, + 41.907692, + 41.911378, + 41.915045, + 41.918694, + 41.922324, + 41.925937, + 41.929531, + 41.933107, + 41.936666, + 41.940206, + 41.943729, + 41.947235, + 41.950723, + 41.954194, + 41.957648, + 41.961085, + 41.964505, + 41.967908, + 41.971294, + 41.974664, + 41.978017, + 41.981354, + 41.984675, + 41.987979, + 41.991268, + 41.994540, + 41.997797, + 42.001038, + 42.004263, + 42.007473, + 42.010667, + 42.013846, + 42.017009, + 42.020158, + 42.023291, + 42.026410, + 42.029513, + 42.032602, + 42.035676, + 42.038736, + 42.041781, + 42.044811, + 42.047828, + 42.050830, + 42.053818, + 42.056791, + 42.059751, + 42.062697, + 42.065630, + 42.068548, + 42.071453, + 42.074344, + 42.077222, + 42.080087, + 42.082938, + 42.085776, + 42.088601, + 42.091413, + 42.094212, + 42.096998, + 42.099771, + 42.102532, + 42.105280, + 42.108015, + 42.110738, + 42.113449, + 42.116147, + 42.118832, + 42.121506, + 42.124168, + 42.126817, + 42.129455, + 42.132080, + 42.134694, + 42.137296, + 42.139886, + 42.142465, + 42.145032, + 42.147588, + 42.150132, + 42.152665, + 42.155186, + 42.157697, + 42.160196, + 42.162684, + 42.165161, + 42.167627, + 42.170083, + 42.172527, + 42.174961, + 42.177384, + 42.179796, + 42.182198, + 42.184589, + 42.186970, + 42.189341, + 42.191701, + 42.194051, + 42.196390, + 42.198720, + 42.201039, + 42.203349, + 42.205648, + 42.207938, + 42.210217, + 42.212487, + 42.214747, + 42.216997, + 42.219238, + 42.221469, + 42.223691, + 42.225903, + 42.228106, + 42.230299, + 42.232483, + 42.234658, + 42.236823, + 42.238980, + 42.241127, + 42.243265, + 42.245395, + 42.247515, + 42.249626, + 42.251729, + 42.253823, + 42.255907, + 42.257984, + 42.260051, + 42.262110, + 42.264161, + 42.266203, + 42.268236, + 42.270261, + 42.272278, + 42.274286, + 42.276286, + 42.278278, + 42.280261, + 42.282237, + 42.284204, + 42.286163, + 42.288114, + 42.290058, + 42.291993, + 42.293920, + 42.295840, + 42.297752, + 42.299656, + 42.301552, + 42.303441, + 42.305322, + 42.307195, + 42.309061, + 42.310919, + 42.312770, + 42.314614, + 42.316450, + 42.318279, + 42.320100, + 42.321914, + 42.323721, + 42.325521, + 42.327313, + 42.329098, + 42.330877, + 42.332648, + 42.334412, + 42.336169, + 42.337920, + 42.339663, + 42.341400, + 42.343129, + 42.344852, + 42.346569, + 42.348278, + 42.349981, + 42.351677, + 42.353366, + 42.355049, + 42.356726, + 42.358395, + 42.360059, + 42.361716, + 42.363366, + 42.365010, + 42.366648, + 42.368280, + 42.369905, + 42.371524, + 42.373136, + 42.374743, + 42.376343, + 42.377937, + 42.379526, + 42.381108, + 42.382684, + 42.384254, + 42.385818, + 42.387376, + 42.388928, + 42.390474, + 42.392015, + 42.393549, + 42.395078, + 42.396601, + 42.398119, + 42.399630, + 42.401136, + 42.402637, + 42.404131, + 42.405620, + 42.407104, + 42.408582, + 42.410054, + 42.411521, + 42.412983, + 42.414439, + 42.415890, + 42.417335, + 42.418775, + 42.420210, + 42.421639, + 42.423063, + 42.424482, + 42.425896, + 42.427304, + 42.428707, + 42.430106, + 42.431499, + 42.432887, + 42.434269, + 42.435647, + 42.437020, + 42.438388, + 42.439751, + 42.441108, + 42.442461, + 42.443809, + 42.445153, + 42.446491, + 42.447824, + 42.449153, + 42.450477, + 42.451796, + 42.453111, + 42.454420, + 42.455725, + 42.457026, + 42.458321, + 42.459612, + 42.460899, + 42.462181, + 42.463458, + 42.464731, + 42.465999, + 42.467263, + 42.468522, + 42.469777, + 42.471027, + 42.472273, + 42.473515, + 42.474752, + 42.475985, + 42.477213, + 42.478438, + 42.479658, + 42.480873, + 42.482085, + 42.483292, + 42.484495, + 42.485694, + 42.486888, + 42.488079, + 42.489265, + 42.490447, + 42.491626, + 42.492800, + 42.493970, + 42.495136, + 42.496297, + 42.497455, + 42.498609, + 42.499759, + 42.500905, + 42.502048, + 42.503186, + 42.504320, + 42.505451, + 42.506577, + 42.507700, + 42.508819, + 42.509934, + 42.511045, + 42.512153, + 42.513257, + 42.514357, + 42.515453, + 42.516546, + 42.517635, + 42.518720, + 42.519802, + 42.520880, + 42.521954, + 42.523025, + 42.524092, + 42.525155, + 42.526216, + 42.527272, + 42.528325, + 42.529374, + 42.530420, + 42.531463, + 42.532502, + 42.533538, + 42.534570, + 42.535598, + 42.536624, + 42.537646, + 42.538664, + 42.539680, + 42.540691, + 42.541700, + 42.542705, + 42.543707, + 42.544706, + 42.545701, + 42.546693, + 42.547682, + 42.548668, + 42.549650, + 42.550629, + 42.551606, + 42.552578, + 42.553548, + 42.554515, + 42.555478, + 42.556438, + 42.557396, + 42.558350, + 42.559301, + 42.560249, + 42.561194, + 42.562136, + 42.563074, + 42.564010, + 42.564943, + 42.565873, + 42.566800, + 42.567724, + 42.568645, + 42.569563, + 42.570478, + 42.571390, + 42.572299, + 42.573206, + 42.574109, + 42.575010, + 42.575908, + 42.576803, + 42.577695, + 42.578584, + 42.579471, + 42.580355, + 42.581236, + 42.582114, + 42.582989, + 42.583862, + 42.584732, + 42.585599, + 42.586464, + 42.587326, + 42.588185, + 42.589041, + 42.589895, + 42.590746, + 42.591595, + 42.592441, + 42.593284, + 42.594125, + 42.594963, + 42.595798, + 42.596631, + 42.597461, + 42.598289, + 42.599114, + 42.599937, + 42.600757, + 42.601575, + 42.602390, + 42.603202, + 42.604012, + 42.604820, + 42.605625, + 42.606428, + 42.607228, + 42.608026, + 42.608822, + 42.609615, + 42.610405, + 42.611193, + 42.611979, + 42.612763, + 42.613544, + 42.614322, + 42.615099, + 42.615873, + 42.616644, + 42.617414, + 42.618181, + 42.618946, + 42.619708, + 42.620468, + 42.621226, + 42.621982, + 42.622735, + }, + {// The expectations for dimension = 87 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706666, + 7.934999, + 8.166665, + 8.401664, + 8.639996, + 8.881658, + 9.126652, + 9.374974, + 9.626621, + 9.881590, + 10.139873, + 10.401460, + 10.666338, + 10.934485, + 11.205876, + 11.480474, + 11.758231, + 12.039086, + 12.322962, + 12.609765, + 12.899380, + 13.191669, + 13.486474, + 13.783612, + 14.082878, + 14.384044, + 14.686861, + 14.991064, + 15.296372, + 15.602492, + 15.909125, + 16.215967, + 16.522715, + 16.829071, + 17.134743, + 17.439451, + 17.742928, + 18.044922, + 18.345198, + 18.643538, + 18.939742, + 19.233629, + 19.525036, + 19.813816, + 20.099840, + 20.382992, + 20.663175, + 20.940303, + 21.214302, + 21.485111, + 21.752681, + 22.016970, + 22.277946, + 22.535587, + 22.789875, + 23.040801, + 23.288361, + 23.532558, + 23.773397, + 24.010891, + 24.245053, + 24.475902, + 24.703459, + 24.927750, + 25.148801, + 25.366640, + 25.581300, + 25.792811, + 26.001210, + 26.206530, + 26.408809, + 26.608083, + 26.804391, + 26.997772, + 27.188265, + 27.375910, + 27.560746, + 27.742814, + 27.922155, + 28.098808, + 28.272814, + 28.444214, + 28.613047, + 28.779354, + 28.943173, + 29.104546, + 29.263510, + 29.420106, + 29.574370, + 29.726342, + 29.876059, + 30.023558, + 30.168877, + 30.312050, + 30.453115, + 30.592107, + 30.729061, + 30.864010, + 30.996989, + 31.128032, + 31.257171, + 31.384438, + 31.509866, + 31.633485, + 31.755328, + 31.875423, + 31.993801, + 32.110491, + 32.225522, + 32.338922, + 32.450720, + 32.560942, + 32.669615, + 32.776766, + 32.882421, + 32.986604, + 33.089342, + 33.190658, + 33.290578, + 33.389123, + 33.486318, + 33.582186, + 33.676748, + 33.770027, + 33.862045, + 33.952822, + 34.042379, + 34.130737, + 34.217915, + 34.303934, + 34.388812, + 34.472568, + 34.555222, + 34.636791, + 34.717292, + 34.796744, + 34.875164, + 34.952569, + 35.028974, + 35.104397, + 35.178854, + 35.252359, + 35.324929, + 35.396578, + 35.467321, + 35.537174, + 35.606149, + 35.674261, + 35.741523, + 35.807950, + 35.873554, + 35.938348, + 36.002346, + 36.065559, + 36.127999, + 36.189680, + 36.250612, + 36.310808, + 36.370278, + 36.429034, + 36.487086, + 36.544447, + 36.601125, + 36.657132, + 36.712478, + 36.767173, + 36.821226, + 36.874648, + 36.927447, + 36.979633, + 37.031216, + 37.082204, + 37.132606, + 37.182431, + 37.231687, + 37.280382, + 37.328526, + 37.376125, + 37.423189, + 37.469724, + 37.515738, + 37.561239, + 37.606235, + 37.650732, + 37.694738, + 37.738259, + 37.781303, + 37.823876, + 37.865986, + 37.907638, + 37.948839, + 37.989595, + 38.029913, + 38.069799, + 38.109258, + 38.148297, + 38.186921, + 38.225137, + 38.262949, + 38.300364, + 38.337387, + 38.374022, + 38.410276, + 38.446153, + 38.481659, + 38.516799, + 38.551577, + 38.585999, + 38.620069, + 38.653791, + 38.687171, + 38.720213, + 38.752921, + 38.785300, + 38.817355, + 38.849088, + 38.880505, + 38.911610, + 38.942407, + 38.972899, + 39.003091, + 39.032987, + 39.062590, + 39.091904, + 39.120932, + 39.149679, + 39.178148, + 39.206342, + 39.234266, + 39.261921, + 39.289313, + 39.316443, + 39.343315, + 39.369933, + 39.396300, + 39.422418, + 39.448291, + 39.473922, + 39.499313, + 39.524469, + 39.549390, + 39.574081, + 39.598545, + 39.622783, + 39.646799, + 39.670595, + 39.694174, + 39.717539, + 39.740691, + 39.763635, + 39.786371, + 39.808903, + 39.831234, + 39.853364, + 39.875297, + 39.897035, + 39.918580, + 39.939935, + 39.961102, + 39.982082, + 40.002879, + 40.023493, + 40.043928, + 40.064186, + 40.084267, + 40.104175, + 40.123911, + 40.143478, + 40.162876, + 40.182109, + 40.201178, + 40.220084, + 40.238830, + 40.257418, + 40.275848, + 40.294124, + 40.312246, + 40.330216, + 40.348036, + 40.365708, + 40.383233, + 40.400613, + 40.417850, + 40.434944, + 40.451898, + 40.468713, + 40.485390, + 40.501932, + 40.518339, + 40.534612, + 40.550755, + 40.566766, + 40.582650, + 40.598405, + 40.614034, + 40.629539, + 40.644920, + 40.660179, + 40.675317, + 40.690335, + 40.705235, + 40.720017, + 40.734684, + 40.749235, + 40.763674, + 40.777999, + 40.792214, + 40.806318, + 40.820313, + 40.834201, + 40.847981, + 40.861656, + 40.875226, + 40.888693, + 40.902057, + 40.915319, + 40.928481, + 40.941544, + 40.954507, + 40.967374, + 40.980144, + 40.992818, + 41.005397, + 41.017883, + 41.030276, + 41.042577, + 41.054787, + 41.066907, + 41.078938, + 41.090880, + 41.102735, + 41.114503, + 41.126186, + 41.137783, + 41.149296, + 41.160726, + 41.172073, + 41.183339, + 41.194523, + 41.205627, + 41.216652, + 41.227598, + 41.238465, + 41.249256, + 41.259970, + 41.270609, + 41.281172, + 41.291660, + 41.302076, + 41.312418, + 41.322687, + 41.332885, + 41.343012, + 41.353069, + 41.363056, + 41.372973, + 41.382823, + 41.392604, + 41.402318, + 41.411966, + 41.421548, + 41.431064, + 41.440515, + 41.449903, + 41.459226, + 41.468487, + 41.477685, + 41.486821, + 41.495895, + 41.504909, + 41.513862, + 41.522756, + 41.531590, + 41.540366, + 41.549083, + 41.557743, + 41.566345, + 41.574891, + 41.583381, + 41.591815, + 41.600193, + 41.608517, + 41.616787, + 41.625002, + 41.633165, + 41.641274, + 41.649331, + 41.657336, + 41.665290, + 41.673192, + 41.681044, + 41.688845, + 41.696597, + 41.704299, + 41.711952, + 41.719557, + 41.727113, + 41.734622, + 41.742084, + 41.749498, + 41.756866, + 41.764187, + 41.771463, + 41.778694, + 41.785879, + 41.793020, + 41.800116, + 41.807169, + 41.814177, + 41.821143, + 41.828066, + 41.834946, + 41.841784, + 41.848580, + 41.855335, + 41.862048, + 41.868721, + 41.875353, + 41.881945, + 41.888497, + 41.895010, + 41.901483, + 41.907918, + 41.914314, + 41.920671, + 41.926991, + 41.933273, + 41.939518, + 41.945725, + 41.951896, + 41.958030, + 41.964128, + 41.970190, + 41.976216, + 41.982207, + 41.988163, + 41.994084, + 41.999970, + 42.005822, + 42.011640, + 42.017424, + 42.023175, + 42.028893, + 42.034577, + 42.040229, + 42.045848, + 42.051435, + 42.056990, + 42.062514, + 42.068005, + 42.073466, + 42.078895, + 42.084294, + 42.089662, + 42.094999, + 42.100307, + 42.105585, + 42.110832, + 42.116051, + 42.121240, + 42.126400, + 42.131532, + 42.136635, + 42.141709, + 42.146755, + 42.151774, + 42.156764, + 42.161727, + 42.166663, + 42.171572, + 42.176453, + 42.181308, + 42.186136, + 42.190938, + 42.195714, + 42.200463, + 42.205187, + 42.209885, + 42.214558, + 42.219206, + 42.223828, + 42.228426, + 42.232999, + 42.237547, + 42.242071, + 42.246571, + 42.251047, + 42.255499, + 42.259927, + 42.264332, + 42.268713, + 42.273072, + 42.277407, + 42.281719, + 42.286009, + 42.290276, + 42.294521, + 42.298743, + 42.302944, + 42.307122, + 42.311279, + 42.315414, + 42.319528, + 42.323620, + 42.327691, + 42.331741, + 42.335770, + 42.339779, + 42.343767, + 42.347734, + 42.351681, + 42.355608, + 42.359515, + 42.363402, + 42.367270, + 42.371117, + 42.374945, + 42.378754, + 42.382543, + 42.386314, + 42.390065, + 42.393797, + 42.397511, + 42.401206, + 42.404883, + 42.408541, + 42.412181, + 42.415803, + 42.419407, + 42.422993, + 42.426561, + 42.430112, + 42.433645, + 42.437160, + 42.440659, + 42.444140, + 42.447604, + 42.451051, + 42.454481, + 42.457895, + 42.461291, + 42.464672, + 42.468036, + 42.471383, + 42.474714, + 42.478030, + 42.481329, + 42.484612, + 42.487880, + 42.491131, + 42.494368, + 42.497588, + 42.500794, + 42.503984, + 42.507158, + 42.510318, + 42.513463, + 42.516592, + 42.519707, + 42.522807, + 42.525893, + 42.528964, + 42.532020, + 42.535062, + 42.538090, + 42.541104, + 42.544103, + 42.547089, + 42.550060, + 42.553018, + 42.555962, + 42.558893, + 42.561809, + 42.564713, + 42.567602, + 42.570479, + 42.573342, + 42.576192, + 42.579029, + 42.581853, + 42.584664, + 42.587462, + 42.590247, + 42.593020, + 42.595780, + 42.598528, + 42.601263, + 42.603985, + 42.606696, + 42.609394, + 42.612079, + 42.614753, + 42.617415, + 42.620065, + 42.622703, + 42.625329, + 42.627943, + 42.630546, + 42.633137, + 42.635716, + 42.638284, + 42.640841, + 42.643386, + 42.645920, + 42.648443, + 42.650955, + 42.653455, + 42.655945, + 42.658424, + 42.660892, + 42.663349, + 42.665795, + 42.668230, + 42.670655, + 42.673070, + 42.675473, + 42.677867, + 42.680250, + 42.682623, + 42.684985, + 42.687337, + 42.689679, + 42.692011, + 42.694333, + 42.696645, + 42.698947, + 42.701240, + 42.703522, + 42.705795, + 42.708058, + 42.710311, + 42.712555, + 42.714789, + 42.717014, + 42.719229, + 42.721435, + 42.723632, + 42.725819, + 42.727997, + 42.730166, + 42.732326, + 42.734477, + 42.736619, + 42.738752, + 42.740876, + 42.742991, + 42.745097, + 42.747195, + 42.749284, + 42.751364, + 42.753435, + 42.755498, + 42.757553, + 42.759599, + 42.761636, + 42.763665, + 42.765686, + 42.767699, + 42.769703, + 42.771699, + 42.773687, + 42.775667, + 42.777639, + 42.779603, + 42.781558, + 42.783506, + 42.785446, + 42.787378, + 42.789302, + 42.791219, + 42.793128, + 42.795029, + 42.796922, + 42.798808, + 42.800686, + 42.802557, + 42.804420, + 42.806276, + 42.808124, + 42.809966, + 42.811799, + 42.813626, + 42.815445, + 42.817257, + 42.819062, + 42.820859, + 42.822650, + 42.824433, + 42.826210, + 42.827979, + 42.829742, + 42.831498, + 42.833246, + 42.834988, + 42.836724, + 42.838452, + 42.840174, + 42.841888, + 42.843597, + 42.845298, + 42.846993, + 42.848682, + 42.850364, + 42.852039, + 42.853708, + 42.855371, + 42.857027, + 42.858677, + 42.860320, + 42.861957, + 42.863588, + 42.865213, + 42.866831, + 42.868444, + 42.870050, + 42.871650, + 42.873244, + 42.874832, + 42.876414, + 42.877990, + 42.879560, + 42.881124, + 42.882682, + 42.884234, + 42.885780, + 42.887321, + 42.888856, + 42.890385, + 42.891908, + 42.893426, + 42.894938, + 42.896444, + 42.897945, + 42.899440, + 42.900930, + 42.902414, + 42.903893, + 42.905366, + 42.906834, + 42.908296, + 42.909753, + 42.911204, + 42.912650, + 42.914091, + 42.915527, + 42.916957, + 42.918382, + 42.919802, + 42.921217, + 42.922626, + 42.924031, + 42.925430, + 42.926824, + 42.928213, + 42.929597, + 42.930976, + 42.932350, + 42.933720, + 42.935084, + 42.936443, + 42.937797, + 42.939147, + 42.940492, + 42.941831, + 42.943167, + 42.944497, + 42.945822, + 42.947143, + 42.948459, + 42.949771, + 42.951077, + 42.952379, + 42.953677, + 42.954970, + 42.956258, + 42.957542, + 42.958821, + 42.960096, + 42.961366, + 42.962631, + 42.963893, + 42.965150, + 42.966402, + 42.967650, + 42.968894, + 42.970133, + 42.971368, + 42.972599, + 42.973825, + 42.975047, + 42.976265, + 42.977479, + 42.978688, + 42.979894, + 42.981095, + 42.982292, + 42.983484, + 42.984673, + 42.985858, + 42.987038, + 42.988215, + 42.989387, + 42.990556, + 42.991720, + 42.992880, + 42.994037, + 42.995189, + 42.996338, + 42.997483, + 42.998624, + 42.999761, + 43.000894, + 43.002023, + 43.003148, + 43.004270, + 43.005388, + 43.006502, + 43.007612, + 43.008719, + 43.009821, + 43.010920, + 43.012016, + 43.013108, + 43.014196, + 43.015280, + 43.016361, + 43.017438, + 43.018512, + 43.019582, + 43.020649, + 43.021712, + 43.022771, + 43.023827, + 43.024879, + 43.025928, + 43.026974, + 43.028016, + 43.029054, + 43.030090, + 43.031121, + 43.032150, + 43.033175, + 43.034197, + 43.035215, + 43.036230, + 43.037241, + 43.038250, + 43.039255, + 43.040257, + 43.041255, + 43.042251, + 43.043243, + 43.044231, + 43.045217, + 43.046200, + 43.047179, + 43.048155, + 43.049128, + 43.050098, + 43.051064, + 43.052028, + 43.052988, + 43.053946, + 43.054900, + 43.055852, + 43.056800, + 43.057745, + 43.058687, + 43.059626, + 43.060563, + 43.061496, + 43.062426, + 43.063353, + 43.064278, + 43.065199, + 43.066118, + 43.067033, + 43.067946, + 43.068856, + 43.069763, + 43.070667, + 43.071568, + 43.072467, + 43.073362, + 43.074255, + 43.075145, + 43.076032, + 43.076917, + 43.077799, + 43.078678, + 43.079554, + 43.080427, + 43.081298, + 43.082166, + 43.083031, + 43.083894, + 43.084754, + 43.085612, + 43.086466, + 43.087318, + 43.088168, + 43.089015, + 43.089859, + 43.090700, + 43.091539, + 43.092376, + 43.093210, + 43.094041, + 43.094870, + 43.095696, + 43.096520, + 43.097341, + 43.098160, + 43.098976, + 43.099790, + 43.100601, + 43.101410, + 43.102216, + 43.103020, + 43.103822, + 43.104621, + 43.105418, + 43.106212, + 43.107004, + 43.107793, + 43.108580, + 43.109365, + 43.110147, + 43.110927, + 43.111705, + 43.112481, + 43.113254, + 43.114024, + }, + {// The expectations for dimension = 88 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706666, + 7.935000, + 8.166666, + 8.401665, + 8.639997, + 8.881661, + 9.126656, + 9.374981, + 9.626633, + 9.881609, + 10.139903, + 10.401508, + 10.666411, + 10.934596, + 11.206040, + 11.480712, + 11.758571, + 12.039563, + 12.323622, + 12.610661, + 12.900578, + 13.193249, + 13.488527, + 13.786242, + 14.086202, + 14.388192, + 14.691975, + 14.997295, + 15.303880, + 15.611442, + 15.919688, + 16.228315, + 16.537020, + 16.845502, + 17.153465, + 17.460625, + 17.766705, + 18.071447, + 18.374604, + 18.675951, + 18.975277, + 19.272390, + 19.567117, + 19.859302, + 20.148805, + 20.435504, + 20.719291, + 21.000072, + 21.277766, + 21.552306, + 21.823635, + 22.091705, + 22.356481, + 22.617932, + 22.876039, + 23.130787, + 23.382169, + 23.630182, + 23.874831, + 24.116123, + 24.354071, + 24.588690, + 24.819999, + 25.048022, + 25.272783, + 25.494309, + 25.712630, + 25.927777, + 26.139784, + 26.348683, + 26.554511, + 26.757305, + 26.957101, + 27.153938, + 27.347855, + 27.538890, + 27.727084, + 27.912476, + 28.095106, + 28.275015, + 28.452243, + 28.626829, + 28.798815, + 28.968239, + 29.135142, + 29.299564, + 29.461542, + 29.621117, + 29.778328, + 29.933211, + 30.085806, + 30.236149, + 30.384277, + 30.530228, + 30.674037, + 30.815740, + 30.955372, + 31.092968, + 31.228562, + 31.362188, + 31.493878, + 31.623666, + 31.751583, + 31.877662, + 32.001934, + 32.124429, + 32.245177, + 32.364208, + 32.481552, + 32.597236, + 32.711289, + 32.823740, + 32.934614, + 33.043938, + 33.151740, + 33.258045, + 33.362877, + 33.466263, + 33.568225, + 33.668790, + 33.767979, + 33.865816, + 33.962324, + 34.057525, + 34.151441, + 34.244093, + 34.335503, + 34.425691, + 34.514677, + 34.602482, + 34.689124, + 34.774624, + 34.859000, + 34.942270, + 35.024453, + 35.105567, + 35.185628, + 35.264654, + 35.342662, + 35.419669, + 35.495690, + 35.570742, + 35.644839, + 35.717999, + 35.790234, + 35.861561, + 35.931994, + 36.001547, + 36.070233, + 36.138068, + 36.205063, + 36.271232, + 36.336589, + 36.401146, + 36.464915, + 36.527908, + 36.590139, + 36.651618, + 36.712357, + 36.772367, + 36.831660, + 36.890247, + 36.948138, + 37.005345, + 37.061876, + 37.117743, + 37.172956, + 37.227525, + 37.281458, + 37.334766, + 37.387458, + 37.439543, + 37.491030, + 37.541928, + 37.592246, + 37.641992, + 37.691174, + 37.739801, + 37.787881, + 37.835422, + 37.882431, + 37.928917, + 37.974886, + 38.020347, + 38.065306, + 38.109771, + 38.153748, + 38.197246, + 38.240269, + 38.282826, + 38.324922, + 38.366564, + 38.407759, + 38.448512, + 38.488830, + 38.528719, + 38.568185, + 38.607234, + 38.645870, + 38.684101, + 38.721931, + 38.759367, + 38.796412, + 38.833073, + 38.869355, + 38.905263, + 38.940801, + 38.975976, + 39.010791, + 39.045252, + 39.079363, + 39.113128, + 39.146554, + 39.179642, + 39.212400, + 39.244829, + 39.276936, + 39.308723, + 39.340196, + 39.371358, + 39.402214, + 39.432766, + 39.463020, + 39.492978, + 39.522645, + 39.552025, + 39.581120, + 39.609935, + 39.638473, + 39.666738, + 39.694733, + 39.722461, + 39.749926, + 39.777131, + 39.804079, + 39.830773, + 39.857217, + 39.883414, + 39.909366, + 39.935076, + 39.960549, + 39.985785, + 40.010789, + 40.035563, + 40.060110, + 40.084432, + 40.108533, + 40.132415, + 40.156080, + 40.179531, + 40.202771, + 40.225802, + 40.248627, + 40.271247, + 40.293666, + 40.315886, + 40.337909, + 40.359738, + 40.381374, + 40.402819, + 40.424077, + 40.445149, + 40.466038, + 40.486745, + 40.507272, + 40.527622, + 40.547797, + 40.567798, + 40.587628, + 40.607288, + 40.626780, + 40.646107, + 40.665270, + 40.684271, + 40.703111, + 40.721793, + 40.740318, + 40.758688, + 40.776905, + 40.794971, + 40.812886, + 40.830653, + 40.848273, + 40.865748, + 40.883080, + 40.900270, + 40.917319, + 40.934229, + 40.951001, + 40.967638, + 40.984140, + 41.000509, + 41.016747, + 41.032854, + 41.048832, + 41.064682, + 41.080407, + 41.096006, + 41.111482, + 41.126835, + 41.142068, + 41.157180, + 41.172175, + 41.187051, + 41.201812, + 41.216458, + 41.230990, + 41.245410, + 41.259718, + 41.273916, + 41.288004, + 41.301985, + 41.315859, + 41.329626, + 41.343289, + 41.356848, + 41.370305, + 41.383660, + 41.396914, + 41.410068, + 41.423124, + 41.436082, + 41.448943, + 41.461708, + 41.474379, + 41.486955, + 41.499439, + 41.511831, + 41.524131, + 41.536341, + 41.548461, + 41.560493, + 41.572437, + 41.584295, + 41.596066, + 41.607752, + 41.619354, + 41.630872, + 41.642307, + 41.653660, + 41.664932, + 41.676124, + 41.687235, + 41.698268, + 41.709223, + 41.720100, + 41.730900, + 41.741624, + 41.752273, + 41.762847, + 41.773348, + 41.783775, + 41.794129, + 41.804411, + 41.814623, + 41.824763, + 41.834834, + 41.844835, + 41.854768, + 41.864632, + 41.874429, + 41.884159, + 41.893823, + 41.903421, + 41.912954, + 41.922423, + 41.931828, + 41.941169, + 41.950448, + 41.959664, + 41.968819, + 41.977913, + 41.986946, + 41.995919, + 42.004832, + 42.013687, + 42.022483, + 42.031221, + 42.039902, + 42.048525, + 42.057093, + 42.065604, + 42.074059, + 42.082460, + 42.090806, + 42.099098, + 42.107337, + 42.115522, + 42.123655, + 42.131735, + 42.139764, + 42.147741, + 42.155667, + 42.163543, + 42.171368, + 42.179144, + 42.186871, + 42.194549, + 42.202179, + 42.209760, + 42.217294, + 42.224781, + 42.232221, + 42.239614, + 42.246961, + 42.254263, + 42.261519, + 42.268731, + 42.275898, + 42.283020, + 42.290099, + 42.297135, + 42.304127, + 42.311076, + 42.317983, + 42.324848, + 42.331672, + 42.338453, + 42.345194, + 42.351894, + 42.358554, + 42.365173, + 42.371753, + 42.378293, + 42.384794, + 42.391257, + 42.397680, + 42.404066, + 42.410413, + 42.416723, + 42.422996, + 42.429232, + 42.435430, + 42.441593, + 42.447719, + 42.453809, + 42.459864, + 42.465883, + 42.471868, + 42.477817, + 42.483732, + 42.489613, + 42.495459, + 42.501272, + 42.507052, + 42.512798, + 42.518511, + 42.524192, + 42.529840, + 42.535456, + 42.541039, + 42.546592, + 42.552112, + 42.557601, + 42.563060, + 42.568487, + 42.573884, + 42.579251, + 42.584587, + 42.589894, + 42.595171, + 42.600418, + 42.605636, + 42.610826, + 42.615986, + 42.621118, + 42.626221, + 42.631296, + 42.636344, + 42.641363, + 42.646355, + 42.651320, + 42.656257, + 42.661168, + 42.666051, + 42.670909, + 42.675739, + 42.680544, + 42.685322, + 42.690075, + 42.694802, + 42.699504, + 42.704180, + 42.708832, + 42.713458, + 42.718060, + 42.722637, + 42.727189, + 42.731718, + 42.736222, + 42.740703, + 42.745160, + 42.749593, + 42.754003, + 42.758390, + 42.762754, + 42.767095, + 42.771413, + 42.775708, + 42.779981, + 42.784232, + 42.788461, + 42.792668, + 42.796853, + 42.801016, + 42.805158, + 42.809279, + 42.813378, + 42.817456, + 42.821513, + 42.825550, + 42.829566, + 42.833561, + 42.837536, + 42.841491, + 42.845426, + 42.849341, + 42.853236, + 42.857111, + 42.860967, + 42.864803, + 42.868620, + 42.872418, + 42.876197, + 42.879957, + 42.883698, + 42.887420, + 42.891124, + 42.894810, + 42.898477, + 42.902126, + 42.905757, + 42.909370, + 42.912966, + 42.916543, + 42.920103, + 42.923646, + 42.927171, + 42.930679, + 42.934170, + 42.937644, + 42.941101, + 42.944541, + 42.947964, + 42.951371, + 42.954761, + 42.958136, + 42.961493, + 42.964835, + 42.968160, + 42.971470, + 42.974764, + 42.978042, + 42.981304, + 42.984551, + 42.987782, + 42.990998, + 42.994199, + 42.997384, + 43.000555, + 43.003710, + 43.006851, + 43.009977, + 43.013088, + 43.016184, + 43.019266, + 43.022334, + 43.025387, + 43.028426, + 43.031451, + 43.034462, + 43.037459, + 43.040442, + 43.043411, + 43.046366, + 43.049308, + 43.052236, + 43.055151, + 43.058052, + 43.060940, + 43.063815, + 43.066676, + 43.069525, + 43.072361, + 43.075183, + 43.077993, + 43.080790, + 43.083575, + 43.086346, + 43.089106, + 43.091853, + 43.094587, + 43.097309, + 43.100019, + 43.102717, + 43.105403, + 43.108076, + 43.110738, + 43.113388, + 43.116026, + 43.118652, + 43.121267, + 43.123870, + 43.126462, + 43.129042, + 43.131611, + 43.134168, + 43.136714, + 43.139249, + 43.141773, + 43.144286, + 43.146787, + 43.149278, + 43.151758, + 43.154228, + 43.156686, + 43.159134, + 43.161571, + 43.163997, + 43.166414, + 43.168819, + 43.171215, + 43.173600, + 43.175974, + 43.178339, + 43.180693, + 43.183037, + 43.185372, + 43.187696, + 43.190010, + 43.192315, + 43.194610, + 43.196895, + 43.199170, + 43.201436, + 43.203692, + 43.205938, + 43.208175, + 43.210403, + 43.212621, + 43.214830, + 43.217030, + 43.219220, + 43.221402, + 43.223574, + 43.225737, + 43.227891, + 43.230037, + 43.232173, + 43.234300, + 43.236419, + 43.238529, + 43.240630, + 43.242722, + 43.244806, + 43.246882, + 43.248948, + 43.251007, + 43.253057, + 43.255098, + 43.257131, + 43.259156, + 43.261173, + 43.263181, + 43.265181, + 43.267173, + 43.269157, + 43.271133, + 43.273101, + 43.275061, + 43.277013, + 43.278958, + 43.280894, + 43.282823, + 43.284744, + 43.286657, + 43.288563, + 43.290461, + 43.292351, + 43.294234, + 43.296110, + 43.297978, + 43.299838, + 43.301691, + 43.303537, + 43.305376, + 43.307207, + 43.309031, + 43.310848, + 43.312658, + 43.314460, + 43.316256, + 43.318044, + 43.319826, + 43.321601, + 43.323368, + 43.325129, + 43.326883, + 43.328630, + 43.330370, + 43.332104, + 43.333831, + 43.335551, + 43.337265, + 43.338972, + 43.340672, + 43.342366, + 43.344053, + 43.345734, + 43.347408, + 43.349076, + 43.350738, + 43.352393, + 43.354042, + 43.355685, + 43.357321, + 43.358952, + 43.360576, + 43.362194, + 43.363805, + 43.365411, + 43.367011, + 43.368604, + 43.370192, + 43.371773, + 43.373349, + 43.374919, + 43.376483, + 43.378041, + 43.379593, + 43.381139, + 43.382680, + 43.384215, + 43.385744, + 43.387268, + 43.388785, + 43.390298, + 43.391804, + 43.393305, + 43.394801, + 43.396291, + 43.397776, + 43.399255, + 43.400728, + 43.402196, + 43.403659, + 43.405117, + 43.406569, + 43.408016, + 43.409457, + 43.410894, + 43.412325, + 43.413751, + 43.415172, + 43.416587, + 43.417998, + 43.419403, + 43.420803, + 43.422199, + 43.423589, + 43.424974, + 43.426354, + 43.427729, + 43.429100, + 43.430465, + 43.431826, + 43.433181, + 43.434532, + 43.435878, + 43.437220, + 43.438556, + 43.439888, + 43.441215, + 43.442537, + 43.443855, + 43.445168, + 43.446476, + 43.447780, + 43.449079, + 43.450373, + 43.451663, + 43.452949, + 43.454230, + 43.455506, + 43.456778, + 43.458046, + 43.459309, + 43.460567, + 43.461822, + 43.463072, + 43.464317, + 43.465559, + 43.466796, + 43.468028, + 43.469257, + 43.470481, + 43.471701, + 43.472917, + 43.474128, + 43.475336, + 43.476539, + 43.477738, + 43.478933, + 43.480124, + 43.481311, + 43.482494, + 43.483672, + 43.484847, + 43.486018, + 43.487185, + 43.488348, + 43.489506, + 43.490661, + 43.491812, + 43.492960, + 43.494103, + 43.495242, + 43.496378, + 43.497510, + 43.498638, + 43.499762, + 43.500882, + 43.501999, + 43.503112, + 43.504221, + 43.505326, + 43.506428, + 43.507526, + 43.508621, + 43.509711, + 43.510798, + 43.511882, + 43.512962, + 43.514038, + 43.515111, + 43.516181, + 43.517246, + 43.518309, + 43.519367, + 43.520423, + 43.521475, + 43.522523, + 43.523568, + 43.524609, + 43.525647, + 43.526682, + 43.527713, + 43.528741, + 43.529766, + 43.530787, + 43.531805, + 43.532820, + 43.533831, + 43.534839, + 43.535844, + 43.536846, + 43.537844, + 43.538839, + 43.539831, + 43.540820, + 43.541805, + 43.542788, + 43.543767, + 43.544743, + 43.545716, + 43.546686, + 43.547653, + 43.548616, + 43.549577, + 43.550534, + 43.551489, + 43.552440, + 43.553389, + 43.554334, + 43.555277, + 43.556216, + 43.557153, + 43.558086, + 43.559017, + 43.559944, + 43.560869, + 43.561791, + 43.562710, + 43.563626, + 43.564539, + 43.565449, + 43.566357, + 43.567261, + 43.568163, + 43.569062, + 43.569958, + 43.570852, + 43.571742, + 43.572630, + 43.573515, + 43.574398, + 43.575277, + 43.576154, + 43.577028, + 43.577900, + 43.578769, + 43.579635, + 43.580498, + 43.581359, + 43.582217, + 43.583073, + 43.583925, + 43.584776, + 43.585623, + 43.586469, + 43.587311, + 43.588151, + 43.588988, + 43.589823, + 43.590656, + 43.591485, + 43.592313, + 43.593137, + 43.593960, + 43.594779, + 43.595597, + 43.596411, + 43.597224, + 43.598034, + 43.598841, + 43.599646, + 43.600449, + 43.601249, + 43.602047, + 43.602842, + 43.603635, + 43.604426, + 43.605214, + }, + {// The expectations for dimension = 89 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166666, + 8.401666, + 8.639998, + 8.881662, + 9.126659, + 9.374986, + 9.626642, + 9.881623, + 10.139927, + 10.401545, + 10.666468, + 10.934684, + 11.206171, + 11.480905, + 11.758849, + 12.039958, + 12.324172, + 12.611415, + 12.901596, + 13.194601, + 13.490297, + 13.788526, + 14.089111, + 14.391847, + 14.696510, + 15.002855, + 15.310619, + 15.619522, + 15.929275, + 16.239579, + 16.550133, + 16.860633, + 17.170783, + 17.480289, + 17.788872, + 18.096264, + 18.402210, + 18.706475, + 19.008839, + 19.309100, + 19.607074, + 19.902596, + 20.195516, + 20.485703, + 20.773039, + 21.057424, + 21.338769, + 21.616998, + 21.892049, + 22.163867, + 22.432411, + 22.697647, + 22.959548, + 23.218096, + 23.473279, + 23.725093, + 23.973537, + 24.218615, + 24.460338, + 24.698718, + 24.933773, + 25.165523, + 25.393990, + 25.619201, + 25.841183, + 26.059966, + 26.275582, + 26.488063, + 26.697445, + 26.903762, + 27.107052, + 27.307351, + 27.504699, + 27.699133, + 27.890693, + 28.079418, + 28.265347, + 28.448522, + 28.628982, + 28.806767, + 28.981916, + 29.154470, + 29.324469, + 29.491952, + 29.656958, + 29.819526, + 29.979695, + 30.137504, + 30.292990, + 30.446192, + 30.597145, + 30.745888, + 30.892455, + 31.036885, + 31.179210, + 31.319468, + 31.457691, + 31.593915, + 31.728172, + 31.860496, + 31.990918, + 32.119472, + 32.246189, + 32.371098, + 32.494232, + 32.615620, + 32.735291, + 32.853275, + 32.969599, + 33.084293, + 33.197383, + 33.308897, + 33.418861, + 33.527301, + 33.634244, + 33.739713, + 33.843735, + 33.946332, + 34.047530, + 34.147352, + 34.245820, + 34.342957, + 34.438786, + 34.533328, + 34.626605, + 34.718637, + 34.809446, + 34.899050, + 34.987472, + 35.074729, + 35.160841, + 35.245826, + 35.329704, + 35.412492, + 35.494208, + 35.574869, + 35.654493, + 35.733096, + 35.810695, + 35.887306, + 35.962945, + 36.037627, + 36.111368, + 36.184182, + 36.256085, + 36.327091, + 36.397214, + 36.466467, + 36.534866, + 36.602423, + 36.669150, + 36.735063, + 36.800172, + 36.864490, + 36.928030, + 36.990804, + 37.052823, + 37.114099, + 37.174644, + 37.234468, + 37.293583, + 37.351999, + 37.409727, + 37.466777, + 37.523160, + 37.578886, + 37.633963, + 37.688403, + 37.742215, + 37.795407, + 37.847989, + 37.899971, + 37.951360, + 38.002166, + 38.052396, + 38.102061, + 38.151167, + 38.199723, + 38.247737, + 38.295216, + 38.342168, + 38.388602, + 38.434523, + 38.479940, + 38.524860, + 38.569290, + 38.613236, + 38.656706, + 38.699706, + 38.742242, + 38.784322, + 38.825952, + 38.867137, + 38.907884, + 38.948200, + 38.988089, + 39.027558, + 39.066612, + 39.105258, + 39.143501, + 39.181346, + 39.218798, + 39.255863, + 39.292547, + 39.328853, + 39.364788, + 39.400356, + 39.435562, + 39.470411, + 39.504908, + 39.539057, + 39.572862, + 39.606329, + 39.639462, + 39.672265, + 39.704742, + 39.736897, + 39.768736, + 39.800261, + 39.831477, + 39.862388, + 39.892997, + 39.923309, + 39.953327, + 39.983056, + 40.012498, + 40.041657, + 40.070537, + 40.099141, + 40.127473, + 40.155536, + 40.183334, + 40.210870, + 40.238146, + 40.265167, + 40.291934, + 40.318453, + 40.344725, + 40.370753, + 40.396541, + 40.422091, + 40.447406, + 40.472489, + 40.497343, + 40.521971, + 40.546374, + 40.570557, + 40.594521, + 40.618270, + 40.641805, + 40.665129, + 40.688245, + 40.711155, + 40.733862, + 40.756367, + 40.778674, + 40.800784, + 40.822700, + 40.844424, + 40.865958, + 40.887305, + 40.908466, + 40.929444, + 40.950241, + 40.970858, + 40.991298, + 41.011564, + 41.031656, + 41.051576, + 41.071328, + 41.090912, + 41.110330, + 41.129585, + 41.148677, + 41.167610, + 41.186384, + 41.205002, + 41.223465, + 41.241774, + 41.259932, + 41.277941, + 41.295800, + 41.313514, + 41.331082, + 41.348506, + 41.365789, + 41.382931, + 41.399935, + 41.416801, + 41.433530, + 41.450126, + 41.466588, + 41.482918, + 41.499119, + 41.515190, + 41.531133, + 41.546951, + 41.562643, + 41.578212, + 41.593658, + 41.608983, + 41.624188, + 41.639275, + 41.654245, + 41.669098, + 41.683836, + 41.698460, + 41.712972, + 41.727372, + 41.741661, + 41.755842, + 41.769914, + 41.783879, + 41.797738, + 41.811492, + 41.825142, + 41.838689, + 41.852135, + 41.865479, + 41.878724, + 41.891870, + 41.904918, + 41.917869, + 41.930724, + 41.943484, + 41.956150, + 41.968723, + 41.981203, + 41.993592, + 42.005891, + 42.018099, + 42.030219, + 42.042252, + 42.054197, + 42.066055, + 42.077829, + 42.089518, + 42.101123, + 42.112644, + 42.124084, + 42.135442, + 42.146720, + 42.157917, + 42.169036, + 42.180076, + 42.191038, + 42.201923, + 42.212732, + 42.223465, + 42.234124, + 42.244708, + 42.255219, + 42.265657, + 42.276022, + 42.286316, + 42.296540, + 42.306693, + 42.316777, + 42.326791, + 42.336738, + 42.346616, + 42.356428, + 42.366173, + 42.375852, + 42.385466, + 42.395015, + 42.404500, + 42.413921, + 42.423279, + 42.432575, + 42.441809, + 42.450982, + 42.460093, + 42.469145, + 42.478136, + 42.487069, + 42.495943, + 42.504758, + 42.513516, + 42.522217, + 42.530860, + 42.539448, + 42.547980, + 42.556457, + 42.564878, + 42.573246, + 42.581560, + 42.589820, + 42.598027, + 42.606182, + 42.614285, + 42.622336, + 42.630336, + 42.638285, + 42.646184, + 42.654033, + 42.661832, + 42.669583, + 42.677284, + 42.684938, + 42.692544, + 42.700102, + 42.707613, + 42.715077, + 42.722495, + 42.729868, + 42.737194, + 42.744476, + 42.751712, + 42.758905, + 42.766053, + 42.773157, + 42.780218, + 42.787236, + 42.794212, + 42.801145, + 42.808036, + 42.814885, + 42.821693, + 42.828461, + 42.835187, + 42.841873, + 42.848519, + 42.855126, + 42.861693, + 42.868221, + 42.874710, + 42.881161, + 42.887574, + 42.893948, + 42.900286, + 42.906585, + 42.912848, + 42.919075, + 42.925265, + 42.931418, + 42.937536, + 42.943618, + 42.949665, + 42.955677, + 42.961655, + 42.967597, + 42.973506, + 42.979381, + 42.985221, + 42.991029, + 42.996803, + 43.002544, + 43.008253, + 43.013929, + 43.019573, + 43.025185, + 43.030765, + 43.036314, + 43.041832, + 43.047318, + 43.052774, + 43.058199, + 43.063594, + 43.068959, + 43.074293, + 43.079599, + 43.084874, + 43.090121, + 43.095338, + 43.100527, + 43.105687, + 43.110819, + 43.115923, + 43.120998, + 43.126046, + 43.131066, + 43.136059, + 43.141025, + 43.145964, + 43.150876, + 43.155761, + 43.160620, + 43.165453, + 43.170260, + 43.175041, + 43.179796, + 43.184526, + 43.189231, + 43.193910, + 43.198565, + 43.203195, + 43.207800, + 43.212381, + 43.216938, + 43.221470, + 43.225979, + 43.230464, + 43.234925, + 43.239363, + 43.243778, + 43.248170, + 43.252538, + 43.256884, + 43.261208, + 43.265509, + 43.269787, + 43.274044, + 43.278279, + 43.282491, + 43.286682, + 43.290852, + 43.295000, + 43.299127, + 43.303233, + 43.307318, + 43.311382, + 43.315425, + 43.319448, + 43.323451, + 43.327433, + 43.331395, + 43.335337, + 43.339259, + 43.343162, + 43.347045, + 43.350908, + 43.354752, + 43.358577, + 43.362383, + 43.366170, + 43.369938, + 43.373688, + 43.377419, + 43.381131, + 43.384825, + 43.388501, + 43.392159, + 43.395799, + 43.399421, + 43.403025, + 43.406611, + 43.410181, + 43.413732, + 43.417267, + 43.420784, + 43.424284, + 43.427767, + 43.431234, + 43.434683, + 43.438116, + 43.441533, + 43.444933, + 43.448317, + 43.451684, + 43.455036, + 43.458371, + 43.461691, + 43.464994, + 43.468283, + 43.471555, + 43.474812, + 43.478054, + 43.481280, + 43.484491, + 43.487687, + 43.490868, + 43.494034, + 43.497185, + 43.500321, + 43.503443, + 43.506550, + 43.509643, + 43.512721, + 43.515785, + 43.518835, + 43.521871, + 43.524892, + 43.527900, + 43.530894, + 43.533874, + 43.536841, + 43.539793, + 43.542733, + 43.545658, + 43.548571, + 43.551470, + 43.554356, + 43.557229, + 43.560089, + 43.562936, + 43.565770, + 43.568591, + 43.571400, + 43.574195, + 43.576979, + 43.579749, + 43.582508, + 43.585254, + 43.587987, + 43.590709, + 43.593418, + 43.596115, + 43.598801, + 43.601474, + 43.604136, + 43.606785, + 43.609423, + 43.612050, + 43.614665, + 43.617268, + 43.619860, + 43.622440, + 43.625010, + 43.627568, + 43.630114, + 43.632650, + 43.635175, + 43.637688, + 43.640191, + 43.642683, + 43.645164, + 43.647634, + 43.650094, + 43.652543, + 43.654982, + 43.657410, + 43.659827, + 43.662234, + 43.664631, + 43.667018, + 43.669395, + 43.671761, + 43.674117, + 43.676464, + 43.678800, + 43.681126, + 43.683443, + 43.685750, + 43.688047, + 43.690334, + 43.692612, + 43.694880, + 43.697138, + 43.699387, + 43.701627, + 43.703858, + 43.706079, + 43.708290, + 43.710493, + 43.712686, + 43.714871, + 43.717046, + 43.719212, + 43.721369, + 43.723518, + 43.725657, + 43.727788, + 43.729910, + 43.732023, + 43.734128, + 43.736223, + 43.738311, + 43.740390, + 43.742460, + 43.744522, + 43.746575, + 43.748621, + 43.750657, + 43.752686, + 43.754706, + 43.756719, + 43.758723, + 43.760719, + 43.762707, + 43.764687, + 43.766659, + 43.768623, + 43.770579, + 43.772528, + 43.774468, + 43.776401, + 43.778326, + 43.780244, + 43.782154, + 43.784056, + 43.785951, + 43.787839, + 43.789718, + 43.791591, + 43.793456, + 43.795314, + 43.797164, + 43.799007, + 43.800843, + 43.802672, + 43.804494, + 43.806308, + 43.808116, + 43.809916, + 43.811709, + 43.813496, + 43.815275, + 43.817048, + 43.818813, + 43.820572, + 43.822324, + 43.824070, + 43.825808, + 43.827540, + 43.829265, + 43.830984, + 43.832696, + 43.834402, + 43.836101, + 43.837793, + 43.839479, + 43.841159, + 43.842832, + 43.844499, + 43.846160, + 43.847814, + 43.849462, + 43.851104, + 43.852739, + 43.854369, + 43.855992, + 43.857609, + 43.859220, + 43.860825, + 43.862424, + 43.864017, + 43.865605, + 43.867186, + 43.868761, + 43.870330, + 43.871894, + 43.873452, + 43.875004, + 43.876550, + 43.878091, + 43.879625, + 43.881155, + 43.882678, + 43.884196, + 43.885708, + 43.887215, + 43.888717, + 43.890212, + 43.891703, + 43.893187, + 43.894667, + 43.896141, + 43.897610, + 43.899073, + 43.900531, + 43.901984, + 43.903431, + 43.904873, + 43.906310, + 43.907742, + 43.909169, + 43.910590, + 43.912006, + 43.913418, + 43.914824, + 43.916225, + 43.917621, + 43.919012, + 43.920399, + 43.921780, + 43.923156, + 43.924528, + 43.925894, + 43.927256, + 43.928613, + 43.929965, + 43.931312, + 43.932654, + 43.933992, + 43.935325, + 43.936654, + 43.937977, + 43.939296, + 43.940611, + 43.941920, + 43.943226, + 43.944526, + 43.945822, + 43.947114, + 43.948401, + 43.949683, + 43.950962, + 43.952235, + 43.953504, + 43.954769, + 43.956030, + 43.957286, + 43.958538, + 43.959785, + 43.961028, + 43.962267, + 43.963502, + 43.964732, + 43.965958, + 43.967180, + 43.968398, + 43.969611, + 43.970821, + 43.972026, + 43.973227, + 43.974424, + 43.975617, + 43.976806, + 43.977991, + 43.979172, + 43.980349, + 43.981522, + 43.982691, + 43.983856, + 43.985017, + 43.986175, + 43.987328, + 43.988477, + 43.989623, + 43.990765, + 43.991903, + 43.993037, + 43.994167, + 43.995294, + 43.996417, + 43.997536, + 43.998651, + 43.999763, + 44.000871, + 44.001975, + 44.003076, + 44.004173, + 44.005266, + 44.006356, + 44.007442, + 44.008525, + 44.009604, + 44.010679, + 44.011751, + 44.012820, + 44.013885, + 44.014946, + 44.016004, + 44.017059, + 44.018110, + 44.019157, + 44.020202, + 44.021243, + 44.022280, + 44.023314, + 44.024345, + 44.025372, + 44.026397, + 44.027417, + 44.028435, + 44.029449, + 44.030460, + 44.031468, + 44.032472, + 44.033474, + 44.034472, + 44.035467, + 44.036458, + 44.037447, + 44.038432, + 44.039414, + 44.040394, + 44.041370, + 44.042342, + 44.043312, + 44.044279, + 44.045243, + 44.046203, + 44.047161, + 44.048115, + 44.049067, + 44.050015, + 44.050961, + 44.051904, + 44.052843, + 44.053780, + 44.054714, + 44.055644, + 44.056572, + 44.057497, + 44.058419, + 44.059339, + 44.060255, + 44.061168, + 44.062079, + 44.062987, + 44.063892, + 44.064794, + 44.065694, + 44.066590, + 44.067484, + 44.068375, + 44.069264, + 44.070149, + 44.071032, + 44.071912, + 44.072790, + 44.073665, + 44.074537, + 44.075406, + 44.076273, + 44.077137, + 44.077999, + 44.078858, + 44.079714, + 44.080567, + 44.081418, + 44.082267, + 44.083113, + 44.083956, + 44.084797, + 44.085635, + 44.086471, + 44.087304, + 44.088135, + 44.088963, + 44.089789, + 44.090612, + 44.091432, + 44.092251, + 44.093066, + 44.093880, + 44.094691, + 44.095499, + 44.096305, + }, + {// The expectations for dimension = 90 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166666, + 8.401666, + 8.639998, + 8.881664, + 9.126661, + 9.374990, + 9.626648, + 9.881634, + 10.139944, + 10.401573, + 10.666514, + 10.934753, + 11.206276, + 11.481061, + 11.759077, + 12.040284, + 12.324629, + 12.612048, + 12.902457, + 13.195754, + 13.491818, + 13.790505, + 14.091648, + 14.395057, + 14.700520, + 15.007803, + 15.316653, + 15.626799, + 15.937957, + 16.249834, + 16.562130, + 16.874542, + 17.186771, + 17.498520, + 17.809504, + 18.119447, + 18.428089, + 18.735182, + 19.040499, + 19.343827, + 19.644974, + 19.943762, + 20.240034, + 20.533648, + 20.824479, + 21.112417, + 21.397365, + 21.679241, + 21.957974, + 22.233505, + 22.505786, + 22.774776, + 23.040445, + 23.302770, + 23.561735, + 23.817331, + 24.069554, + 24.318405, + 24.563892, + 24.806024, + 25.044816, + 25.280287, + 25.512456, + 25.741348, + 25.966989, + 26.189408, + 26.408633, + 26.624698, + 26.837636, + 27.047481, + 27.254269, + 27.458037, + 27.658821, + 27.856661, + 28.051595, + 28.243661, + 28.432900, + 28.619350, + 28.803052, + 28.984046, + 29.162370, + 29.338066, + 29.511172, + 29.681729, + 29.849774, + 30.015349, + 30.178491, + 30.339238, + 30.497630, + 30.653703, + 30.807495, + 30.959043, + 31.108384, + 31.255554, + 31.400588, + 31.543522, + 31.684390, + 31.823226, + 31.960065, + 32.094940, + 32.227883, + 32.358926, + 32.488103, + 32.615442, + 32.740977, + 32.864736, + 32.986750, + 33.107049, + 33.225660, + 33.342612, + 33.457933, + 33.571651, + 33.683792, + 33.794383, + 33.903450, + 34.011019, + 34.117114, + 34.221760, + 34.324981, + 34.426801, + 34.527244, + 34.626332, + 34.724089, + 34.820535, + 34.915692, + 35.009583, + 35.102228, + 35.193647, + 35.283860, + 35.372888, + 35.460750, + 35.547465, + 35.633051, + 35.717527, + 35.800911, + 35.883220, + 35.964473, + 36.044686, + 36.123876, + 36.202059, + 36.279251, + 36.355468, + 36.430727, + 36.505041, + 36.578426, + 36.650897, + 36.722469, + 36.793154, + 36.862968, + 36.931923, + 37.000034, + 37.067313, + 37.133774, + 37.199429, + 37.264290, + 37.328369, + 37.391680, + 37.454233, + 37.516040, + 37.577113, + 37.637462, + 37.697099, + 37.756034, + 37.814278, + 37.871842, + 37.928734, + 37.984967, + 38.040549, + 38.095490, + 38.149799, + 38.203487, + 38.256561, + 38.309032, + 38.360907, + 38.412196, + 38.462907, + 38.513049, + 38.562629, + 38.611656, + 38.660138, + 38.708083, + 38.755498, + 38.802391, + 38.848770, + 38.894641, + 38.940012, + 38.984889, + 39.029281, + 39.073193, + 39.116632, + 39.159606, + 39.202120, + 39.244180, + 39.285794, + 39.326967, + 39.367705, + 39.408014, + 39.447900, + 39.487369, + 39.526427, + 39.565079, + 39.603330, + 39.641186, + 39.678653, + 39.715735, + 39.752437, + 39.788765, + 39.824724, + 39.860318, + 39.895553, + 39.930433, + 39.964962, + 39.999146, + 40.032988, + 40.066494, + 40.099667, + 40.132512, + 40.165033, + 40.197235, + 40.229121, + 40.260696, + 40.291962, + 40.322926, + 40.353589, + 40.383956, + 40.414031, + 40.443818, + 40.473319, + 40.502539, + 40.531481, + 40.560148, + 40.588545, + 40.616673, + 40.644537, + 40.672140, + 40.699485, + 40.726576, + 40.753414, + 40.780004, + 40.806348, + 40.832450, + 40.858312, + 40.883937, + 40.909328, + 40.934487, + 40.959419, + 40.984124, + 41.008607, + 41.032869, + 41.056913, + 41.080742, + 41.104358, + 41.127764, + 41.150962, + 41.173955, + 41.196745, + 41.219334, + 41.241725, + 41.263920, + 41.285921, + 41.307730, + 41.329351, + 41.350784, + 41.372031, + 41.393096, + 41.413980, + 41.434685, + 41.455213, + 41.475567, + 41.495747, + 41.515757, + 41.535597, + 41.555270, + 41.574778, + 41.594122, + 41.613304, + 41.632327, + 41.651191, + 41.669899, + 41.688452, + 41.706852, + 41.725101, + 41.743200, + 41.761150, + 41.778954, + 41.796613, + 41.814129, + 41.831503, + 41.848736, + 41.865830, + 41.882787, + 41.899609, + 41.916295, + 41.932848, + 41.949270, + 41.965561, + 41.981724, + 41.997758, + 42.013667, + 42.029450, + 42.045110, + 42.060647, + 42.076063, + 42.091359, + 42.106537, + 42.121597, + 42.136540, + 42.151369, + 42.166084, + 42.180686, + 42.195176, + 42.209555, + 42.223826, + 42.237988, + 42.252043, + 42.265991, + 42.279835, + 42.293574, + 42.307211, + 42.320745, + 42.334179, + 42.347512, + 42.360747, + 42.373883, + 42.386923, + 42.399866, + 42.412714, + 42.425467, + 42.438128, + 42.450696, + 42.463172, + 42.475557, + 42.487853, + 42.500060, + 42.512179, + 42.524210, + 42.536155, + 42.548014, + 42.559789, + 42.571479, + 42.583086, + 42.594611, + 42.606054, + 42.617417, + 42.628699, + 42.639901, + 42.651025, + 42.662071, + 42.673040, + 42.683933, + 42.694749, + 42.705491, + 42.716158, + 42.726751, + 42.737271, + 42.747719, + 42.758095, + 42.768400, + 42.778635, + 42.788799, + 42.798895, + 42.808922, + 42.818881, + 42.828773, + 42.838598, + 42.848357, + 42.858050, + 42.867679, + 42.877243, + 42.886743, + 42.896180, + 42.905554, + 42.914866, + 42.924117, + 42.933306, + 42.942435, + 42.951504, + 42.960513, + 42.969464, + 42.978356, + 42.987190, + 42.995966, + 43.004686, + 43.013349, + 43.021956, + 43.030508, + 43.039005, + 43.047447, + 43.055835, + 43.064169, + 43.072450, + 43.080678, + 43.088855, + 43.096979, + 43.105052, + 43.113073, + 43.121045, + 43.128966, + 43.136837, + 43.144659, + 43.152433, + 43.160157, + 43.167834, + 43.175463, + 43.183044, + 43.190579, + 43.198067, + 43.205509, + 43.212905, + 43.220256, + 43.227562, + 43.234823, + 43.242039, + 43.249212, + 43.256341, + 43.263427, + 43.270470, + 43.277471, + 43.284429, + 43.291346, + 43.298221, + 43.305054, + 43.311847, + 43.318599, + 43.325311, + 43.331983, + 43.338615, + 43.345209, + 43.351763, + 43.358278, + 43.364755, + 43.371194, + 43.377595, + 43.383959, + 43.390286, + 43.396575, + 43.402828, + 43.409045, + 43.415225, + 43.421370, + 43.427479, + 43.433553, + 43.439592, + 43.445596, + 43.451566, + 43.457502, + 43.463404, + 43.469272, + 43.475106, + 43.480908, + 43.486677, + 43.492412, + 43.498116, + 43.503787, + 43.509427, + 43.515035, + 43.520611, + 43.526156, + 43.531670, + 43.537153, + 43.542606, + 43.548028, + 43.553421, + 43.558783, + 43.564116, + 43.569420, + 43.574694, + 43.579939, + 43.585155, + 43.590343, + 43.595503, + 43.600634, + 43.605737, + 43.610813, + 43.615861, + 43.620881, + 43.625875, + 43.630841, + 43.635781, + 43.640694, + 43.645581, + 43.650442, + 43.655276, + 43.660085, + 43.664868, + 43.669625, + 43.674358, + 43.679065, + 43.683747, + 43.688404, + 43.693037, + 43.697646, + 43.702230, + 43.706790, + 43.711326, + 43.715839, + 43.720328, + 43.724793, + 43.729235, + 43.733654, + 43.738051, + 43.742424, + 43.746775, + 43.751103, + 43.755409, + 43.759693, + 43.763955, + 43.768195, + 43.772413, + 43.776610, + 43.780785, + 43.784939, + 43.789072, + 43.793184, + 43.797275, + 43.801346, + 43.805395, + 43.809425, + 43.813434, + 43.817423, + 43.821392, + 43.825341, + 43.829270, + 43.833180, + 43.837070, + 43.840941, + 43.844793, + 43.848625, + 43.852439, + 43.856233, + 43.860009, + 43.863767, + 43.867505, + 43.871226, + 43.874928, + 43.878612, + 43.882278, + 43.885926, + 43.889557, + 43.893170, + 43.896765, + 43.900342, + 43.903903, + 43.907446, + 43.910972, + 43.914481, + 43.917974, + 43.921449, + 43.924908, + 43.928350, + 43.931776, + 43.935185, + 43.938578, + 43.941955, + 43.945316, + 43.948661, + 43.951991, + 43.955304, + 43.958602, + 43.961884, + 43.965151, + 43.968402, + 43.971638, + 43.974859, + 43.978065, + 43.981256, + 43.984432, + 43.987594, + 43.990740, + 43.993872, + 43.996990, + 44.000093, + 44.003181, + 44.006256, + 44.009316, + 44.012362, + 44.015395, + 44.018413, + 44.021417, + 44.024408, + 44.027385, + 44.030349, + 44.033299, + 44.036236, + 44.039159, + 44.042069, + 44.044966, + 44.047850, + 44.050720, + 44.053578, + 44.056423, + 44.059255, + 44.062075, + 44.064882, + 44.067676, + 44.070458, + 44.073228, + 44.075985, + 44.078730, + 44.081462, + 44.084183, + 44.086892, + 44.089588, + 44.092273, + 44.094946, + 44.097607, + 44.100256, + 44.102894, + 44.105520, + 44.108135, + 44.110738, + 44.113330, + 44.115911, + 44.118480, + 44.121039, + 44.123586, + 44.126122, + 44.128647, + 44.131161, + 44.133665, + 44.136158, + 44.138640, + 44.141111, + 44.143572, + 44.146022, + 44.148461, + 44.150891, + 44.153310, + 44.155718, + 44.158117, + 44.160505, + 44.162883, + 44.165251, + 44.167609, + 44.169957, + 44.172295, + 44.174623, + 44.176942, + 44.179251, + 44.181550, + 44.183839, + 44.186119, + 44.188389, + 44.190650, + 44.192902, + 44.195144, + 44.197377, + 44.199600, + 44.201815, + 44.204020, + 44.206216, + 44.208403, + 44.210581, + 44.212750, + 44.214910, + 44.217061, + 44.219204, + 44.221338, + 44.223463, + 44.225579, + 44.227687, + 44.229786, + 44.231876, + 44.233959, + 44.236032, + 44.238097, + 44.240154, + 44.242203, + 44.244243, + 44.246276, + 44.248300, + 44.250316, + 44.252323, + 44.254323, + 44.256315, + 44.258299, + 44.260275, + 44.262243, + 44.264203, + 44.266155, + 44.268100, + 44.270037, + 44.271966, + 44.273888, + 44.275802, + 44.277708, + 44.279607, + 44.281499, + 44.283383, + 44.285260, + 44.287129, + 44.288991, + 44.290846, + 44.292694, + 44.294534, + 44.296367, + 44.298193, + 44.300012, + 44.301824, + 44.303629, + 44.305427, + 44.307218, + 44.309003, + 44.310780, + 44.312550, + 44.314314, + 44.316071, + 44.317821, + 44.319564, + 44.321301, + 44.323031, + 44.324755, + 44.326472, + 44.328182, + 44.329886, + 44.331584, + 44.333275, + 44.334959, + 44.336638, + 44.338310, + 44.339975, + 44.341635, + 44.343288, + 44.344935, + 44.346575, + 44.348210, + 44.349839, + 44.351461, + 44.353077, + 44.354688, + 44.356292, + 44.357890, + 44.359483, + 44.361069, + 44.362650, + 44.364225, + 44.365794, + 44.367357, + 44.368914, + 44.370466, + 44.372012, + 44.373552, + 44.375087, + 44.376616, + 44.378140, + 44.379657, + 44.381170, + 44.382677, + 44.384178, + 44.385674, + 44.387164, + 44.388649, + 44.390129, + 44.391603, + 44.393072, + 44.394536, + 44.395994, + 44.397447, + 44.398895, + 44.400338, + 44.401775, + 44.403208, + 44.404635, + 44.406057, + 44.407474, + 44.408886, + 44.410293, + 44.411695, + 44.413092, + 44.414484, + 44.415871, + 44.417253, + 44.418630, + 44.420003, + 44.421370, + 44.422733, + 44.424091, + 44.425444, + 44.426792, + 44.428136, + 44.429475, + 44.430809, + 44.432138, + 44.433463, + 44.434784, + 44.436099, + 44.437410, + 44.438717, + 44.440019, + 44.441316, + 44.442609, + 44.443898, + 44.445182, + 44.446462, + 44.447737, + 44.449008, + 44.450274, + 44.451536, + 44.452794, + 44.454047, + 44.455296, + 44.456541, + 44.457782, + 44.459018, + 44.460250, + 44.461478, + 44.462702, + 44.463922, + 44.465137, + 44.466348, + 44.467556, + 44.468759, + 44.469958, + 44.471153, + 44.472344, + 44.473531, + 44.474714, + 44.475893, + 44.477068, + 44.478239, + 44.479406, + 44.480570, + 44.481729, + 44.482884, + 44.484036, + 44.485184, + 44.486328, + 44.487468, + 44.488604, + 44.489737, + 44.490866, + 44.491991, + 44.493113, + 44.494230, + 44.495344, + 44.496455, + 44.497561, + 44.498665, + 44.499764, + 44.500860, + 44.501952, + 44.503041, + 44.504126, + 44.505207, + 44.506285, + 44.507360, + 44.508431, + 44.509498, + 44.510563, + 44.511623, + 44.512680, + 44.513734, + 44.514784, + 44.515831, + 44.516875, + 44.517915, + 44.518952, + 44.519985, + 44.521016, + 44.522042, + 44.523066, + 44.524086, + 44.525103, + 44.526117, + 44.527128, + 44.528135, + 44.529139, + 44.530140, + 44.531138, + 44.532132, + 44.533124, + 44.534112, + 44.535097, + 44.536079, + 44.537058, + 44.538034, + 44.539006, + 44.539976, + 44.540943, + 44.541906, + 44.542867, + 44.543824, + 44.544779, + 44.545730, + 44.546679, + 44.547625, + 44.548567, + 44.549507, + 44.550444, + 44.551378, + 44.552309, + 44.553237, + 44.554162, + 44.555084, + 44.556004, + 44.556920, + 44.557834, + 44.558745, + 44.559653, + 44.560558, + 44.561461, + 44.562361, + 44.563258, + 44.564152, + 44.565044, + 44.565932, + 44.566819, + 44.567702, + 44.568583, + 44.569461, + 44.570336, + 44.571209, + 44.572079, + 44.572946, + 44.573811, + 44.574673, + 44.575532, + 44.576389, + 44.577244, + 44.578095, + 44.578945, + 44.579791, + 44.580635, + 44.581477, + 44.582316, + 44.583152, + 44.583986, + 44.584818, + 44.585647, + 44.586473, + 44.587297, + }, + {// The expectations for dimension = 91 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166666, + 8.401666, + 8.639999, + 8.881665, + 9.126663, + 9.374992, + 9.626653, + 9.881642, + 10.139958, + 10.401596, + 10.666549, + 10.934808, + 11.206361, + 11.481187, + 11.759262, + 12.040551, + 12.325009, + 12.612577, + 12.903183, + 13.196734, + 13.493122, + 13.792213, + 14.093855, + 14.397869, + 14.704056, + 15.012195, + 15.322042, + 15.633336, + 15.945801, + 16.259149, + 16.573083, + 16.887302, + 17.201505, + 17.515393, + 17.828676, + 18.141072, + 18.452313, + 18.762144, + 19.070327, + 19.376641, + 19.680883, + 19.982866, + 20.282423, + 20.579402, + 20.873670, + 21.165108, + 21.453610, + 21.739088, + 22.021463, + 22.300669, + 22.576653, + 22.849367, + 23.118777, + 23.384854, + 23.647579, + 23.906938, + 24.162922, + 24.415532, + 24.664769, + 24.910643, + 25.153163, + 25.392347, + 25.628213, + 25.860782, + 26.090080, + 26.316132, + 26.538968, + 26.758617, + 26.975113, + 27.188489, + 27.398779, + 27.606020, + 27.810247, + 28.011500, + 28.209814, + 28.405230, + 28.597786, + 28.787521, + 28.974475, + 29.158687, + 29.340198, + 29.519045, + 29.695271, + 29.868913, + 30.040010, + 30.208603, + 30.374730, + 30.538429, + 30.699739, + 30.858698, + 31.015343, + 31.169711, + 31.321839, + 31.471763, + 31.619520, + 31.765144, + 31.908671, + 32.050135, + 32.189571, + 32.327011, + 32.462488, + 32.596037, + 32.727688, + 32.857472, + 32.985423, + 33.111569, + 33.235940, + 33.358568, + 33.479480, + 33.598706, + 33.716273, + 33.832210, + 33.946543, + 34.059300, + 34.170506, + 34.280188, + 34.388371, + 34.495080, + 34.600339, + 34.704173, + 34.806604, + 34.907658, + 35.007355, + 35.105720, + 35.202772, + 35.298536, + 35.393030, + 35.486277, + 35.578297, + 35.669109, + 35.758734, + 35.847191, + 35.934499, + 36.020677, + 36.105742, + 36.189713, + 36.272608, + 36.354443, + 36.435236, + 36.515004, + 36.593762, + 36.671528, + 36.748316, + 36.824143, + 36.899023, + 36.972971, + 37.046003, + 37.118132, + 37.189373, + 37.259739, + 37.329245, + 37.397902, + 37.465726, + 37.532728, + 37.598922, + 37.664319, + 37.728932, + 37.792773, + 37.855853, + 37.918185, + 37.979780, + 38.040648, + 38.100801, + 38.160249, + 38.219003, + 38.277074, + 38.334472, + 38.391206, + 38.447286, + 38.502723, + 38.557525, + 38.611703, + 38.665264, + 38.718219, + 38.770575, + 38.822343, + 38.873529, + 38.924143, + 38.974193, + 39.023688, + 39.072634, + 39.121039, + 39.168913, + 39.216261, + 39.263092, + 39.309413, + 39.355231, + 39.400552, + 39.445385, + 39.489736, + 39.533611, + 39.577018, + 39.619962, + 39.662450, + 39.704488, + 39.746083, + 39.787240, + 39.827966, + 39.868266, + 39.908147, + 39.947613, + 39.986671, + 40.025326, + 40.063583, + 40.101447, + 40.138925, + 40.176020, + 40.212739, + 40.249085, + 40.285065, + 40.320683, + 40.355943, + 40.390850, + 40.425409, + 40.459624, + 40.493500, + 40.527042, + 40.560253, + 40.593137, + 40.625700, + 40.657944, + 40.689875, + 40.721496, + 40.752810, + 40.783823, + 40.814537, + 40.844957, + 40.875085, + 40.904927, + 40.934485, + 40.963762, + 40.992763, + 41.021491, + 41.049949, + 41.078140, + 41.106068, + 41.133736, + 41.161146, + 41.188303, + 41.215210, + 41.241868, + 41.268282, + 41.294454, + 41.320387, + 41.346085, + 41.371549, + 41.396782, + 41.421788, + 41.446569, + 41.471127, + 41.495466, + 41.519587, + 41.543494, + 41.567189, + 41.590674, + 41.613952, + 41.637025, + 41.659895, + 41.682566, + 41.705038, + 41.727315, + 41.749399, + 41.771292, + 41.792995, + 41.814512, + 41.835844, + 41.856993, + 41.877962, + 41.898752, + 41.919366, + 41.939805, + 41.960072, + 41.980167, + 42.000094, + 42.019854, + 42.039449, + 42.058881, + 42.078151, + 42.097261, + 42.116213, + 42.135009, + 42.153650, + 42.172138, + 42.190475, + 42.208663, + 42.226702, + 42.244595, + 42.262343, + 42.279947, + 42.297410, + 42.314732, + 42.331916, + 42.348962, + 42.365872, + 42.382648, + 42.399291, + 42.415801, + 42.432182, + 42.448434, + 42.464557, + 42.480555, + 42.496428, + 42.512176, + 42.527803, + 42.543308, + 42.558693, + 42.573959, + 42.589108, + 42.604141, + 42.619058, + 42.633862, + 42.648552, + 42.663131, + 42.677599, + 42.691958, + 42.706208, + 42.720351, + 42.734387, + 42.748319, + 42.762146, + 42.775870, + 42.789492, + 42.803013, + 42.816434, + 42.829755, + 42.842978, + 42.856105, + 42.869134, + 42.882069, + 42.894909, + 42.907655, + 42.920309, + 42.932871, + 42.945342, + 42.957724, + 42.970016, + 42.982220, + 42.994336, + 43.006366, + 43.018309, + 43.030168, + 43.041943, + 43.053634, + 43.065243, + 43.076770, + 43.088215, + 43.099581, + 43.110866, + 43.122073, + 43.133202, + 43.144253, + 43.155228, + 43.166126, + 43.176949, + 43.187698, + 43.198373, + 43.208974, + 43.219503, + 43.229960, + 43.240345, + 43.250660, + 43.260905, + 43.271080, + 43.281187, + 43.291225, + 43.301196, + 43.311100, + 43.320938, + 43.330710, + 43.340417, + 43.350059, + 43.359637, + 43.369151, + 43.378603, + 43.387992, + 43.397320, + 43.406586, + 43.415791, + 43.424936, + 43.434021, + 43.443048, + 43.452015, + 43.460925, + 43.469776, + 43.478571, + 43.487308, + 43.495990, + 43.504616, + 43.513186, + 43.521702, + 43.530163, + 43.538571, + 43.546925, + 43.555226, + 43.563475, + 43.571671, + 43.579816, + 43.587910, + 43.595953, + 43.603945, + 43.611888, + 43.619781, + 43.627624, + 43.635420, + 43.643166, + 43.650865, + 43.658516, + 43.666121, + 43.673678, + 43.681189, + 43.688654, + 43.696073, + 43.703447, + 43.710777, + 43.718061, + 43.725302, + 43.732498, + 43.739651, + 43.746761, + 43.753829, + 43.760853, + 43.767836, + 43.774777, + 43.781676, + 43.788535, + 43.795352, + 43.802130, + 43.808866, + 43.815564, + 43.822221, + 43.828840, + 43.835419, + 43.841960, + 43.848463, + 43.854927, + 43.861354, + 43.867743, + 43.874096, + 43.880411, + 43.886690, + 43.892933, + 43.899139, + 43.905310, + 43.911445, + 43.917546, + 43.923611, + 43.929642, + 43.935638, + 43.941600, + 43.947528, + 43.953423, + 43.959284, + 43.965112, + 43.970907, + 43.976670, + 43.982400, + 43.988098, + 43.993765, + 43.999399, + 44.005002, + 44.010574, + 44.016115, + 44.021625, + 44.027105, + 44.032554, + 44.037974, + 44.043363, + 44.048723, + 44.054054, + 44.059355, + 44.064627, + 44.069871, + 44.075085, + 44.080272, + 44.085430, + 44.090561, + 44.095663, + 44.100739, + 44.105786, + 44.110807, + 44.115801, + 44.120767, + 44.125708, + 44.130622, + 44.135509, + 44.140371, + 44.145207, + 44.150017, + 44.154801, + 44.159561, + 44.164295, + 44.169004, + 44.173689, + 44.178349, + 44.182984, + 44.187595, + 44.192182, + 44.196746, + 44.201285, + 44.205801, + 44.210293, + 44.214762, + 44.219208, + 44.223631, + 44.228032, + 44.232409, + 44.236765, + 44.241097, + 44.245408, + 44.249697, + 44.253963, + 44.258208, + 44.262432, + 44.266634, + 44.270814, + 44.274974, + 44.279113, + 44.283230, + 44.287327, + 44.291403, + 44.295459, + 44.299495, + 44.303510, + 44.307506, + 44.311481, + 44.315437, + 44.319373, + 44.323289, + 44.327186, + 44.331064, + 44.334923, + 44.338762, + 44.342583, + 44.346385, + 44.350168, + 44.353933, + 44.357680, + 44.361408, + 44.365118, + 44.368810, + 44.372484, + 44.376140, + 44.379778, + 44.383399, + 44.387002, + 44.390588, + 44.394157, + 44.397709, + 44.401243, + 44.404761, + 44.408262, + 44.411746, + 44.415214, + 44.418665, + 44.422099, + 44.425518, + 44.428920, + 44.432306, + 44.435676, + 44.439030, + 44.442369, + 44.445691, + 44.448998, + 44.452290, + 44.455566, + 44.458827, + 44.462073, + 44.465304, + 44.468519, + 44.471720, + 44.474906, + 44.478077, + 44.481233, + 44.484375, + 44.487503, + 44.490616, + 44.493714, + 44.496799, + 44.499869, + 44.502926, + 44.505968, + 44.508997, + 44.512011, + 44.515012, + 44.518000, + 44.520974, + 44.523934, + 44.526881, + 44.529815, + 44.532736, + 44.535643, + 44.538538, + 44.541419, + 44.544287, + 44.547143, + 44.549986, + 44.552816, + 44.555634, + 44.558439, + 44.561232, + 44.564012, + 44.566780, + 44.569536, + 44.572279, + 44.575011, + 44.577731, + 44.580438, + 44.583134, + 44.585818, + 44.588490, + 44.591150, + 44.593799, + 44.596436, + 44.599062, + 44.601677, + 44.604280, + 44.606872, + 44.609452, + 44.612022, + 44.614580, + 44.617128, + 44.619664, + 44.622190, + 44.624704, + 44.627208, + 44.629702, + 44.632184, + 44.634656, + 44.637118, + 44.639569, + 44.642009, + 44.644440, + 44.646860, + 44.649270, + 44.651669, + 44.654059, + 44.656438, + 44.658807, + 44.661167, + 44.663517, + 44.665856, + 44.668186, + 44.670506, + 44.672817, + 44.675118, + 44.677409, + 44.679691, + 44.681964, + 44.684227, + 44.686480, + 44.688725, + 44.690960, + 44.693186, + 44.695402, + 44.697610, + 44.699808, + 44.701998, + 44.704179, + 44.706350, + 44.708513, + 44.710667, + 44.712812, + 44.714949, + 44.717077, + 44.719196, + 44.721307, + 44.723409, + 44.725502, + 44.727588, + 44.729665, + 44.731733, + 44.733793, + 44.735845, + 44.737889, + 44.739924, + 44.741952, + 44.743971, + 44.745982, + 44.747986, + 44.749981, + 44.751968, + 44.753948, + 44.755920, + 44.757883, + 44.759840, + 44.761788, + 44.763729, + 44.765662, + 44.767588, + 44.769506, + 44.771416, + 44.773319, + 44.775215, + 44.777103, + 44.778984, + 44.780857, + 44.782723, + 44.784582, + 44.786434, + 44.788279, + 44.790116, + 44.791947, + 44.793770, + 44.795587, + 44.797396, + 44.799198, + 44.800994, + 44.802782, + 44.804564, + 44.806339, + 44.808107, + 44.809869, + 44.811623, + 44.813371, + 44.815113, + 44.816848, + 44.818576, + 44.820298, + 44.822013, + 44.823722, + 44.825424, + 44.827120, + 44.828809, + 44.830492, + 44.832169, + 44.833840, + 44.835504, + 44.837162, + 44.838814, + 44.840460, + 44.842100, + 44.843733, + 44.845361, + 44.846982, + 44.848597, + 44.850207, + 44.851810, + 44.853408, + 44.855000, + 44.856585, + 44.858165, + 44.859740, + 44.861308, + 44.862871, + 44.864428, + 44.865979, + 44.867525, + 44.869064, + 44.870599, + 44.872128, + 44.873651, + 44.875169, + 44.876681, + 44.878187, + 44.879689, + 44.881185, + 44.882675, + 44.884160, + 44.885640, + 44.887114, + 44.888583, + 44.890047, + 44.891506, + 44.892959, + 44.894407, + 44.895851, + 44.897288, + 44.898721, + 44.900149, + 44.901571, + 44.902989, + 44.904402, + 44.905809, + 44.907212, + 44.908609, + 44.910002, + 44.911390, + 44.912773, + 44.914151, + 44.915524, + 44.916892, + 44.918256, + 44.919615, + 44.920969, + 44.922318, + 44.923663, + 44.925003, + 44.926338, + 44.927669, + 44.928995, + 44.930316, + 44.931633, + 44.932945, + 44.934253, + 44.935556, + 44.936855, + 44.938149, + 44.939439, + 44.940725, + 44.942006, + 44.943282, + 44.944555, + 44.945822, + 44.947086, + 44.948345, + 44.949600, + 44.950851, + 44.952097, + 44.953340, + 44.954578, + 44.955811, + 44.957041, + 44.958266, + 44.959488, + 44.960705, + 44.961918, + 44.963127, + 44.964332, + 44.965533, + 44.966730, + 44.967923, + 44.969112, + 44.970297, + 44.971478, + 44.972655, + 44.973828, + 44.974997, + 44.976162, + 44.977324, + 44.978481, + 44.979635, + 44.980785, + 44.981931, + 44.983073, + 44.984212, + 44.985347, + 44.986478, + 44.987605, + 44.988729, + 44.989849, + 44.990965, + 44.992078, + 44.993187, + 44.994292, + 44.995394, + 44.996492, + 44.997587, + 44.998678, + 44.999765, + 45.000849, + 45.001930, + 45.003006, + 45.004080, + 45.005150, + 45.006216, + 45.007280, + 45.008339, + 45.009396, + 45.010448, + 45.011498, + 45.012544, + 45.013587, + 45.014626, + 45.015662, + 45.016695, + 45.017725, + 45.018751, + 45.019774, + 45.020793, + 45.021810, + 45.022823, + 45.023833, + 45.024840, + 45.025844, + 45.026844, + 45.027841, + 45.028835, + 45.029826, + 45.030814, + 45.031799, + 45.032781, + 45.033759, + 45.034735, + 45.035708, + 45.036677, + 45.037643, + 45.038607, + 45.039567, + 45.040525, + 45.041479, + 45.042431, + 45.043379, + 45.044325, + 45.045267, + 45.046207, + 45.047144, + 45.048078, + 45.049009, + 45.049937, + 45.050862, + 45.051785, + 45.052704, + 45.053621, + 45.054535, + 45.055446, + 45.056355, + 45.057260, + 45.058163, + 45.059063, + 45.059960, + 45.060855, + 45.061747, + 45.062636, + 45.063523, + 45.064406, + 45.065288, + 45.066166, + 45.067042, + 45.067915, + 45.068785, + 45.069653, + 45.070519, + 45.071381, + 45.072241, + 45.073099, + 45.073954, + 45.074806, + 45.075656, + 45.076503, + 45.077348, + 45.078190, + }, + {// The expectations for dimension = 92 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166666, + 8.401666, + 8.639999, + 8.881665, + 9.126664, + 9.374995, + 9.626657, + 9.881649, + 10.139969, + 10.401613, + 10.666576, + 10.934852, + 11.206427, + 11.481288, + 11.759412, + 12.040770, + 12.325322, + 12.613018, + 12.903793, + 13.197565, + 13.494235, + 13.793683, + 14.095768, + 14.400325, + 14.707166, + 15.016083, + 15.326842, + 15.639195, + 15.952871, + 16.267591, + 16.583061, + 16.898983, + 17.215056, + 17.530981, + 17.846461, + 18.161211, + 18.474956, + 18.787432, + 19.098394, + 19.407610, + 19.714868, + 20.019972, + 20.322745, + 20.623025, + 20.920671, + 21.215553, + 21.507559, + 21.796592, + 22.082566, + 22.365409, + 22.645060, + 22.921466, + 23.194588, + 23.464392, + 23.730853, + 23.993953, + 24.253682, + 24.510034, + 24.763008, + 25.012610, + 25.258849, + 25.501738, + 25.741294, + 25.977535, + 26.210486, + 26.440169, + 26.666614, + 26.889848, + 27.109904, + 27.326812, + 27.540608, + 27.751326, + 27.959001, + 28.163672, + 28.365374, + 28.564146, + 28.760027, + 28.953056, + 29.143271, + 29.330711, + 29.515417, + 29.697428, + 29.876783, + 30.053522, + 30.227683, + 30.399307, + 30.568431, + 30.735094, + 30.899336, + 31.061193, + 31.220703, + 31.377904, + 31.532833, + 31.685526, + 31.836019, + 31.984348, + 32.130548, + 32.274654, + 32.416700, + 32.556720, + 32.694747, + 32.830815, + 32.964955, + 33.097199, + 33.227580, + 33.356127, + 33.482871, + 33.607843, + 33.731071, + 33.852585, + 33.972413, + 34.090583, + 34.207123, + 34.322059, + 34.435420, + 34.547229, + 34.657515, + 34.766300, + 34.873612, + 34.979473, + 35.083908, + 35.186941, + 35.288594, + 35.388890, + 35.487852, + 35.585501, + 35.681860, + 35.776948, + 35.870788, + 35.963398, + 36.054800, + 36.145013, + 36.234056, + 36.321947, + 36.408707, + 36.494352, + 36.578902, + 36.662373, + 36.744782, + 36.826147, + 36.906484, + 36.985810, + 37.064141, + 37.141492, + 37.217879, + 37.293317, + 37.367821, + 37.441406, + 37.514085, + 37.585874, + 37.656786, + 37.726834, + 37.796032, + 37.864393, + 37.931930, + 37.998656, + 38.064582, + 38.129722, + 38.194087, + 38.257689, + 38.320539, + 38.382649, + 38.444030, + 38.504693, + 38.564649, + 38.623908, + 38.682481, + 38.740377, + 38.797607, + 38.854181, + 38.910108, + 38.965398, + 39.020060, + 39.074104, + 39.127537, + 39.180370, + 39.232611, + 39.284268, + 39.335351, + 39.385866, + 39.435822, + 39.485228, + 39.534090, + 39.582417, + 39.630217, + 39.677496, + 39.724263, + 39.770523, + 39.816285, + 39.861555, + 39.906341, + 39.950648, + 39.994484, + 40.037854, + 40.080766, + 40.123226, + 40.165239, + 40.206812, + 40.247952, + 40.288662, + 40.328951, + 40.368823, + 40.408283, + 40.447338, + 40.485993, + 40.524252, + 40.562123, + 40.599608, + 40.636714, + 40.673446, + 40.709808, + 40.745806, + 40.781444, + 40.816726, + 40.851658, + 40.886244, + 40.920488, + 40.954395, + 40.987969, + 41.021214, + 41.054135, + 41.086736, + 41.119021, + 41.150993, + 41.182657, + 41.214017, + 41.245076, + 41.275838, + 41.306307, + 41.336487, + 41.366380, + 41.395992, + 41.425324, + 41.454381, + 41.483166, + 41.511683, + 41.539934, + 41.567922, + 41.595652, + 41.623126, + 41.650347, + 41.677318, + 41.704043, + 41.730523, + 41.756763, + 41.782765, + 41.808532, + 41.834066, + 41.859371, + 41.884448, + 41.909302, + 41.933933, + 41.958346, + 41.982542, + 42.006525, + 42.030295, + 42.053857, + 42.077212, + 42.100362, + 42.123311, + 42.146060, + 42.168612, + 42.190969, + 42.213133, + 42.235106, + 42.256890, + 42.278488, + 42.299902, + 42.321134, + 42.342185, + 42.363058, + 42.383755, + 42.404278, + 42.424628, + 42.444808, + 42.464819, + 42.484664, + 42.504344, + 42.523860, + 42.543215, + 42.562411, + 42.581449, + 42.600331, + 42.619058, + 42.637632, + 42.656056, + 42.674329, + 42.692455, + 42.710435, + 42.728270, + 42.745961, + 42.763511, + 42.780920, + 42.798191, + 42.815324, + 42.832322, + 42.849185, + 42.865914, + 42.882513, + 42.898981, + 42.915319, + 42.931531, + 42.947616, + 42.963576, + 42.979412, + 42.995125, + 43.010718, + 43.026190, + 43.041544, + 43.056780, + 43.071899, + 43.086904, + 43.101794, + 43.116571, + 43.131237, + 43.145792, + 43.160237, + 43.174574, + 43.188803, + 43.202926, + 43.216944, + 43.230857, + 43.244667, + 43.258375, + 43.271982, + 43.285488, + 43.298895, + 43.312204, + 43.325416, + 43.338531, + 43.351550, + 43.364475, + 43.377306, + 43.390044, + 43.402691, + 43.415246, + 43.427712, + 43.440088, + 43.452375, + 43.464575, + 43.476688, + 43.488715, + 43.500657, + 43.512515, + 43.524289, + 43.535980, + 43.547589, + 43.559117, + 43.570564, + 43.581932, + 43.593220, + 43.604430, + 43.615562, + 43.626618, + 43.637597, + 43.648501, + 43.659330, + 43.670085, + 43.680766, + 43.691375, + 43.701911, + 43.712376, + 43.722770, + 43.733094, + 43.743348, + 43.753533, + 43.763650, + 43.773699, + 43.783681, + 43.793596, + 43.803446, + 43.813230, + 43.822949, + 43.832604, + 43.842195, + 43.851723, + 43.861188, + 43.870591, + 43.879933, + 43.889214, + 43.898435, + 43.907595, + 43.916696, + 43.925738, + 43.934722, + 43.943648, + 43.952516, + 43.961327, + 43.970082, + 43.978781, + 43.987425, + 43.996014, + 44.004548, + 44.013027, + 44.021454, + 44.029827, + 44.038147, + 44.046415, + 44.054631, + 44.062796, + 44.070909, + 44.078972, + 44.086985, + 44.094948, + 44.102862, + 44.110726, + 44.118543, + 44.126311, + 44.134031, + 44.141704, + 44.149330, + 44.156909, + 44.164442, + 44.171929, + 44.179371, + 44.186767, + 44.194119, + 44.201427, + 44.208690, + 44.215910, + 44.223086, + 44.230219, + 44.237310, + 44.244358, + 44.251364, + 44.258329, + 44.265252, + 44.272135, + 44.278976, + 44.285778, + 44.292539, + 44.299260, + 44.305942, + 44.312585, + 44.319189, + 44.325755, + 44.332282, + 44.338772, + 44.345224, + 44.351638, + 44.358015, + 44.364356, + 44.370660, + 44.376928, + 44.383160, + 44.389356, + 44.395517, + 44.401643, + 44.407734, + 44.413790, + 44.419812, + 44.425800, + 44.431754, + 44.437674, + 44.443561, + 44.449416, + 44.455237, + 44.461025, + 44.466782, + 44.472506, + 44.478198, + 44.483859, + 44.489488, + 44.495086, + 44.500654, + 44.506190, + 44.511696, + 44.517172, + 44.522617, + 44.528033, + 44.533420, + 44.538776, + 44.544104, + 44.549403, + 44.554673, + 44.559914, + 44.565127, + 44.570312, + 44.575469, + 44.580598, + 44.585700, + 44.590774, + 44.595821, + 44.600841, + 44.605835, + 44.610801, + 44.615742, + 44.620656, + 44.625544, + 44.630406, + 44.635243, + 44.640054, + 44.644840, + 44.649601, + 44.654337, + 44.659048, + 44.663734, + 44.668396, + 44.673034, + 44.677647, + 44.682237, + 44.686803, + 44.691345, + 44.695864, + 44.700359, + 44.704832, + 44.709281, + 44.713708, + 44.718112, + 44.722493, + 44.726853, + 44.731189, + 44.735504, + 44.739797, + 44.744069, + 44.748318, + 44.752546, + 44.756753, + 44.760939, + 44.765103, + 44.769247, + 44.773370, + 44.777473, + 44.781554, + 44.785616, + 44.789657, + 44.793679, + 44.797680, + 44.801661, + 44.805623, + 44.809565, + 44.813488, + 44.817392, + 44.821276, + 44.825141, + 44.828988, + 44.832815, + 44.836624, + 44.840415, + 44.844187, + 44.847940, + 44.851676, + 44.855393, + 44.859092, + 44.862774, + 44.866438, + 44.870084, + 44.873712, + 44.877324, + 44.880917, + 44.884494, + 44.888054, + 44.891597, + 44.895122, + 44.898632, + 44.902124, + 44.905600, + 44.909060, + 44.912503, + 44.915930, + 44.919340, + 44.922735, + 44.926114, + 44.929477, + 44.932824, + 44.936156, + 44.939472, + 44.942773, + 44.946058, + 44.949328, + 44.952583, + 44.955823, + 44.959048, + 44.962258, + 44.965453, + 44.968634, + 44.971800, + 44.974951, + 44.978088, + 44.981211, + 44.984319, + 44.987414, + 44.990494, + 44.993560, + 44.996612, + 44.999651, + 45.002675, + 45.005686, + 45.008684, + 45.011668, + 45.014638, + 45.017596, + 45.020540, + 45.023470, + 45.026388, + 45.029293, + 45.032184, + 45.035063, + 45.037929, + 45.040782, + 45.043623, + 45.046451, + 45.049267, + 45.052070, + 45.054861, + 45.057639, + 45.060406, + 45.063160, + 45.065902, + 45.068632, + 45.071350, + 45.074057, + 45.076751, + 45.079434, + 45.082105, + 45.084765, + 45.087413, + 45.090050, + 45.092675, + 45.095289, + 45.097892, + 45.100483, + 45.103064, + 45.105633, + 45.108191, + 45.110739, + 45.113275, + 45.115801, + 45.118316, + 45.120820, + 45.123314, + 45.125797, + 45.128270, + 45.130732, + 45.133183, + 45.135625, + 45.138056, + 45.140477, + 45.142888, + 45.145288, + 45.147679, + 45.150059, + 45.152430, + 45.154791, + 45.157142, + 45.159483, + 45.161814, + 45.164136, + 45.166448, + 45.168751, + 45.171044, + 45.173327, + 45.175602, + 45.177867, + 45.180122, + 45.182369, + 45.184606, + 45.186834, + 45.189052, + 45.191262, + 45.193463, + 45.195655, + 45.197838, + 45.200012, + 45.202177, + 45.204334, + 45.206482, + 45.208621, + 45.210751, + 45.212873, + 45.214987, + 45.217092, + 45.219188, + 45.221276, + 45.223356, + 45.225428, + 45.227491, + 45.229546, + 45.231593, + 45.233631, + 45.235662, + 45.237685, + 45.239699, + 45.241706, + 45.243704, + 45.245695, + 45.247678, + 45.249653, + 45.251621, + 45.253580, + 45.255532, + 45.257477, + 45.259414, + 45.261343, + 45.263265, + 45.265179, + 45.267086, + 45.268985, + 45.270877, + 45.272762, + 45.274639, + 45.276510, + 45.278373, + 45.280229, + 45.282077, + 45.283919, + 45.285753, + 45.287581, + 45.289401, + 45.291215, + 45.293022, + 45.294821, + 45.296614, + 45.298400, + 45.300180, + 45.301952, + 45.303718, + 45.305477, + 45.307230, + 45.308975, + 45.310715, + 45.312448, + 45.314174, + 45.315894, + 45.317607, + 45.319314, + 45.321014, + 45.322708, + 45.324396, + 45.326078, + 45.327753, + 45.329422, + 45.331085, + 45.332742, + 45.334392, + 45.336037, + 45.337675, + 45.339307, + 45.340934, + 45.342554, + 45.344168, + 45.345777, + 45.347379, + 45.348976, + 45.350567, + 45.352152, + 45.353731, + 45.355305, + 45.356872, + 45.358434, + 45.359991, + 45.361542, + 45.363087, + 45.364626, + 45.366160, + 45.367688, + 45.369211, + 45.370729, + 45.372241, + 45.373747, + 45.375248, + 45.376744, + 45.378234, + 45.379719, + 45.381199, + 45.382674, + 45.384143, + 45.385607, + 45.387065, + 45.388519, + 45.389967, + 45.391411, + 45.392849, + 45.394282, + 45.395710, + 45.397133, + 45.398551, + 45.399964, + 45.401372, + 45.402775, + 45.404173, + 45.405566, + 45.406955, + 45.408338, + 45.409717, + 45.411091, + 45.412460, + 45.413824, + 45.415184, + 45.416539, + 45.417889, + 45.419235, + 45.420576, + 45.421912, + 45.423243, + 45.424571, + 45.425893, + 45.427211, + 45.428524, + 45.429833, + 45.431138, + 45.432438, + 45.433733, + 45.435024, + 45.436311, + 45.437593, + 45.438871, + 45.440145, + 45.441414, + 45.442679, + 45.443940, + 45.445196, + 45.446448, + 45.447696, + 45.448940, + 45.450179, + 45.451415, + 45.452646, + 45.453873, + 45.455096, + 45.456315, + 45.457529, + 45.458740, + 45.459947, + 45.461149, + 45.462348, + 45.463543, + 45.464733, + 45.465920, + 45.467103, + 45.468282, + 45.469457, + 45.470628, + 45.471795, + 45.472958, + 45.474118, + 45.475274, + 45.476426, + 45.477574, + 45.478718, + 45.479859, + 45.480995, + 45.482129, + 45.483258, + 45.484384, + 45.485506, + 45.486624, + 45.487739, + 45.488850, + 45.489958, + 45.491062, + 45.492162, + 45.493259, + 45.494352, + 45.495442, + 45.496528, + 45.497611, + 45.498690, + 45.499766, + 45.500839, + 45.501908, + 45.502973, + 45.504035, + 45.505094, + 45.506149, + 45.507201, + 45.508250, + 45.509295, + 45.510337, + 45.511375, + 45.512411, + 45.513443, + 45.514471, + 45.515497, + 45.516519, + 45.517538, + 45.518554, + 45.519566, + 45.520576, + 45.521582, + 45.522585, + 45.523585, + 45.524582, + 45.525576, + 45.526566, + 45.527554, + 45.528538, + 45.529519, + 45.530498, + 45.531473, + 45.532445, + 45.533414, + 45.534380, + 45.535344, + 45.536304, + 45.537261, + 45.538215, + 45.539167, + 45.540115, + 45.541060, + 45.542003, + 45.542943, + 45.543879, + 45.544813, + 45.545744, + 45.546673, + 45.547598, + 45.548520, + 45.549440, + 45.550357, + 45.551271, + 45.552182, + 45.553091, + 45.553997, + 45.554900, + 45.555800, + 45.556698, + 45.557593, + 45.558485, + 45.559374, + 45.560261, + 45.561145, + 45.562027, + 45.562905, + 45.563782, + 45.564655, + 45.565526, + 45.566394, + 45.567260, + 45.568123, + 45.568984, + }, + {// The expectations for dimension = 93 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401666, + 8.639999, + 8.881666, + 9.126665, + 9.374996, + 9.626659, + 9.881653, + 10.139977, + 10.401626, + 10.666598, + 10.934886, + 11.206480, + 11.481369, + 11.759533, + 12.040948, + 12.325580, + 12.613384, + 12.904303, + 13.198266, + 13.495183, + 13.794945, + 14.097422, + 14.402463, + 14.709893, + 15.019515, + 15.331108, + 15.644432, + 15.959229, + 16.275225, + 16.592132, + 16.909656, + 17.227497, + 17.545355, + 17.862931, + 18.179936, + 18.496087, + 18.811116, + 19.124767, + 19.436800, + 19.746995, + 20.055144, + 20.361062, + 20.664578, + 20.965539, + 21.263809, + 21.559267, + 21.851807, + 22.141336, + 22.427775, + 22.711055, + 22.991121, + 23.267923, + 23.541426, + 23.811599, + 24.078419, + 24.341872, + 24.601948, + 24.858645, + 25.111963, + 25.361910, + 25.608494, + 25.851732, + 26.091639, + 26.328238, + 26.561550, + 26.791601, + 27.018420, + 27.242035, + 27.462478, + 27.679782, + 27.893980, + 28.105108, + 28.313202, + 28.518297, + 28.720433, + 28.919646, + 29.115976, + 29.309460, + 29.500138, + 29.688049, + 29.873233, + 30.055728, + 30.235574, + 30.412811, + 30.587476, + 30.759609, + 30.929249, + 31.096434, + 31.261203, + 31.423592, + 31.583639, + 31.741382, + 31.896856, + 32.050100, + 32.201147, + 32.350034, + 32.496796, + 32.641467, + 32.784081, + 32.924672, + 33.063273, + 33.199916, + 33.334635, + 33.467460, + 33.598422, + 33.727554, + 33.854884, + 33.980442, + 34.104258, + 34.226361, + 34.346779, + 34.465540, + 34.582671, + 34.698199, + 34.812151, + 34.924553, + 35.035430, + 35.144808, + 35.252711, + 35.359163, + 35.464189, + 35.567811, + 35.670054, + 35.770938, + 35.870488, + 35.968723, + 36.065667, + 36.161339, + 36.255761, + 36.348953, + 36.440935, + 36.531726, + 36.621345, + 36.709812, + 36.797145, + 36.883362, + 36.968480, + 37.052519, + 37.135494, + 37.217422, + 37.298321, + 37.378206, + 37.457094, + 37.535000, + 37.611940, + 37.687928, + 37.762980, + 37.837110, + 37.910333, + 37.982662, + 38.054112, + 38.124696, + 38.194427, + 38.263319, + 38.331384, + 38.398635, + 38.465085, + 38.530745, + 38.595627, + 38.659744, + 38.723107, + 38.785727, + 38.847615, + 38.908782, + 38.969239, + 39.028997, + 39.088066, + 39.146455, + 39.204176, + 39.261238, + 39.317650, + 39.373423, + 39.428565, + 39.483085, + 39.536993, + 39.590297, + 39.643007, + 39.695130, + 39.746676, + 39.797651, + 39.848065, + 39.897926, + 39.947241, + 39.996018, + 40.044264, + 40.091988, + 40.139196, + 40.185895, + 40.232093, + 40.277797, + 40.323013, + 40.367748, + 40.412010, + 40.455803, + 40.499135, + 40.542012, + 40.584441, + 40.626427, + 40.667976, + 40.709094, + 40.749787, + 40.790061, + 40.829921, + 40.869373, + 40.908422, + 40.947074, + 40.985334, + 41.023207, + 41.060698, + 41.097812, + 41.134554, + 41.170929, + 41.206941, + 41.242596, + 41.277898, + 41.312852, + 41.347462, + 41.381732, + 41.415667, + 41.449271, + 41.482548, + 41.515502, + 41.548139, + 41.580460, + 41.612471, + 41.644176, + 41.675577, + 41.706680, + 41.737487, + 41.768003, + 41.798231, + 41.828174, + 41.857836, + 41.887221, + 41.916331, + 41.945171, + 41.973743, + 42.002051, + 42.030098, + 42.057887, + 42.085421, + 42.112703, + 42.139737, + 42.166524, + 42.193069, + 42.219374, + 42.245442, + 42.271276, + 42.296878, + 42.322251, + 42.347398, + 42.372321, + 42.397024, + 42.421508, + 42.445776, + 42.469831, + 42.493675, + 42.517311, + 42.540740, + 42.563966, + 42.586991, + 42.609816, + 42.632445, + 42.654879, + 42.677120, + 42.699172, + 42.721035, + 42.742712, + 42.764205, + 42.785517, + 42.806648, + 42.827602, + 42.848380, + 42.868984, + 42.889416, + 42.909677, + 42.929771, + 42.949698, + 42.969460, + 42.989060, + 43.008498, + 43.027777, + 43.046898, + 43.065864, + 43.084675, + 43.103334, + 43.121841, + 43.140199, + 43.158410, + 43.176474, + 43.194393, + 43.212170, + 43.229805, + 43.247299, + 43.264655, + 43.281873, + 43.298956, + 43.315905, + 43.332720, + 43.349404, + 43.365957, + 43.382381, + 43.398678, + 43.414849, + 43.430894, + 43.446816, + 43.462615, + 43.478293, + 43.493851, + 43.509290, + 43.524611, + 43.539816, + 43.554906, + 43.569882, + 43.584744, + 43.599495, + 43.614135, + 43.628665, + 43.643087, + 43.657401, + 43.671609, + 43.685711, + 43.699709, + 43.713604, + 43.727396, + 43.741087, + 43.754677, + 43.768169, + 43.781561, + 43.794856, + 43.808055, + 43.821158, + 43.834166, + 43.847081, + 43.859902, + 43.872632, + 43.885270, + 43.897818, + 43.910277, + 43.922647, + 43.934929, + 43.947124, + 43.959233, + 43.971257, + 43.983196, + 43.995051, + 44.006823, + 44.018513, + 44.030122, + 44.041650, + 44.053098, + 44.064467, + 44.075757, + 44.086969, + 44.098105, + 44.109164, + 44.120147, + 44.131055, + 44.141889, + 44.152649, + 44.163336, + 44.173951, + 44.184494, + 44.194967, + 44.205368, + 44.215700, + 44.225963, + 44.236157, + 44.246283, + 44.256341, + 44.266333, + 44.276259, + 44.286119, + 44.295914, + 44.305645, + 44.315312, + 44.324915, + 44.334456, + 44.343934, + 44.353350, + 44.362706, + 44.372000, + 44.381235, + 44.390410, + 44.399526, + 44.408583, + 44.417582, + 44.426523, + 44.435407, + 44.444235, + 44.453006, + 44.461722, + 44.470383, + 44.478988, + 44.487540, + 44.496037, + 44.504481, + 44.512872, + 44.521211, + 44.529497, + 44.537732, + 44.545916, + 44.554048, + 44.562131, + 44.570163, + 44.578146, + 44.586079, + 44.593964, + 44.601801, + 44.609589, + 44.617330, + 44.625024, + 44.632670, + 44.640271, + 44.647825, + 44.655334, + 44.662797, + 44.670215, + 44.677589, + 44.684918, + 44.692204, + 44.699446, + 44.706644, + 44.713800, + 44.720913, + 44.727984, + 44.735014, + 44.742001, + 44.748948, + 44.755853, + 44.762718, + 44.769543, + 44.776328, + 44.783073, + 44.789778, + 44.796445, + 44.803073, + 44.809663, + 44.816214, + 44.822728, + 44.829204, + 44.835642, + 44.842044, + 44.848409, + 44.854738, + 44.861030, + 44.867287, + 44.873508, + 44.879694, + 44.885844, + 44.891960, + 44.898041, + 44.904088, + 44.910101, + 44.916080, + 44.922026, + 44.927938, + 44.933818, + 44.939664, + 44.945478, + 44.951260, + 44.957010, + 44.962727, + 44.968414, + 44.974068, + 44.979692, + 44.985285, + 44.990847, + 44.996379, + 45.001880, + 45.007351, + 45.012793, + 45.018205, + 45.023588, + 45.028941, + 45.034266, + 45.039562, + 45.044829, + 45.050068, + 45.055278, + 45.060461, + 45.065616, + 45.070744, + 45.075844, + 45.080917, + 45.085963, + 45.090983, + 45.095976, + 45.100942, + 45.105882, + 45.110796, + 45.115684, + 45.120547, + 45.125384, + 45.130196, + 45.134983, + 45.139745, + 45.144482, + 45.149194, + 45.153882, + 45.158545, + 45.163185, + 45.167801, + 45.172392, + 45.176961, + 45.181505, + 45.186027, + 45.190525, + 45.195000, + 45.199453, + 45.203883, + 45.208290, + 45.212675, + 45.217038, + 45.221378, + 45.225697, + 45.229994, + 45.234269, + 45.238523, + 45.242756, + 45.246967, + 45.251157, + 45.255326, + 45.259475, + 45.263603, + 45.267710, + 45.271797, + 45.275864, + 45.279911, + 45.283938, + 45.287945, + 45.291932, + 45.295899, + 45.299848, + 45.303776, + 45.307686, + 45.311577, + 45.315448, + 45.319301, + 45.323135, + 45.326951, + 45.330748, + 45.334526, + 45.338287, + 45.342029, + 45.345753, + 45.349460, + 45.353148, + 45.356819, + 45.360473, + 45.364109, + 45.367727, + 45.371329, + 45.374913, + 45.378481, + 45.382031, + 45.385565, + 45.389082, + 45.392582, + 45.396066, + 45.399534, + 45.402985, + 45.406420, + 45.409839, + 45.413243, + 45.416630, + 45.420001, + 45.423357, + 45.426697, + 45.430022, + 45.433332, + 45.436626, + 45.439905, + 45.443169, + 45.446417, + 45.449651, + 45.452870, + 45.456075, + 45.459264, + 45.462439, + 45.465600, + 45.468746, + 45.471878, + 45.474996, + 45.478100, + 45.481189, + 45.484265, + 45.487327, + 45.490375, + 45.493409, + 45.496430, + 45.499437, + 45.502431, + 45.505411, + 45.508378, + 45.511332, + 45.514272, + 45.517200, + 45.520114, + 45.523016, + 45.525905, + 45.528781, + 45.531644, + 45.534495, + 45.537333, + 45.540159, + 45.542972, + 45.545773, + 45.548562, + 45.551339, + 45.554103, + 45.556855, + 45.559596, + 45.562325, + 45.565041, + 45.567746, + 45.570440, + 45.573121, + 45.575791, + 45.578450, + 45.581097, + 45.583733, + 45.586358, + 45.588971, + 45.591573, + 45.594164, + 45.596744, + 45.599313, + 45.601871, + 45.604418, + 45.606955, + 45.609480, + 45.611995, + 45.614500, + 45.616994, + 45.619477, + 45.621950, + 45.624412, + 45.626865, + 45.629307, + 45.631738, + 45.634160, + 45.636571, + 45.638973, + 45.641364, + 45.643746, + 45.646117, + 45.648479, + 45.650831, + 45.653174, + 45.655506, + 45.657830, + 45.660143, + 45.662447, + 45.664742, + 45.667027, + 45.669303, + 45.671569, + 45.673827, + 45.676075, + 45.678314, + 45.680544, + 45.682765, + 45.684976, + 45.687179, + 45.689373, + 45.691558, + 45.693735, + 45.695902, + 45.698061, + 45.700211, + 45.702353, + 45.704486, + 45.706611, + 45.708727, + 45.710834, + 45.712933, + 45.715024, + 45.717107, + 45.719181, + 45.721247, + 45.723305, + 45.725355, + 45.727396, + 45.729430, + 45.731455, + 45.733473, + 45.735483, + 45.737485, + 45.739479, + 45.741465, + 45.743443, + 45.745414, + 45.747377, + 45.749333, + 45.751280, + 45.753221, + 45.755153, + 45.757079, + 45.758997, + 45.760907, + 45.762810, + 45.764706, + 45.766594, + 45.768475, + 45.770349, + 45.772216, + 45.774076, + 45.775928, + 45.777774, + 45.779612, + 45.781444, + 45.783268, + 45.785086, + 45.786897, + 45.788700, + 45.790497, + 45.792288, + 45.794071, + 45.795848, + 45.797618, + 45.799381, + 45.801138, + 45.802888, + 45.804632, + 45.806369, + 45.808100, + 45.809824, + 45.811541, + 45.813253, + 45.814958, + 45.816656, + 45.818349, + 45.820035, + 45.821715, + 45.823388, + 45.825056, + 45.826717, + 45.828372, + 45.830021, + 45.831664, + 45.833301, + 45.834932, + 45.836557, + 45.838177, + 45.839790, + 45.841397, + 45.842999, + 45.844594, + 45.846184, + 45.847768, + 45.849347, + 45.850919, + 45.852486, + 45.854047, + 45.855603, + 45.857153, + 45.858698, + 45.860237, + 45.861770, + 45.863298, + 45.864820, + 45.866337, + 45.867849, + 45.869355, + 45.870856, + 45.872351, + 45.873841, + 45.875326, + 45.876806, + 45.878280, + 45.879749, + 45.881213, + 45.882672, + 45.884126, + 45.885574, + 45.887018, + 45.888456, + 45.889889, + 45.891318, + 45.892741, + 45.894159, + 45.895572, + 45.896981, + 45.898384, + 45.899783, + 45.901177, + 45.902565, + 45.903950, + 45.905329, + 45.906703, + 45.908073, + 45.909438, + 45.910798, + 45.912154, + 45.913505, + 45.914851, + 45.916193, + 45.917530, + 45.918863, + 45.920191, + 45.921514, + 45.922833, + 45.924147, + 45.925457, + 45.926763, + 45.928064, + 45.929360, + 45.930652, + 45.931940, + 45.933224, + 45.934503, + 45.935777, + 45.937048, + 45.938314, + 45.939576, + 45.940834, + 45.942087, + 45.943337, + 45.944582, + 45.945823, + 45.947059, + 45.948292, + 45.949521, + 45.950745, + 45.951966, + 45.953182, + 45.954394, + 45.955602, + 45.956807, + 45.958007, + 45.959203, + 45.960396, + 45.961584, + 45.962768, + 45.963949, + 45.965126, + 45.966299, + 45.967468, + 45.968633, + 45.969794, + 45.970952, + 45.972105, + 45.973256, + 45.974402, + 45.975544, + 45.976683, + 45.977818, + 45.978950, + 45.980077, + 45.981202, + 45.982322, + 45.983439, + 45.984552, + 45.985662, + 45.986768, + 45.987870, + 45.988969, + 45.990065, + 45.991157, + 45.992245, + 45.993330, + 45.994412, + 45.995490, + 45.996564, + 45.997635, + 45.998703, + 45.999767, + 46.000828, + 46.001886, + 46.002940, + 46.003991, + 46.005039, + 46.006083, + 46.007124, + 46.008162, + 46.009196, + 46.010227, + 46.011255, + 46.012280, + 46.013301, + 46.014320, + 46.015335, + 46.016347, + 46.017355, + 46.018361, + 46.019364, + 46.020363, + 46.021359, + 46.022352, + 46.023342, + 46.024329, + 46.025313, + 46.026294, + 46.027272, + 46.028247, + 46.029219, + 46.030187, + 46.031153, + 46.032116, + 46.033076, + 46.034033, + 46.034987, + 46.035938, + 46.036886, + 46.037832, + 46.038774, + 46.039713, + 46.040650, + 46.041584, + 46.042515, + 46.043443, + 46.044368, + 46.045291, + 46.046211, + 46.047128, + 46.048042, + 46.048953, + 46.049862, + 46.050768, + 46.051671, + 46.052571, + 46.053469, + 46.054364, + 46.055256, + 46.056146, + 46.057033, + 46.057917, + 46.058799, + 46.059678, + }, + {// The expectations for dimension = 94 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401666, + 8.640000, + 8.881666, + 9.126665, + 9.374997, + 9.626661, + 9.881657, + 10.139983, + 10.401636, + 10.666614, + 10.934912, + 11.206522, + 11.481433, + 11.759631, + 12.041093, + 12.325791, + 12.613686, + 12.904730, + 13.198856, + 13.495987, + 13.796024, + 14.098848, + 14.404320, + 14.712278, + 15.022536, + 15.334887, + 15.649103, + 15.964933, + 16.282112, + 16.600360, + 16.919387, + 17.238895, + 17.558585, + 17.878157, + 18.197317, + 18.515779, + 18.833266, + 19.149515, + 19.464280, + 19.777329, + 20.088446, + 20.397437, + 20.704120, + 21.008334, + 21.309933, + 21.608788, + 21.904785, + 22.197823, + 22.487815, + 22.774688, + 23.058376, + 23.338829, + 23.616001, + 23.889859, + 24.160376, + 24.427532, + 24.691315, + 24.951717, + 25.208737, + 25.462379, + 25.712649, + 25.959560, + 26.203126, + 26.443367, + 26.680303, + 26.913959, + 27.144360, + 27.371535, + 27.595513, + 27.816327, + 28.034008, + 28.248592, + 28.460113, + 28.668608, + 28.874112, + 29.076665, + 29.276302, + 29.473064, + 29.666988, + 29.858114, + 30.046479, + 30.232125, + 30.415089, + 30.595411, + 30.773129, + 30.948283, + 31.120911, + 31.291052, + 31.458743, + 31.624023, + 31.786930, + 31.947499, + 32.105769, + 32.261776, + 32.415555, + 32.567142, + 32.716573, + 32.863883, + 33.009105, + 33.152273, + 33.293421, + 33.432583, + 33.569789, + 33.705073, + 33.838465, + 33.969998, + 34.099700, + 34.227603, + 34.353736, + 34.478128, + 34.600808, + 34.721804, + 34.841144, + 34.958854, + 35.074963, + 35.189495, + 35.302477, + 35.413935, + 35.523894, + 35.632377, + 35.739410, + 35.845015, + 35.949217, + 36.052038, + 36.153501, + 36.253627, + 36.352439, + 36.449958, + 36.546205, + 36.641200, + 36.734964, + 36.827516, + 36.918876, + 37.009063, + 37.098095, + 37.185992, + 37.272772, + 37.358452, + 37.443049, + 37.526581, + 37.609065, + 37.690517, + 37.770953, + 37.850390, + 37.928843, + 38.006328, + 38.082859, + 38.158451, + 38.233119, + 38.306878, + 38.379741, + 38.451722, + 38.522835, + 38.593092, + 38.662508, + 38.731095, + 38.798865, + 38.865831, + 38.932005, + 38.997399, + 39.062024, + 39.125893, + 39.189016, + 39.251406, + 39.313071, + 39.374024, + 39.434275, + 39.493834, + 39.552712, + 39.610918, + 39.668463, + 39.725355, + 39.781605, + 39.837221, + 39.892213, + 39.946591, + 40.000362, + 40.053535, + 40.106120, + 40.158124, + 40.209555, + 40.260423, + 40.310734, + 40.360497, + 40.409719, + 40.458408, + 40.506572, + 40.554217, + 40.601351, + 40.647982, + 40.694115, + 40.739758, + 40.784918, + 40.829601, + 40.873813, + 40.917562, + 40.960853, + 41.003693, + 41.046088, + 41.088044, + 41.129566, + 41.170660, + 41.211333, + 41.251590, + 41.291436, + 41.330877, + 41.369918, + 41.408564, + 41.446821, + 41.484694, + 41.522187, + 41.559306, + 41.596056, + 41.632441, + 41.668466, + 41.704135, + 41.739454, + 41.774427, + 41.809058, + 41.843351, + 41.877311, + 41.910942, + 41.944248, + 41.977233, + 42.009902, + 42.042258, + 42.074305, + 42.106048, + 42.137489, + 42.168632, + 42.199482, + 42.230041, + 42.260314, + 42.290304, + 42.320014, + 42.349448, + 42.378610, + 42.407501, + 42.436126, + 42.464489, + 42.492591, + 42.520436, + 42.548028, + 42.575369, + 42.602462, + 42.629311, + 42.655917, + 42.682285, + 42.708416, + 42.734314, + 42.759981, + 42.785420, + 42.810634, + 42.835625, + 42.860395, + 42.884949, + 42.909287, + 42.933412, + 42.957327, + 42.981034, + 43.004536, + 43.027835, + 43.050932, + 43.073832, + 43.096535, + 43.119044, + 43.141361, + 43.163488, + 43.185427, + 43.207181, + 43.228752, + 43.250141, + 43.271350, + 43.292383, + 43.313239, + 43.333922, + 43.354433, + 43.374775, + 43.394948, + 43.414955, + 43.434798, + 43.454478, + 43.473998, + 43.493358, + 43.512561, + 43.531608, + 43.550501, + 43.569241, + 43.587831, + 43.606272, + 43.624565, + 43.642712, + 43.660714, + 43.678573, + 43.696291, + 43.713869, + 43.731308, + 43.748610, + 43.765776, + 43.782808, + 43.799707, + 43.816474, + 43.833111, + 43.849619, + 43.866000, + 43.882254, + 43.898383, + 43.914389, + 43.930272, + 43.946033, + 43.961675, + 43.977198, + 43.992603, + 44.007892, + 44.023065, + 44.038124, + 44.053070, + 44.067905, + 44.082628, + 44.097242, + 44.111747, + 44.126144, + 44.140435, + 44.154621, + 44.168702, + 44.182679, + 44.196554, + 44.210328, + 44.224001, + 44.237575, + 44.251050, + 44.264428, + 44.277708, + 44.290894, + 44.303984, + 44.316980, + 44.329883, + 44.342694, + 44.355414, + 44.368044, + 44.380583, + 44.393034, + 44.405397, + 44.417673, + 44.429863, + 44.441967, + 44.453986, + 44.465922, + 44.477774, + 44.489544, + 44.501232, + 44.512840, + 44.524367, + 44.535815, + 44.547184, + 44.558475, + 44.569689, + 44.580826, + 44.591888, + 44.602874, + 44.613786, + 44.624624, + 44.635389, + 44.646081, + 44.656701, + 44.667250, + 44.677728, + 44.688137, + 44.698476, + 44.708746, + 44.718948, + 44.729083, + 44.739150, + 44.749151, + 44.759086, + 44.768957, + 44.778762, + 44.788503, + 44.798181, + 44.807796, + 44.817348, + 44.826838, + 44.836267, + 44.845635, + 44.854943, + 44.864191, + 44.873379, + 44.882509, + 44.891580, + 44.900594, + 44.909550, + 44.918449, + 44.927292, + 44.936079, + 44.944810, + 44.953487, + 44.962109, + 44.970677, + 44.979191, + 44.987652, + 44.996060, + 45.004416, + 45.012721, + 45.020973, + 45.029175, + 45.037326, + 45.045427, + 45.053478, + 45.061480, + 45.069432, + 45.077337, + 45.085192, + 45.093001, + 45.100761, + 45.108475, + 45.116142, + 45.123763, + 45.131337, + 45.138867, + 45.146351, + 45.153790, + 45.161185, + 45.168535, + 45.175842, + 45.183105, + 45.190326, + 45.197503, + 45.204638, + 45.211731, + 45.218783, + 45.225793, + 45.232761, + 45.239689, + 45.246577, + 45.253424, + 45.260232, + 45.267000, + 45.273728, + 45.280418, + 45.287069, + 45.293682, + 45.300257, + 45.306794, + 45.313293, + 45.319756, + 45.326181, + 45.332570, + 45.338923, + 45.345239, + 45.351520, + 45.357765, + 45.363974, + 45.370149, + 45.376289, + 45.382395, + 45.388466, + 45.394503, + 45.400507, + 45.406477, + 45.412414, + 45.418318, + 45.424189, + 45.430028, + 45.435834, + 45.441609, + 45.447352, + 45.453063, + 45.458742, + 45.464391, + 45.470009, + 45.475596, + 45.481153, + 45.486679, + 45.492176, + 45.497643, + 45.503080, + 45.508488, + 45.513866, + 45.519216, + 45.524537, + 45.529830, + 45.535094, + 45.540330, + 45.545538, + 45.550719, + 45.555871, + 45.560997, + 45.566095, + 45.571167, + 45.576212, + 45.581230, + 45.586222, + 45.591187, + 45.596127, + 45.601041, + 45.605929, + 45.610791, + 45.615629, + 45.620441, + 45.625228, + 45.629990, + 45.634728, + 45.639441, + 45.644130, + 45.648795, + 45.653436, + 45.658054, + 45.662647, + 45.667217, + 45.671764, + 45.676288, + 45.680788, + 45.685266, + 45.689721, + 45.694154, + 45.698564, + 45.702952, + 45.707318, + 45.711662, + 45.715984, + 45.720285, + 45.724564, + 45.728822, + 45.733058, + 45.737274, + 45.741468, + 45.745642, + 45.749795, + 45.753927, + 45.758040, + 45.762131, + 45.766203, + 45.770255, + 45.774287, + 45.778299, + 45.782291, + 45.786264, + 45.790218, + 45.794153, + 45.798068, + 45.801964, + 45.805842, + 45.809701, + 45.813541, + 45.817363, + 45.821166, + 45.824951, + 45.828718, + 45.832467, + 45.836198, + 45.839911, + 45.843606, + 45.847284, + 45.850944, + 45.854587, + 45.858213, + 45.861822, + 45.865414, + 45.868988, + 45.872546, + 45.876087, + 45.879612, + 45.883120, + 45.886612, + 45.890087, + 45.893546, + 45.896989, + 45.900416, + 45.903827, + 45.907223, + 45.910602, + 45.913966, + 45.917315, + 45.920648, + 45.923966, + 45.927268, + 45.930556, + 45.933828, + 45.937085, + 45.940328, + 45.943556, + 45.946769, + 45.949967, + 45.953151, + 45.956321, + 45.959476, + 45.962617, + 45.965744, + 45.968856, + 45.971955, + 45.975040, + 45.978111, + 45.981168, + 45.984212, + 45.987242, + 45.990258, + 45.993261, + 45.996251, + 45.999227, + 46.002191, + 46.005141, + 46.008078, + 46.011002, + 46.013913, + 46.016812, + 46.019698, + 46.022571, + 46.025431, + 46.028279, + 46.031115, + 46.033938, + 46.036749, + 46.039548, + 46.042334, + 46.045109, + 46.047871, + 46.050622, + 46.053360, + 46.056087, + 46.058802, + 46.061506, + 46.064198, + 46.066878, + 46.069547, + 46.072204, + 46.074850, + 46.077485, + 46.080109, + 46.082721, + 46.085322, + 46.087913, + 46.090492, + 46.093061, + 46.095618, + 46.098165, + 46.100701, + 46.103227, + 46.105741, + 46.108246, + 46.110740, + 46.113223, + 46.115696, + 46.118159, + 46.120611, + 46.123054, + 46.125486, + 46.127908, + 46.130320, + 46.132722, + 46.135114, + 46.137497, + 46.139869, + 46.142232, + 46.144585, + 46.146928, + 46.149262, + 46.151586, + 46.153901, + 46.156206, + 46.158502, + 46.160789, + 46.163066, + 46.165334, + 46.167593, + 46.169843, + 46.172083, + 46.174315, + 46.176538, + 46.178751, + 46.180956, + 46.183152, + 46.185339, + 46.187518, + 46.189687, + 46.191848, + 46.194001, + 46.196144, + 46.198280, + 46.200407, + 46.202525, + 46.204635, + 46.206737, + 46.208830, + 46.210915, + 46.212992, + 46.215061, + 46.217121, + 46.219174, + 46.221218, + 46.223255, + 46.225283, + 46.227304, + 46.229316, + 46.231321, + 46.233318, + 46.235307, + 46.237289, + 46.239263, + 46.241229, + 46.243188, + 46.245139, + 46.247082, + 46.249018, + 46.250947, + 46.252868, + 46.254782, + 46.256689, + 46.258588, + 46.260480, + 46.262365, + 46.264242, + 46.266113, + 46.267976, + 46.269832, + 46.271681, + 46.273524, + 46.275359, + 46.277187, + 46.279009, + 46.280823, + 46.282631, + 46.284432, + 46.286226, + 46.288013, + 46.289794, + 46.291568, + 46.293336, + 46.295096, + 46.296851, + 46.298598, + 46.300340, + 46.302075, + 46.303803, + 46.305525, + 46.307240, + 46.308950, + 46.310653, + 46.312349, + 46.314040, + 46.315724, + 46.317402, + 46.319074, + 46.320740, + 46.322399, + 46.324053, + 46.325700, + 46.327342, + 46.328978, + 46.330607, + 46.332231, + 46.333849, + 46.335461, + 46.337067, + 46.338667, + 46.340262, + 46.341850, + 46.343433, + 46.345011, + 46.346582, + 46.348149, + 46.349709, + 46.351264, + 46.352813, + 46.354357, + 46.355895, + 46.357428, + 46.358955, + 46.360477, + 46.361994, + 46.363505, + 46.365010, + 46.366511, + 46.368006, + 46.369496, + 46.370980, + 46.372460, + 46.373934, + 46.375403, + 46.376867, + 46.378325, + 46.379779, + 46.381227, + 46.382671, + 46.384109, + 46.385543, + 46.386971, + 46.388394, + 46.389813, + 46.391226, + 46.392635, + 46.394039, + 46.395438, + 46.396832, + 46.398221, + 46.399606, + 46.400985, + 46.402360, + 46.403731, + 46.405096, + 46.406457, + 46.407813, + 46.409165, + 46.410512, + 46.411854, + 46.413192, + 46.414525, + 46.415854, + 46.417178, + 46.418498, + 46.419813, + 46.421124, + 46.422430, + 46.423732, + 46.425030, + 46.426323, + 46.427612, + 46.428896, + 46.430177, + 46.431452, + 46.432724, + 46.433991, + 46.435255, + 46.436514, + 46.437768, + 46.439019, + 46.440265, + 46.441507, + 46.442746, + 46.443980, + 46.445209, + 46.446435, + 46.447657, + 46.448875, + 46.450089, + 46.451298, + 46.452504, + 46.453706, + 46.454904, + 46.456098, + 46.457288, + 46.458474, + 46.459656, + 46.460834, + 46.462009, + 46.463180, + 46.464346, + 46.465509, + 46.466669, + 46.467824, + 46.468976, + 46.470124, + 46.471269, + 46.472409, + 46.473546, + 46.474679, + 46.475809, + 46.476935, + 46.478058, + 46.479176, + 46.480292, + 46.481403, + 46.482511, + 46.483616, + 46.484717, + 46.485814, + 46.486908, + 46.487999, + 46.489086, + 46.490169, + 46.491250, + 46.492326, + 46.493400, + 46.494469, + 46.495536, + 46.496599, + 46.497659, + 46.498715, + 46.499769, + 46.500818, + 46.501865, + 46.502908, + 46.503948, + 46.504985, + 46.506018, + 46.507049, + 46.508076, + 46.509100, + 46.510120, + 46.511138, + 46.512152, + 46.513163, + 46.514171, + 46.515176, + 46.516178, + 46.517177, + 46.518172, + 46.519165, + 46.520154, + 46.521141, + 46.522124, + 46.523104, + 46.524082, + 46.525056, + 46.526027, + 46.526996, + 46.527961, + 46.528924, + 46.529883, + 46.530840, + 46.531794, + 46.532745, + 46.533692, + 46.534638, + 46.535580, + 46.536519, + 46.537455, + 46.538389, + 46.539320, + 46.540248, + 46.541173, + 46.542096, + 46.543015, + 46.543932, + 46.544846, + 46.545758, + 46.546666, + 46.547572, + 46.548476, + 46.549376, + 46.550274, + }, + {// The expectations for dimension = 95 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881666, + 9.126666, + 9.374998, + 9.626663, + 9.881660, + 10.139987, + 10.401644, + 10.666627, + 10.934933, + 11.206555, + 11.481484, + 11.759709, + 12.041210, + 12.325963, + 12.613936, + 12.905084, + 13.199351, + 13.496667, + 13.796943, + 14.100073, + 14.405927, + 14.714357, + 15.025189, + 15.338228, + 15.653256, + 15.970036, + 16.288310, + 16.607807, + 16.928240, + 17.249317, + 17.570740, + 17.892207, + 18.213424, + 18.534098, + 18.853949, + 19.172707, + 19.490116, + 19.805935, + 20.119943, + 20.431931, + 20.741712, + 21.049114, + 21.353982, + 21.656178, + 21.955580, + 22.252079, + 22.545581, + 22.836005, + 23.123280, + 23.407348, + 23.688160, + 23.965677, + 24.239865, + 24.510703, + 24.778172, + 25.042262, + 25.302969, + 25.560292, + 25.814236, + 26.064810, + 26.312028, + 26.555905, + 26.796460, + 27.033716, + 27.267697, + 27.498430, + 27.725944, + 27.950268, + 28.171435, + 28.389478, + 28.604430, + 28.816328, + 29.025207, + 29.231104, + 29.434057, + 29.634104, + 29.831281, + 30.025630, + 30.217187, + 30.405992, + 30.592083, + 30.775501, + 30.956283, + 31.134469, + 31.310096, + 31.483204, + 31.653831, + 31.822014, + 31.987791, + 32.151200, + 32.312278, + 32.471060, + 32.627584, + 32.781886, + 32.933999, + 33.083961, + 33.231804, + 33.377564, + 33.521273, + 33.662966, + 33.802674, + 33.940430, + 34.076267, + 34.210214, + 34.342303, + 34.472564, + 34.601028, + 34.727723, + 34.852679, + 34.975924, + 35.097486, + 35.217393, + 35.335672, + 35.452348, + 35.567450, + 35.681002, + 35.793029, + 35.903557, + 36.012611, + 36.120213, + 36.226388, + 36.331159, + 36.434548, + 36.536579, + 36.637273, + 36.736651, + 36.834736, + 36.931547, + 37.027105, + 37.121431, + 37.214545, + 37.306465, + 37.397210, + 37.486800, + 37.575252, + 37.662586, + 37.748818, + 37.833966, + 37.918047, + 38.001078, + 38.083075, + 38.164055, + 38.244033, + 38.323025, + 38.401047, + 38.478113, + 38.554238, + 38.629437, + 38.703725, + 38.777114, + 38.849619, + 38.921254, + 38.992031, + 39.061964, + 39.131065, + 39.199348, + 39.266824, + 39.333505, + 39.399405, + 39.464533, + 39.528902, + 39.592523, + 39.655407, + 39.717566, + 39.779009, + 39.839747, + 39.899792, + 39.959152, + 40.017838, + 40.075859, + 40.133226, + 40.189948, + 40.246034, + 40.301493, + 40.356335, + 40.410568, + 40.464200, + 40.517242, + 40.569700, + 40.621583, + 40.672899, + 40.723656, + 40.773863, + 40.823526, + 40.872654, + 40.921253, + 40.969332, + 41.016897, + 41.063955, + 41.110514, + 41.156581, + 41.202161, + 41.247262, + 41.291890, + 41.336052, + 41.379754, + 41.423002, + 41.465802, + 41.508161, + 41.550084, + 41.591577, + 41.632645, + 41.673295, + 41.713532, + 41.753361, + 41.792788, + 41.831819, + 41.870457, + 41.908708, + 41.946578, + 41.984072, + 42.021193, + 42.057948, + 42.094340, + 42.130374, + 42.166056, + 42.201389, + 42.236378, + 42.271027, + 42.305341, + 42.339323, + 42.372978, + 42.406311, + 42.439324, + 42.472023, + 42.504411, + 42.536491, + 42.568269, + 42.599746, + 42.630928, + 42.661817, + 42.692418, + 42.722734, + 42.752768, + 42.782523, + 42.812004, + 42.841213, + 42.870154, + 42.898830, + 42.927244, + 42.955399, + 42.983298, + 43.010945, + 43.038342, + 43.065492, + 43.092399, + 43.119065, + 43.145492, + 43.171684, + 43.197644, + 43.223374, + 43.248876, + 43.274154, + 43.299210, + 43.324047, + 43.348666, + 43.373071, + 43.397265, + 43.421248, + 43.445025, + 43.468596, + 43.491965, + 43.515134, + 43.538105, + 43.560880, + 43.583462, + 43.605852, + 43.628053, + 43.650066, + 43.671895, + 43.693540, + 43.715005, + 43.736290, + 43.757398, + 43.778331, + 43.799091, + 43.819679, + 43.840098, + 43.860349, + 43.880435, + 43.900356, + 43.920115, + 43.939713, + 43.959153, + 43.978435, + 43.997562, + 44.016535, + 44.035355, + 44.054025, + 44.072546, + 44.090920, + 44.109148, + 44.127231, + 44.145171, + 44.162970, + 44.180629, + 44.198150, + 44.215533, + 44.232781, + 44.249894, + 44.266875, + 44.283724, + 44.300443, + 44.317033, + 44.333495, + 44.349832, + 44.366043, + 44.382130, + 44.398095, + 44.413939, + 44.429663, + 44.445268, + 44.460755, + 44.476126, + 44.491381, + 44.506522, + 44.521550, + 44.536466, + 44.551272, + 44.565967, + 44.580554, + 44.595033, + 44.609406, + 44.623673, + 44.637836, + 44.651895, + 44.665851, + 44.679706, + 44.693460, + 44.707115, + 44.720671, + 44.734130, + 44.747491, + 44.760757, + 44.773928, + 44.787005, + 44.799988, + 44.812880, + 44.825679, + 44.838389, + 44.851008, + 44.863539, + 44.875982, + 44.888337, + 44.900606, + 44.912789, + 44.924887, + 44.936902, + 44.948833, + 44.960681, + 44.972448, + 44.984134, + 44.995739, + 45.007265, + 45.018712, + 45.030080, + 45.041372, + 45.052586, + 45.063725, + 45.074788, + 45.085777, + 45.096691, + 45.107532, + 45.118301, + 45.128997, + 45.139622, + 45.150176, + 45.160660, + 45.171074, + 45.181419, + 45.191696, + 45.201905, + 45.212047, + 45.222123, + 45.232132, + 45.242076, + 45.251956, + 45.261770, + 45.271522, + 45.281209, + 45.290835, + 45.300398, + 45.309899, + 45.319340, + 45.328720, + 45.338039, + 45.347300, + 45.356501, + 45.365644, + 45.374728, + 45.383756, + 45.392726, + 45.401639, + 45.410496, + 45.419298, + 45.428045, + 45.436736, + 45.445374, + 45.453958, + 45.462488, + 45.470965, + 45.479390, + 45.487763, + 45.496084, + 45.504354, + 45.512573, + 45.520741, + 45.528860, + 45.536929, + 45.544949, + 45.552920, + 45.560842, + 45.568717, + 45.576544, + 45.584324, + 45.592056, + 45.599743, + 45.607383, + 45.614978, + 45.622527, + 45.630031, + 45.637490, + 45.644905, + 45.652276, + 45.659604, + 45.666888, + 45.674129, + 45.681328, + 45.688484, + 45.695598, + 45.702671, + 45.709702, + 45.716693, + 45.723642, + 45.730552, + 45.737421, + 45.744251, + 45.751041, + 45.757792, + 45.764504, + 45.771178, + 45.777813, + 45.784410, + 45.790970, + 45.797493, + 45.803978, + 45.810426, + 45.816838, + 45.823214, + 45.829553, + 45.835857, + 45.842126, + 45.848359, + 45.854557, + 45.860721, + 45.866850, + 45.872945, + 45.879006, + 45.885034, + 45.891028, + 45.896989, + 45.902917, + 45.908812, + 45.914675, + 45.920505, + 45.926304, + 45.932071, + 45.937806, + 45.943510, + 45.949183, + 45.954825, + 45.960437, + 45.966018, + 45.971569, + 45.977090, + 45.982581, + 45.988043, + 45.993476, + 45.998879, + 46.004253, + 46.009599, + 46.014916, + 46.020205, + 46.025466, + 46.030699, + 46.035904, + 46.041082, + 46.046232, + 46.051356, + 46.056452, + 46.061522, + 46.066565, + 46.071581, + 46.076572, + 46.081536, + 46.086475, + 46.091388, + 46.096275, + 46.101137, + 46.105974, + 46.110787, + 46.115574, + 46.120337, + 46.125075, + 46.129789, + 46.134479, + 46.139145, + 46.143787, + 46.148405, + 46.153000, + 46.157572, + 46.162120, + 46.166646, + 46.171149, + 46.175629, + 46.180086, + 46.184521, + 46.188934, + 46.193325, + 46.197694, + 46.202041, + 46.206366, + 46.210670, + 46.214952, + 46.219213, + 46.223453, + 46.227673, + 46.231871, + 46.236049, + 46.240206, + 46.244342, + 46.248459, + 46.252555, + 46.256631, + 46.260688, + 46.264725, + 46.268742, + 46.272739, + 46.276717, + 46.280676, + 46.284616, + 46.288537, + 46.292438, + 46.296322, + 46.300186, + 46.304032, + 46.307859, + 46.311669, + 46.315460, + 46.319233, + 46.322988, + 46.326725, + 46.330445, + 46.334146, + 46.337831, + 46.341498, + 46.345148, + 46.348780, + 46.352396, + 46.355994, + 46.359576, + 46.363141, + 46.366689, + 46.370221, + 46.373736, + 46.377235, + 46.380718, + 46.384185, + 46.387635, + 46.391070, + 46.394489, + 46.397892, + 46.401279, + 46.404651, + 46.408008, + 46.411349, + 46.414675, + 46.417985, + 46.421281, + 46.424561, + 46.427827, + 46.431078, + 46.434314, + 46.437535, + 46.440742, + 46.443935, + 46.447113, + 46.450277, + 46.453426, + 46.456562, + 46.459683, + 46.462791, + 46.465884, + 46.468964, + 46.472030, + 46.475083, + 46.478122, + 46.481148, + 46.484160, + 46.487158, + 46.490144, + 46.493117, + 46.496076, + 46.499022, + 46.501956, + 46.504877, + 46.507784, + 46.510680, + 46.513562, + 46.516432, + 46.519290, + 46.522135, + 46.524968, + 46.527788, + 46.530596, + 46.533393, + 46.536177, + 46.538949, + 46.541709, + 46.544458, + 46.547194, + 46.549919, + 46.552633, + 46.555334, + 46.558024, + 46.560703, + 46.563371, + 46.566027, + 46.568671, + 46.571305, + 46.573927, + 46.576539, + 46.579139, + 46.581729, + 46.584307, + 46.586875, + 46.589432, + 46.591978, + 46.594514, + 46.597039, + 46.599553, + 46.602058, + 46.604551, + 46.607034, + 46.609508, + 46.611970, + 46.614423, + 46.616865, + 46.619298, + 46.621720, + 46.624133, + 46.626535, + 46.628928, + 46.631311, + 46.633684, + 46.636047, + 46.638401, + 46.640745, + 46.643080, + 46.645405, + 46.647721, + 46.650027, + 46.652325, + 46.654612, + 46.656891, + 46.659160, + 46.661421, + 46.663672, + 46.665914, + 46.668147, + 46.670371, + 46.672586, + 46.674793, + 46.676991, + 46.679180, + 46.681360, + 46.683531, + 46.685694, + 46.687849, + 46.689995, + 46.692132, + 46.694261, + 46.696382, + 46.698494, + 46.700598, + 46.702693, + 46.704781, + 46.706860, + 46.708931, + 46.710994, + 46.713049, + 46.715096, + 46.717135, + 46.719167, + 46.721190, + 46.723205, + 46.725213, + 46.727213, + 46.729205, + 46.731189, + 46.733166, + 46.735135, + 46.737097, + 46.739051, + 46.740998, + 46.742937, + 46.744869, + 46.746793, + 46.748711, + 46.750620, + 46.752523, + 46.754418, + 46.756306, + 46.758187, + 46.760061, + 46.761928, + 46.763788, + 46.765641, + 46.767486, + 46.769325, + 46.771157, + 46.772982, + 46.774800, + 46.776612, + 46.778416, + 46.780214, + 46.782006, + 46.783790, + 46.785568, + 46.787339, + 46.789104, + 46.790862, + 46.792614, + 46.794359, + 46.796098, + 46.797831, + 46.799557, + 46.801276, + 46.802990, + 46.804697, + 46.806398, + 46.808092, + 46.809781, + 46.811463, + 46.813139, + 46.814809, + 46.816473, + 46.818131, + 46.819783, + 46.821429, + 46.823069, + 46.824703, + 46.826331, + 46.827953, + 46.829570, + 46.831180, + 46.832785, + 46.834384, + 46.835977, + 46.837565, + 46.839147, + 46.840723, + 46.842294, + 46.843859, + 46.845418, + 46.846972, + 46.848521, + 46.850064, + 46.851601, + 46.853133, + 46.854660, + 46.856181, + 46.857697, + 46.859207, + 46.860713, + 46.862212, + 46.863707, + 46.865196, + 46.866681, + 46.868160, + 46.869634, + 46.871102, + 46.872566, + 46.874024, + 46.875478, + 46.876926, + 46.878369, + 46.879808, + 46.881241, + 46.882670, + 46.884093, + 46.885512, + 46.886925, + 46.888334, + 46.889738, + 46.891137, + 46.892531, + 46.893921, + 46.895306, + 46.896686, + 46.898061, + 46.899432, + 46.900798, + 46.902159, + 46.903516, + 46.904868, + 46.906216, + 46.907559, + 46.908897, + 46.910231, + 46.911560, + 46.912885, + 46.914206, + 46.915522, + 46.916833, + 46.918141, + 46.919443, + 46.920742, + 46.922036, + 46.923326, + 46.924611, + 46.925892, + 46.927169, + 46.928442, + 46.929710, + 46.930974, + 46.932234, + 46.933490, + 46.934742, + 46.935990, + 46.937233, + 46.938472, + 46.939708, + 46.940939, + 46.942166, + 46.943389, + 46.944608, + 46.945823, + 46.947034, + 46.948241, + 46.949445, + 46.950644, + 46.951839, + 46.953031, + 46.954218, + 46.955402, + 46.956582, + 46.957758, + 46.958930, + 46.960099, + 46.961263, + 46.962424, + 46.963582, + 46.964735, + 46.965885, + 46.967031, + 46.968173, + 46.969312, + 46.970447, + 46.971579, + 46.972706, + 46.973831, + 46.974951, + 46.976068, + 46.977182, + 46.978292, + 46.979398, + 46.980501, + 46.981601, + 46.982696, + 46.983789, + 46.984878, + 46.985964, + 46.987046, + 46.988124, + 46.989200, + 46.990272, + 46.991340, + 46.992406, + 46.993468, + 46.994526, + 46.995581, + 46.996633, + 46.997682, + 46.998728, + 46.999770, + 47.000809, + 47.001844, + 47.002877, + 47.003906, + 47.004932, + 47.005955, + 47.006975, + 47.007992, + 47.009005, + 47.010015, + 47.011023, + 47.012027, + 47.013028, + 47.014026, + 47.015021, + 47.016013, + 47.017001, + 47.017987, + 47.018970, + 47.019950, + 47.020927, + 47.021900, + 47.022871, + 47.023839, + 47.024804, + 47.025766, + 47.026725, + 47.027682, + 47.028635, + 47.029585, + 47.030533, + 47.031478, + 47.032420, + 47.033359, + 47.034295, + 47.035228, + 47.036159, + 47.037087, + 47.038012, + 47.038934, + 47.039854, + 47.040770, + }, + {// The expectations for dimension = 96 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881666, + 9.126666, + 9.374999, + 9.626664, + 9.881661, + 10.139990, + 10.401650, + 10.666637, + 10.934949, + 11.206581, + 11.481525, + 11.759771, + 12.041305, + 12.326104, + 12.614141, + 12.905378, + 13.199765, + 13.497241, + 13.797725, + 14.101122, + 14.407314, + 14.716164, + 15.027511, + 15.341172, + 15.656941, + 15.974592, + 16.293876, + 16.614531, + 16.936277, + 17.258827, + 17.581884, + 17.905149, + 18.228324, + 18.551114, + 18.873234, + 19.194408, + 19.514372, + 19.832879, + 20.149696, + 20.464607, + 20.777414, + 21.087937, + 21.396012, + 21.701491, + 22.004245, + 22.304155, + 22.601122, + 22.895055, + 23.185879, + 23.473528, + 23.757948, + 24.039093, + 24.316928, + 24.591423, + 24.862558, + 25.130318, + 25.394694, + 25.655684, + 25.913290, + 26.167517, + 26.418376, + 26.665882, + 26.910050, + 27.150902, + 27.388460, + 27.622750, + 27.853797, + 28.081633, + 28.306286, + 28.527790, + 28.746177, + 28.961482, + 29.173740, + 29.382988, + 29.589262, + 29.792599, + 29.993039, + 30.190617, + 30.385374, + 30.577347, + 30.766576, + 30.953099, + 31.136955, + 31.318183, + 31.496820, + 31.672907, + 31.846480, + 32.017578, + 32.186239, + 32.352499, + 32.516397, + 32.677968, + 32.837250, + 32.994277, + 33.149087, + 33.301713, + 33.452191, + 33.600556, + 33.746840, + 33.891077, + 34.033301, + 34.173543, + 34.311837, + 34.448213, + 34.582702, + 34.715336, + 34.846144, + 34.975156, + 35.102402, + 35.227910, + 35.351708, + 35.473824, + 35.594287, + 35.713122, + 35.830356, + 35.946015, + 36.060126, + 36.172712, + 36.283799, + 36.393412, + 36.501573, + 36.608307, + 36.713637, + 36.817585, + 36.920173, + 37.021424, + 37.121360, + 37.220000, + 37.317366, + 37.413479, + 37.508358, + 37.602024, + 37.694494, + 37.785789, + 37.875928, + 37.964927, + 38.052806, + 38.139582, + 38.225272, + 38.309894, + 38.393463, + 38.475998, + 38.557513, + 38.638025, + 38.717549, + 38.796100, + 38.873694, + 38.950345, + 39.026068, + 39.100877, + 39.174785, + 39.247808, + 39.319957, + 39.391247, + 39.461691, + 39.531301, + 39.600089, + 39.668069, + 39.735252, + 39.801650, + 39.867274, + 39.932138, + 39.996251, + 40.059624, + 40.122269, + 40.184197, + 40.245418, + 40.305941, + 40.365778, + 40.424939, + 40.483433, + 40.541269, + 40.598458, + 40.655009, + 40.710930, + 40.766231, + 40.820921, + 40.875008, + 40.928501, + 40.981408, + 41.033738, + 41.085499, + 41.136698, + 41.187344, + 41.237444, + 41.287006, + 41.336037, + 41.384545, + 41.432537, + 41.480020, + 41.527001, + 41.573486, + 41.619484, + 41.664999, + 41.710039, + 41.754610, + 41.798719, + 41.842372, + 41.885574, + 41.928333, + 41.970653, + 42.012541, + 42.054002, + 42.095042, + 42.135667, + 42.175881, + 42.215691, + 42.255102, + 42.294119, + 42.332746, + 42.370990, + 42.408855, + 42.446345, + 42.483467, + 42.520223, + 42.556620, + 42.592662, + 42.628353, + 42.663697, + 42.698700, + 42.733365, + 42.767696, + 42.801698, + 42.835376, + 42.868732, + 42.901771, + 42.934497, + 42.966914, + 42.999025, + 43.030834, + 43.062346, + 43.093563, + 43.124490, + 43.155129, + 43.185485, + 43.215560, + 43.245359, + 43.274884, + 43.304138, + 43.333126, + 43.361850, + 43.390313, + 43.418518, + 43.446469, + 43.474168, + 43.501619, + 43.528824, + 43.555786, + 43.582508, + 43.608993, + 43.635244, + 43.661263, + 43.687053, + 43.712617, + 43.737956, + 43.763075, + 43.787975, + 43.812659, + 43.837129, + 43.861388, + 43.885437, + 43.909281, + 43.932920, + 43.956357, + 43.979595, + 44.002635, + 44.025480, + 44.048132, + 44.070593, + 44.092865, + 44.114950, + 44.136851, + 44.158569, + 44.180107, + 44.201466, + 44.222648, + 44.243655, + 44.264490, + 44.285153, + 44.305648, + 44.325975, + 44.346136, + 44.366134, + 44.385969, + 44.405644, + 44.425161, + 44.444521, + 44.463725, + 44.482776, + 44.501675, + 44.520423, + 44.539022, + 44.557475, + 44.575781, + 44.593943, + 44.611963, + 44.629841, + 44.647579, + 44.665179, + 44.682642, + 44.699970, + 44.717163, + 44.734224, + 44.751153, + 44.767952, + 44.784622, + 44.801165, + 44.817581, + 44.833873, + 44.850041, + 44.866086, + 44.882010, + 44.897814, + 44.913500, + 44.929067, + 44.944518, + 44.959854, + 44.975076, + 44.990184, + 45.005181, + 45.020066, + 45.034842, + 45.049509, + 45.064069, + 45.078521, + 45.092868, + 45.107111, + 45.121250, + 45.135286, + 45.149221, + 45.163055, + 45.176790, + 45.190425, + 45.203963, + 45.217404, + 45.230749, + 45.243999, + 45.257155, + 45.270218, + 45.283188, + 45.296066, + 45.308854, + 45.321552, + 45.334161, + 45.346682, + 45.359116, + 45.371463, + 45.383724, + 45.395900, + 45.407992, + 45.420000, + 45.431926, + 45.443770, + 45.455533, + 45.467215, + 45.478817, + 45.490341, + 45.501786, + 45.513154, + 45.524444, + 45.535659, + 45.546798, + 45.557862, + 45.568852, + 45.579768, + 45.590612, + 45.601383, + 45.612083, + 45.622711, + 45.633269, + 45.643758, + 45.654177, + 45.664528, + 45.674811, + 45.685027, + 45.695175, + 45.705258, + 45.715275, + 45.725227, + 45.735115, + 45.744938, + 45.754698, + 45.764395, + 45.774030, + 45.783604, + 45.793115, + 45.802567, + 45.811958, + 45.821289, + 45.830561, + 45.839774, + 45.848929, + 45.858026, + 45.867066, + 45.876049, + 45.884976, + 45.893847, + 45.902663, + 45.911424, + 45.920130, + 45.928782, + 45.937381, + 45.945926, + 45.954419, + 45.962859, + 45.971248, + 45.979585, + 45.987871, + 45.996107, + 46.004292, + 46.012428, + 46.020514, + 46.028551, + 46.036540, + 46.044480, + 46.052373, + 46.060218, + 46.068016, + 46.075767, + 46.083472, + 46.091131, + 46.098745, + 46.106313, + 46.113836, + 46.121315, + 46.128750, + 46.136141, + 46.143488, + 46.150792, + 46.158054, + 46.165272, + 46.172449, + 46.179584, + 46.186677, + 46.193730, + 46.200741, + 46.207712, + 46.214642, + 46.221533, + 46.228384, + 46.235195, + 46.241968, + 46.248702, + 46.255397, + 46.262055, + 46.268674, + 46.275256, + 46.281800, + 46.288308, + 46.294779, + 46.301213, + 46.307611, + 46.313973, + 46.320300, + 46.326591, + 46.332847, + 46.339068, + 46.345255, + 46.351407, + 46.357525, + 46.363609, + 46.369660, + 46.375677, + 46.381661, + 46.387613, + 46.393531, + 46.399418, + 46.405272, + 46.411094, + 46.416884, + 46.422643, + 46.428371, + 46.434068, + 46.439734, + 46.445369, + 46.450974, + 46.456549, + 46.462094, + 46.467609, + 46.473095, + 46.478552, + 46.483979, + 46.489377, + 46.494747, + 46.500089, + 46.505402, + 46.510687, + 46.515944, + 46.521173, + 46.526375, + 46.531550, + 46.536698, + 46.541818, + 46.546912, + 46.551979, + 46.557020, + 46.562035, + 46.567024, + 46.571987, + 46.576924, + 46.581836, + 46.586723, + 46.591584, + 46.596421, + 46.601232, + 46.606020, + 46.610782, + 46.615521, + 46.620235, + 46.624925, + 46.629592, + 46.634235, + 46.638854, + 46.643450, + 46.648023, + 46.652573, + 46.657100, + 46.661604, + 46.666086, + 46.670546, + 46.674983, + 46.679398, + 46.683791, + 46.688162, + 46.692512, + 46.696840, + 46.701147, + 46.705432, + 46.709696, + 46.713940, + 46.718162, + 46.722364, + 46.726546, + 46.730707, + 46.734847, + 46.738968, + 46.743068, + 46.747148, + 46.751209, + 46.755250, + 46.759272, + 46.763274, + 46.767257, + 46.771220, + 46.775165, + 46.779091, + 46.782998, + 46.786886, + 46.790756, + 46.794607, + 46.798440, + 46.802255, + 46.806052, + 46.809831, + 46.813592, + 46.817335, + 46.821060, + 46.824768, + 46.828459, + 46.832132, + 46.835789, + 46.839428, + 46.843050, + 46.846655, + 46.850243, + 46.853815, + 46.857370, + 46.860909, + 46.864431, + 46.867937, + 46.871427, + 46.874900, + 46.878358, + 46.881800, + 46.885226, + 46.888637, + 46.892032, + 46.895411, + 46.898775, + 46.902124, + 46.905457, + 46.908776, + 46.912079, + 46.915368, + 46.918641, + 46.921900, + 46.925144, + 46.928374, + 46.931589, + 46.934790, + 46.937976, + 46.941148, + 46.944306, + 46.947450, + 46.950580, + 46.953696, + 46.956798, + 46.959886, + 46.962961, + 46.966022, + 46.969070, + 46.972104, + 46.975125, + 46.978133, + 46.981127, + 46.984109, + 46.987077, + 46.990032, + 46.992975, + 46.995905, + 46.998822, + 47.001726, + 47.004618, + 47.007497, + 47.010364, + 47.013218, + 47.016060, + 47.018890, + 47.021707, + 47.024513, + 47.027307, + 47.030088, + 47.032858, + 47.035616, + 47.038362, + 47.041096, + 47.043819, + 47.046531, + 47.049230, + 47.051919, + 47.054596, + 47.057262, + 47.059916, + 47.062559, + 47.065192, + 47.067813, + 47.070423, + 47.073022, + 47.075611, + 47.078188, + 47.080755, + 47.083311, + 47.085857, + 47.088392, + 47.090916, + 47.093430, + 47.095934, + 47.098427, + 47.100910, + 47.103383, + 47.105846, + 47.108298, + 47.110741, + 47.113173, + 47.115596, + 47.118008, + 47.120411, + 47.122804, + 47.125188, + 47.127561, + 47.129925, + 47.132280, + 47.134624, + 47.136960, + 47.139286, + 47.141602, + 47.143910, + 47.146208, + 47.148497, + 47.150776, + 47.153047, + 47.155308, + 47.157561, + 47.159804, + 47.162039, + 47.164264, + 47.166481, + 47.168689, + 47.170888, + 47.173079, + 47.175261, + 47.177434, + 47.179599, + 47.181755, + 47.183903, + 47.186042, + 47.188173, + 47.190296, + 47.192410, + 47.194516, + 47.196614, + 47.198703, + 47.200785, + 47.202858, + 47.204924, + 47.206981, + 47.209031, + 47.211072, + 47.213106, + 47.215132, + 47.217150, + 47.219160, + 47.221162, + 47.223157, + 47.225144, + 47.227124, + 47.229096, + 47.231061, + 47.233018, + 47.234967, + 47.236909, + 47.238844, + 47.240772, + 47.242692, + 47.244605, + 47.246510, + 47.248409, + 47.250300, + 47.252185, + 47.254062, + 47.255932, + 47.257795, + 47.259651, + 47.261500, + 47.263342, + 47.265178, + 47.267006, + 47.268828, + 47.270643, + 47.272451, + 47.274253, + 47.276048, + 47.277836, + 47.279618, + 47.281393, + 47.283161, + 47.284923, + 47.286679, + 47.288428, + 47.290170, + 47.291907, + 47.293637, + 47.295360, + 47.297078, + 47.298789, + 47.300493, + 47.302192, + 47.303885, + 47.305571, + 47.307251, + 47.308925, + 47.310593, + 47.312255, + 47.313911, + 47.315561, + 47.317206, + 47.318844, + 47.320476, + 47.322103, + 47.323723, + 47.325338, + 47.326948, + 47.328551, + 47.330149, + 47.331741, + 47.333327, + 47.334908, + 47.336483, + 47.338052, + 47.339616, + 47.341175, + 47.342728, + 47.344275, + 47.345817, + 47.347354, + 47.348885, + 47.350411, + 47.351931, + 47.353446, + 47.354956, + 47.356461, + 47.357960, + 47.359454, + 47.360943, + 47.362427, + 47.363905, + 47.365379, + 47.366847, + 47.368310, + 47.369768, + 47.371222, + 47.372670, + 47.374113, + 47.375551, + 47.376984, + 47.378413, + 47.379836, + 47.381255, + 47.382668, + 47.384077, + 47.385481, + 47.386880, + 47.388275, + 47.389665, + 47.391050, + 47.392430, + 47.393806, + 47.395177, + 47.396543, + 47.397905, + 47.399262, + 47.400614, + 47.401962, + 47.403306, + 47.404645, + 47.405979, + 47.407309, + 47.408635, + 47.409956, + 47.411272, + 47.412585, + 47.413893, + 47.415196, + 47.416495, + 47.417790, + 47.419081, + 47.420367, + 47.421649, + 47.422927, + 47.424201, + 47.425470, + 47.426735, + 47.427996, + 47.429253, + 47.430506, + 47.431754, + 47.432999, + 47.434239, + 47.435476, + 47.436708, + 47.437936, + 47.439161, + 47.440381, + 47.441597, + 47.442810, + 47.444018, + 47.445223, + 47.446423, + 47.447620, + 47.448813, + 47.450002, + 47.451187, + 47.452368, + 47.453546, + 47.454720, + 47.455890, + 47.457056, + 47.458218, + 47.459377, + 47.460532, + 47.461683, + 47.462831, + 47.463975, + 47.465115, + 47.466252, + 47.467385, + 47.468515, + 47.469641, + 47.470763, + 47.471882, + 47.472997, + 47.474109, + 47.475217, + 47.476322, + 47.477423, + 47.478521, + 47.479615, + 47.480706, + 47.481794, + 47.482878, + 47.483959, + 47.485036, + 47.486110, + 47.487180, + 47.488248, + 47.489312, + 47.490372, + 47.491429, + 47.492483, + 47.493534, + 47.494582, + 47.495626, + 47.496667, + 47.497705, + 47.498740, + 47.499771, + 47.500799, + 47.501824, + 47.502846, + 47.503865, + 47.504881, + 47.505893, + 47.506903, + 47.507909, + 47.508912, + 47.509913, + 47.510910, + 47.511904, + 47.512895, + 47.513883, + 47.514868, + 47.515851, + 47.516830, + 47.517806, + 47.518779, + 47.519749, + 47.520717, + 47.521681, + 47.522643, + 47.523602, + 47.524557, + 47.525510, + 47.526460, + 47.527407, + 47.528352, + 47.529293, + 47.530232, + 47.531168, + }, + {// The expectations for dimension = 97 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881666, + 9.126666, + 9.374999, + 9.626665, + 9.881663, + 10.139993, + 10.401654, + 10.666644, + 10.934961, + 11.206601, + 11.481557, + 11.759821, + 12.041381, + 12.326218, + 12.614309, + 12.905620, + 13.200110, + 13.497722, + 13.798387, + 14.102018, + 14.408508, + 14.717731, + 15.029538, + 15.343760, + 15.660202, + 15.978648, + 16.298862, + 16.620589, + 16.943558, + 17.267486, + 17.592082, + 17.917047, + 18.242082, + 18.566893, + 18.891188, + 19.214685, + 19.537116, + 19.858224, + 20.177769, + 20.495525, + 20.811286, + 21.124862, + 21.436079, + 21.744783, + 22.050832, + 22.354104, + 22.654487, + 22.951887, + 23.246219, + 23.537413, + 23.825407, + 24.110151, + 24.391604, + 24.669732, + 24.944510, + 25.215920, + 25.483949, + 25.748591, + 26.009844, + 26.267712, + 26.522204, + 26.773329, + 27.021104, + 27.265546, + 27.506677, + 27.744520, + 27.979100, + 28.210446, + 28.438587, + 28.663553, + 28.885377, + 29.104092, + 29.319734, + 29.532337, + 29.741937, + 29.948573, + 30.152280, + 30.353096, + 30.551061, + 30.746211, + 30.938586, + 31.128223, + 31.315163, + 31.499443, + 31.681101, + 31.860176, + 32.036707, + 32.210732, + 32.382287, + 32.551411, + 32.718140, + 32.882513, + 33.044564, + 33.204331, + 33.361849, + 33.517153, + 33.670279, + 33.821261, + 33.970132, + 34.116928, + 34.261680, + 34.404422, + 34.545187, + 34.684005, + 34.820908, + 34.955927, + 35.089093, + 35.220436, + 35.349985, + 35.477769, + 35.603817, + 35.728157, + 35.850817, + 35.971823, + 36.091204, + 36.208984, + 36.325191, + 36.439849, + 36.552983, + 36.664619, + 36.774780, + 36.883490, + 36.990773, + 37.096651, + 37.201148, + 37.304284, + 37.406083, + 37.506566, + 37.605753, + 37.703665, + 37.800322, + 37.895746, + 37.989954, + 38.082967, + 38.174803, + 38.265480, + 38.355018, + 38.443434, + 38.530746, + 38.616970, + 38.702124, + 38.786225, + 38.869289, + 38.951331, + 39.032369, + 39.112417, + 39.191490, + 39.269605, + 39.346774, + 39.423013, + 39.498337, + 39.572758, + 39.646291, + 39.718948, + 39.790745, + 39.861692, + 39.931804, + 40.001092, + 40.069569, + 40.137247, + 40.204138, + 40.270253, + 40.335604, + 40.400203, + 40.464060, + 40.527187, + 40.589593, + 40.651290, + 40.712288, + 40.772597, + 40.832227, + 40.891187, + 40.949488, + 41.007139, + 41.064149, + 41.120528, + 41.176283, + 41.231425, + 41.285962, + 41.339902, + 41.393255, + 41.446027, + 41.498228, + 41.549864, + 41.600945, + 41.651478, + 41.701470, + 41.750929, + 41.799862, + 41.848277, + 41.896180, + 41.943579, + 41.990480, + 42.036890, + 42.082816, + 42.128265, + 42.173242, + 42.217754, + 42.261808, + 42.305409, + 42.348564, + 42.391278, + 42.433557, + 42.475408, + 42.516835, + 42.557844, + 42.598441, + 42.638631, + 42.678420, + 42.717812, + 42.756813, + 42.795427, + 42.833660, + 42.871517, + 42.909003, + 42.946122, + 42.982878, + 43.019277, + 43.055323, + 43.091021, + 43.126375, + 43.161388, + 43.196066, + 43.230413, + 43.264433, + 43.298129, + 43.331506, + 43.364569, + 43.397319, + 43.429762, + 43.461902, + 43.493741, + 43.525285, + 43.556535, + 43.587496, + 43.618172, + 43.648565, + 43.678679, + 43.708518, + 43.738085, + 43.767382, + 43.796414, + 43.825183, + 43.853693, + 43.881946, + 43.909946, + 43.937695, + 43.965197, + 43.992454, + 44.019470, + 44.046246, + 44.072786, + 44.099093, + 44.125169, + 44.151017, + 44.176639, + 44.202038, + 44.227217, + 44.252178, + 44.276924, + 44.301456, + 44.325778, + 44.349892, + 44.373800, + 44.397504, + 44.421008, + 44.444312, + 44.467419, + 44.490331, + 44.513051, + 44.535581, + 44.557922, + 44.580077, + 44.602048, + 44.623837, + 44.645446, + 44.666876, + 44.688130, + 44.709210, + 44.730117, + 44.750854, + 44.771421, + 44.791822, + 44.812057, + 44.832129, + 44.852039, + 44.871790, + 44.891381, + 44.910817, + 44.930097, + 44.949223, + 44.968198, + 44.987023, + 45.005699, + 45.024228, + 45.042612, + 45.060851, + 45.078948, + 45.096903, + 45.114719, + 45.132397, + 45.149938, + 45.167343, + 45.184615, + 45.201753, + 45.218761, + 45.235638, + 45.252387, + 45.269008, + 45.285503, + 45.301873, + 45.318119, + 45.334244, + 45.350246, + 45.366129, + 45.381893, + 45.397540, + 45.413070, + 45.428484, + 45.443785, + 45.458972, + 45.474047, + 45.489012, + 45.503866, + 45.518612, + 45.533250, + 45.547781, + 45.562207, + 45.576528, + 45.590746, + 45.604861, + 45.618874, + 45.632786, + 45.646599, + 45.660313, + 45.673929, + 45.687448, + 45.700870, + 45.714198, + 45.727432, + 45.740572, + 45.753620, + 45.766576, + 45.779441, + 45.792216, + 45.804902, + 45.817500, + 45.830011, + 45.842434, + 45.854772, + 45.867025, + 45.879193, + 45.891278, + 45.903279, + 45.915199, + 45.927038, + 45.938796, + 45.950474, + 45.962073, + 45.973593, + 45.985036, + 45.996401, + 46.007691, + 46.018904, + 46.030043, + 46.041107, + 46.052098, + 46.063015, + 46.073860, + 46.084633, + 46.095336, + 46.105967, + 46.116529, + 46.127021, + 46.137445, + 46.147801, + 46.158089, + 46.168310, + 46.178465, + 46.188554, + 46.198577, + 46.208536, + 46.218431, + 46.228263, + 46.238031, + 46.247737, + 46.257381, + 46.266963, + 46.276485, + 46.285946, + 46.295347, + 46.304689, + 46.313972, + 46.323196, + 46.332363, + 46.341472, + 46.350524, + 46.359519, + 46.368459, + 46.377343, + 46.386172, + 46.394946, + 46.403666, + 46.412332, + 46.420945, + 46.429505, + 46.438012, + 46.446467, + 46.454871, + 46.463224, + 46.471525, + 46.479777, + 46.487978, + 46.496130, + 46.504233, + 46.512286, + 46.520292, + 46.528249, + 46.536159, + 46.544021, + 46.551837, + 46.559606, + 46.567329, + 46.575006, + 46.582638, + 46.590225, + 46.597767, + 46.605264, + 46.612718, + 46.620127, + 46.627494, + 46.634817, + 46.642098, + 46.649337, + 46.656533, + 46.663688, + 46.670801, + 46.677874, + 46.684905, + 46.691896, + 46.698847, + 46.705759, + 46.712630, + 46.719463, + 46.726256, + 46.733011, + 46.739728, + 46.746406, + 46.753047, + 46.759650, + 46.766216, + 46.772745, + 46.779238, + 46.785694, + 46.792114, + 46.798498, + 46.804846, + 46.811160, + 46.817438, + 46.823681, + 46.829890, + 46.836065, + 46.842205, + 46.848312, + 46.854385, + 46.860425, + 46.866432, + 46.872406, + 46.878347, + 46.884257, + 46.890134, + 46.895979, + 46.901792, + 46.907574, + 46.913325, + 46.919045, + 46.924734, + 46.930393, + 46.936021, + 46.941619, + 46.947188, + 46.952726, + 46.958235, + 46.963715, + 46.969166, + 46.974588, + 46.979982, + 46.985347, + 46.990683, + 46.995992, + 47.001273, + 47.006526, + 47.011751, + 47.016950, + 47.022121, + 47.027265, + 47.032383, + 47.037474, + 47.042539, + 47.047578, + 47.052590, + 47.057577, + 47.062538, + 47.067474, + 47.072385, + 47.077270, + 47.082130, + 47.086966, + 47.091777, + 47.096563, + 47.101326, + 47.106064, + 47.110778, + 47.115468, + 47.120135, + 47.124779, + 47.129399, + 47.133995, + 47.138569, + 47.143120, + 47.147648, + 47.152154, + 47.156637, + 47.161099, + 47.165537, + 47.169954, + 47.174350, + 47.178723, + 47.183075, + 47.187406, + 47.191715, + 47.196003, + 47.200270, + 47.204516, + 47.208742, + 47.212947, + 47.217132, + 47.221296, + 47.225440, + 47.229564, + 47.233668, + 47.237753, + 47.241818, + 47.245863, + 47.249888, + 47.253895, + 47.257882, + 47.261850, + 47.265800, + 47.269730, + 47.273642, + 47.277535, + 47.281410, + 47.285266, + 47.289105, + 47.292925, + 47.296727, + 47.300511, + 47.304277, + 47.308026, + 47.311758, + 47.315471, + 47.319168, + 47.322847, + 47.326509, + 47.330154, + 47.333783, + 47.337394, + 47.340989, + 47.344567, + 47.348128, + 47.351674, + 47.355202, + 47.358715, + 47.362212, + 47.365692, + 47.369157, + 47.372606, + 47.376039, + 47.379457, + 47.382859, + 47.386246, + 47.389617, + 47.392973, + 47.396314, + 47.399640, + 47.402951, + 47.406247, + 47.409528, + 47.412794, + 47.416046, + 47.419283, + 47.422506, + 47.425715, + 47.428909, + 47.432089, + 47.435255, + 47.438407, + 47.441545, + 47.444670, + 47.447780, + 47.450877, + 47.453960, + 47.457029, + 47.460085, + 47.463128, + 47.466157, + 47.469174, + 47.472177, + 47.475167, + 47.478144, + 47.481108, + 47.484059, + 47.486997, + 47.489923, + 47.492836, + 47.495737, + 47.498625, + 47.501501, + 47.504364, + 47.507215, + 47.510054, + 47.512881, + 47.515695, + 47.518498, + 47.521289, + 47.524068, + 47.526835, + 47.529590, + 47.532334, + 47.535066, + 47.537787, + 47.540496, + 47.543193, + 47.545880, + 47.548555, + 47.551219, + 47.553872, + 47.556513, + 47.559144, + 47.561764, + 47.564373, + 47.566971, + 47.569558, + 47.572134, + 47.574700, + 47.577255, + 47.579800, + 47.582334, + 47.584858, + 47.587371, + 47.589874, + 47.592367, + 47.594850, + 47.597322, + 47.599784, + 47.602237, + 47.604679, + 47.607111, + 47.609534, + 47.611947, + 47.614349, + 47.616743, + 47.619126, + 47.621500, + 47.623864, + 47.626219, + 47.628565, + 47.630901, + 47.633227, + 47.635544, + 47.637853, + 47.640151, + 47.642441, + 47.644722, + 47.646993, + 47.649255, + 47.651509, + 47.653754, + 47.655989, + 47.658216, + 47.660434, + 47.662643, + 47.664844, + 47.667036, + 47.669220, + 47.671394, + 47.673561, + 47.675719, + 47.677868, + 47.680009, + 47.682142, + 47.684266, + 47.686382, + 47.688490, + 47.690590, + 47.692682, + 47.694765, + 47.696841, + 47.698909, + 47.700968, + 47.703020, + 47.705064, + 47.707100, + 47.709128, + 47.711148, + 47.713161, + 47.715166, + 47.717163, + 47.719153, + 47.721135, + 47.723110, + 47.725077, + 47.727037, + 47.728989, + 47.730934, + 47.732872, + 47.734802, + 47.736725, + 47.738641, + 47.740550, + 47.742451, + 47.744346, + 47.746233, + 47.748113, + 47.749987, + 47.751853, + 47.753712, + 47.755565, + 47.757410, + 47.759249, + 47.761081, + 47.762906, + 47.764724, + 47.766536, + 47.768341, + 47.770139, + 47.771931, + 47.773716, + 47.775495, + 47.777267, + 47.779032, + 47.780791, + 47.782544, + 47.784290, + 47.786030, + 47.787764, + 47.789491, + 47.791213, + 47.792927, + 47.794636, + 47.796339, + 47.798035, + 47.799725, + 47.801409, + 47.803087, + 47.804759, + 47.806425, + 47.808086, + 47.809740, + 47.811388, + 47.813030, + 47.814667, + 47.816297, + 47.817922, + 47.819541, + 47.821155, + 47.822762, + 47.824364, + 47.825960, + 47.827551, + 47.829136, + 47.830715, + 47.832289, + 47.833857, + 47.835420, + 47.836977, + 47.838529, + 47.840076, + 47.841617, + 47.843152, + 47.844683, + 47.846207, + 47.847727, + 47.849241, + 47.850750, + 47.852254, + 47.853753, + 47.855246, + 47.856735, + 47.858218, + 47.859696, + 47.861169, + 47.862637, + 47.864099, + 47.865557, + 47.867010, + 47.868458, + 47.869901, + 47.871339, + 47.872772, + 47.874200, + 47.875623, + 47.877041, + 47.878455, + 47.879864, + 47.881268, + 47.882667, + 47.884062, + 47.885452, + 47.886837, + 47.888217, + 47.889593, + 47.890964, + 47.892331, + 47.893693, + 47.895050, + 47.896403, + 47.897751, + 47.899095, + 47.900435, + 47.901769, + 47.903100, + 47.904426, + 47.905747, + 47.907065, + 47.908378, + 47.909686, + 47.910990, + 47.912290, + 47.913586, + 47.914877, + 47.916164, + 47.917447, + 47.918725, + 47.920000, + 47.921270, + 47.922536, + 47.923798, + 47.925056, + 47.926309, + 47.927559, + 47.928804, + 47.930046, + 47.931283, + 47.932517, + 47.933746, + 47.934971, + 47.936193, + 47.937410, + 47.938624, + 47.939834, + 47.941039, + 47.942241, + 47.943439, + 47.944633, + 47.945824, + 47.947010, + 47.948193, + 47.949372, + 47.950547, + 47.951718, + 47.952886, + 47.954050, + 47.955210, + 47.956366, + 47.957519, + 47.958668, + 47.959814, + 47.960956, + 47.962094, + 47.963229, + 47.964360, + 47.965488, + 47.966612, + 47.967732, + 47.968849, + 47.969962, + 47.971072, + 47.972179, + 47.973282, + 47.974381, + 47.975478, + 47.976570, + 47.977660, + 47.978745, + 47.979828, + 47.980907, + 47.981983, + 47.983055, + 47.984125, + 47.985190, + 47.986253, + 47.987312, + 47.988368, + 47.989421, + 47.990470, + 47.991517, + 47.992560, + 47.993600, + 47.994636, + 47.995670, + 47.996700, + 47.997727, + 47.998751, + 47.999772, + 48.000790, + 48.001805, + 48.002816, + 48.003825, + 48.004830, + 48.005833, + 48.006832, + 48.007828, + 48.008822, + 48.009812, + 48.010799, + 48.011784, + 48.012765, + 48.013744, + 48.014719, + 48.015692, + 48.016661, + 48.017628, + 48.018592, + 48.019553, + 48.020511, + 48.021467, + }, + {// The expectations for dimension = 98 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881666, + 9.126666, + 9.374999, + 9.626665, + 9.881664, + 10.139995, + 10.401657, + 10.666650, + 10.934970, + 11.206616, + 11.481582, + 11.759860, + 12.041441, + 12.326310, + 12.614446, + 12.905820, + 13.200396, + 13.498126, + 13.798946, + 14.102780, + 14.409531, + 14.719085, + 15.031303, + 15.346029, + 15.663079, + 15.982250, + 16.303316, + 16.626033, + 16.950138, + 17.275355, + 17.601395, + 17.927964, + 18.254765, + 18.581499, + 18.907874, + 19.233603, + 19.558411, + 19.882034, + 20.204224, + 20.524747, + 20.843387, + 21.159946, + 21.474241, + 21.786107, + 22.095396, + 22.401975, + 22.705727, + 23.006548, + 23.304347, + 23.599047, + 23.890581, + 24.178893, + 24.463935, + 24.745671, + 25.024069, + 25.299107, + 25.570769, + 25.839046, + 26.103933, + 26.365429, + 26.623541, + 26.878278, + 27.129651, + 27.377678, + 27.622377, + 27.863769, + 28.101880, + 28.336735, + 28.568362, + 28.796791, + 29.022054, + 29.244182, + 29.463211, + 29.679173, + 29.892105, + 30.102044, + 30.309025, + 30.513086, + 30.714266, + 30.912601, + 31.108130, + 31.300891, + 31.490923, + 31.678265, + 31.862954, + 32.045029, + 32.224528, + 32.401489, + 32.575950, + 32.747949, + 32.917523, + 33.084708, + 33.249541, + 33.412059, + 33.572298, + 33.730293, + 33.886079, + 34.039691, + 34.191163, + 34.340529, + 34.487824, + 34.633078, + 34.776327, + 34.917600, + 35.056930, + 35.194349, + 35.329886, + 35.463573, + 35.595438, + 35.725512, + 35.853823, + 35.980400, + 36.105270, + 36.228462, + 36.350001, + 36.469916, + 36.588232, + 36.704975, + 36.820170, + 36.933842, + 37.046016, + 37.156715, + 37.265964, + 37.373786, + 37.480203, + 37.585238, + 37.688913, + 37.791250, + 37.892270, + 37.991994, + 38.090443, + 38.187636, + 38.283595, + 38.378337, + 38.471883, + 38.564251, + 38.655460, + 38.745528, + 38.834472, + 38.922311, + 39.009061, + 39.094740, + 39.179364, + 39.262949, + 39.345512, + 39.427068, + 39.507632, + 39.587221, + 39.665848, + 39.743529, + 39.820277, + 39.896108, + 39.971035, + 40.045071, + 40.118231, + 40.190526, + 40.261971, + 40.332578, + 40.402359, + 40.471328, + 40.539494, + 40.606872, + 40.673472, + 40.739306, + 40.804385, + 40.868720, + 40.932322, + 40.995202, + 41.057370, + 41.118836, + 41.179611, + 41.239705, + 41.299127, + 41.357887, + 41.415995, + 41.473460, + 41.530290, + 41.586496, + 41.642085, + 41.697067, + 41.751450, + 41.805243, + 41.858453, + 41.911089, + 41.963159, + 42.014671, + 42.065632, + 42.116050, + 42.165932, + 42.215287, + 42.264120, + 42.312440, + 42.360253, + 42.407566, + 42.454385, + 42.500718, + 42.546571, + 42.591951, + 42.636863, + 42.681315, + 42.725311, + 42.768859, + 42.811964, + 42.854631, + 42.896868, + 42.938679, + 42.980070, + 43.021046, + 43.061613, + 43.101776, + 43.141541, + 43.180912, + 43.219894, + 43.258494, + 43.296714, + 43.334561, + 43.372039, + 43.409153, + 43.445907, + 43.482306, + 43.518354, + 43.554056, + 43.589416, + 43.624438, + 43.659127, + 43.693487, + 43.727521, + 43.761235, + 43.794631, + 43.827713, + 43.860486, + 43.892953, + 43.925119, + 43.956986, + 43.988558, + 44.019839, + 44.050832, + 44.081541, + 44.111969, + 44.142120, + 44.171997, + 44.201603, + 44.230941, + 44.260015, + 44.288827, + 44.317381, + 44.345680, + 44.373726, + 44.401523, + 44.429073, + 44.456380, + 44.483447, + 44.510275, + 44.536868, + 44.563228, + 44.589359, + 44.615262, + 44.640941, + 44.666397, + 44.691634, + 44.716654, + 44.741459, + 44.766052, + 44.790435, + 44.814610, + 44.838581, + 44.862348, + 44.885915, + 44.909283, + 44.932455, + 44.955433, + 44.978219, + 45.000815, + 45.023224, + 45.045447, + 45.067486, + 45.089343, + 45.111020, + 45.132520, + 45.153844, + 45.174994, + 45.195972, + 45.216779, + 45.237418, + 45.257891, + 45.278198, + 45.298342, + 45.318325, + 45.338148, + 45.357813, + 45.377322, + 45.396676, + 45.415877, + 45.434926, + 45.453825, + 45.472576, + 45.491180, + 45.509638, + 45.527953, + 45.546125, + 45.564156, + 45.582048, + 45.599802, + 45.617419, + 45.634900, + 45.652248, + 45.669463, + 45.686547, + 45.703501, + 45.720326, + 45.737024, + 45.753596, + 45.770043, + 45.786367, + 45.802568, + 45.818648, + 45.834608, + 45.850449, + 45.866173, + 45.881780, + 45.897272, + 45.912649, + 45.927914, + 45.943066, + 45.958108, + 45.973040, + 45.987863, + 46.002578, + 46.017187, + 46.031690, + 46.046088, + 46.060382, + 46.074574, + 46.088664, + 46.102653, + 46.116543, + 46.130333, + 46.144026, + 46.157622, + 46.171121, + 46.184525, + 46.197835, + 46.211052, + 46.224176, + 46.237208, + 46.250149, + 46.263000, + 46.275762, + 46.288436, + 46.301022, + 46.313521, + 46.325934, + 46.338262, + 46.350505, + 46.362665, + 46.374742, + 46.386736, + 46.398649, + 46.410482, + 46.422234, + 46.433907, + 46.445502, + 46.457019, + 46.468458, + 46.479821, + 46.491108, + 46.502320, + 46.513457, + 46.524521, + 46.535512, + 46.546429, + 46.557275, + 46.568050, + 46.578754, + 46.589388, + 46.599952, + 46.610448, + 46.620875, + 46.631234, + 46.641527, + 46.651753, + 46.661913, + 46.672007, + 46.682037, + 46.692003, + 46.701904, + 46.711743, + 46.721519, + 46.731232, + 46.740884, + 46.750475, + 46.760006, + 46.769476, + 46.778887, + 46.788238, + 46.797531, + 46.806766, + 46.815943, + 46.825063, + 46.834127, + 46.843134, + 46.852085, + 46.860981, + 46.869823, + 46.878610, + 46.887342, + 46.896022, + 46.904648, + 46.913222, + 46.921743, + 46.930213, + 46.938631, + 46.946998, + 46.955315, + 46.963581, + 46.971798, + 46.979965, + 46.988083, + 46.996153, + 47.004174, + 47.012148, + 47.020074, + 47.027953, + 47.035786, + 47.043572, + 47.051312, + 47.059007, + 47.066656, + 47.074260, + 47.081820, + 47.089336, + 47.096807, + 47.104236, + 47.111621, + 47.118963, + 47.126262, + 47.133520, + 47.140735, + 47.147909, + 47.155042, + 47.162134, + 47.169185, + 47.176196, + 47.183166, + 47.190097, + 47.196989, + 47.203842, + 47.210655, + 47.217431, + 47.224168, + 47.230867, + 47.237528, + 47.244152, + 47.250739, + 47.257289, + 47.263803, + 47.270280, + 47.276721, + 47.283126, + 47.289496, + 47.295831, + 47.302131, + 47.308396, + 47.314626, + 47.320823, + 47.326985, + 47.333114, + 47.339209, + 47.345271, + 47.351300, + 47.357296, + 47.363260, + 47.369191, + 47.375090, + 47.380958, + 47.386794, + 47.392598, + 47.398372, + 47.404114, + 47.409826, + 47.415507, + 47.421158, + 47.426779, + 47.432370, + 47.437932, + 47.443464, + 47.448967, + 47.454440, + 47.459885, + 47.465302, + 47.470690, + 47.476049, + 47.481381, + 47.486685, + 47.491961, + 47.497210, + 47.502432, + 47.507626, + 47.512794, + 47.517935, + 47.523049, + 47.528137, + 47.533199, + 47.538235, + 47.543245, + 47.548230, + 47.553189, + 47.558123, + 47.563031, + 47.567915, + 47.572774, + 47.577608, + 47.582418, + 47.587204, + 47.591966, + 47.596703, + 47.601417, + 47.606107, + 47.610774, + 47.615418, + 47.620038, + 47.624635, + 47.629209, + 47.633761, + 47.638290, + 47.642797, + 47.647281, + 47.651744, + 47.656184, + 47.660603, + 47.665000, + 47.669375, + 47.673729, + 47.678061, + 47.682373, + 47.686664, + 47.690933, + 47.695182, + 47.699411, + 47.703618, + 47.707806, + 47.711973, + 47.716121, + 47.720248, + 47.724356, + 47.728444, + 47.732512, + 47.736561, + 47.740591, + 47.744601, + 47.748592, + 47.752565, + 47.756518, + 47.760453, + 47.764369, + 47.768267, + 47.772147, + 47.776008, + 47.779851, + 47.783676, + 47.787483, + 47.791273, + 47.795044, + 47.798798, + 47.802535, + 47.806254, + 47.809956, + 47.813641, + 47.817309, + 47.820960, + 47.824594, + 47.828211, + 47.831812, + 47.835396, + 47.838964, + 47.842515, + 47.846051, + 47.849570, + 47.853073, + 47.856560, + 47.860031, + 47.863487, + 47.866927, + 47.870351, + 47.873760, + 47.877154, + 47.880532, + 47.883895, + 47.887243, + 47.890576, + 47.893894, + 47.897197, + 47.900486, + 47.903760, + 47.907019, + 47.910264, + 47.913494, + 47.916710, + 47.919912, + 47.923100, + 47.926274, + 47.929434, + 47.932579, + 47.935712, + 47.938830, + 47.941935, + 47.945026, + 47.948103, + 47.951167, + 47.954218, + 47.957256, + 47.960280, + 47.963292, + 47.966290, + 47.969275, + 47.972248, + 47.975207, + 47.978154, + 47.981089, + 47.984010, + 47.986919, + 47.989816, + 47.992700, + 47.995572, + 47.998432, + 48.001280, + 48.004115, + 48.006939, + 48.009750, + 48.012550, + 48.015338, + 48.018114, + 48.020878, + 48.023631, + 48.026372, + 48.029102, + 48.031820, + 48.034527, + 48.037222, + 48.039906, + 48.042580, + 48.045242, + 48.047892, + 48.050532, + 48.053161, + 48.055779, + 48.058387, + 48.060983, + 48.063569, + 48.066144, + 48.068709, + 48.071263, + 48.073807, + 48.076340, + 48.078863, + 48.081375, + 48.083877, + 48.086369, + 48.088851, + 48.091323, + 48.093785, + 48.096237, + 48.098679, + 48.101111, + 48.103533, + 48.105946, + 48.108349, + 48.110742, + 48.113126, + 48.115500, + 48.117864, + 48.120219, + 48.122565, + 48.124901, + 48.127228, + 48.129546, + 48.131855, + 48.134154, + 48.136445, + 48.138726, + 48.140998, + 48.143261, + 48.145516, + 48.147761, + 48.149998, + 48.152226, + 48.154445, + 48.156656, + 48.158858, + 48.161051, + 48.163236, + 48.165412, + 48.167580, + 48.169739, + 48.171890, + 48.174033, + 48.176167, + 48.178293, + 48.180411, + 48.182521, + 48.184622, + 48.186716, + 48.188801, + 48.190879, + 48.192948, + 48.195010, + 48.197064, + 48.199110, + 48.201148, + 48.203178, + 48.205201, + 48.207216, + 48.209223, + 48.211223, + 48.213215, + 48.215200, + 48.217177, + 48.219147, + 48.221109, + 48.223064, + 48.225012, + 48.226952, + 48.228885, + 48.230811, + 48.232729, + 48.234641, + 48.236545, + 48.238442, + 48.240333, + 48.242216, + 48.244092, + 48.245961, + 48.247824, + 48.249679, + 48.251528, + 48.253370, + 48.255205, + 48.257033, + 48.258854, + 48.260669, + 48.262478, + 48.264279, + 48.266074, + 48.267863, + 48.269645, + 48.271420, + 48.273189, + 48.274952, + 48.276708, + 48.278458, + 48.280202, + 48.281939, + 48.283670, + 48.285395, + 48.287113, + 48.288825, + 48.290532, + 48.292232, + 48.293926, + 48.295613, + 48.297295, + 48.298971, + 48.300641, + 48.302305, + 48.303963, + 48.305615, + 48.307261, + 48.308902, + 48.310536, + 48.312165, + 48.313788, + 48.315406, + 48.317017, + 48.318623, + 48.320224, + 48.321818, + 48.323407, + 48.324991, + 48.326569, + 48.328141, + 48.329708, + 48.331270, + 48.332826, + 48.334376, + 48.335922, + 48.337462, + 48.338996, + 48.340525, + 48.342049, + 48.343568, + 48.345081, + 48.346590, + 48.348093, + 48.349590, + 48.351083, + 48.352571, + 48.354053, + 48.355531, + 48.357003, + 48.358470, + 48.359932, + 48.361390, + 48.362842, + 48.364290, + 48.365732, + 48.367170, + 48.368602, + 48.370030, + 48.371453, + 48.372871, + 48.374285, + 48.375693, + 48.377097, + 48.378497, + 48.379891, + 48.381281, + 48.382666, + 48.384047, + 48.385422, + 48.386794, + 48.388160, + 48.389523, + 48.390880, + 48.392233, + 48.393582, + 48.394926, + 48.396266, + 48.397601, + 48.398932, + 48.400258, + 48.401580, + 48.402898, + 48.404211, + 48.405520, + 48.406825, + 48.408125, + 48.409422, + 48.410713, + 48.412001, + 48.413285, + 48.414564, + 48.415839, + 48.417110, + 48.418377, + 48.419639, + 48.420898, + 48.422153, + 48.423403, + 48.424649, + 48.425892, + 48.427130, + 48.428365, + 48.429595, + 48.430821, + 48.432044, + 48.433262, + 48.434477, + 48.435688, + 48.436894, + 48.438097, + 48.439297, + 48.440492, + 48.441683, + 48.442871, + 48.444055, + 48.445235, + 48.446412, + 48.447584, + 48.448753, + 48.449918, + 48.451080, + 48.452238, + 48.453392, + 48.454543, + 48.455690, + 48.456833, + 48.457973, + 48.459109, + 48.460242, + 48.461371, + 48.462496, + 48.463618, + 48.464737, + 48.465852, + 48.466964, + 48.468072, + 48.469176, + 48.470277, + 48.471375, + 48.472470, + 48.473561, + 48.474648, + 48.475733, + 48.476813, + 48.477891, + 48.478965, + 48.480036, + 48.481104, + 48.482168, + 48.483229, + 48.484287, + 48.485342, + 48.486393, + 48.487441, + 48.488486, + 48.489528, + 48.490567, + 48.491602, + 48.492634, + 48.493664, + 48.494690, + 48.495713, + 48.496732, + 48.497749, + 48.498763, + 48.499773, + 48.500781, + 48.501785, + 48.502787, + 48.503785, + 48.504781, + 48.505773, + 48.506763, + 48.507749, + 48.508733, + 48.509713, + 48.510691, + 48.511666, + }, + {// The expectations for dimension = 99 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881667, + 9.126666, + 9.374999, + 9.626666, + 9.881665, + 10.139996, + 10.401660, + 10.666654, + 10.934978, + 11.206628, + 11.481601, + 11.759891, + 12.041490, + 12.326384, + 12.614557, + 12.905984, + 13.200633, + 13.498463, + 13.799417, + 14.103427, + 14.410407, + 14.720251, + 15.032835, + 15.348012, + 15.665611, + 15.985441, + 16.307287, + 16.630916, + 16.956073, + 17.282489, + 17.609883, + 17.937963, + 18.266434, + 18.594997, + 18.923358, + 19.251226, + 19.578321, + 19.904372, + 20.229123, + 20.552333, + 20.873777, + 21.193247, + 21.510552, + 21.825518, + 22.137988, + 22.447821, + 22.754890, + 23.059086, + 23.360310, + 23.658477, + 23.953515, + 24.245361, + 24.533963, + 24.819278, + 25.101271, + 25.379916, + 25.655192, + 25.927086, + 26.195590, + 26.460701, + 26.722422, + 26.980759, + 27.235722, + 27.487326, + 27.735587, + 27.980525, + 28.222162, + 28.460524, + 28.695637, + 28.927530, + 29.156232, + 29.381776, + 29.604193, + 29.823519, + 30.039787, + 30.253034, + 30.463295, + 30.670607, + 30.875008, + 31.076536, + 31.275227, + 31.471120, + 31.664254, + 31.854666, + 32.042396, + 32.227480, + 32.409958, + 32.589867, + 32.767245, + 32.942129, + 33.114558, + 33.284567, + 33.452194, + 33.617475, + 33.780447, + 33.941144, + 34.099603, + 34.255858, + 34.409943, + 34.561894, + 34.711742, + 34.859523, + 35.005267, + 35.149009, + 35.290780, + 35.430610, + 35.568532, + 35.704575, + 35.838771, + 35.971147, + 36.101735, + 36.230561, + 36.357655, + 36.483045, + 36.606757, + 36.728819, + 36.849257, + 36.968098, + 37.085366, + 37.201088, + 37.315287, + 37.427989, + 37.539217, + 37.648995, + 37.757345, + 37.864291, + 37.969855, + 38.074059, + 38.176925, + 38.278473, + 38.378726, + 38.477702, + 38.575422, + 38.671907, + 38.767175, + 38.861245, + 38.954137, + 39.045868, + 39.136458, + 39.225923, + 39.314281, + 39.401549, + 39.487744, + 39.572883, + 39.656982, + 39.740057, + 39.822124, + 39.903198, + 39.983294, + 40.062427, + 40.140612, + 40.217863, + 40.294194, + 40.369619, + 40.444153, + 40.517807, + 40.590596, + 40.662532, + 40.733627, + 40.803896, + 40.873349, + 40.941999, + 41.009857, + 41.076935, + 41.143246, + 41.208799, + 41.273606, + 41.337678, + 41.401026, + 41.463659, + 41.525589, + 41.586825, + 41.647378, + 41.707256, + 41.766471, + 41.825030, + 41.882945, + 41.940223, + 41.996873, + 42.052906, + 42.108328, + 42.163149, + 42.217377, + 42.271021, + 42.324088, + 42.376587, + 42.428525, + 42.479910, + 42.530750, + 42.581052, + 42.630824, + 42.680072, + 42.728804, + 42.777027, + 42.824748, + 42.871974, + 42.918710, + 42.964964, + 43.010742, + 43.056051, + 43.100897, + 43.145285, + 43.189223, + 43.232715, + 43.275768, + 43.318387, + 43.360579, + 43.402348, + 43.443700, + 43.484641, + 43.525176, + 43.565310, + 43.605049, + 43.644397, + 43.683359, + 43.721940, + 43.760146, + 43.797981, + 43.835449, + 43.872555, + 43.909304, + 43.945700, + 43.981748, + 44.017452, + 44.052817, + 44.087845, + 44.122543, + 44.156913, + 44.190960, + 44.224687, + 44.258100, + 44.291200, + 44.323993, + 44.356482, + 44.388671, + 44.420563, + 44.452162, + 44.483471, + 44.514494, + 44.545234, + 44.575695, + 44.605880, + 44.635793, + 44.665435, + 44.694812, + 44.723925, + 44.752778, + 44.781374, + 44.809715, + 44.837806, + 44.865648, + 44.893245, + 44.920600, + 44.947714, + 44.974592, + 45.001236, + 45.027647, + 45.053830, + 45.079787, + 45.105520, + 45.131031, + 45.156324, + 45.181400, + 45.206263, + 45.230914, + 45.255355, + 45.279590, + 45.303621, + 45.327449, + 45.351077, + 45.374508, + 45.397743, + 45.420784, + 45.443634, + 45.466294, + 45.488768, + 45.511056, + 45.533161, + 45.555085, + 45.576829, + 45.598396, + 45.619788, + 45.641006, + 45.662052, + 45.682929, + 45.703637, + 45.724179, + 45.744557, + 45.764771, + 45.784825, + 45.804719, + 45.824456, + 45.844036, + 45.863462, + 45.882735, + 45.901856, + 45.920828, + 45.939652, + 45.958329, + 45.976860, + 45.995249, + 46.013494, + 46.031600, + 46.049565, + 46.067393, + 46.085084, + 46.102641, + 46.120063, + 46.137353, + 46.154512, + 46.171540, + 46.188441, + 46.205214, + 46.221861, + 46.238383, + 46.254782, + 46.271059, + 46.287214, + 46.303250, + 46.319167, + 46.334966, + 46.350649, + 46.366216, + 46.381670, + 46.397010, + 46.412238, + 46.427356, + 46.442363, + 46.457262, + 46.472053, + 46.486737, + 46.501315, + 46.515789, + 46.530159, + 46.544427, + 46.558592, + 46.572657, + 46.586622, + 46.600488, + 46.614256, + 46.627927, + 46.641501, + 46.654981, + 46.668366, + 46.681657, + 46.694856, + 46.707963, + 46.720979, + 46.733905, + 46.746741, + 46.759489, + 46.772150, + 46.784723, + 46.797210, + 46.809612, + 46.821929, + 46.834163, + 46.846314, + 46.858382, + 46.870368, + 46.882274, + 46.894100, + 46.905846, + 46.917513, + 46.929103, + 46.940615, + 46.952051, + 46.963410, + 46.974694, + 46.985904, + 46.997040, + 47.008102, + 47.019091, + 47.030009, + 47.040855, + 47.051630, + 47.062335, + 47.072970, + 47.083537, + 47.094035, + 47.104465, + 47.114828, + 47.125124, + 47.135354, + 47.145518, + 47.155618, + 47.165653, + 47.175624, + 47.185531, + 47.195376, + 47.205159, + 47.214880, + 47.224539, + 47.234138, + 47.243676, + 47.253155, + 47.262574, + 47.271935, + 47.281237, + 47.290482, + 47.299669, + 47.308800, + 47.317874, + 47.326892, + 47.335854, + 47.344762, + 47.353615, + 47.362413, + 47.371159, + 47.379850, + 47.388489, + 47.397076, + 47.405611, + 47.414094, + 47.422525, + 47.430907, + 47.439237, + 47.447518, + 47.455749, + 47.463931, + 47.472065, + 47.480150, + 47.488186, + 47.496176, + 47.504118, + 47.512013, + 47.519861, + 47.527664, + 47.535421, + 47.543132, + 47.550798, + 47.558419, + 47.565996, + 47.573529, + 47.581018, + 47.588464, + 47.595867, + 47.603227, + 47.610545, + 47.617820, + 47.625054, + 47.632247, + 47.639398, + 47.646509, + 47.653579, + 47.660608, + 47.667598, + 47.674549, + 47.681460, + 47.688332, + 47.695165, + 47.701960, + 47.708717, + 47.715436, + 47.722117, + 47.728762, + 47.735369, + 47.741939, + 47.748473, + 47.754971, + 47.761433, + 47.767859, + 47.774249, + 47.780605, + 47.786926, + 47.793212, + 47.799463, + 47.805681, + 47.811864, + 47.818014, + 47.824131, + 47.830214, + 47.836264, + 47.842282, + 47.848268, + 47.854221, + 47.860142, + 47.866031, + 47.871889, + 47.877715, + 47.883511, + 47.889275, + 47.895009, + 47.900712, + 47.906385, + 47.912028, + 47.917642, + 47.923226, + 47.928780, + 47.934305, + 47.939801, + 47.945269, + 47.950707, + 47.956118, + 47.961500, + 47.966854, + 47.972181, + 47.977480, + 47.982751, + 47.987995, + 47.993213, + 47.998403, + 48.003566, + 48.008704, + 48.013814, + 48.018899, + 48.023958, + 48.028991, + 48.033998, + 48.038980, + 48.043937, + 48.048868, + 48.053775, + 48.058657, + 48.063514, + 48.068347, + 48.073156, + 48.077940, + 48.082701, + 48.087438, + 48.092151, + 48.096841, + 48.101507, + 48.106150, + 48.110770, + 48.115368, + 48.119942, + 48.124495, + 48.129024, + 48.133532, + 48.138017, + 48.142480, + 48.146922, + 48.151342, + 48.155740, + 48.160117, + 48.164472, + 48.168807, + 48.173120, + 48.177413, + 48.181685, + 48.185936, + 48.190167, + 48.194377, + 48.198567, + 48.202738, + 48.206888, + 48.211018, + 48.215129, + 48.219220, + 48.223292, + 48.227344, + 48.231377, + 48.235391, + 48.239386, + 48.243363, + 48.247320, + 48.251259, + 48.255180, + 48.259082, + 48.262965, + 48.266831, + 48.270679, + 48.274508, + 48.278320, + 48.282114, + 48.285891, + 48.289650, + 48.293392, + 48.297116, + 48.300823, + 48.304514, + 48.308187, + 48.311843, + 48.315483, + 48.319106, + 48.322712, + 48.326302, + 48.329876, + 48.333433, + 48.336975, + 48.340500, + 48.344009, + 48.347502, + 48.350980, + 48.354442, + 48.357888, + 48.361319, + 48.364734, + 48.368135, + 48.371519, + 48.374889, + 48.378244, + 48.381584, + 48.384909, + 48.388219, + 48.391515, + 48.394796, + 48.398062, + 48.401314, + 48.404552, + 48.407775, + 48.410985, + 48.414180, + 48.417361, + 48.420528, + 48.423682, + 48.426821, + 48.429947, + 48.433060, + 48.436158, + 48.439244, + 48.442316, + 48.445375, + 48.448420, + 48.451452, + 48.454472, + 48.457478, + 48.460472, + 48.463452, + 48.466420, + 48.469375, + 48.472317, + 48.475247, + 48.478165, + 48.481070, + 48.483963, + 48.486843, + 48.489711, + 48.492567, + 48.495411, + 48.498243, + 48.501063, + 48.503872, + 48.506668, + 48.509453, + 48.512226, + 48.514987, + 48.517737, + 48.520476, + 48.523203, + 48.525918, + 48.528623, + 48.531316, + 48.533998, + 48.536669, + 48.539329, + 48.541978, + 48.544615, + 48.547243, + 48.549859, + 48.552465, + 48.555059, + 48.557644, + 48.560217, + 48.562781, + 48.565333, + 48.567876, + 48.570408, + 48.572930, + 48.575441, + 48.577943, + 48.580434, + 48.582915, + 48.585386, + 48.587847, + 48.590299, + 48.592740, + 48.595172, + 48.597594, + 48.600006, + 48.602409, + 48.604802, + 48.607185, + 48.609559, + 48.611924, + 48.614279, + 48.616625, + 48.618962, + 48.621289, + 48.623607, + 48.625916, + 48.628216, + 48.630507, + 48.632789, + 48.635061, + 48.637325, + 48.639581, + 48.641827, + 48.644065, + 48.646293, + 48.648513, + 48.650725, + 48.652928, + 48.655122, + 48.657308, + 48.659486, + 48.661655, + 48.663815, + 48.665968, + 48.668112, + 48.670248, + 48.672375, + 48.674495, + 48.676606, + 48.678709, + 48.680804, + 48.682892, + 48.684971, + 48.687042, + 48.689106, + 48.691162, + 48.693209, + 48.695250, + 48.697282, + 48.699307, + 48.701324, + 48.703333, + 48.705335, + 48.707330, + 48.709317, + 48.711296, + 48.713268, + 48.715233, + 48.717190, + 48.719140, + 48.721083, + 48.723019, + 48.724947, + 48.726868, + 48.728783, + 48.730690, + 48.732589, + 48.734482, + 48.736368, + 48.738247, + 48.740120, + 48.741985, + 48.743843, + 48.745695, + 48.747540, + 48.749378, + 48.751209, + 48.753034, + 48.754851, + 48.756663, + 48.758468, + 48.760266, + 48.762058, + 48.763843, + 48.765622, + 48.767394, + 48.769160, + 48.770919, + 48.772673, + 48.774420, + 48.776160, + 48.777895, + 48.779623, + 48.781345, + 48.783061, + 48.784770, + 48.786474, + 48.788172, + 48.789863, + 48.791549, + 48.793228, + 48.794902, + 48.796569, + 48.798231, + 48.799887, + 48.801537, + 48.803181, + 48.804820, + 48.806452, + 48.808079, + 48.809700, + 48.811316, + 48.812926, + 48.814530, + 48.816129, + 48.817722, + 48.819309, + 48.820891, + 48.822468, + 48.824039, + 48.825604, + 48.827164, + 48.828719, + 48.830269, + 48.831813, + 48.833351, + 48.834885, + 48.836413, + 48.837936, + 48.839453, + 48.840966, + 48.842473, + 48.843975, + 48.845472, + 48.846964, + 48.848451, + 48.849932, + 48.851409, + 48.852881, + 48.854347, + 48.855809, + 48.857266, + 48.858717, + 48.860164, + 48.861606, + 48.863044, + 48.864476, + 48.865903, + 48.867326, + 48.868744, + 48.870157, + 48.871565, + 48.872969, + 48.874368, + 48.875763, + 48.877152, + 48.878537, + 48.879918, + 48.881294, + 48.882665, + 48.884032, + 48.885394, + 48.886752, + 48.888105, + 48.889454, + 48.890798, + 48.892138, + 48.893473, + 48.894805, + 48.896131, + 48.897454, + 48.898772, + 48.900085, + 48.901395, + 48.902700, + 48.904001, + 48.905298, + 48.906590, + 48.907878, + 48.909162, + 48.910442, + 48.911718, + 48.912989, + 48.914257, + 48.915520, + 48.916780, + 48.918035, + 48.919286, + 48.920533, + 48.921777, + 48.923016, + 48.924251, + 48.925482, + 48.926709, + 48.927933, + 48.929152, + 48.930368, + 48.931580, + 48.932788, + 48.933992, + 48.935192, + 48.936388, + 48.937581, + 48.938770, + 48.939955, + 48.941136, + 48.942314, + 48.943487, + 48.944658, + 48.945824, + 48.946987, + 48.948146, + 48.949302, + 48.950454, + 48.951602, + 48.952747, + 48.953888, + 48.955025, + 48.956159, + 48.957290, + 48.958417, + 48.959540, + 48.960660, + 48.961777, + 48.962890, + 48.964000, + 48.965106, + 48.966209, + 48.967308, + 48.968404, + 48.969497, + 48.970586, + 48.971672, + 48.972754, + 48.973834, + 48.974910, + 48.975982, + 48.977052, + 48.978118, + 48.979181, + 48.980240, + 48.981297, + 48.982350, + 48.983400, + 48.984447, + 48.985490, + 48.986531, + 48.987568, + 48.988602, + 48.989633, + 48.990661, + 48.991686, + 48.992708, + 48.993726, + 48.994742, + 48.995754, + 48.996764, + 48.997771, + 48.998774, + 48.999774, + 49.000772, + 49.001766, + }, + {// The expectations for dimension = 100 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881667, + 9.126666, + 9.375000, + 9.626666, + 9.881665, + 10.139997, + 10.401662, + 10.666657, + 10.934983, + 11.206637, + 11.481617, + 11.759916, + 12.041528, + 12.326444, + 12.614647, + 12.906118, + 13.200829, + 13.498743, + 13.799812, + 14.103974, + 14.411153, + 14.721254, + 15.034161, + 15.349740, + 15.667833, + 15.988260, + 16.310818, + 16.635283, + 16.961412, + 17.288943, + 17.617602, + 17.947102, + 18.277150, + 18.607449, + 18.937702, + 19.267617, + 19.596908, + 19.925299, + 20.252527, + 20.578343, + 20.902514, + 21.224823, + 21.545069, + 21.863071, + 22.178662, + 22.491692, + 22.802027, + 23.109550, + 23.414153, + 23.715747, + 24.014251, + 24.309597, + 24.601727, + 24.890593, + 25.176156, + 25.458383, + 25.737252, + 26.012745, + 26.284849, + 26.553560, + 26.818877, + 27.080804, + 27.339347, + 27.594520, + 27.846336, + 28.094814, + 28.339975, + 28.581841, + 28.820438, + 29.055793, + 29.287936, + 29.516896, + 29.742705, + 29.965396, + 30.185004, + 30.401564, + 30.615110, + 30.825679, + 31.033308, + 31.238034, + 31.439895, + 31.638928, + 31.835172, + 32.028664, + 32.219443, + 32.407546, + 32.593012, + 32.775879, + 32.956184, + 33.133965, + 33.309260, + 33.482104, + 33.652537, + 33.820593, + 33.986309, + 34.149721, + 34.310864, + 34.469774, + 34.626485, + 34.781031, + 34.933447, + 35.083766, + 35.232020, + 35.378243, + 35.522466, + 35.664721, + 35.805040, + 35.943454, + 36.079992, + 36.214684, + 36.347561, + 36.478650, + 36.607981, + 36.735581, + 36.861479, + 36.985702, + 37.108275, + 37.229226, + 37.348581, + 37.466365, + 37.582603, + 37.697319, + 37.810539, + 37.922285, + 38.032581, + 38.141451, + 38.248916, + 38.355000, + 38.459724, + 38.563109, + 38.665176, + 38.765947, + 38.865442, + 38.963680, + 39.060682, + 39.156467, + 39.251053, + 39.344460, + 39.436706, + 39.527809, + 39.617786, + 39.706655, + 39.794434, + 39.881138, + 39.966785, + 40.051390, + 40.134970, + 40.217540, + 40.299115, + 40.379712, + 40.459344, + 40.538026, + 40.615772, + 40.692597, + 40.768514, + 40.843538, + 40.917680, + 40.990956, + 41.063376, + 41.134955, + 41.205704, + 41.275636, + 41.344762, + 41.413095, + 41.480647, + 41.547428, + 41.613449, + 41.678723, + 41.743259, + 41.807069, + 41.870163, + 41.932550, + 41.994242, + 42.055248, + 42.115579, + 42.175242, + 42.234249, + 42.292608, + 42.350329, + 42.407419, + 42.463890, + 42.519748, + 42.575003, + 42.629662, + 42.683735, + 42.737229, + 42.790152, + 42.842513, + 42.894318, + 42.945575, + 42.996293, + 43.046478, + 43.096137, + 43.145278, + 43.193907, + 43.242032, + 43.289659, + 43.336796, + 43.383447, + 43.429621, + 43.475322, + 43.520559, + 43.565336, + 43.609659, + 43.653536, + 43.696970, + 43.739970, + 43.782539, + 43.824683, + 43.866409, + 43.907721, + 43.948624, + 43.989125, + 44.029228, + 44.068938, + 44.108261, + 44.147200, + 44.185762, + 44.223951, + 44.261770, + 44.299227, + 44.336323, + 44.373065, + 44.409457, + 44.445502, + 44.481206, + 44.516572, + 44.551605, + 44.586308, + 44.620687, + 44.654744, + 44.688483, + 44.721910, + 44.755026, + 44.787837, + 44.820345, + 44.852555, + 44.884469, + 44.916092, + 44.947428, + 44.978478, + 45.009247, + 45.039739, + 45.069956, + 45.099901, + 45.129578, + 45.158991, + 45.188141, + 45.217032, + 45.245668, + 45.274050, + 45.302183, + 45.330068, + 45.357709, + 45.385109, + 45.412270, + 45.439195, + 45.465887, + 45.492348, + 45.518581, + 45.544588, + 45.570373, + 45.595937, + 45.621284, + 45.646414, + 45.671332, + 45.696039, + 45.720537, + 45.744830, + 45.768918, + 45.792805, + 45.816493, + 45.839983, + 45.863279, + 45.886381, + 45.909293, + 45.932016, + 45.954552, + 45.976904, + 45.999073, + 46.021061, + 46.042870, + 46.064503, + 46.085960, + 46.107245, + 46.128358, + 46.149301, + 46.170077, + 46.190687, + 46.211133, + 46.231416, + 46.251538, + 46.271501, + 46.291307, + 46.310957, + 46.330453, + 46.349796, + 46.368989, + 46.388031, + 46.406926, + 46.425674, + 46.444278, + 46.462737, + 46.481055, + 46.499232, + 46.517270, + 46.535171, + 46.552935, + 46.570564, + 46.588059, + 46.605422, + 46.622654, + 46.639756, + 46.656730, + 46.673576, + 46.690297, + 46.706893, + 46.723366, + 46.739716, + 46.755946, + 46.772055, + 46.788046, + 46.803919, + 46.819676, + 46.835318, + 46.850846, + 46.866260, + 46.881562, + 46.896754, + 46.911836, + 46.926809, + 46.941674, + 46.956433, + 46.971085, + 46.985633, + 47.000078, + 47.014419, + 47.028659, + 47.042798, + 47.056837, + 47.070777, + 47.084619, + 47.098363, + 47.112012, + 47.125565, + 47.139024, + 47.152389, + 47.165661, + 47.178842, + 47.191931, + 47.204931, + 47.217840, + 47.230662, + 47.243395, + 47.256041, + 47.268602, + 47.281076, + 47.293466, + 47.305773, + 47.317996, + 47.330136, + 47.342195, + 47.354173, + 47.366071, + 47.377889, + 47.389628, + 47.401289, + 47.412873, + 47.424380, + 47.435811, + 47.447166, + 47.458447, + 47.469654, + 47.480787, + 47.491847, + 47.502835, + 47.513751, + 47.524597, + 47.535372, + 47.546077, + 47.556713, + 47.567281, + 47.577781, + 47.588213, + 47.598578, + 47.608877, + 47.619111, + 47.629279, + 47.639382, + 47.649422, + 47.659398, + 47.669311, + 47.679161, + 47.688950, + 47.698677, + 47.708343, + 47.717949, + 47.727495, + 47.736981, + 47.746409, + 47.755778, + 47.765089, + 47.774342, + 47.783539, + 47.792679, + 47.801763, + 47.810791, + 47.819764, + 47.828682, + 47.837546, + 47.846356, + 47.855113, + 47.863816, + 47.872467, + 47.881066, + 47.889613, + 47.898109, + 47.906554, + 47.914948, + 47.923292, + 47.931587, + 47.939832, + 47.948028, + 47.956176, + 47.964275, + 47.972327, + 47.980331, + 47.988288, + 47.996198, + 48.004062, + 48.011881, + 48.019653, + 48.027380, + 48.035063, + 48.042700, + 48.050294, + 48.057843, + 48.065349, + 48.072812, + 48.080232, + 48.087610, + 48.094945, + 48.102238, + 48.109489, + 48.116700, + 48.123869, + 48.130998, + 48.138086, + 48.145134, + 48.152143, + 48.159112, + 48.166042, + 48.172932, + 48.179785, + 48.186599, + 48.193375, + 48.200113, + 48.206814, + 48.213478, + 48.220104, + 48.226694, + 48.233248, + 48.239766, + 48.246248, + 48.252694, + 48.259105, + 48.265480, + 48.271821, + 48.278128, + 48.284400, + 48.290638, + 48.296842, + 48.303013, + 48.309150, + 48.315254, + 48.321326, + 48.327364, + 48.333371, + 48.339345, + 48.345287, + 48.351198, + 48.357077, + 48.362924, + 48.368741, + 48.374527, + 48.380282, + 48.386007, + 48.391702, + 48.397367, + 48.403002, + 48.408607, + 48.414183, + 48.419730, + 48.425248, + 48.430738, + 48.436198, + 48.441631, + 48.447035, + 48.452411, + 48.457760, + 48.463081, + 48.468374, + 48.473641, + 48.478880, + 48.484093, + 48.489278, + 48.494438, + 48.499571, + 48.504678, + 48.509759, + 48.514814, + 48.519844, + 48.524848, + 48.529827, + 48.534781, + 48.539710, + 48.544615, + 48.549494, + 48.554350, + 48.559181, + 48.563988, + 48.568771, + 48.573530, + 48.578266, + 48.582978, + 48.587667, + 48.592333, + 48.596975, + 48.601595, + 48.606192, + 48.610767, + 48.615319, + 48.619849, + 48.624357, + 48.628843, + 48.633307, + 48.637749, + 48.642170, + 48.646569, + 48.650947, + 48.655304, + 48.659640, + 48.663955, + 48.668250, + 48.672523, + 48.676777, + 48.681009, + 48.685222, + 48.689415, + 48.693587, + 48.697740, + 48.701873, + 48.705987, + 48.710081, + 48.714156, + 48.718211, + 48.722247, + 48.726265, + 48.730263, + 48.734243, + 48.738204, + 48.742147, + 48.746071, + 48.749977, + 48.753865, + 48.757735, + 48.761587, + 48.765421, + 48.769237, + 48.773036, + 48.776817, + 48.780581, + 48.784327, + 48.788057, + 48.791769, + 48.795464, + 48.799142, + 48.802804, + 48.806449, + 48.810077, + 48.813689, + 48.817284, + 48.820864, + 48.824427, + 48.827973, + 48.831504, + 48.835019, + 48.838519, + 48.842002, + 48.845470, + 48.848923, + 48.852360, + 48.855781, + 48.859188, + 48.862579, + 48.865956, + 48.869317, + 48.872663, + 48.875995, + 48.879312, + 48.882614, + 48.885902, + 48.889175, + 48.892434, + 48.895679, + 48.898909, + 48.902125, + 48.905328, + 48.908516, + 48.911691, + 48.914851, + 48.917998, + 48.921131, + 48.924251, + 48.927358, + 48.930450, + 48.933530, + 48.936596, + 48.939649, + 48.942690, + 48.945717, + 48.948731, + 48.951732, + 48.954720, + 48.957696, + 48.960659, + 48.963609, + 48.966547, + 48.969473, + 48.972386, + 48.975287, + 48.978175, + 48.981052, + 48.983916, + 48.986768, + 48.989608, + 48.992437, + 48.995253, + 48.998058, + 49.000851, + 49.003633, + 49.006403, + 49.009161, + 49.011908, + 49.014644, + 49.017368, + 49.020081, + 49.022783, + 49.025473, + 49.028153, + 49.030821, + 49.033479, + 49.036126, + 49.038762, + 49.041387, + 49.044001, + 49.046605, + 49.049198, + 49.051781, + 49.054353, + 49.056915, + 49.059466, + 49.062007, + 49.064538, + 49.067058, + 49.069569, + 49.072069, + 49.074559, + 49.077039, + 49.079510, + 49.081970, + 49.084421, + 49.086862, + 49.089293, + 49.091714, + 49.094126, + 49.096528, + 49.098921, + 49.101304, + 49.103678, + 49.106043, + 49.108398, + 49.110744, + 49.113080, + 49.115408, + 49.117726, + 49.120035, + 49.122335, + 49.124627, + 49.126909, + 49.129182, + 49.131447, + 49.133703, + 49.135949, + 49.138188, + 49.140417, + 49.142638, + 49.144851, + 49.147054, + 49.149250, + 49.151437, + 49.153615, + 49.155785, + 49.157947, + 49.160101, + 49.162246, + 49.164383, + 49.166512, + 49.168633, + 49.170746, + 49.172851, + 49.174947, + 49.177036, + 49.179117, + 49.181190, + 49.183255, + 49.185313, + 49.187362, + 49.189404, + 49.191439, + 49.193465, + 49.195484, + 49.197496, + 49.199500, + 49.201496, + 49.203485, + 49.205467, + 49.207441, + 49.209408, + 49.211368, + 49.213320, + 49.215266, + 49.217203, + 49.219134, + 49.221058, + 49.222975, + 49.224884, + 49.226787, + 49.228682, + 49.230571, + 49.232452, + 49.234327, + 49.236195, + 49.238056, + 49.239911, + 49.241758, + 49.243599, + 49.245433, + 49.247261, + 49.249082, + 49.250896, + 49.252704, + 49.254505, + 49.256300, + 49.258088, + 49.259870, + 49.261646, + 49.263415, + 49.265177, + 49.266934, + 49.268684, + 49.270428, + 49.272166, + 49.273897, + 49.275623, + 49.277342, + 49.279055, + 49.280762, + 49.282463, + 49.284158, + 49.285847, + 49.287530, + 49.289207, + 49.290878, + 49.292544, + 49.294203, + 49.295857, + 49.297505, + 49.299147, + 49.300783, + 49.302414, + 49.304039, + 49.305658, + 49.307271, + 49.308880, + 49.310482, + 49.312079, + 49.313670, + 49.315256, + 49.316836, + 49.318411, + 49.319981, + 49.321545, + 49.323104, + 49.324657, + 49.326205, + 49.327748, + 49.329285, + 49.330817, + 49.332344, + 49.333866, + 49.335382, + 49.336894, + 49.338400, + 49.339901, + 49.341397, + 49.342888, + 49.344374, + 49.345855, + 49.347330, + 49.348801, + 49.350267, + 49.351728, + 49.353184, + 49.354635, + 49.356082, + 49.357523, + 49.358960, + 49.360392, + 49.361819, + 49.363241, + 49.364658, + 49.366071, + 49.367479, + 49.368883, + 49.370281, + 49.371676, + 49.373065, + 49.374450, + 49.375830, + 49.377206, + 49.378577, + 49.379944, + 49.381306, + 49.382664, + 49.384017, + 49.385366, + 49.386711, + 49.388051, + 49.389386, + 49.390718, + 49.392044, + 49.393367, + 49.394685, + 49.395999, + 49.397309, + 49.398615, + 49.399916, + 49.401213, + 49.402506, + 49.403795, + 49.405079, + 49.406359, + 49.407636, + 49.408908, + 49.410176, + 49.411440, + 49.412700, + 49.413956, + 49.415208, + 49.416456, + 49.417700, + 49.418939, + 49.420175, + 49.421408, + 49.422636, + 49.423860, + 49.425080, + 49.426297, + 49.427509, + 49.428718, + 49.429923, + 49.431124, + 49.432322, + 49.433515, + 49.434705, + 49.435891, + 49.437074, + 49.438252, + 49.439427, + 49.440599, + 49.441766, + 49.442930, + 49.444091, + 49.445247, + 49.446401, + 49.447550, + 49.448696, + 49.449839, + 49.450978, + 49.452113, + 49.453245, + 49.454373, + 49.455498, + 49.456619, + 49.457737, + 49.458852, + 49.459963, + 49.461071, + 49.462175, + 49.463276, + 49.464373, + 49.465467, + 49.466558, + 49.467646, + 49.468730, + 49.469811, + 49.470888, + 49.471962, + 49.473033, + 49.474101, + 49.475166, + 49.476227, + 49.477285, + 49.478340, + 49.479392, + 49.480440, + 49.481485, + 49.482528, + 49.483567, + 49.484603, + 49.485636, + 49.486665, + 49.487692, + 49.488716, + 49.489736, + 49.490754, + 49.491768, + }, + {// The expectations for dimension = 101 + 0.000000, + 0.001667, + 0.006667, + 0.015000, + 0.026667, + 0.041667, + 0.060000, + 0.081667, + 0.106667, + 0.135000, + 0.166667, + 0.201667, + 0.240000, + 0.281667, + 0.326667, + 0.375000, + 0.426667, + 0.481667, + 0.540000, + 0.601667, + 0.666667, + 0.735000, + 0.806667, + 0.881667, + 0.960000, + 1.041667, + 1.126667, + 1.215000, + 1.306667, + 1.401667, + 1.500000, + 1.601667, + 1.706667, + 1.815000, + 1.926667, + 2.041667, + 2.160000, + 2.281667, + 2.406667, + 2.535000, + 2.666667, + 2.801667, + 2.940000, + 3.081667, + 3.226667, + 3.375000, + 3.526667, + 3.681667, + 3.840000, + 4.001667, + 4.166667, + 4.335000, + 4.506667, + 4.681667, + 4.860000, + 5.041667, + 5.226667, + 5.415000, + 5.606667, + 5.801667, + 6.000000, + 6.201667, + 6.406667, + 6.615000, + 6.826667, + 7.041667, + 7.260000, + 7.481667, + 7.706667, + 7.935000, + 8.166667, + 8.401667, + 8.640000, + 8.881667, + 9.126667, + 9.375000, + 9.626666, + 9.881666, + 10.139998, + 10.401663, + 10.666660, + 10.934987, + 11.206645, + 11.481628, + 11.759935, + 12.041559, + 12.326491, + 12.614720, + 12.906227, + 13.200989, + 13.498975, + 13.800142, + 14.104436, + 14.411788, + 14.722112, + 15.035305, + 15.351243, + 15.669779, + 15.990745, + 16.313949, + 16.639180, + 16.966204, + 17.294770, + 17.624608, + 17.955439, + 18.286973, + 18.618915, + 18.950968, + 19.282838, + 19.614234, + 19.944877, + 20.274497, + 20.602838, + 20.929657, + 21.254730, + 21.577848, + 21.898820, + 22.217470, + 22.533640, + 22.847188, + 23.157987, + 23.465925, + 23.770902, + 24.072833, + 24.371643, + 24.667269, + 24.959656, + 25.248761, + 25.534547, + 25.816987, + 26.096057, + 26.371745, + 26.644040, + 26.912939, + 27.178443, + 27.440556, + 27.699288, + 27.954653, + 28.206665, + 28.455344, + 28.700711, + 28.942789, + 29.181606, + 29.417188, + 29.649565, + 29.878767, + 30.104827, + 30.327778, + 30.547654, + 30.764490, + 30.978321, + 31.189184, + 31.397116, + 31.602153, + 31.804334, + 32.003695, + 32.200275, + 32.394112, + 32.585243, + 32.773707, + 32.959541, + 33.142784, + 33.323472, + 33.501643, + 33.677334, + 33.850582, + 34.021425, + 34.189897, + 34.356035, + 34.519875, + 34.681451, + 34.840800, + 34.997955, + 35.152950, + 35.305819, + 35.456595, + 35.605311, + 35.752000, + 35.896693, + 36.039422, + 36.180217, + 36.319111, + 36.456132, + 36.591310, + 36.724675, + 36.856255, + 36.986080, + 37.114176, + 37.240571, + 37.365293, + 37.488367, + 37.609821, + 37.729679, + 37.847968, + 37.964712, + 38.079936, + 38.193663, + 38.305918, + 38.416723, + 38.526103, + 38.634078, + 38.740672, + 38.845906, + 38.949801, + 39.052379, + 39.153660, + 39.253664, + 39.352412, + 39.449922, + 39.546215, + 39.641309, + 39.735223, + 39.827975, + 39.919583, + 40.010065, + 40.099437, + 40.187718, + 40.274923, + 40.361070, + 40.446174, + 40.530251, + 40.613317, + 40.695387, + 40.776477, + 40.856600, + 40.935773, + 41.014008, + 41.091320, + 41.167722, + 41.243229, + 41.317854, + 41.391609, + 41.464508, + 41.536563, + 41.607786, + 41.678191, + 41.747788, + 41.816590, + 41.884609, + 41.951854, + 42.018339, + 42.084074, + 42.149069, + 42.213336, + 42.276884, + 42.339724, + 42.401867, + 42.463321, + 42.524098, + 42.584206, + 42.643654, + 42.702453, + 42.760612, + 42.818138, + 42.875042, + 42.931331, + 42.987015, + 43.042101, + 43.096599, + 43.150515, + 43.203859, + 43.256637, + 43.308858, + 43.360529, + 43.411658, + 43.462252, + 43.512319, + 43.561864, + 43.610896, + 43.659422, + 43.707447, + 43.754979, + 43.802025, + 43.848590, + 43.894681, + 43.940305, + 43.985467, + 44.030174, + 44.074431, + 44.118244, + 44.161620, + 44.204563, + 44.247080, + 44.289175, + 44.330855, + 44.372125, + 44.412990, + 44.453454, + 44.493524, + 44.533204, + 44.572499, + 44.611414, + 44.649953, + 44.688123, + 44.725926, + 44.763368, + 44.800453, + 44.837185, + 44.873570, + 44.909610, + 44.945312, + 44.980678, + 45.015712, + 45.050420, + 45.084804, + 45.118869, + 45.152618, + 45.186056, + 45.219186, + 45.252012, + 45.284538, + 45.316766, + 45.348701, + 45.380346, + 45.411705, + 45.442781, + 45.473577, + 45.504097, + 45.534343, + 45.564319, + 45.594029, + 45.623475, + 45.652660, + 45.681588, + 45.710260, + 45.738682, + 45.766854, + 45.794780, + 45.822463, + 45.849906, + 45.877111, + 45.904081, + 45.930819, + 45.957327, + 45.983608, + 46.009664, + 46.035499, + 46.061114, + 46.086511, + 46.111694, + 46.136665, + 46.161426, + 46.185979, + 46.210327, + 46.234471, + 46.258415, + 46.282160, + 46.305708, + 46.329062, + 46.352224, + 46.375195, + 46.397979, + 46.420576, + 46.442989, + 46.465220, + 46.487270, + 46.509143, + 46.530839, + 46.552360, + 46.573709, + 46.594886, + 46.615895, + 46.636736, + 46.657412, + 46.677924, + 46.698274, + 46.718463, + 46.738494, + 46.758367, + 46.778085, + 46.797649, + 46.817061, + 46.836322, + 46.855434, + 46.874398, + 46.893216, + 46.911889, + 46.930419, + 46.948807, + 46.967054, + 46.985163, + 47.003134, + 47.020969, + 47.038669, + 47.056235, + 47.073670, + 47.090973, + 47.108147, + 47.125192, + 47.142111, + 47.158904, + 47.175572, + 47.192117, + 47.208540, + 47.224841, + 47.241023, + 47.257087, + 47.273033, + 47.288862, + 47.304577, + 47.320177, + 47.335664, + 47.351039, + 47.366304, + 47.381458, + 47.396504, + 47.411442, + 47.426273, + 47.440999, + 47.455620, + 47.470137, + 47.484551, + 47.498864, + 47.513075, + 47.527187, + 47.541200, + 47.555114, + 47.568932, + 47.582653, + 47.596279, + 47.609810, + 47.623247, + 47.636592, + 47.649845, + 47.663006, + 47.676078, + 47.689060, + 47.701953, + 47.714758, + 47.727476, + 47.740108, + 47.752655, + 47.765116, + 47.777494, + 47.789788, + 47.802000, + 47.814130, + 47.826179, + 47.838148, + 47.850037, + 47.861847, + 47.873579, + 47.885233, + 47.896810, + 47.908311, + 47.919737, + 47.931088, + 47.942364, + 47.953567, + 47.964697, + 47.975754, + 47.986740, + 47.997655, + 48.008499, + 48.019273, + 48.029978, + 48.040615, + 48.051183, + 48.061683, + 48.072117, + 48.082484, + 48.092785, + 48.103021, + 48.113193, + 48.123300, + 48.133343, + 48.143323, + 48.153241, + 48.163096, + 48.172890, + 48.182623, + 48.192295, + 48.201907, + 48.211460, + 48.220953, + 48.230388, + 48.239765, + 48.249084, + 48.258346, + 48.267551, + 48.276700, + 48.285793, + 48.294830, + 48.303813, + 48.312741, + 48.321615, + 48.330436, + 48.339204, + 48.347918, + 48.356581, + 48.365191, + 48.373750, + 48.382258, + 48.390715, + 48.399122, + 48.407479, + 48.415786, + 48.424044, + 48.432254, + 48.440415, + 48.448528, + 48.456594, + 48.464612, + 48.472584, + 48.480509, + 48.488388, + 48.496221, + 48.504009, + 48.511751, + 48.519449, + 48.527102, + 48.534712, + 48.542277, + 48.549800, + 48.557279, + 48.564715, + 48.572109, + 48.579461, + 48.586771, + 48.594040, + 48.601267, + 48.608454, + 48.615600, + 48.622706, + 48.629772, + 48.636798, + 48.643785, + 48.650733, + 48.657643, + 48.664513, + 48.671346, + 48.678140, + 48.684897, + 48.691617, + 48.698300, + 48.704945, + 48.711554, + 48.718127, + 48.724664, + 48.731165, + 48.737631, + 48.744062, + 48.750457, + 48.756818, + 48.763144, + 48.769436, + 48.775694, + 48.781918, + 48.788109, + 48.794266, + 48.800391, + 48.806483, + 48.812542, + 48.818569, + 48.824563, + 48.830526, + 48.836457, + 48.842357, + 48.848226, + 48.854063, + 48.859870, + 48.865646, + 48.871392, + 48.877108, + 48.882794, + 48.888450, + 48.894077, + 48.899674, + 48.905242, + 48.910782, + 48.916292, + 48.921774, + 48.927228, + 48.932654, + 48.938052, + 48.943422, + 48.948764, + 48.954079, + 48.959367, + 48.964628, + 48.969863, + 48.975070, + 48.980251, + 48.985406, + 48.990535, + 48.995638, + 49.000715, + 49.005767, + 49.010793, + 49.015794, + 49.020770, + 49.025721, + 49.030647, + 49.035549, + 49.040426, + 49.045279, + 49.050108, + 49.054913, + 49.059694, + 49.064452, + 49.069186, + 49.073897, + 49.078585, + 49.083250, + 49.087892, + 49.092511, + 49.097108, + 49.101682, + 49.106234, + 49.110764, + 49.115272, + 49.119758, + 49.124222, + 49.128665, + 49.133086, + 49.137487, + 49.141866, + 49.146224, + 49.150561, + 49.154877, + 49.159173, + 49.163448, + 49.167703, + 49.171938, + 49.176152, + 49.180347, + 49.184522, + 49.188677, + 49.192812, + 49.196928, + 49.201025, + 49.205103, + 49.209161, + 49.213200, + 49.217221, + 49.221222, + 49.225206, + 49.229170, + 49.233116, + 49.237044, + 49.240954, + 49.244845, + 49.248719, + 49.252575, + 49.256413, + 49.260233, + 49.264036, + 49.267821, + 49.271590, + 49.275341, + 49.279074, + 49.282791, + 49.286491, + 49.290174, + 49.293841, + 49.297491, + 49.301124, + 49.304741, + 49.308342, + 49.311926, + 49.315494, + 49.319047, + 49.322583, + 49.326104, + 49.329609, + 49.333098, + 49.336572, + 49.340030, + 49.343473, + 49.346901, + 49.350313, + 49.353710, + 49.357093, + 49.360460, + 49.363813, + 49.367151, + 49.370474, + 49.373783, + 49.377077, + 49.380357, + 49.383623, + 49.386874, + 49.390111, + 49.393334, + 49.396543, + 49.399739, + 49.402920, + 49.406088, + 49.409242, + 49.412382, + 49.415509, + 49.418622, + 49.421723, + 49.424809, + 49.427883, + 49.430944, + 49.433991, + 49.437025, + 49.440047, + 49.443056, + 49.446052, + 49.449035, + 49.452006, + 49.454964, + 49.457909, + 49.460843, + 49.463764, + 49.466672, + 49.469569, + 49.472453, + 49.475325, + 49.478185, + 49.481034, + 49.483870, + 49.486695, + 49.489508, + 49.492309, + 49.495099, + 49.497877, + 49.500643, + 49.503399, + 49.506142, + 49.508875, + 49.511596, + 49.514306, + 49.517006, + 49.519694, + 49.522371, + 49.525037, + 49.527692, + 49.530336, + 49.532970, + 49.535593, + 49.538205, + 49.540807, + 49.543398, + 49.545979, + 49.548550, + 49.551110, + 49.553659, + 49.556199, + 49.558728, + 49.561247, + 49.563757, + 49.566256, + 49.568745, + 49.571224, + 49.573693, + 49.576153, + 49.578603, + 49.581043, + 49.583473, + 49.585894, + 49.588305, + 49.590707, + 49.593099, + 49.595482, + 49.597855, + 49.600220, + 49.602574, + 49.604920, + 49.607257, + 49.609584, + 49.611902, + 49.614212, + 49.616512, + 49.618804, + 49.621086, + 49.623360, + 49.625625, + 49.627881, + 49.630128, + 49.632367, + 49.634597, + 49.636819, + 49.639032, + 49.641237, + 49.643433, + 49.645620, + 49.647800, + 49.649971, + 49.652134, + 49.654288, + 49.656435, + 49.658573, + 49.660703, + 49.662825, + 49.664939, + 49.667045, + 49.669144, + 49.671234, + 49.673316, + 49.675391, + 49.677458, + 49.679517, + 49.681568, + 49.683612, + 49.685648, + 49.687676, + 49.689697, + 49.691710, + 49.693716, + 49.695715, + 49.697706, + 49.699689, + 49.701666, + 49.703635, + 49.705596, + 49.707551, + 49.709498, + 49.711438, + 49.713372, + 49.715298, + 49.717216, + 49.719128, + 49.721033, + 49.722931, + 49.724822, + 49.726706, + 49.728584, + 49.730454, + 49.732318, + 49.734175, + 49.736025, + 49.737869, + 49.739706, + 49.741536, + 49.743360, + 49.745177, + 49.746988, + 49.748792, + 49.750589, + 49.752381, + 49.754166, + 49.755944, + 49.757716, + 49.759482, + 49.761241, + 49.762995, + 49.764742, + 49.766483, + 49.768217, + 49.769946, + 49.771668, + 49.773385, + 49.775095, + 49.776799, + 49.778498, + 49.780190, + 49.781876, + 49.783557, + 49.785231, + 49.786900, + 49.788563, + 49.790220, + 49.791872, + 49.793517, + 49.795157, + 49.796791, + 49.798420, + 49.800043, + 49.801660, + 49.803272, + 49.804878, + 49.806478, + 49.808073, + 49.809663, + 49.811247, + 49.812826, + 49.814399, + 49.815967, + 49.817529, + 49.819086, + 49.820638, + 49.822185, + 49.823726, + 49.825262, + 49.826793, + 49.828319, + 49.829839, + 49.831354, + 49.832865, + 49.834370, + 49.835870, + 49.837365, + 49.838855, + 49.840340, + 49.841819, + 49.843294, + 49.844764, + 49.846229, + 49.847690, + 49.849145, + 49.850595, + 49.852041, + 49.853482, + 49.854918, + 49.856349, + 49.857775, + 49.859197, + 49.860614, + 49.862027, + 49.863434, + 49.864837, + 49.866236, + 49.867630, + 49.869019, + 49.870403, + 49.871784, + 49.873159, + 49.874530, + 49.875897, + 49.877259, + 49.878617, + 49.879970, + 49.881319, + 49.882663, + 49.884003, + 49.885339, + 49.886670, + 49.887997, + 49.889320, + 49.890639, + 49.891953, + 49.893263, + 49.894569, + 49.895870, + 49.897167, + 49.898461, + 49.899750, + 49.901035, + 49.902315, + 49.903592, + 49.904865, + 49.906133, + 49.907398, + 49.908658, + 49.909915, + 49.911167, + 49.912416, + 49.913660, + 49.914901, + 49.916138, + 49.917370, + 49.918599, + 49.919824, + 49.921045, + 49.922263, + 49.923476, + 49.924686, + 49.925892, + 49.927094, + 49.928292, + 49.929487, + 49.930677, + 49.931864, + 49.933048, + 49.934227, + 49.935403, + 49.936576, + 49.937745, + 49.938910, + 49.940071, + 49.941229, + 49.942383, + 49.943534, + 49.944681, + 49.945825, + 49.946965, + 49.948102, + 49.949235, + 49.950364, + 49.951490, + 49.952613, + 49.953732, + 49.954848, + 49.955961, + 49.957070, + 49.958175, + 49.959278, + 49.960376, + 49.961472, + 49.962564, + 49.963653, + 49.964739, + 49.965821, + 49.966900, + 49.967976, + 49.969049, + 49.970118, + 49.971184, + 49.972247, + 49.973307, + 49.974363, + 49.975416, + 49.976467, + 49.977514, + 49.978558, + 49.979598, + 49.980636, + 49.981671, + }, + }; + +} + +#endif diff --git a/src/Util.cpp b/src/Util.cpp new file mode 100644 index 0000000..b85dd22 --- /dev/null +++ b/src/Util.cpp @@ -0,0 +1,1570 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "Util.h" +#include "OutputFiles.h" +#include "CommonParameters.h" +#include "LapackInterface.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Apply IIR high-pass filter +void Util::applyIIRHighPassFilter( const double samplingFreq, const double cutoffFreq, const int numData, double* data ){ + + double* dataOrg = new double[numData]; + const double lamda = tan(CommonParameters::PI * cutoffFreq / samplingFreq); + const double beta = 1.0 / (lamda + 1.0); + const double alpha = (lamda - 1.0) / (lamda + 1.0); + for( int i = 0; i < numData; ++i ){ + dataOrg[i] = data[i]; + } + data[0] = dataOrg[0]; + double yPre1 = dataOrg[0]; + for( int i = 1; i < numData; ++i ){ + data[i] = beta * dataOrg[i] - beta * dataOrg[i-1] - alpha * yPre1; + yPre1 = data[i]; + } + delete [] dataOrg; + +} + +// Apply IIR low-pass filter +void Util::applyIIRLowPassFilter( const double samplingFreq, const double cutoffFreq, const int numData, double* data ){ + + double* dataOrg = new double[numData]; + const double Q = 1.0/sqrt(2.0); + const double lamda = tan(CommonParameters::PI * cutoffFreq / samplingFreq); + const double delta = lamda * lamda + lamda / Q + 1.0; + const double beta = lamda * lamda / delta; + const double alpha1 = 2.0 * (lamda * lamda - 1.0) / delta; + const double alpha2 = 1.0 - 2.0 * lamda / Q / delta; + for( int i = 0; i < numData; ++i ){ + dataOrg[i] = data[i]; + } + data[0] = dataOrg[0]; + data[1] = dataOrg[1]; + double yPre2 = dataOrg[0];// 2-2=0 + double yPre1 = dataOrg[1];// 2-1=1 + for( int i = 2; i < numData; ++i ){ + data[i] = beta * dataOrg[i] + 2.0 * beta * dataOrg[i-1] + beta * dataOrg[i-2] - alpha1 * yPre1 - alpha2 * yPre2; + yPre2 = yPre1; + yPre1 = data[i]; + } + delete [] dataOrg; + +} + +// Apply notch filter +void Util::applyNotchFilter( const double Q, const double samplingFreq, const double cutoffFreq, const int numData, double* data ){ + + double* dataOrg = new double[numData]; + const double lamda = tan(CommonParameters::PI * cutoffFreq / samplingFreq); + const double delta = lamda * lamda + lamda / Q + 1.0; + const double beta0 = (lamda * lamda + 1.0) / delta; + const double beta1 = 2.0 * (lamda * lamda - 1.0) / delta; + const double beta2 = beta0; + const double alpha1 = beta1; + const double alpha2 = 1.0 - 2.0 * lamda / Q / delta; + for( int i = 0; i < numData; ++i ){ + dataOrg[i] = data[i]; + } + data[0] = dataOrg[0]; + data[1] = dataOrg[1]; + double yPre2 = dataOrg[0];// 2-2=0 + double yPre1 = dataOrg[1];// 2-1=1 + for( int i = 2; i < numData; ++i ){ + data[i] = beta0 * dataOrg[i] + beta1 * dataOrg[i-1] + beta2 * dataOrg[i-2] - alpha1 * yPre1 - alpha2 * yPre2; + yPre2 = yPre1; + yPre1 = data[i]; + } + delete [] dataOrg; + +} + +// Convert string "HH:MM:SS" to seconds +int Util::convertHHMMSSToSeconds( const std::string& hhmmss ){ + + //const int hour = stoi( hhmmss.substr(0,2) ); + //const int min = stoi( hhmmss.substr(3,2) ); + //const int sec = stoi( hhmmss.substr(6,2) ); + + std::istringstream issHour(hhmmss.substr(0,2)); + int hour(0); + issHour >> hour; + + std::istringstream issMin(hhmmss.substr(3,2)); + int min(0); + issMin >> min; + + std::istringstream issSec(hhmmss.substr(6,2)); + int sec(0); + issSec >> sec; + + return hour * 3600 + min * 60 + sec; + +} + +// Debug write real matrix +// Matrix must be stored by column major order +void Util::debugWriteRealMatrix( const int numRows, const int numColumns, const double* const matrix ){ + + std::cout << "["; + for( int row = 0; row < numRows; ++row ){ + for( int col = 0; col < numColumns; ++col ){ + // Column major + const int index = col * numRows + row; + std::cout << matrix[index] << " "; + } + if( row + 1 < numRows ){ + std::cout << ";"; + } + } + std::cout << "]" << std::endl; + +} + +// Sort elements by its key value with quick sort +// cf) Numerical Recipes in C++ Second Edition, p336-p339. +// [Input]: +// 1) numOfIDs: Number of elements to be sorted +// 2) values: Values of each element. Elements are sorted by this values. +// [Input/Output]: +// 1) ids: Array of elements to be sorted +void Util::quickSort( const int numOfIDs, int* ids, const double* const values ){ + + const int minimumSizeOfQuickSort = 7; + std::vector< std::pair > stack; + + if( ids == NULL ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("ids is NULL in quickSort"); + } + if( values == NULL ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("values is NULL quickSort"); + } + if( numOfIDs <= 0 ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("numOfIDs is equal to or less than zero"); + } + int iLeft(0); + int iRight(numOfIDs - 1); + + while(1){ + + if( iRight - iLeft < minimumSizeOfQuickSort ){ + //----- Insertion sort >>>>> + for( int j = iLeft + 1; j <= iRight; ++j ){ + const int moved = ids[j]; + const double valueOfElemnentMoved = values[moved]; + int i = j - 1; + for( ; i >= iLeft; --i ){ + if( values[ids[i]] <= valueOfElemnentMoved ){ + break; + } + ids[i+1] = ids[i]; + } + ids[i+1] = moved; + } + + if( stack.empty() ){ + break;// Finish while loop + } + iLeft = stack.back().first; + iRight = stack.back().second; + stack.pop_back(); + //----- Insertion sort <<<<< + }else{ + //----- Quick sort >>>>> + std::swap( ids[(iLeft+iRight)/2] , ids[iLeft+1] );// Exchange element + if( values[ids[iLeft]] > values[ids[iRight]] ){ + std::swap( ids[iLeft], ids[iRight] );// Exchange element + } + if( values[ids[iLeft+1]] > values[ids[iRight]] ){ + std::swap( ids[iLeft+1], ids[iRight] );// Exchange element + } + if( values[ids[iLeft]] > values[ids[iLeft+1]] ){ + std::swap( ids[iLeft], ids[iLeft+1] );// Exchange element + } + int i = iLeft + 1; + int j = iRight; + const int partitioningElement = ids[iLeft+1];// Partitioning element + const double valueOfPartitioningElement = values[ids[iLeft+1]];// values of partitioning element + + while(1){ + ++i; + while( values[ids[i]] < valueOfPartitioningElement ){ + ++i;// Scan up to find element which >= partitioning element + } + --j; + while( values[ids[j]] > valueOfPartitioningElement ){ + --j;// Scan up to find element which <= partitioning element + } + if( j < i ){// i and j are crossed, so that partitioning complete + break; + } + std::swap( ids[i], ids[j] );// Exchange element + } + + // Exchange IDs of j and iLeft+1 ( partitioning element ) + ids[iLeft+1] = ids[j]; + ids[j] = partitioningElement; + + if( iLeft - i + 1 >= j - iLeft ){// Elements in the right side >= Elements in the left side + stack.push_back( std::pair( i, iRight ) ); + iRight = j - 1; + }else{// Elements in the right side < Elements in the left side + stack.push_back( std::pair( iLeft, j - 1) ); + iLeft = i; + } + //----- Quick sort <<<<< + } + + } + + return; + +} + +// Sort elements by its key value with quick sort and replace input values +void Util::quickSort( const int numOfIDs, double* values ){ + + int* ids = new int[numOfIDs]; + double* valuesOrg = new double[numOfIDs]; + for( int i = 0; i < numOfIDs; ++i ){ + ids[i] = i; + valuesOrg[i] = values[i]; + } + Util::quickSort(numOfIDs, ids, valuesOrg); + for( int i = 0; i < numOfIDs; ++i ){ + values[i] = valuesOrg[ids[i]]; + } + delete [] ids; + delete [] valuesOrg; + +} + +// Calculate Absolute value fo a complex value +double Util::calculateAbsoluteValue( const std::complex value ){ + + return hypot(value.real(), value.imag()); + +} + + +// Calculate calibration function for FIR filter (Type1) +std::complex Util::calculateCalibrationForFIRFilterType1( const std::string& fileName, const int nskip, + const double samplingFreq, const double freq, const bool groupDelay ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + //ptrOutputFiles->writeLogMessage("Read FIR filter coefficients from " + fileName ); + + std::string sbuf; + for( int i = 0; i < nskip; ++i){ + getline(ifs,sbuf); + } + + std::vector h; + double sumh(0.0); + while(getline(ifs,sbuf)){ + std::istringstream iss(sbuf); + double dbuf; + iss >> dbuf; + h.push_back(dbuf); + sumh += dbuf; + } + + const int numh = static_cast( h.size() ); + //ptrOutputFiles->writeLogMessage("FIR filter length: " + Util::toString(numh) ); + + for( int i = 0; i < numh; ++i ){ + h[i] /= sumh; + } + + const double omega = 2.0 * CommonParameters::PI * freq / samplingFreq; + std::complex H = std::complex(0.0, 0.0); + if(groupDelay){ + // Timer is delayed according to group delay + for( int i = 1; i <= numh; ++i ){ + const double arg = static_cast(i - numh) * omega; + H += h[i-1] * std::complex( cos(arg), sin(arg) ); + } + }else{ + // Timer group delay in convolution is adjusted + const double adjust = (1.0 - static_cast(numh)) / 2.0; + for( int i = 1; i <= numh; ++i ){ + const double arg = ( static_cast(i - numh) - adjust ) * omega; + H += h[i-1] * std::complex( cos(arg), sin(arg) ); + } + } + +//#ifdef _DEBUG_WRITE +// std::cout << std::setw(20) << std::setprecision(12) << 1.0/freq; +// std::cout << std::setw(20) << std::setprecision(12) << hypot(H.real(), H.imag()); +// std::cout << std::setw(20) << std::setprecision(12) << atan2(H.imag(), H.real()) * CommonParameters::RAD2DEG; +// std::cout << std::endl; +//#endif + + return H; + +} + +// Calculate calibration function for FIR filter (Type2) +std::complex Util::calculateCalibrationForFIRFilterType2( const std::string& fileName, const int nskip, const double samplingFreq, const double freq, + const int nfstart, const int nfend ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + std::ifstream ifs( fileName.c_str(), std::ios::in ); + if( ifs.fail() ){ + ptrOutputFiles->writeErrorMessage("File open error : " + fileName); + } + //ptrOutputFiles->writeLogMessage("Read FIR filter coefficients from " + fileName ); + + std::string sbuf; + for( int i = 0; i < nskip; ++i){ + getline(ifs,sbuf); + } + + std::vector h; + double sumh(0.0); + while(getline(ifs,sbuf)){ + std::istringstream iss(sbuf); + double dbuf; + iss >> dbuf; + h.push_back(dbuf); + sumh += dbuf; + } + + const int numh = static_cast( h.size() ); + //ptrOutputFiles->writeLogMessage("FIR filter length: " + Util::toString(numh) ); + + if( numh != nfend- nfstart + 1 ){ + ptrOutputFiles->writeErrorMessage("nfend-nfstart+1 is not equal to filter length: " + Util::toString(nfend-nfstart+1) ); + } + + const double omega = 2.0 * CommonParameters::PI * freq / samplingFreq; + std::complex H = std::complex(0.0, 0.0); + int icount(0); + for( int i = nfstart; i <= nfend; ++i, ++icount ){ + const double arg = static_cast(i) * omega; + H += h[icount] * std::complex( cos(arg), sin(arg) ); + } + + return H; + +} + +// Calculate determinant of real square matrix +double Util::calculateDeterminantOfMatrix( const int dimension, const double* const matrixOrg ){ + + const int numComps = dimension * dimension; + double* matrixWork = new double[numComps]; + // Copy matrix + for( int i = 0; i < numComps; ++i ){ + matrixWork[i] = matrixOrg[i]; + } + +//#ifdef _DEBUG_WRITE +// Util::debugWriteRealMatrix(dimension, dimension, matrixWork); +//#endif + + int numPivoting(0); + // Change to triangular matrix + for( int col = 0; col < dimension - 1; ++col ){ + // Search maximum diagonal component + double maxAbsDiag(0.0); + int rowMax(-1); + for( int row = col; row < dimension; ++row ){ + const int index = col * dimension + row; + if( fabs(matrixWork[index]) > maxAbsDiag ){ + maxAbsDiag = fabs(matrixWork[index]); + rowMax = row; + } + } + if( maxAbsDiag < 1.0e-20 ){ + delete [] matrixWork; + return 0.0; + } + // Pivoting + if( rowMax != col ){ + for( int i = col; i < dimension; ++i ){ + const int indexCur = i * dimension + col; + const int indexMax = i * dimension + rowMax; + const double valCur = matrixWork[indexCur]; + const double valMax = matrixWork[indexMax]; + matrixWork[indexCur] = valMax; + matrixWork[indexMax] = valCur; + } + ++numPivoting; +//#ifdef _DEBUG_WRITE +// Util::debugWriteRealMatrix(dimension, dimension, matrixWork); +//#endif + } + const int indexDiag = col * dimension + col; + const double diagComp = matrixWork[indexDiag]; + for( int row = col + 1; row < dimension; ++row ){ + // Column major + const int index = col * dimension + row; + const double factor = matrixWork[index] / diagComp; + for( int i = 0; i < dimension; ++i ){ + // Column major + const int index1 = i * dimension + row; + const int index2 = i * dimension + col; + matrixWork[index1] -= matrixWork[index2] * factor; + } + } +//#ifdef _DEBUG_WRITE +// Util::debugWriteRealMatrix(dimension, dimension, matrixWork); +//#endif + } + + double determinant(1.0); + for( int i = 0; i < dimension; ++i ){ + // Column major + const int index = i * dimension + i; + determinant *= matrixWork[index]; + } + delete [] matrixWork; + determinant *= pow(-1.0, numPivoting); + + return determinant; + +} + +// Calcualte all eigenvalues and eigenvectors of a real symmetric +void Util::calculateEigenValuesAndVectorsOfRealSymmetricMatrix(const int dimension, const double* const matrix, + double* eigenValues, double* eigenVectors) { + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if (dimension < 1) { + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1"); + } + + int icount(0); + // Column major + for (int col = 0; col < dimension; ++col) { + for (int row = 0; row < col; ++row) { + const int index = col * dimension + row; + eigenVectors[index] = 0.0; + } + for (int row = col; row < dimension; ++row) { + const int index = col * dimension + row; + eigenVectors[index] = matrix[icount]; + ++icount; + } + } + + LapackInterface::calculateEigenValuesAndVectorsOfRealSymmetricMatrix(dimension, eigenVectors, eigenValues); + +} + +// Calculate IQR +double Util::calculateIQR( const int num, const double* const data ){ + + int* ids = new int[num]; + for( int i = 0; i < num; ++i ){ + ids[i] = i; + } + Util::quickSort(num, ids, data); + double* dataSort = new double[num]; + for( int i = 0; i < num; ++i ){ + dataSort[i] = data[ids[i]]; + } + delete [] ids; + + const int quartile1 = num / 4; + const int quartile3 = num / 4 * 3; + const double result = dataSort[quartile3] - dataSort[quartile1]; + delete [] dataSort; + return result; + +} + +// Calculate MADN +double Util::calculateMADN( const int num, const double* const data ){ + return Util::calculateMAD( num, data ) / 0.675; +} + +// Calculate MADN +double Util::calculateMADN( const std::vector& data ){ + return Util::calculateMAD( data ) / 0.675; +} + +// Calculate mean value +double Util::calculateMeanValue( const int num, const double* const data ){ + + double sum(0.0); + for( int i = 0; i < num; ++i ){ + sum += data[i]; + } + + return sum / static_cast(num); + +} + +// Calculate mean square value +double Util::calculateMeanSquareValue( const int num, const double* const data ){ + + double sum(0.0); + for( int i = 0; i < num; ++i ){ + sum += data[i] * data[i]; + } + + return sum / static_cast(num); + +} + +// Calculate median +double Util::calculateMedian( const int num, const double* const data ){ + + int* ids = new int[num]; + for( int i = 0; i < num; ++i ){ + ids[i] = i; + } + Util::quickSort(num, ids, data); +//#ifdef _DEBUG_WRITE +// for( int i = 0; i < num; ++i ){ +// std::cout << "ids[" << i << "]=" << ids[i] << std::endl; +// } +//#endif + double* dataSort = new double[num]; + for( int i = 0; i < num; ++i ){ + dataSort[i] = data[ids[i]]; + } + delete [] ids; + +//#ifdef _DEBUG_WRITE +// for( int i = 0; i < num; ++i ){ +// std::cout << "dataSort[" << i << "]=" << dataSort[i] << std::endl; +// } +//#endif + + if( num % 2 == 1 ){ + // Add number + const int center = num / 2; + const double result = dataSort[center]; + delete [] dataSort; + return result; + }else{ + // Even number + const int center0 = num / 2 - 1; + const int center1 = num / 2; + const double result = 0.5 * ( dataSort[center0] + dataSort[center1] ); + delete [] dataSort; + return result; + } + +} + +// Calculate median +double Util::calculateMedian( const std::vector& data ){ + + std::vector vec = data; + std::sort(vec.begin(), vec.end()); + + const int num = static_cast(data.size()); + + if( num % 2 == 1 ){ + // Add number + const int center = num / 2; + const double result = vec[center]; + return result; + }else{ + // Even number + const int center0 = num / 2 - 1; + const int center1 = num / 2; + const double result = 0.5 * ( vec[center0] + vec[center1] ); + return result; + } + +} + +// Calculate median absolute deviation +double Util::calculateMAD(const int num, const double median, const double* const data) { + + double* diffAbs = new double[num]; + for (int i = 0; i < num; ++i) { + diffAbs[i] = fabs(data[i] - median); + } + const double result = Util::calculateMedian(num, diffAbs); + delete[] diffAbs; + + return result; + +} + +// Calculate median absolute deviation +double Util::calculateMAD(const int num, const double* const data) { + + const double median = Util::calculateMedian(num, data); + return calculateMAD(num, median, data); + +} + +// Calculate median absolute deviation +double Util::calculateMAD( const std::vector& data ){ + + const double median = Util::calculateMedian( data ); + + const int num = static_cast(data.size()); + double* diffAbs = new double[num]; + for( int i = 0; i < num; ++i ){ + diffAbs[i] = fabs( data[i] - median ); + } + + const double result = Util::calculateMedian( num, diffAbs ); + delete [] diffAbs; + + return result; + +} + +// Calculate regression coefficients by weighted least square method +double Util::calculateRegressionCoefficientsByWLS( const int numOfData, const double* const y, const double* const x, + const double* const weights ){ + + double xx = 0.0; + double xy = 0.0; + for( int iData = 0; iData < numOfData; ++iData ){ + xx += x[iData] * x[iData] * weights[iData]; + xy += x[iData] * y[iData] * weights[iData]; + } + + if( fabs(xx) < CommonParameters::EPS ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeWarningMessage("Denominator is too small ("+ Util::toString(xx) + ") in the weighted least square method"); + return xy / CommonParameters::EPS; + } + + return xy / xx; + +} + +// Calculate regression coefficients by weighted least square method with intercept +void Util::calculateRegressionCoefficientsByWLSWithIntercept(const int numOfData, const double* const y, const double* const x, + const double* const weights, double& slope, double& intercept) { + + double wSum = 0.0; + double wx = 0.0; + double wy = 0.0; + double wxx = 0.0; + double wxy = 0.0; + for (int iData = 0; iData < numOfData; ++iData) { + wSum += weights[iData]; + wx += x[iData] * weights[iData]; + wy += y[iData] * weights[iData]; + wxx += x[iData] * x[iData] * weights[iData]; + wxy += x[iData] * y[iData] * weights[iData]; + } + + const double det = wSum * wxx - wx * wx; + if (fabs(det) < CommonParameters::EPS) { + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeWarningMessage("Denominator is too small (" + Util::toString(det) + ") in the weighted least square method"); + } + + intercept = ( wxx * wy - wx * wxy ) / det; + slope = ( wSum * wxy - wx * wy ) / det; + +} + +// Calculate variance +double Util::calculateVariance( const int num, const double mean, const double* const data ){ + + double sum(0.0); + for( int i = 0; i < num; ++i ){ + sum += ( data[i] - mean ) * ( data[i] - mean ); + } + + return sum / static_cast(num-1); + +} + +// Calculate linear trend factor by Hino (1985) +// [References] +// Mikio Hino, Spectral analysis, Asakura publishing, 1985 (Japanese) +double Util::calculateLinearTrendFactorByHino1985( const int num, const double* const data ){ + + const int numDiv3 = num / 3; + const double mean0 = Util::calculateMeanValue( numDiv3, data ); + const double mean1 = Util::calculateMeanValue( numDiv3, &data[num-numDiv3] ); + const double alpha = ( mean1 - mean0 ) / ( num - numDiv3 ); + return alpha; + +} + +// Calculate linear trend factor by the least square +void Util::calculateLinearTrendFactorByLeastSquare( const int num, const double* const data, double& b0, double& b1 ){ + + const double mean = Util::calculateMeanValue( num, data ); + const double sum1 = static_cast( num * (num + 1) ) / 2.0; + const double sum2 = static_cast( num * (num + 1) * (2*num + 1) ) / 6.0; + double sum3(0.0); + for( int i = 0; i < num; ++i ){ + sum3 += data[i] * static_cast(i+1); + } + const double dnum = static_cast(num); + const double deno = dnum * sum2 - sum1 * sum1; + b0 = ( dnum * mean * sum2 - sum1 * sum3 ) / deno; + b1 = ( dnum * sum3 - dnum * mean * sum1 ) / deno; + +} + +// Apply Hampel filter +int Util::hampelFilter( const int num, const int numNeighborsOnEitherSide, const double nsigma, double* data ){ + + double* dataMod = new double[num]; + for( int i = 0; i < num; ++i ){ + dataMod[i] = data[i]; + } + + int numModifiedPoints(0); + + const int windowLength = 2 * numNeighborsOnEitherSide + 1; + for( int iData = numNeighborsOnEitherSide; iData < num - numNeighborsOnEitherSide; ++iData ){ + const double median = Util::calculateMedian( windowLength, &data[iData-numNeighborsOnEitherSide] ); + const double MADN = Util::calculateMADN( windowLength, &data[iData-numNeighborsOnEitherSide] ); + if( fabs( data[iData] - median ) > nsigma * MADN ){ +#ifdef _DEBUG_WRITE + const double absErr = fabs( data[iData] - median ); + const double ratio = absErr / MADN; +#endif + dataMod[iData] = median; + ++numModifiedPoints; + } + } + // Near the start point + for( int iData = 0; iData < numNeighborsOnEitherSide; ++iData ){ + const double median = Util::calculateMedian( numNeighborsOnEitherSide, data ); + const double MADN = Util::calculateMADN( numNeighborsOnEitherSide, data ); + if( fabs( data[iData] - median ) > nsigma * MADN ){ +#ifdef _DEBUG_WRITE + const double absErr = fabs( data[iData] - median ); + const double ratio = absErr / MADN; +#endif + dataMod[iData] = median; + ++numModifiedPoints; + } + } + // Near the end point + for( int iData = num - numNeighborsOnEitherSide; iData < num; ++iData ){ + const double median = Util::calculateMedian( numNeighborsOnEitherSide, &data[num-numNeighborsOnEitherSide] ); + const double MADN = Util::calculateMADN( numNeighborsOnEitherSide, &data[num-numNeighborsOnEitherSide] ); + if( fabs( data[iData] - median ) > nsigma * MADN ){ +#ifdef _DEBUG_WRITE + const double absErr = fabs( data[iData] - median ); + const double ratio = absErr / MADN; +#endif + dataMod[iData] = median; + ++numModifiedPoints; + } + } + + for( int i = 0; i < num; ++i ){ + data[i] = dataMod[i]; + } + + delete [] dataMod; + + return numModifiedPoints; + +} + +// Apply Hanning window +void Util::hanningWindow( const int num, double* data ){ + + for( int i = 0; i < num; ++i ){ + const double ratio = static_cast(i) / static_cast(num-1); + data[i] *= 0.5 * ( 1.0 - cos(2.0 * CommonParameters::PI * ratio) ); + } + +} + +// Perform FFT +// [References] +// 1) Numerical Recipes in C++ Second Edition, p504-p510. +// 2) Yorihiko Osaki, A new guide to spectral analysis of earthquake motions, Kajima publishing, 1994 (Japanese) +void Util::fft( const int num, std::complex* data, const int isign ){ + + if(!Util::isPow2(num)){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("Data length for FFT routine must be power of two."); + } + + // Bit-reversal section +// int j = 1; +// for( int i = 1; i <= num; ++i ){ +// if( j > i ){ +//#ifdef _DEBUG_WRITE +// const int bini = decimalToBinary(i-1); +// const int binj = decimalToBinary(j-1); +// std::cout << i-1 << " " << j-1 << " " << bini << " " << binj << std::endl; +//#endif +// const std::complex temp = data[j-1]; +// data[j-1] = data[i-1]; +// data[i-1] = temp; +// } +// int m = num / 2; +// while( m >= 2 && j > m ){ +// j -= m; +// m /= 2; +// } +// j += m; +// } + int j = 0; + for( int i = 0; i < num; ++i ){ + if( j > i ){ +//#ifdef _DEBUG_WRITE +// const int bini = Util::decimalToBinary(i); +// const int binj = Util::decimalToBinary(j); +// std::cout << i << " " << j << " " << bini << " " << binj << std::endl; +//#endif + const std::complex temp = data[j]; + data[j] = data[i]; + data[i] = temp; + } + int m = num / 2; + while( j >= m ){ + j -= m; + m /= 2; + if( m < 2 ){ + break; + } + } + j += m; + } + + // Danielson-Lanczos section + int kmax = 1; + while( num > kmax ){ + const int istep = kmax * 2; + for( int k = 0; k < kmax; ++k ){ + const double ratio = static_cast(isign*k) / static_cast(kmax); + const std::complex theta = std::complex(0.0, CommonParameters::PI*ratio); + for( int i = k; i < num; i += istep ){ + const int j = i + kmax; + const std::complex temp = data[j] * exp(theta); + data[j] = data[i] - temp; + data[i] = data[i] + temp; + } + } + kmax = istep; + } + +} + +// Fourier transform +void Util::fourierTransform( const int num, std::complex* data ){ + + Util::fft( num, data, -1 ); + + const double factor = 1.0 / static_cast(num); + for( int i = 0; i < num; ++i ){ + data[i] *= factor; + } + +} + +// Inverse fourier transform +void Util::inverseFourierTransform( const int num, std::complex* data ){ + + Util::fft( num, data, 1 ); + +} + +// Calculate field at an angle from those of two different directions +std::complex Util::calculateRotatedField( const double direction1, const double direction2, const double rotation, + const std::complex& v1, const std::complex& v2 ){ + + const double d1 = direction1 * CommonParameters::DEG2RAD; + const double d2 = direction2 * CommonParameters::DEG2RAD; + const double rot = rotation * CommonParameters::DEG2RAD; + const double factor = 1.0 / sin(d2 - d1); + const double factor1 = - sin(rot - d2) * factor; + const double factor2 = sin(rot - d1) * factor; + + return factor1 * v1 + factor2 * v2; + +} + +// Check wether the input value is power of two +bool Util::isPow2( const int val ){ + + for( int i = 1; i < 1000; ++i ){ + const int vpow2 = static_cast( pow(2,i) ); + if( val == vpow2 ){ + return true; + } + if( val < vpow2 ){ + return false; + } + } + + return false; +} + +// Interpolation by the algorithm of Akima (1970) +// [References] +// Akima, Hiroshi, A new method of interpolation and smooth curve: fitting based on local procedures. J. ACM 17, 4 (Oct. 1970), 589-602. +double Util::interpolationAkima( const int num, const double* const dataX, const double* const dataY, const double x ){ + +#ifdef _DEBUG_WRITE + for( int i = 0; i < num; ++i ){ + std::cout << "dataX[" << i << "]=" << dataX[i] << ", dataY[" << i << "]=" << dataY[i] << std::endl; + } +#endif + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + + if( num < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of data is less than one in the interpolation by the algorithm of Akima (1970)"); + return -99999; + }else if( num == 1 ){ + return dataY[0]; + }else if( num == 2 ){ + const double xMin = dataX[0] < dataX[1] ? dataX[0] : dataX[1]; + const double xMax = dataX[0] > dataX[1] ? dataX[0] : dataX[1]; + if( x < xMin ){ + std::ostringstream msg; + msg << "Target x (" << x << ") is less than the minimum value of data (" << xMin << ") in interpolation. The end point value (" << xMin << ") is used as the result of the interpolation."; + ptrOutputFiles->writeWarningMessage(msg.str()); + if( dataX[0] < dataX[1] ){ + return dataY[0]; + }else{ + return dataY[1]; + } + }else if( x > xMax ){ + std::ostringstream msg; + msg << "Target x (" << x << ") is larger than the maximum value of data (" << xMax << ") in interpolation. The end point value (" << xMax << ") is used as the result of the interpolation."; + ptrOutputFiles->writeWarningMessage(msg.str()); + if( dataX[0] > dataX[1] ){ + return dataY[0]; + }else{ + return dataY[1]; + } + } + return Util::interpolationLinear( dataX[0], dataX[1], dataY[0], dataY[1], x ); + } + + // Arrange the data in ascending order + int* ids = new int[num]; + for( int i = 0; i < num; ++i ){ + ids[i] = i; + } + quickSort(num, ids, dataX); +#ifdef _DEBUG_WRITE + for( int i = 0; i < num; ++i ){ + std::cout << "ids[" << i << "]=" << ids[i] << std::endl; + } +#endif + double* dataXAdd = new double[num+4]; + double* dataYAdd = new double[num+4]; + for( int i = 0; i < num; ++i ){ + dataXAdd[i+2] = dataX[ids[i]]; + dataYAdd[i+2] = dataY[ids[i]]; + } + delete [] ids; + + const int orgIndexMin = 2; + const int orgIndexMax = num+1; + if( x < dataXAdd[orgIndexMin] ){ + std::ostringstream msg; + msg << "Target x (" << x << ") is less than the minimum value of data (" << dataXAdd[orgIndexMin] << ") in interpolation. The end point value (" << dataYAdd[orgIndexMin] << ") is used as the result of the interpolation."; + ptrOutputFiles->writeWarningMessage(msg.str()); + return dataYAdd[orgIndexMin]; + }else if( x > dataXAdd[orgIndexMax] ){ + std::ostringstream msg; + msg << "Target x (" << x << ") is larger than the maximum value of data (" << dataXAdd[orgIndexMax] << ") in interpolation. The end point value (" << dataYAdd[orgIndexMax] << ") is used as the result of the interpolation."; + ptrOutputFiles->writeWarningMessage(msg.str()); + return dataYAdd[orgIndexMax]; + } + for( int i = orgIndexMin; i < orgIndexMax; ++i ){ + const double x1 = dataXAdd[i]; + const double x2 = dataXAdd[i+1]; + if( fabs(x1 - x2) < CommonParameters::EPS ){ + ptrOutputFiles->writeErrorMessage("Adjacent two x values are nearly identical in the interpolation"); + } + } + + // Add two points to left and right ends of the data + const double dx2Left = dataXAdd[orgIndexMin+2] - dataXAdd[orgIndexMin]; + const double dx2Right = dataXAdd[orgIndexMax] - dataXAdd[orgIndexMax-2]; + dataXAdd[orgIndexMin-2] = dataXAdd[orgIndexMin ] - dx2Left; + dataXAdd[orgIndexMin-1] = dataXAdd[orgIndexMin+1] - dx2Left; + dataXAdd[orgIndexMax+1] = dataXAdd[orgIndexMax-1] + dx2Right; + dataXAdd[orgIndexMax+2] = dataXAdd[orgIndexMax ] + dx2Right; + dataYAdd[orgIndexMin-2] = Util::interpolation2ndOrderLagrange( dataXAdd[orgIndexMin], dataXAdd[orgIndexMin+1], dataXAdd[orgIndexMin+2], + dataYAdd[orgIndexMin], dataYAdd[orgIndexMin+1], dataYAdd[orgIndexMin+2], dataXAdd[orgIndexMin-2] ); + dataYAdd[orgIndexMin-1] = Util::interpolation2ndOrderLagrange( dataXAdd[orgIndexMin], dataXAdd[orgIndexMin+1], dataXAdd[orgIndexMin+2], + dataYAdd[orgIndexMin], dataYAdd[orgIndexMin+1], dataYAdd[orgIndexMin+2], dataXAdd[orgIndexMin-1] ); + dataYAdd[orgIndexMax+1] = Util::interpolation2ndOrderLagrange( dataXAdd[orgIndexMax], dataXAdd[orgIndexMax-1], dataXAdd[orgIndexMax-2], + dataYAdd[orgIndexMax], dataYAdd[orgIndexMax-1], dataYAdd[orgIndexMax-2], dataXAdd[orgIndexMax+1] ); + dataYAdd[orgIndexMax+2] = Util::interpolation2ndOrderLagrange( dataXAdd[orgIndexMax], dataXAdd[orgIndexMax-1], dataXAdd[orgIndexMax-2], + dataYAdd[orgIndexMax], dataYAdd[orgIndexMax-1], dataYAdd[orgIndexMax-2], dataXAdd[orgIndexMax+2] ); + +#ifdef _DEBUG_WRITE + for( int i = 0; i < num+4; ++i ){ + std::cout << "dataXAdd[" << i << "]=" << dataXAdd[i] << ", dataYAdd[" << i << "]=" << dataYAdd[i] << std::endl; + } +#endif + + for( int i = orgIndexMin; i < orgIndexMax; ++i ){ + const double x1 = dataXAdd[i]; + const double x2 = dataXAdd[i+1]; + if( x >= x1 - CommonParameters::EPS && x <= x2 + CommonParameters::EPS ){ + const double y1 = dataYAdd[i]; + const double y2 = dataYAdd[i+1]; + const double t1 = Util::calculateSlopeForInterpolationAkima( &dataXAdd[i-2], &dataYAdd[i-2] ); + const double t2 = Util::calculateSlopeForInterpolationAkima( &dataXAdd[i-1], &dataYAdd[i-1] ); + const double p0 = y1; + const double p1 = t1; + const double p2 = ( 3.0 * (y2 - y1) / (x2 - x1) - 2.0 * t1 - t2 ) / ( x2 - x1 ); + const double p3 = ( t1 + t2 - 2.0 * (y2 - y1) / (x2 - x1) ) / ( x2 - x1 ) / ( x2 - x1 ); + const double dx = x-x1; + const double y = p0 + p1 * dx + p2 * dx * dx + p3 * dx * dx * dx; + return y; + } + } + + delete [] dataXAdd; + delete [] dataYAdd; + + std::ostringstream msg; + msg << "Interpolation was not performed for the target x (" << x << ")."; + ptrOutputFiles->writeErrorMessage(msg.str()); + return -99999; + +} + +// Calculate slope t for the interpolation by the algorithm of Akima (1970) +// [References] +// Akima, Hiroshi, A new method of interpolation and smooth curve: fitting based on local procedures. J. ACM 17, 4 (Oct. 1970), 589-602. +double Util::calculateSlopeForInterpolationAkima( const double* const dataX, const double* const dataY ){ + + const double m1 = ( dataY[1] - dataY[0] ) / ( dataX[1] - dataX[0] ); + const double m2 = ( dataY[2] - dataY[1] ) / ( dataX[2] - dataX[1] ); + const double m3 = ( dataY[3] - dataY[2] ) / ( dataX[3] - dataX[2] ); + const double m4 = ( dataY[4] - dataY[3] ) / ( dataX[4] - dataX[3] ); + + if( fabs(m1-m2) < CommonParameters::EPS && fabs(m3-m4) < CommonParameters::EPS ){ + return 0.5 * (m1 + m4); + }else{ + const double absm43 = fabs( m4 - m3 ); + const double absm21 = fabs( m2 - m1 ); + return ( absm43 * m2 + absm21 * m3 ) / ( absm43 + absm21 ); + } + +} + +// Linear interpolation +double Util::interpolationLinear( const double x1, const double x2, const double y1, const double y2, const double x ){ + + if( fabs(x1 - x2) < CommonParameters::EPS ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("x1 and x2 are nearly identical in the linear interpolation"); + } + + const double term1 = y1 * (x - x2) / (x1 - x2); + const double term2 = y2 * (x - x1) / (x2 - x1); + + return term1 + term2; + +} + +// Calculate FIR filter coefficients by the least square method +void Util::calculateFIRFilterCoeffsByLeastSquare( const int dimension, const bool isLowPass, const double samplingFreq, + const double freq1, const double freq2, const double weight1, const double weight2, double* coeff ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension <= 0 ){ + ptrOutputFiles->writeErrorMessage("Dimension of FIR filter must be positive"); + } + if( dimension % 2 != 0 ){ + ptrOutputFiles->writeErrorMessage("Dimension must be an even number when FIR filter is calculated by the least square method."); + } + if( samplingFreq <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Sampling frequency must be positive"); + } + if( freq1 <= 0.0 || freq2 <= 0.0 ){ + ptrOutputFiles->writeErrorMessage("Frequency must be positive"); + } + if( freq1 >= freq2 ){ + ptrOutputFiles->writeErrorMessage("The first frequency must be smaller than the second frequency"); + } + + const double normOmega1 = 2.0 * CommonParameters::PI * freq1 / samplingFreq; + const double normOmega2 = 2.0 * CommonParameters::PI * freq2 / samplingFreq; + + const int num = dimension / 2 + 1; + double* Amat = new double [ num * num ]; + double* bvec = new double [ num ]; + + if( isLowPass ){ + // Low pass + bvec[0] = weight1 * normOmega1; + for( int iRow = 1; iRow < num; ++iRow ){ + const double m = static_cast(iRow); + bvec[iRow] = weight1 * sin(m * normOmega1)/m; + } + }else{ + // High pass + bvec[0] = weight2 * ( CommonParameters::PI - normOmega2 ); + for( int iRow = 1; iRow < num; ++iRow ){ + const double m = static_cast(iRow); + bvec[iRow] = - weight2 * sin(m * normOmega2)/m; + } + } + + int icount(0); + for( int iCol = 0; iCol < num; ++iCol ){ + for( int iRow = 0; iRow < num; ++iRow ){ + if( iRow == 0 && iCol == 0 ){ + Amat[icount] = weight1 * normOmega1 + weight2 * ( CommonParameters::PI - normOmega2 ); + }else if( iRow == iCol ){ + const double nn = 2.0 * static_cast(iRow); + const double term1 = 0.5 * weight1 * ( sin(nn * normOmega1) / nn + normOmega1 ); + const double term2 = 0.5 * weight2 * sin(nn * normOmega2) / nn; + const double term3 = 0.5 * weight2 * ( CommonParameters::PI - normOmega2 ); + Amat[icount] = term1 - term2 + term3; + }else{ + const double nm1 = static_cast(iRow + iCol); + const double nm2 = static_cast(iRow - iCol); + const double term1 = 0.5 * weight1 * sin(nm1 * normOmega1) / nm1; + const double term2 = 0.5 * weight1 * sin(nm2 * normOmega1) / nm2; + const double term3 = 0.5 * weight2 * sin(nm1 * normOmega2) / nm1; + const double term4 = 0.5 * weight2 * sin(nm2 * normOmega2) / nm2; + Amat[icount] = term1 + term2 - term3 - term4; + } + ++icount; + } + } + + double* result = new double [ num ]; + Util::factorizeAndSolveLinearEquationRealMatrix( num, 1, Amat, bvec, result ); + delete [] Amat; + delete [] bvec; + coeff[dimension/2] = result[0]; + for( int iRow = 1; iRow < num; ++iRow ){ + const int index = dimension / 2 - iRow; + const double h = 0.5 * result[iRow]; + coeff[index] = h; + coeff[dimension - index] = h; + } +#ifdef _DEBUG_WRITE + for( int iRow = 0; iRow < num; ++iRow ){ + std::cout << "a[" << iRow << "]=" << std::setw(20) << std::setprecision(12) << result[iRow] << std::endl; + } +#endif + delete [] result; + +} + +// Calculate frequency characteristics of FIR filter +std::complex Util::calculateFrequencyCharacteristicsOfFIRFilter( const int dimension, const double samplingFreq, const double freq, const double* coeff ){ + + const double omega = 2.0 * CommonParameters::PI * freq / samplingFreq; + + std::complex H = std::complex(0.0, 0.0); + + const int halfOfDimension = dimension / 2; + for( int i = 0; i <= dimension; ++i ){ + const double arg = - static_cast(i - halfOfDimension) * omega;// Group delay is adjusted + H += std::complex( cos(arg), sin(arg) ) * coeff[i]; + } + + return H; + +} + +// Calculate frequency characteristics of IIR high-pass filter +std::complex Util::calculateFrequencyCharacteristicsOfIIRHighPassFilter( const double freq, const double samplingFrequency, const double cutoffFreq ){ + + const double omega = 2.0 * CommonParameters::PI * freq / samplingFrequency; + const double lamda = tan(CommonParameters::PI * cutoffFreq / samplingFrequency); + const double beta = 1.0 / (lamda + 1.0); + const double alpha = (lamda - 1.0) / (lamda + 1.0); + + const double arg = - omega; + + std::complex numerator = std::complex(beta, 0.0); + numerator -= std::complex( cos(arg), sin(arg) ) * beta; + + std::complex denominator = std::complex(1.0, 0.0); + denominator += std::complex( cos(arg), sin(arg) ) * alpha; + + return numerator / denominator; + +} + +// Calculate frequency characteristics of IIR low-pass filter +std::complex Util::calculateFrequencyCharacteristicsOfIIRLowPassFilter( const double freq, const double samplingFrequency, const double cutoffFreq ){ + + const double Q = 1.0/sqrt(2.0); + const double omega = 2.0 * CommonParameters::PI * freq / samplingFrequency; + const double lamda = tan(CommonParameters::PI * cutoffFreq / samplingFrequency); + const double delta = lamda * lamda + lamda / Q + 1.0; + const double beta0 = lamda * lamda / delta; + const double alpha1 = 2.0 * (lamda * lamda - 1.0) / delta; + const double alpha2 = 1.0 - 2.0 * lamda / Q / delta; + const double beta[2] = { 2.0 * beta0, beta0 }; + const double alpha[2] = { alpha1, alpha2 }; + + std::complex numerator = std::complex(beta0, 0.0); + for( int i = 0; i < 2; ++i ){ + const double arg = - static_cast(i+1) * omega; + numerator += std::complex( cos(arg), sin(arg) ) * beta[i]; + } + + std::complex denominator = std::complex(1.0, 0.0); + for( int i = 0; i < 2; ++i ){ + const double arg = - static_cast(i+1) * omega; + denominator += std::complex( cos(arg), sin(arg) ) * alpha[i]; + } + + return numerator / denominator; + +} + +// Calculate frequency characteristics of notch filter +std::complex Util::calculateFrequencyCharacteristicsOfNotchFilter( const double freq, const double Q, const double samplingFrequency, const double cutoffFreq ){ + + const double omega = 2.0 * CommonParameters::PI * freq / samplingFrequency; + const double lamda = tan(CommonParameters::PI * cutoffFreq / samplingFrequency); + const double delta = lamda * lamda + lamda / Q + 1.0; + const double beta0 = (lamda * lamda + 1.0) / delta; + const double beta1 = 2.0 * (lamda * lamda - 1.0) / delta; + const double beta2 = beta0; + const double alpha1 = beta1; + const double alpha2 = 1.0 - 2.0 * lamda / Q / delta; + const double beta[2] = { beta1, beta2 }; + const double alpha[2] = { alpha1, alpha2 }; + + std::complex numerator = std::complex(beta0, 0.0); + for( int i = 0; i < 2; ++i ){ + const double arg = - static_cast(i+1) * omega; + numerator += std::complex( cos(arg), sin(arg) ) * beta[i]; + } + + std::complex denominator = std::complex(1.0, 0.0); + for( int i = 0; i < 2; ++i ){ + const double arg = - static_cast(i+1) * omega; + denominator += std::complex( cos(arg), sin(arg) ) * alpha[i]; + } + + return numerator / denominator; + +} + +// Factrize and solve a linear equation with real coefficents and vectors +void Util::factorizeAndSolveLinearEquationRealMatrix( const int dimension, const int nRhs, const double* const matrix, const double* const rhsVectors, double* result ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + if( nRhs < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of the right-hand-side vectors is less than 1" ); + } + + double* matrixWork = new double[dimension * dimension]; + memcpy(matrixWork, matrix, sizeof(double)*dimension*dimension); + memcpy(result, rhsVectors, sizeof(double)*nRhs*dimension); + + LapackInterface::factorizeAndSolveLinearEquationRealMatrix(dimension, nRhs, matrixWork, result); + delete [] matrixWork; + +} + +// Factrize and solve a linear equation with real symmetric matrix +void Util::factorizeAndSolveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, const double* const matrix, const double* const rhsVectors, double* result ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + if( nRhs < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of the right-hand-side vectors is less than 1" ); + } + + double* matrixWork = new double[dimension * dimension]; + + int icount(0); + // Column major + for( int col = 0; col < dimension; ++col ){ + for( int row = 0; row < col; ++row ){ + const int index = col * dimension + row; + matrixWork[index] = 0.0; + } + for( int row = col; row < dimension; ++row ){ + const int index = col * dimension + row; + matrixWork[index] = matrix[icount]; + ++icount; + } + } + memcpy(result, rhsVectors, sizeof(double)*nRhs*dimension); + + LapackInterface::factorizeAndSolveLinearEquationRealSymmetricMatrix(dimension, nRhs, matrixWork, result); + delete [] matrixWork; + +} + +// Factrize and solve a linear equation with real symmetric positive definite matrix +void Util::factorizeAndSolveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, const double* const matrix, const double* const rhsVectors, double* result ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + if( nRhs < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of the right-hand-side vectors is less than 1" ); + } + + double* matrixWork = new double[dimension * dimension]; + int icount(0); + // Column major + for( int col = 0; col < dimension; ++col ){ + for( int row = 0; row < col; ++row ){ + const int index = col * dimension + row; + matrixWork[index] = 0.0; + } + for( int row = col; row < dimension; ++row ){ + const int index = col * dimension + row; + matrixWork[index] = matrix[icount]; + ++icount; + } + } + memcpy(result, rhsVectors, sizeof(double)*nRhs*dimension); + + LapackInterface::factorizeAndSolveLinearEquationRealSymmetricPositiveDefiniteMatrix(dimension, nRhs, matrixWork, result); + delete [] matrixWork; + +} + +// Factorize a real square matrix +void Util::factorizeRealSquareMatrix( const int dimension, const double* const matrix, double* factorizedMatrix, int* ipiv ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + + // Copy + memcpy(factorizedMatrix, matrix, sizeof(double) * dimension * dimension); + + LapackInterface::factorizeRealSquareMatrix( dimension, factorizedMatrix, ipiv ); + +} + +// Factorize a real symmetric matrix +void Util::factorizeRealSymmetricMatrix( const int dimension, const double* const matrix, double* factorizedMatrix, int* ipiv ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + + int icount(0); + // Column major + for( int col = 0; col < dimension; ++col ){ + for( int row = 0; row < col; ++row ){ + const int index = col * dimension + row; + factorizedMatrix[index] = 0.0; + } + for( int row = col; row < dimension; ++row ){ + const int index = col * dimension + row; + factorizedMatrix[index] = matrix[icount]; + ++icount; + } + } + LapackInterface::factorizeRealSymmetricMatrix( dimension, factorizedMatrix, ipiv ); + +} + +// Factorize a real symmetric positive definite matrix +void Util::factorizeRealSymmetricPositiveDefiniteMatrix( const int dimension, const double* const matrix, double* factorizedMatrix ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + + int icount(0); + // Column major + for( int col = 0; col < dimension; ++col ){ + for( int row = 0; row < col; ++row ){ + const int index = col * dimension + row; + factorizedMatrix[index] = 0.0; + } + for( int row = col; row < dimension; ++row ){ + const int index = col * dimension + row; + factorizedMatrix[index] = matrix[icount]; + ++icount; + } + } + LapackInterface::factorizeRealSymmetricPositiveDefiniteMatrix( dimension, factorizedMatrix ); + +} + +// Solve a linear equation with real square matrix +void Util::solveLinearEquationRealSquareMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, const double* const rhsVectors, double* result ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + if( nRhs < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of the right-hand-side vectors is less than 1" ); + } + + memcpy(result, rhsVectors, sizeof(double)*nRhs*dimension); + LapackInterface::solveLinearEquationRealSquareMatrix(dimension, nRhs, ipivInt, factorizedMatrix, result ); + +} + +// Solve a linear equation with real symmetric matrix +void Util::solveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, const double* const rhsVectors, double* result ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + if( nRhs < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of the right-hand-side vectors is less than 1" ); + } + + memcpy(result, rhsVectors, sizeof(double)*nRhs*dimension); + LapackInterface::solveLinearEquationRealSymmetricMatrix(dimension, nRhs, ipivInt, factorizedMatrix, result ); + +} + +// Solve a linear equation with real symmetric positive definite matrix +void Util::solveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, double* factorizedMatrix, const double* const rhsVectors, double* result ){ + + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + if( dimension < 1 ){ + ptrOutputFiles->writeErrorMessage("Dimension of linear equation is less than 1" ); + } + if( nRhs < 1 ){ + ptrOutputFiles->writeErrorMessage("Number of the right-hand-side vectors is less than 1" ); + } + + memcpy(result, rhsVectors, sizeof(double)*nRhs*dimension); + LapackInterface::solveLinearEquationRealSymmetricPositiveDefiniteMatrix(dimension, nRhs, factorizedMatrix, result ); + +} + +std::string Util::extractFileNameWithoutExtension( const std::string& fileNameFull ){ + + std::string::size_type pos; + + if( ( pos = fileNameFull.find_last_of(".") ) == std::string::npos){ + return fileNameFull; + } + + return fileNameFull.substr(0, pos); + +} + +// Extract extension of filename +std::string Util::extractExtensionOfFileName(const std::string& fileNameFull) { + + std::string::size_type pos; + + if ((pos = fileNameFull.find_last_of(".")) == std::string::npos) { + return fileNameFull; + } + + return fileNameFull.substr(pos, fileNameFull.length()); + +} + +// The second degree Lagrange interpolation +double Util::interpolation2ndOrderLagrange( const double x1, const double x2, const double x3, + const double y1, const double y2, const double y3, const double x ){ + + if( fabs(x1 - x2) < CommonParameters::EPS ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("x1 and x2 are nearly identical in the second degree Lagrange interpolation"); + } + if( fabs(x2 - x3) < CommonParameters::EPS ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeErrorMessage("x1 and x2 are nearly identical in the second degree Lagrange interpolation"); + } + + const double term1 = y1 * (x - x2) * (x - x3) / (x1 - x2) / (x1 - x3); + const double term2 = y2 * (x - x1) * (x - x3) / (x2 - x1) / (x2 - x3); + const double term3 = y3 * (x - x1) * (x - x2) / (x3 - x1) / (x3 - x2); + + return term1 + term2 + term3; + +} + +// Convert a decimal number to a binary-coded form +int Util::decimalToBinary(int dec ){ + + int bin = 0; + for( int i = 0; dec > 0 ; ++i){ + bin += ( dec % 2 ) * static_cast( pow(10,i) ); + dec /= 2; + } + return bin; + +} + +// Convert string to integer +int Util::stringToInt( const std::string& sbuf ){ + + std::istringstream oss(sbuf); + int ret; + oss >> ret; + return ret; + +} + +// Convert string to double +double Util::stringToDouble( const std::string& sbuf ){ + + std::istringstream oss(sbuf); + double ret; + oss >> ret; + return ret; + +} diff --git a/src/Util.h b/src/Util.h new file mode 100644 index 0000000..4f74cd4 --- /dev/null +++ b/src/Util.h @@ -0,0 +1,229 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_UTIL +#define DBLDEF_UTIL + +#include +#include +#include + +namespace Util +{ + +// Apply IIR high-pass filter +void applyIIRHighPassFilter( const double samplingFreq, const double cutoffFreq, const int numData, double* data ); + +// Apply IIR low-pass filter +void applyIIRLowPassFilter( const double samplingFreq, const double cutoffFreq, const int numData, double* data ); + +// Apply notch filter +void applyNotchFilter( const double Q, const double samplingFreq, const double cutoffFreq, const int numData, double* data ); + +// Convert string "HH:MM:SS" to seconds +int convertHHMMSSToSeconds( const std::string& hhmmss ); + +// Debug write real matrix +// Matrix must be stored by column major order +void debugWriteRealMatrix( const int numRows, const int numColumns, const double* const matrix ); + +// Sort elements by its key value with quick sort +void quickSort( const int numOfIDs, int* ids, const double* const values ); + +// Sort elements by its key value with quick sort and replace original arrays +void quickSort( const int numOfIDs, double* values ); + +// Calculate Absolute value fo a complex value +double calculateAbsoluteValue( const std::complex value ); + +// Calculate calibration function for FIR filter (Type1) +std::complex calculateCalibrationForFIRFilterType1( const std::string& fileName, const int nskip, + const double samplingFreq, const double freq, const bool groupDelay ); + +// Calculate calibration function for FIR filter (Type2) +std::complex calculateCalibrationForFIRFilterType2( const std::string& fileName, const int nskip, + const double samplingFreq, const double freq, const int nfstart, const int nfend ); + +// Calculate determinant of real square matrix +double calculateDeterminantOfMatrix( const int dimension, const double* const matrix ); + +// Calcualte all eigenvalues and eigenvectors of a real symmetric +void calculateEigenValuesAndVectorsOfRealSymmetricMatrix( const int dimension, const double* const matrix, + double* eigenValues, double* eigenVectors ); + +// Calculate IQR +double calculateIQR( const int num, const double* const data ); + +// Calculate MADN +double calculateMADN( const int num, const double* const data ); + +// Calculate MADN +double calculateMADN( const std::vector& data ); + +// calculate mean value +double calculateMeanValue( const int num, const double* const data ); + +// calculate mean square value +double calculateMeanSquareValue( const int num, const double* const data ); + +// Calculate median +double calculateMedian( const int num, const double* const data ); + +// Calculate median +double calculateMedian( const std::vector& data ); + +// Calculate median absolute deviation +double calculateMAD(const int num, const double median, const double* const data); + +// Calculate median absolute deviation +double calculateMAD( const int num, const double* const data ); + +// Calculate median absolute deviation +double calculateMAD( const std::vector& data ); + +// Calculate regression coefficients by weighted least square method +double calculateRegressionCoefficientsByWLS( const int numOfData, const double* const y, const double* const x, + const double* const weights ); + +// Calculate regression coefficients by weighted least square method with intercept +void calculateRegressionCoefficientsByWLSWithIntercept(const int numOfData, const double* const y, const double* const x, + const double* const weights, double& slope, double& intercept); + +// calculate variance +double calculateVariance( const int num, const double mean, const double* const data ); + +// calculate linear trend factor by Hino (1985) +double calculateLinearTrendFactorByHino1985( const int num, const double* const data ); + +// calculate linear trend factor by the least square +void calculateLinearTrendFactorByLeastSquare( const int num, const double* const data, double& b0, double& b1 ); + +// Apply Hampel filter +int hampelFilter( const int num, const int numNeighborsOnEitherSide, const double nsigma, double* data ); + +// Apply Hanning window +void hanningWindow( const int num, double* data ); + +// Perform FFT +void fft( const int num, std::complex* data, const int isign ); + +// Fourier transform +void fourierTransform( const int num, std::complex* data ); + +// Inverse fourier transform +void inverseFourierTransform( const int num, std::complex* data ); + +// Calculate field at an angle from those of two different directions +std::complex calculateRotatedField( const double d1, const double d2, const double rot, const std::complex& v1, const std::complex& v2 ); + +// Check wether the input value is power of two +bool isPow2( const int val ); + +// Interpolation by the algorithm of Akima (1970) +double interpolationAkima( const int num, const double* const dataX, const double* const dataY, const double x ); + +// Calculate slope t for the interpolation by the algorithm of Akima (1970) +double calculateSlopeForInterpolationAkima( const double* const dataX, const double* const dataY ); + +// Linear interpolation +double interpolationLinear( const double x1, const double x2, const double y1, const double y2, const double x ); + +// Calculate FIR filter coefficients by the least square method +void calculateFIRFilterCoeffsByLeastSquare( const int dimension, const bool isLowPass, const double samplingFreq, + const double freq1, const double freq2, const double weight1, const double weight2, double* coeff ); + +// Calculate frequency characteristics of FIR filter +std::complex calculateFrequencyCharacteristicsOfFIRFilter( const int dimension, const double samplingFreq, const double freq, const double* coeff ); + +// Calculate frequency characteristics of IIR high-pass filter +std::complex calculateFrequencyCharacteristicsOfIIRHighPassFilter( const double freq, const double samplingFrequency, const double cutoffFreq ); + +// Calculate frequency characteristics of IIR low-pass filter +std::complex calculateFrequencyCharacteristicsOfIIRLowPassFilter( const double freq, const double samplingFrequency, const double cutoffFreq ); + +// Calculate frequency characteristics of notch filter +std::complex calculateFrequencyCharacteristicsOfNotchFilter( const double freq, const double Q, const double samplingFrequency, const double cutoffFreq ); + +// Factrize and solve a linear equation with real coefficents matrix +void factorizeAndSolveLinearEquationRealMatrix( const int dimension, const int nRhs, const double* const matrix, const double* const rhsVectors, double* result ); + +// Factrize and solve a linear equation with real symmetric matrix +void factorizeAndSolveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, const double* const matrix, const double* const rhsVectors, double* result ); + +// Factrize and solve a linear equation with real symmetric positive definite matrix +void factorizeAndSolveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, const double* const matrix, const double* const rhsVectors, double* result ); + +// Factorize a real square matrix +void factorizeRealSquareMatrix( const int dimension, const double* const matrix, double* factorizedMatrix, int* ipiv ); + +// Factorize a real symmetric matrix +void factorizeRealSymmetricMatrix( const int dimension, const double* const matrix, double* factorizedMatrix, int* ipiv ); + +// Factorize a real symmetric positive definite matrix +void factorizeRealSymmetricPositiveDefiniteMatrix( const int dimension, const double* const matrix, double* factorizedMatrix ); + +// Solve a linear equation with real square matrix +void solveLinearEquationRealSquareMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, const double* const rhsVectors, double* result ); + +// Solve a linear equation with real symmetric matrix +void solveLinearEquationRealSymmetricMatrix( const int dimension, const int nRhs, const int* const ipivInt, double* factorizedMatrix, const double* const rhsVectors, double* result ); + +// Solve a linear equation with real symmetric positive definite matrix +void solveLinearEquationRealSymmetricPositiveDefiniteMatrix( const int dimension, const int nRhs, double* factorizedMatrix, const double* const rhsVectors, double* result ); + +// Extract filename without extension +std::string extractFileNameWithoutExtension( const std::string& fileNameFull ); + +// Extract extension of filename +std::string extractExtensionOfFileName(const std::string& fileNameFull); + +// The second degree Lagrange interpolation +double interpolation2ndOrderLagrange( const double x1, const double x2, const double x3, const double y1, const double y2, const double y3, const double x ); + +// Convert a decimal number to a binary-coded form +int decimalToBinary(int dec ); + +// Convert to string +template < typename T > +std::string toString( const T x ){ + + std::ostringstream oss; + oss << x; + return oss.str(); + +} + +// Convert string to integer +int stringToInt( const std::string& sbuf ); + +// Convert string to double +double stringToDouble( const std::string& sbuf ); + +} + +#endif diff --git a/src/UtilRobust.cpp b/src/UtilRobust.cpp new file mode 100644 index 0000000..301c84b --- /dev/null +++ b/src/UtilRobust.cpp @@ -0,0 +1,319 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include "UtilRobust.h" +#include "Util.h" +#include "OutputFiles.h" +#include "CommonParameters.h" +#include + +#include +#include +#include + +// Calculate bisquare weights +double UtilRobust::calculateBisquareWeights( const double val, const double c ){ + + assert( c > 0.0 ); + if( fabs(val) > c ){ + return 0.0; + }else{ + const double temp = 1.0 - pow(val/c, 2); + return pow(temp, 2); + } + +} + +// Calculate loss function of bisquare weights +double UtilRobust::calculateLossFunctionOfBisquareWeights( const double val, const double c ){ + + assert( c > 0.0 ); + if( fabs(val) > c ){ + return 1.0; + }else{ + const double temp = 1.0 - pow(val/c, 2); + return 1.0 - pow(temp, 3); + } + +} + +// Calculate derivative of the loss function of bisquare weights +double UtilRobust::calculateDerivativeOfLossFunctionOfBisquareWeights( const double val, const double c ){ + + assert( c > 0.0 ); + if( fabs(val) > c ){ + return 0.0; + }else{ + const double temp = 1.0 - pow(val/c, 2); + return 6.0 * val / pow(c, 2) * (temp, 2); + } + +} + +// Calculate M-estimator of scale +double UtilRobust::calculateMEstimatorOfScale( const int numOfData, const double* const residuals ){ + + double scale = Util::calculateMADN(numOfData, residuals); + const double paramb = 0.5; + const double paramc = 1.56; + const int numOfISteps = 20; + const double convergenceCriteria = 0.05; + for( int iter = 0; iter < numOfISteps; ++iter ){ + const double scaleNew = calculateRobustScaleWithBisquareWeights(numOfData, residuals, scale, paramb, paramc); + if( fabs(scale - scaleNew)/fabs(scale) < convergenceCriteria ){ + // Converged + return scaleNew; + } + scale = scaleNew; + } + + return scale; + +} + +// Calculate robust scale with bisquare weights +double UtilRobust::calculateRobustScaleWithBisquareWeights( const int numOfData, const double* residuals, const double scale, + const double paramb, const double paramc ){ + + double squareScale(0.0); + for( int iData = 0; iData < numOfData; ++iData ){ + const double u = residuals[iData] / scale; + if( fabs(u) < CommonParameters::EPS ){ + // rho''(0) / 2 = 6 / c^2 / 2 = 3 / c^2 + squareScale += 3.0 / pow(paramc, 2) * pow(residuals[iData], 2); + }else{ + squareScale += calculateLossFunctionOfBisquareWeights(residuals[iData]/scale, paramc) * pow(scale, 2); + } + } + squareScale /= static_cast(numOfData); + squareScale /= paramb; + return sqrt(squareScale); + +} + +// Calculate second derivative of the loss function of bisquare weights +double UtilRobust::calculateSecondDerivativeOfLossFunctionOfBisquareWeights( const double val, const double c ){ + + assert( c > 0.0 ); + if( fabs(val) > c ){ + return 0.0; + }else{ + const double temp = 1.0 - pow(val/c, 2); + const double term1 = 6.0 / pow(c, 2) * pow(temp, 2); + const double term2 = 24.0 * pow(val, 2) / pow(c, 4) * temp; + return term1 - term2; + } + +} + +// Compute least square estimator for univariate linear regression +void UtilRobust::computeLSEstimatorForUnivariateLinearRegression( const int numOfData, const double* const y, const double* const x, + const double coeffMin, const double coeffMax, double& scaleOut, double& coeffOut ){ + + double xx = 0.0; + double xy = 0.0; + for( int iData = 0; iData < numOfData; ++iData ){ + xx += x[iData] * x[iData]; + xy += x[iData] * y[iData]; + } + + if( fabs(xx) < CommonParameters::EPS ){ + OutputFiles* ptrOutputFiles = OutputFiles::getInstance(); + ptrOutputFiles->writeWarningMessage("Denominator is too small ("+ Util::toString(xx) + ") in the weighted least square method"); + coeffOut = xy / CommonParameters::EPS; + }else{ + coeffOut = xy / xx; + } + + if( coeffOut < coeffMin ){ + coeffOut = coeffMin; + } + if( coeffOut > coeffMax ){ + coeffOut = coeffMax; + } + + double* residuals = new double[numOfData]; + for( int iData = 0; iData < numOfData; ++iData ){ + residuals[iData] = y[iData] - coeffOut * x[iData]; + } + const double variance = Util::calculateVariance(numOfData, 0.0, residuals); + scaleOut= sqrt(variance); + delete [] residuals; + +} + +// Compute S-estimator for univariate linear regression +// This function is based on the algorithm of Salibian-Barrera & Yohai (2006) +void UtilRobust::computeSEstimatorForUnivariateLinearRegression( const int numOfData, const int numOfCandidates, + const double* const y, const double* const x, const double* const coeffCandidates, const double coeffMin, const double coeffMax, + double& scaleOut, double& coeffOut, double& AICS ){ + + const double paramb = 0.5; + const double paramc = 1.56; + const int numOfISteps = 20; + // Initialize + scaleOut = 1.0e20; + coeffOut = 0.0; + double* residuals = new double[numOfData]; + for( int iCan = 0; iCan < numOfCandidates; ++iCan ){ + double coeff = coeffCandidates[iCan]; + for( int iData = 0; iData < numOfData; ++iData ){ + residuals[iData] = y[iData] - coeff * x[iData]; + } + double scale = Util::calculateMADN(numOfData, residuals); + performISteps( numOfData, y, x, paramb, paramc, numOfISteps, coeffMin, coeffMax, coeff, scale, residuals ); + if( scale < scaleOut ){ + scaleOut = scale; + coeffOut = coeff; + } + } + + double Jsn(0.0); + double Ksn(0.0); + for( int iData = 0; iData < numOfData; ++iData ){ + const double normalizedResidual = residuals[iData] / scaleOut; + Jsn += calculateSecondDerivativeOfLossFunctionOfBisquareWeights(normalizedResidual, paramc) * pow(x[iData]/scaleOut,2); + Ksn += pow(calculateDerivativeOfLossFunctionOfBisquareWeights(normalizedResidual, paramc), 2) * pow(x[iData]/scaleOut,2); + } + // 1/n is omiteed because it is canceled out + + const double term1 = 2.0 * static_cast(numOfData) * log(scaleOut); + double term2(0.0); + if( fabs(Jsn) > CommonParameters::EPS ){ + const double term2 = 2.0 * Ksn / Jsn; + } + + AICS = term1 + term2; + + delete [] residuals; + +} + +// Compute S-estimator for univariate linear regression with intercept +void UtilRobust::computeSEstimatorForUnivariateLinearRegressionWithIntercept(const int numOfData, const int numOfCandidates, + const double* const y, const double* const x, const double* const slopeCandidates, const double* const interceptCandidates, + double& scaleOut, double& slopeOut, double& interceptOut) { + + const double paramb = 0.5; + const double paramc = 1.56; + const int numOfISteps = 20; + // Initialize + scaleOut = 1.0e20; + slopeOut = 0.0; + interceptOut = 0.0; + double* residuals = new double[numOfData]; + for (int iCan = 0; iCan < numOfCandidates; ++iCan) { + double slope = slopeCandidates[iCan]; + double intercept = interceptCandidates[iCan]; + for (int iData = 0; iData < numOfData; ++iData) { + residuals[iData] = y[iData] - slope * x[iData] - intercept; + } + double scale = Util::calculateMADN(numOfData, residuals); + performIStepsWithIntercept(numOfData, y, x, paramb, paramc, numOfISteps, slope, intercept, scale, residuals); +#ifdef _DEBUG_WRITE + std::cout << "iCan " << iCan << " " << slope << " " << intercept << " " << scale << std::endl; +#endif + if (scale < scaleOut) { + slopeOut = slope; + interceptOut = intercept; + scaleOut = scale; + } + } + + delete[] residuals; +} + +// Perform I-steps for calculating S-estimator for univariate linear regression +void UtilRobust::performISteps( const int numOfData, const double* const y, const double* const x, + const double paramb, const double paramc, const int numOfISteps, const double coeffMin, const double coeffMax, + double& coeff, double& scale, double* residuals ){ + + double* weights = new double[numOfData]; + const double convergenceCriteriaCoeff = 0.01; + const double convergenceCriteriaScale = 0.05; + double coeffPre = coeff; + double scalePre = scale; + for( int iter = 0; iter < numOfISteps; ++iter ){ + scale = calculateRobustScaleWithBisquareWeights(numOfData, residuals, scale, paramb, paramc); + for( int iData = 0; iData < numOfData; ++iData ){ + weights[iData] = calculateBisquareWeights( residuals[iData]/scale, paramc ); + } + coeff = Util::calculateRegressionCoefficientsByWLS( numOfData, y, x, weights ); + if( coeff < coeffMin ){ + coeff = coeffMin; + } + if( coeff > coeffMax ){ + coeff = coeffMax; + } + for( int iData = 0; iData < numOfData; ++iData ){ + residuals[iData] = y[iData] - coeff * x[iData]; + } + if( fabs(coeff - coeffPre)/fabs(coeffPre) < convergenceCriteriaCoeff && + fabs(scale - scalePre)/fabs(scalePre) < convergenceCriteriaScale ){ + // Converged + break; + } + coeffPre = coeff; + scalePre = scale; + } + delete [] weights; + +} + +// Perform I-steps for calculating S-estimator for univariate linear regression with intercept +void UtilRobust::performIStepsWithIntercept(const int numOfData, const double* const y, const double* const x, + const double paramb, const double paramc, const int numOfISteps, double& slope, double& intercept, double& scale, double* residuals) { + + double* weights = new double[numOfData]; + const double convergenceCriteria = 0.01; + const double convergenceCriteriaScale = 0.05; + double slopePre = slope; + double interceptPre = intercept; + double scalePre = scale; + for (int iter = 0; iter < numOfISteps; ++iter) { + scale = calculateRobustScaleWithBisquareWeights(numOfData, residuals, scale, paramb, paramc); + for (int iData = 0; iData < numOfData; ++iData) { + weights[iData] = calculateBisquareWeights(residuals[iData] / scale, paramc); + } + Util::calculateRegressionCoefficientsByWLSWithIntercept(numOfData, y, x, weights, slope, intercept); + for (int iData = 0; iData < numOfData; ++iData) { + residuals[iData] = y[iData] - slope * x[iData] - intercept; + } + if (fabs(slope - slopePre) / fabs(slopePre) < convergenceCriteria && + fabs(intercept - interceptPre) / fabs(interceptPre) < convergenceCriteria && + fabs(scale - scalePre) / fabs(scalePre) < convergenceCriteriaScale) { + // Converged + break; + } + slopePre = slope; + interceptPre = intercept; + scalePre = scale; + } + delete[] weights; + +} diff --git a/src/UtilRobust.h b/src/UtilRobust.h new file mode 100644 index 0000000..ee471f3 --- /dev/null +++ b/src/UtilRobust.h @@ -0,0 +1,78 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#ifndef DBLDEF_UTIL_ROBUST +#define DBLDEF_UTIL_ROBUST + +namespace UtilRobust +{ + + // Calculate bisquare weights + double calculateBisquareWeights( const double val, const double c ); + + // Calculate loss function of bisquare weights + double calculateLossFunctionOfBisquareWeights( const double val, const double c ); + + // Calculate derivative of the loss function of bisquare weights + double calculateDerivativeOfLossFunctionOfBisquareWeights(const double val, const double c); + + // Calculate M-estimator of scale + double calculateMEstimatorOfScale( const int numOfData, const double* const residuals ); + + // Calculate robust scale with bisquare weights + double calculateRobustScaleWithBisquareWeights( const int numOfData, const double* residuals, const double scale, + const double paramb, const double paramc ); + + // Calculate second order derivative of the loss function of bisquare weights + double calculateSecondDerivativeOfLossFunctionOfBisquareWeights( const double val, const double c ); + + // Compute least square estimator for univariate linear regression + void computeLSEstimatorForUnivariateLinearRegression( const int numOfData, const double* const y, const double* const x, + const double coeffMin, const double coeffMax, double& scaleOut, double& coeffOut ); + + // Compute S-estimator for univariate linear regression + void computeSEstimatorForUnivariateLinearRegression( const int numOfData, const int numOfCandidates, + const double* const y, const double* const x, const double* const coeffCandidates, const double coeffMin, const double coeffMax, + double& scaleOut, double& coeffOut, double& AICS ); + + // Compute S-estimator for univariate linear regression + void computeSEstimatorForUnivariateLinearRegressionWithIntercept(const int numOfData, const int numOfCandidates, + const double* const y, const double* const x, const double* const slopeCandidates, const double* const interceptCandidates, + double& scaleOut, double& slopeOut, double& interceptOut); + + // Perform I-steps for calculating S-estimator for univariate linear regression + void performISteps( const int numOfData, const double* const y, const double* const x, + const double paramb, const double paramc, const int numOfISteps, const double coeffMin, const double coeffMax, + double& coeff, double& scale, double* residuals ); + + // Perform I-steps for calculating S-estimator for univariate linear regression with intercept + void performIStepsWithIntercept(const int numOfData, const double* const y, const double* const x, + const double paramb, const double paramc, const int numOfISteps, double& slope, double& intercept, double& scale, double* residuals); + +} +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..b539b0f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,48 @@ +//-------------------------------------------------------------------------- +// Copyright(c) 2024, Yoshiya Usui +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met : +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and /or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//-------------------------------------------------------------------------- +#include +#include +#include "Control.h" + +int main( int argc, char* argv[] ){ + + bool outputToConsole(false); + for (int i = 1; i < argc; ++i) { + if (strcmp(argv[i], "-cout") == 0) { + outputToConsole = true; + } + } + + Control::getInstance()->run(outputToConsole); + + return 0; + +} + +