diff --git a/CHANGELOG.md b/CHANGELOG.md
index 73d9eab9..5d78cc00 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,31 +2,42 @@
All notable changes to this project will be documented in this file.
-## [2.0.0] - 2021-??-??
+## [2.0.0] - 2022-??-??
### Added
+- The possibility to work with Monte Carlo histories which are evenly or unevenly spaced was added.
+- `cov_Obs` added as a possibility to propagate the error of non Monte Carlo data together with Monte Carlo data.
- `CObs` class added which can handle complex valued Markov chain Monte Carlo data and the corresponding error propagation.
- Matrix to matrix operations like the matrix inverse now also work for complex matrices and matrices containing entries that are not `Obs` but `float` or `int`.
-- The possibility to work with Monte Carlo histories which are evenly or unevenly spaced was added.
+- Support for a new `json.gz` file format was added
- The Corr class now has additional methods like `reverse`, `T_symmetry`, `correlate` and `reweight`.
-- `linalg` module now has explicit functions `inv` and `cholesky`.
+- `Corr.m_eff` can now cope with periodic and anti-periodic correlation functions
+- Forward, backward and improved variants of the first and second derivative were added to the `Corr` class
+- The `linalg` module now has explicit functions `inv` and `cholesky`.
- `Obs` objects now have methods `is_zero` and `is_zero_within_error` as well as overloaded comparison operations.
- Functions to convert Obs data to or from jackknife was added.
- Alternative matrix multiplication routine `jack_matmul` was added to `linalg` module which makes use of the jackknife approximation and is much faster for large matrices.
- Additional input routines for npr data added to `input.hadrons`.
+- The `sfcf` and `openQCD` input modules can now handle all recent file type versions.
+- `extract_t0` can now visualize the extraction on the fly
+- Module added which provides the Dirac gamma matrices in the Grid convention.
- Version number added.
### Changed
- The internal bookkeeping system for ensembles/replica was changed. The separator for replica is now `|`.
- The fit functions were renamed to `least_squares` and `total_least_squares`.
+- The output of the fit functions is now a dedicated results class which keeps track of all relevant information
- The fit functions can now deal with provided covariance matrices.
+- `covariance` can now operate on a list or array of `Obs` and returns a matrix
- The convention for the fit range in the Corr class has been changed.
-- Obs.print was renamed to Obs.details and the output was improved.
+- Various method of the `Corr` class were renamed
+- `Obs.print` was renamed to `Obs.details` and the output was improved.
- The default value for `Corr.prange` is now `None`.
- The `input` module was restructured to contain one submodule per data source.
- Performance of Obs.__init__ improved.
-### Deprecated
+### Removed
- The function `plot_corrs` was deprecated as all its functionality is now contained within `Corr.show`
+- `fits.covariance_matrix` was removed as it is now redundant with the functionality of `covariance`
- The kwarg `bias_correction` in `derived_observable` was removed
- Obs no longer have an attribute `e_Q`
- Removed `fits.fit_exp`
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index cd627bd2..6d95d672 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -24,7 +24,7 @@ For all pull requests tests are executed for the most recent python releases via
```
pytest --cov=pyerrors -vv
```
-requiring `pytest`, `pytest-cov` and `pytest-benchmark`. To get a coverage report in html run
+requiring `pytest`, `pytest-cov` and `pytest-benchmark`. To get a coverage report in html run
```
pytest --cov=pyerrors --cov-report html
```
diff --git a/examples/02_correlators.ipynb b/examples/02_correlators.ipynb
index 76234ceb..a647162e 100644
--- a/examples/02_correlators.ipynb
+++ b/examples/02_correlators.ipynb
@@ -68,7 +68,8 @@
"metadata": {},
"outputs": [],
"source": [
- "my_correlator = pe.Corr(correlator_data)"
+ "my_correlator = pe.Corr(correlator_data)\n",
+ "my_correlator.gamma_method()"
]
},
{
@@ -104,7 +105,7 @@
"id": "b00d670b",
"metadata": {},
"source": [
- "The `show` method can display the correlator"
+ "The `show` method can display the correlator. The argument auto_gamma
tells `show` to calculate the y-errors using the gamma method with the default parameters."
]
},
{
@@ -115,7 +116,7 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
""
]
@@ -127,7 +128,7 @@
}
],
"source": [
- "my_correlator.show()"
+ "my_correlator.show(auto_gamma=True)"
]
},
{
@@ -192,7 +193,7 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
""
]
@@ -204,7 +205,7 @@
}
],
"source": [
- "shifted_correlator.show(comp=symmetrised_correlator, logscale=True)"
+ "shifted_correlator.show(comp=symmetrised_correlator, logscale=True, auto_gamma=True)"
]
},
{
@@ -269,7 +270,7 @@
"outputs": [
{
"data": {
- "image/png": "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DTI+o7PfGNPin81prU0YY8Dp6gz8ntbao8BRXx2ynEJERALbfif84psT9/9gU+r2JV+Hj3ZOLCdSYULR3QngtoCd62/9MsbY9O5I37EGYAfOOLN42r5mYDtwOO14xN23wA1sgd4zQx1qgBF1d4qITIL0lrRs1JImM9xM7O7swmkB87ouW/Atj+GOL2vxZnNaa2PGmM1pXZobgZi7lAYZjrcC/b6Wt5zvKSIiU0jhSyRFaFrSILm4rBeqGn0zMb1B/x3W2nrfvgip65rVu2USWY4v9J8z33sWUF+1pImIiEgghbakhSqkzTQKaSIiIhJUoSEtFIvZioiIiEgqhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREFJIExEREQkhhTQRERGREJoz3RXwM8a0Awl3M2Kt3ZynfATY4G7WA1Fgk7U24SvT7juOtbbNd6wJaAMGgDjQDGyz1vaXeCkiIiIiJQlNSPPClLW2191uMsb0+ENVBt1At7U27r6mB+jDCVsYY7qttR2+9+gxxgxYa5vdXRGgCWjBCWndCmgiIiISBmHq7uwEer0Na+0g0JrnNVGcgOUZAtZCspWtwf3s6QGajDFR376V1lpjra33AqKIiIjIdAtFS5obmiL+bkrfsSY3sE3gaxHzNAL+smtxglzM3Y67nyNF1nMuMNe3a14x5xERERHJJxQhDSdIZZKgwEBljGlxy64HcAPfgrRiTe7nuG/fBmPMMFAL1Pu7RzPoBG4opD4iIiIipQhLSMvGC09Z+SYPRIC+TK1xPp1Am69MDMA3pq3VGNNnrV2f5fVdwLd82/OAF3NegYiIiEgRwh7ScgY0SLaYeZMNWo0xh3HGmSX85Ywx3cAW/7gzL5z53Af0GGMydr1aa48CR33nLPhCRERERIIIy8SB9LDkiWQ7ZoyJGGO60yYGDDI+Y9NftgUYSl/Sw92f5Atm2bpfRURERKZEKEKa26KVSJt16R3LOGkAJ0i1k9raFnE/J7wd7lpo/qU9IsaYqBvu+vzv6Qt82UKjiIiIyJQIRUhzdeFrAXNbuXp921HfwrRYa2PA5rQuy41AzAt2xpgGoAGIua+P4izrMey2mqW/vhXozzOuTURERKTsjLV2uuuQ5IYwLzQ1pi1E2wp0WGvrffsipK6lVu+WSbjHniXD7FBrrcny+oV5Znem17cGGBkZGaGmpqbQl4mIiMgsduTIEebPnw8w31p7JFu5UIW0mUYhTURERIIqNKSFqbtTRERERFwKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkIKaSIiIiIhpJAmIiIiEkJzprsCfsaYdiDhbkastZvzlI8AG9zNeiAKbLLWJnxlcp4z6HuKiIiITIXQtKS5YQlrba+1theIGWN68rysGxh0X9MBDAN9hZ6zyPcUERERKTtjrZ3uOgBgjDkMrExrBbPWWpPjNQPAgNf65YauTmvtgkLOWcx7pr1/DTAyMjJCTU1NwdcqIiIis9eRI0eYP38+wHxr7ZFs5ULRkmaMieJ0NSYyHGvK9jprbXNa92QjMFjIOYt9TxEREZGpEJYxadEs+xNApJATGGNa3LLrCzxn4Pc0xswF5vp2zSukbiIiIiJBhaIlLYdhoDZXAWNMxBjTihO6+jK1jAU8Z67jncCI7+PFPO8lIiIiUpSwh7ScAQ3AWptwB/5749IOu7M+iz1nruNdwHzfx3vy1U9ERESkGGHp7oxn2R/JdswNYp1Al6/1bNB9TRMQy3POwO9prT0KHPXVIcspcju07zkSr7yQt1xk8XIWLVtR1HuIiIjIzBaKkGatjRtjEsaYqLU2nnZsMMvLokA70INvnTP3c6KQcxbxnpNiz89u4/wX7shb7tHlm1j0xZvLWRUREREJqVCENFcXTgtYLyQnAvR6B93ZmC1et6a1NmaM2ZwWsDYCMV/IynnOAo6XxaqPf4m9r3wquX34uV00xtrZ1rCZBSvWjJdbvLzcVREREZGQCs06aZBc58wLXY3uArXesVagw1pb79sXAVp9p6h3yyQKOWchx/PUd1LWSdv7q0c47YdXsPfTP+W0D1xY9HlEREQk/ApdJy1UIW2mUUgTERGRoGbUYraz2eixY7z0zE62j63ipWd2Mnrs2HRXSUREREJALWklKLUlbefWu1j22E0sGTuQ3Hegagn7zruec9ZdPYk1FRERkbAotCWt5IkDxphNgLXW/q9SzzWb7Nx6Fx949FpYtQ4u/hrUnQkHn2LxQzez+NFr2QkKaiIiIrPYZHR3RoDt3oYx5g/SCxhjzp6E96kYo8eOseyxm2DVOqquugeWN8Lck2B5o7O9ah0nP/YNdX2KiIjMYpOxBEc9YH0LuzYbYxJpZdpwlscQ4OnHtrJm7IDTglaVlpOrqqi6+Kss3dPMrse2subDV0xPJUVERGRaTdY6aX8CNAMGZ5HZ+rTjKyfpfSrC7w6/5HxRd2bmAu7+ZDkRERGZdSYjpA1Ya//E2zDGbLLWpiynb4z5w0l4n4pxwoJTnC8OPuV0daY7+FRqOREREZl1JmNMWnorWabpokOT8D4V44zz1nGgagljD90MY2OpB8fGGHvoFl6uWsoZ562bngqKiIjItJuMlrQRY8ztwIC73ZzhwePrASUOV/WcOew773oWP3otY/dcRdXFX03O7hx76BbYs5X959/K0jlhemqXiIiITKWSU4C19g5jzKU4Y9IAFgCn+YpEgNpS36fSnLPuanaCs07anubk/oNVS9l//q1afkNERGSWm/TFbI0xl1prH8y3rxJMxmOhRo8d45Ef3s6Jv76LN953NRd++hqq1YImIiJSsabtsVDW2geNMd80xmyF5KSBbZP9PpWies4cTjn9HNZW7eGU089RQBMRERGgDCHNGNOFE8oGAay1/whsmOz3EREREalk5Wi22W6t/Ud3nJpnuAzvM2Md2vcciVdeSG4ffm5X8vNeX7nI4uUsWrZiimsnIiIiYVCOkOYtyeEf7NYI/KAM7zUj7fnZbZz/wh0T9jfG2iE2vv3o8k0s+uLNU1gzERERCYtyhLSdxpi9wJAxZj3QhPNYKHGt+viX2PvKp/KXW7y8/JURERGRUJr02Z0AxpiVQAuwENhird056W8SApMxu1NERERml0Jnd5ZlKqG19lngb8pxbhEREZHZoByzO//cGPOxyT6viIiIyGxSUkgzxnzN/UiGMmvt3wDPGmP+oOTaiYiIiMxSRXd3GmPuw3nkE8B1xpj5OGuj/R3wIHoUlIiIiEjRSmlJ22atvcz9qMVZZmMnzli0w4wHOBEREREJaNImDlhrYzirfH19ss4pIiIiMluV0pIWM8acPVkVEREREZFxRYc0a+2DwFpjzFeNMfMmsU4iIiIis14pEwe+CbTijD3bbIyJ40wcGAAGcy3OJiIiIiK5lbQEh7W21lpbBawCNgPG/XzYGLN1EuonIiIiMiuVMnFgyPvCWhsH4sAdAO5yHNHSqiYiIiIye5W6mG3GB1Zaa0cq9XmdIiIiIlOh6JY0a+0dxpguY8y91tpfTUZljDHtQMLdjFhrNxf4GoB6t15tvmN9wBacVr6E/3XW2rgxpglowxlHFweacdZ/6y/pQkRERERKVMrEgT8HOoD2yZg04IUta22vu91kjOnxh64Mr+m21nb4tnuMMQPW2mZ3VwPQkuGl/cB6nEkPTW6ZONCtgCYiIiJhUOrEAf+kgYXu54Qx5lVjTFfA03UCvb5zD+LMHs3IGBMBGtzPnh6gyRjjjYfrsdYa/wfQZq1d73vNSvdYvRcQRURERKZbKSEtboz5T8Aha+0d1toN1trTcJ7Z2YbTMlUQN1RFrLWJDMeacrx0LakTFLz3jLifU1rF3HNtL7ReIiIiItOllDFp/+jO4mx2uxiPuPsTpIWjAmSbCZogyzNA3fdZkLbbC3Rxt0wyKLpBMOq20PltMMYM44TLen/3aTpjzFxgrm+XFvEVERGRsii1u3PEWvuP/jFok/yoKC88FaoTpzszkeFYR4buzBjOGLp+99iQO9kg1/lHfB8vBqibiIiISMGKDmnGmPnGmI9lPmT+PMuxoAoOaMaYbmBLpnFlxpiGTK+x1sb9rW3AfUBL2jg3vy5gvu/jPYXWT0RERCSIUlrSaoFBY8yoMWabuxzHR621O621f0OwxWyzjV+L5DiWZIxpAYZyLNnRhm/x3bTXJfla4DLW3Vp71Fp7xPsAXstXNxEREZFilBLSojjLWFwGPAicCzzohrY9OGuOFcRtzUr4ZmX6j6WPIUvhTSzwLd0RyXCeJtLWSXNby/r8ZX0taAVPehAREREph1JC2kp3PNqD1tqvW2svc5fkWAfstNZuDHi+LsYH/nutXL2+7ahv4VpvXwPOWmgx93gUZ9mO4bRzR0kLXm6r2ea07s5WoD/LmDYRERGRKWOstcW90Jgua21nlmPzgfXW2v8V8JztjIepxrSFaltxBv/Xu9sR4FkyzP5010Pzn3fIrU8sbX+E1LXYFuaa3ZmhvjXAyMjICDU1GZ+QJSIiIpLiyJEjzJ8/H2B+rgcAlBLS/hCn5avdWjthbJYx5j8FDWkzjUKaiIiIBFVoSCu6u9Na+4/ATuA5Y8wWY8ynjTHvheQyHOcWe24RERGR2a7oxWzBGaxvjBnEeRzTPwLWGANOl+X6XK8VERERkexKCmmQnJnZDGCMWenue7bU84qIiIjMZiWHND+FMxEREZHJUdJjoURERESkPBTSREREREJIIU1EREQkhBTSREREREJIIU1EREQkhBTSREREREJoUpfgkPI4tO85Eq+8kLdcZPFyFi1bMQU1EhERkXJTSJsB9vzsNs5/4Y685R5dvolFX7x5CmokIiIi5aaQNgOs+viX2PvKp5Lbh5/bRWOsnW0Nm1mwYs14ucXLp6F2IiIiUg4KaTPAomUrUrox9wLEYMGKNZz2gQunrV4iIiJSPpo4MMOMHjvGS8/sZPvYKl56Ziejx45Nd5VERESkDIy1drrrMGMZY2qAkZGREWpqasr+fju33sWyx25iydiB5L4DVUvYd971nLPu6rK/v4iIiJTuyJEjzJ8/H2C+tfZItnLq7pwhdm69iw88ei2sWgcXfw3qzoSDT7H4oZtZ/Oi17AQFNRERkQqi7s4ZYPTYMZY9dhOsWkfVVffA8kaYexIsb3S2V63j5Me+oa5PERGRCqKQNgM8/dhWlowdoOrir0FV2i2rqqLq4q+ydOxlnn5s6/RUUERERCadQtoM8LvDLzlf1J2ZuYC7P1lOREREZjyFtBnghAWnOF8cfCpzAXd/spyIiIjMeAppM8AZ563jQNUSxh66GcbGUg+OjTH20C28XLWUM85bNz0VFBERkUmnkDYDVM+Zw77zroc9Wxm75yp44XE4+hq88LizvWcr+8+7juo5mqwrIiJSKfRbfYY4Z93V7ARnnbQ9zcn9B6uWsv/8W7X8hoiISIXRYrYlmOrFbMFZjuORH97Oib++izfedzUXfvoataCJiIjMIIUuZqvuzhmmes4cTjn9HNZW7eGU089RQBMREalQCmkiIiIiIaRmmBng0L7nSLzyQnL78HO7kp/3+spFFi9n0bIVU1w7ERERKQeFtBlgz89u4/wX7piwvzHWDrHx7UeXb2LRF2+ewpqJiIhIuSikzQCrPv4l9r7yqfzlFi8vf2VERERkSoQqpBlj2oGEuxmx1m4u8DUA9QDW2jbfsSagDRgA4kAzsM1a21/Ke061RctWqBtTRERklglNSPPClrW2191uMsb0+ENXhtd0W2s7fNs9xpgBa623kFgEaAJacEJad4aAFug9RURERKZCaNZJM8YcBlZaaxO+fdZaa7KUjwB9wHrvNcaYBmAHUG+tjRtjWoBB/zlLec8Mr5/yddJERERkZptR66QZY6I4XY2JDMeacrx0LRD1bcfdz5FyvKcxZq4xpsb7AOblex8RERGRYoSluzOaZX+CLIHLDVcL0nZ74Sru27fBGDMM1OK0sHndo4HfE+gEbshyTERERGTShCWkZeOFq0J1Am2+1rEYgLU2DmCMaTXG9Flr1xf5nl3At3zb84AXA9RvSqSvq5aN1lUTEREJr7CHtIIDmjGmG9jiTQKA8XDmcx/Q445nC/ye1tqjwFHfexZavSmVbV21dFpXTUREJLzCEtLSw5QnkuNYkjtBYMgf0Lz9/tmc1tqEG6yipb5nmKWvq3b4uV00xtrZ1rCZBSvWjJfTumoiIiKhFYqQ5s7ETBhjoumtX9bawVyv9Qb5+5bRiOC0hg0DfcaYel93Z8R9WdwNbEW9Z9ilr6u2FyAGC1as4bQPXDht9RIREZHChWJ2p6uL8YH/XutYr2876lu41tvXADQAMfd4FGgFht1xaZvTAlgr0O8bs5bzPUVERESmS2jWSYPk4rJeqGpMW6i2Feiw1ta72xHgWTLMxPTWOXPLtPoOLfSfM997FlDf0K+TNnrsGI/88HZO/PVdvPG+q7nw09dQPScUDagiIiKzUqHrpIUqpM00YQ9pO7fexbLHbmLJ2IHkvgNVS9h33vWcs+7qaayZiIjI7FVoSFOTSoXaufUuPvDotbBqHVz8Nag7Ew4+xeKHbmbxo9eyExTUREREQixMY9JkkoweO8ayx26CVeuouuoeWN4Ic0+C5Y3O9qp1nPzYNxg9dmy6qyoiIiJZKKRVoKcf28qSsQNUXfw1qEq7xVVVVF38VZaOvczTj22dngqKiIhIXururEC/O/yS80XdmZkLuPu9cnpCgYiISPgopFWgExac4nxx8CmnqzPdwadSyukJBSIiIuGj2Z0lCOvsztFjxzj0jdUsrj/HGYPm7/IcG2Psnqs4OPQEi6/bRfWcORNa0rI9oUAtaSIiIqXT7M5ZrHrOHPaddz2LH72WsXuuouriryZnd449dAvs2cr+829lqbtemp5QICIiEj4KaRXqnHVXsxOcddL2NCf3H6xayv7zb9XyGyIiIiGnkFbBzll3NaOXfo5fpD1xYGmOJw6MHjvGS8/sJDG2ijee2cnKNR/SEwpERESmgX77VrjqOXM45fRzOG3XX7D39HNyBi7vCQWXjB1wFmfZ9RcceOq2CU8o0GxQERGR8lNIEyDYEwo0G1RERKT8FNIqUKbZmt7nvb5yXkvXhCcUeLNB3ScUjN1zlfOEgks/R/WcOaz6+JfY+8qnUs6faTboqsXLy3mZIiIiFU0hrQJla+lqjLVDbHzba+l6+rGtrBk74LSgZXtCwZ5mdj22lTUfvkKzQUVERKaAQloFSm/pylrObekK+oQCERERKT+FtAqU3tKVT9AnFPhpNqiIiEh56IkDJQjrEweCCvqEAo83G3TJ2IHkvgNVSzQbVEREJAc9cUAKFvQJBaDZoCIiIuWmlrQSVEpLmidTy9jLVUvZf951KS1jejaoiIhI8dSSJoEV+oQCzQYVEREpv6r8RWQ28Z5QsLZqD6dkeUKBZoOKiIiUn1rSJLBSZoOKSG6aaCMiHoU0CfyEgjPOW8eBB5ew+KGbM49Je+gWDlYt5Yzz1k14Ly3ZIZKbf6LNqIWnx07ld2YuJ9ijnFH1PNXGKaeJNiKVTxMHSlApEwce/c7XCp59eb77S8E/uzPTbNBfnX9rymQD7zWFLNkhMpt5fzQ9/+RDrHn2TpaMHUweO1BVx66Vf8yp779YLWkiM5gmDkjBgj6hAJxJBjvBCV17mpP7D1YtZX+WgFbokh3q7pHZbNGyFbzw63/hI0ObM/68fGTPZn5Vd0py0o3/52V09BgvD/2aY68PM+ekWpbWv4/qaue/+Ur5eTl45C0OvnY0b7m6eXOpqzl+CmokUj5qSStBpbSklWL02DEeSZsNmt59GXTJjmJa9kQqRbE/LztH61k2Z4Ql9lCy+AGziH3H5nNO9VBof16Chq7en/6S//2I8xBia+FNjucY1cxhlHfzFsbtDv4PFzbQesUF5ay6SNHUkiZTwpsNetquv2BvltmgQZfsSG/Zy7aumr9lL0zUEih+Qf89FPPz8s8P1jotb6dlaKnes5V/ru/g/Zd+rkxXWJofPRxLhq5cvND1ueoHaZ17Mw+MNvLX73ye5VWvUEeCg0R4YWwxfznn+1xevY03qr8GXKCWN5nRFNKk7IIu2eFfV82baLB9bBVvHn2bhhkw0UBPWBC/oP8egv68LKg7hTXPftcZH+pveVveSNVV9zB2z1WsHrqLBXXtpV5KWXihKx8vdJ344U088O4mfvTAA/SdcBPL7PiYvX2mjr86+llo/msuP2clAP/w2PPc+uCevOe/9tJV/Gnz6UVfh0g5hPu3nYRS0NmgxS7Z4U00uGTsgLOi366/4MBTt4V+osFMbwmUyRX030PQn5egLW9hc+KHN8H7PwnA6Jjlp4/vxu78/zHn/Eeu+OBqqquc/ssT5y11ypy4hH956Dv8z+NundByuPShm/mfe27luoeOo/nC66gG/uOauXyybn7y/P8cf5N/2LaPzzUu42PRdyfPH1k8d+ovXiQPhTQJLFvLQGOsHXy9Fl7LQDFLdgSZaBA2esKC+AVtGQ768zLjF5eetxTmLeWB3+znr+//Nctf30cd53Jw+z66n17MX175Pi4/6+Rk8ceHXuHLo9/N2XL45b138fjQJs5fVceif7+bRb/4Jg+MNnLjO19gPwuBOrq3HeN7257lhnd9j8urt8ElX4dlndPyLRDJJlQhzRjTDiTczYi1dnOBrwGoB7DWthV63BjTBLQBA0AcaAa2WWv7i7+Kyhd0NmjQB7iPHjvGssduyvmf8MmPfYPRSz83JV2fGmMmfsXOpiy0ZTjoz0slLC79wG/286O7/46+uXez7Dhf9+U7dfzV3Z+Fz/5JMqiN/vZfnS7OHC2Hy/Y0E//tv8KqT8PaP+aB6o9wzT8NYxjjQ1W7k2PYto2dwTXv/Cm3N9cmu0f9Y9hGxyy79o1w+M13WPDud7Fm2fxky5vGsMlUCE1I88KUtbbX3W4yxvSkh66013Rbazt82z3GmAFrbXMhx4EI0AS04IS0bgW0/NJbigoRZMmOsHXflDLGrJDFe6cyBI4eO8bTj23ld4df4oQFp3DGeetCP8YvbLx/D95syt/zz6bcnTqbclGGdQULaRkO8vNSe+YlBbS8LaH2zEvK9j0pxeiY5V9+9Pe5uy9/dBzNq6+juspQZxLOC/O0HHrlRk9cwo3/uovLqh7nhrl3ZxzDduO/XkzzhUuoJvgYNk1MkHIK0//OncBKb8NaO2iMGcBp6ZrAGBMBGowxEWttwt3dA+wwxkSB4VzHrbVxd99K33Epo0If4B60+6bcIcffcjg6eoxntw+w6MWtHHrPOlaubU62nKSPMSu05aTcEw3SF0dd418c9cGpXxw1bOt6Bf33E3Q2ZdCWYa8+85bWk/hELzvT/r3Nq57D3l89kqzPjx99kufe+n3+es93s7a83fb2H7Hi0SenZEmKlPs7Zvn1K6MM/26M2hOqeN/iat8YMKf+Qbsv66P18Ah5Ww7ro/UAPP7sMO9/7SFuzxECr3kNHn/2bM6vX8jnzjuVE4+r5hs/ezrrNV738TP41DlOy6QmJuSmEFuaUIQ0N1RFMoUlY0yTtXYwy0vXAlHGR0J5wSuCE9JyHZdpUMiSHUG7b4KGnKC/lL0PL3Rd7oWufXs48JO+jBMZgrSclHuiwZ6f3cbxv/1nPlIdz7446jP9vPLejxX1/SmmPkFbosop6GOYgs6mDNoynP7v+fcg+e+N+/82ud+rz+eqH+TE4+50vp97t6e2vJlF7B+NctNxd/JG9UKg/CHNq3+mJTL+v7HF/OW7nCUyvPoH7b6sfu+H+d2J72FujpbDoye+hxPe+2Hne3DkDW6Yezeclv1+3bD3HrYd+SKwkIX2MHc+/Izz9ozxwaqnk/V/fOwMLFXc+fAevnj2u4GT+dx5p9K8ekmyCnsPvs5XtjzBtzeezWl1JyX3182bnRMTZluILTSUnmDzl4GQhDScIJVJgiyByg10C9J2N7mf4/mO+/ZtMMYMA7VAvb97NJ0xZi7g/0mbl62sFC/owOmgLV3FtFwFCV1BW07KPdEg2nwNfPd/Q32O+gztxDRfM+H7U45nR4ZtXS/v30+ypdE8nzzmfwyT9+8naOgK2jIcdMynNzvyHJx/e7t2xfjdkUOcULOIM9Y0JFuqvdmRQUN4MS2Nd8au4N9++S8Zl8i48ehn2X/e9XyywflvP2j35cHX3+Gt8/+S5YN/krHl0OzZyitNf8fxr79DXU01p73564JC4Glv/ho4lccH+9j/ej3rsnSP3nj0s2x9/YM8PtjH+X/4Zepqjs/YAnRa3Umcdcr8CftnW8uSP8SOjll+vvtl/sf/GeI/f7Sey1YvTRnjVwkKDaVtHzo5bxkIT0jLxgtPheoE2nJ0X6YfjwF4XZ/GmFZjTJ+1dn2O198QoD5ShKADp4O2dAUNdUFDV9jG1B164WmnizNffV54miWn1gcOLX6FjHkL27peQR/DFDR0BW0ZDjzm050dCVANrDl1bc7iQUN40D9qFiw9lX9/4vtZuxdv33Mr1z1xHF/4/Y8ABO6+dBa/PcQFVVfRuvcBFvtaDg+ZhdzxzlX88qeH+A8jMVqvuIAz573pHMxzv7xyB09pYt2OLTnrf83b13LwlI3O61972flwHX/oddaYZzn+0Hww4y1p3n2a6WPegtbH+3jgN/u58ce72T/yFgD/4/8M8YPYS9zwydUps3dnukJbVk+wR7mugPOFPaQVHNCMMd3AFm/iQSHHfePSPPcBPWnj2Py6gG/5tucBLxZax9kq6LpqUN5ngwYNdeVuOSm3YhYTLubZkYWOeZvKEFtIaAwawoOGrmKWoCmnoCE86B81QceYBe2+TFn8Nu2phnX2Va5/193A+OK3VW6AzXe/vHJ1CxcV1D363ML/7Ozffif84pvO98caXhk7g9Y5EV7p/z4rq56m2riVvOTr8NHOwN2jYesuLKY+D/xmP9d8P5Z+u3h55C2u+X6M2z/fUDFBrdCW1SNHsj4JKkVYQlp6WPJEchxLMsa0AEM5AlrG48aYFv9sTmttwjgPfvOPY8N3/Chw1Pf6fFUTgq+r5il0okExS3YECXXlbjlJv5bJng0atD5Bv59Bx7yVO8SWOzQGDV1BW4bLLWgID/pHTeAlMqqqOeGKLux9X8jafXnChu9BVTWQuvhtLl73LisugMip2Idvxnxm4v2yD9+CiaxwygEfrH6a6gLqv6T6aaAO1v4x/N7HeWDv77jxoQT7Xx9LFj/5pCpuuDjC5aedkGzt9P8SHx2zPPliAoA33z7GmSfXJLv/PF6o++XeQ/Q+HOfQ62+P38uTjqP1oigXnLYoGerK3fIWNGSOjllu/PHuCQENnIxtgBt/vJtmX9enjAtFSLPWxo0xibRZl96xbJMGgORaZ/6lOyJAra8LM+NxnK7UPmNMva9sxD1t3mAohQs6xiY9hLx77nGsrdrDtrnH8eyuf0vuL/aXbFhbTso1G3TR8jM4UFWXd4mGRcvPAIK3HAYd81budb3KHRoPH3yJXSv/iI/s2Zw1dO2ub+f9B18qumW4nMr9R03QMWYArL4Ss+F78PPr4Tvj3x8TWeHsX33leFlf924hDr7+Dm+tvZ7lg3+CvfcqzEXj98s+fAs8s5XnfWPYXj/0IvMLqP/rh15kftSpzwPPWa75pwwtRa+Pcc0/DTstRctS65ze/XfdD3/Dbf+8d0L3X13N8cSeP0zXz56ecP5XX3+brp89ze2fb0i20pTSnVrIunBBQ+bjzw4nrzETC+wfeYvHnx3m/PqFees924QipLm6cAb2e2Gqxfva3Y4CLf4Fbo0xDUAD0O8eB2fNs958x91Ws81pobAV6NeSHJMr6BiboC1vQX/JhrHlpNjZoIV0P8UHbuf4d+axeM/W7PUZjfLWwO0sKeL7GXTMW9DvZ9CWw3KHxj0/u42PebNTs8ym/NhQN4++PZwyW7bQJTXKrdx/1AQdYzZ+f2vhI3/LsV0/5Yw9PTy9qo05a66Ad6qhhO+PE1rmsa7qWm7YczfLnhm/X/vNEm58+1q2/mQe1/7uef60+XR+/rxhvVfPHPX/+fOG9R8srqUoSPdf0PMHbXkrtju10JB58LXsAc3PK6fFhFOFJqRZazcbY9rdcAbQmLaQrfd0gM2QbPV6EKdLtDvDuXIed7/s8j2RAGBhjkkDMkWCtrwF/SUbNIQUE7qCtJwUOxs0yESJxCuf4l+efIg1Q3em1WcJu+vbOfX9F7N8ir6fQVuigg50L3do9P59zgMSo8d4Om2dt3nVc9hL9tnE+ZbUKLdy/1ETdIxZtj/KztjTA3t6ktvFfn/Gn93ZzJv2Yxz87c+pe+JvOXj2f+HN917Gn5tq/pzxZ3de0nQlbz93E+/K0T36zrxTuaTJad0L2lI0OrKfG3/0RO7Q9aNf0bwcquefHPj8QVvegq4LB8FCZt28woKUVy5sY/CmW2hCGqSEJ4D+tGO9+FrWsiyxQaHHfWXyPnpKplbQlregv2SL6W4rpruq0DF1xQykL2aixGkfuJDRY+3sShtI/7ESnx1Z7paooAPdyx0a0/99/l7DRzK/jyvoHx3lVu4QfujlF3lnzRdY+nhX1jFmiQ928sbLLyaX7Cjn98d7dueEaj/xt9Q9MR6SvWd31lW/Bh9qhYH/CvdeBb7uUR6+BfPMVo5r/iunHCemtBRlWldtDOfnxyvnLfGRjQX2vz6aXOIjaEtU0Ja3hSfN5c5f/jbreQ1w5y9/yxcvihZ1/g+urOXk+cfz8shbGV9jgKXzj+eDK515gkFDY9hmv062UIU0kWIEbekqdsxYoaErvW75Fu8N+kuwlGebVs+Zk3fGZODQEnDMW9CWqKAD3csdGoMq5jFq5TQVITzZMrZ3EPY8kCxqzBwMlpMf/waP7n/FGTNZ7u+PO7A/L2+cm2+2JnsH4Jnx+lM1B7Aw8Jfw9hvw0c5kC1DOddXGPpgsd/CUJtj2bN7qHDzFWdYzaEtU0Ja3cpevrjLc8MnVXPP9GIbUCbne6LUbPrk62Y0ZNDRWesubQppUhCAtXUFDXdCJDEEF/SVY7iUsgoaWoGPegrZEBQ2l5e6+nOleffMYv1r9NZp+0571fj151mbOfvMYdTXFfz8BsKOccGgX1W8NM3p8Lb9btAaMM0tzyr6fAScapIS6sVF4+Ul481V490JY+v7kLFPvnB9cWctnTnqCbxzLsS7cnD/ngyt/H4C6xUuA/CHNKUfglqjAY8DKXB7g8rNO5vbPN6SMYcOtd/oYtqAhMOgYvJlGIU1mvGIGZgcJdcUuIVKooL8Ey72ERdDQEnTMW1BBQ2m5uy9nuh89HON/73ibX5g/4r/s/Skn++7Xy6aO//H2H/HEjrf5Dyc4i8EWu7j0uHA+2D2r9FD3nnNzFq9mzFlXbWWOddX23U01XweqU0KXyfLYKX/oCtoSFbTlrdzlPZefdTLNq5eyZdvzXPfD3/CNT5/FxsZTJ8wGDRoCg47Bm2ndowppMuMVOzC70O7LUpcQybd4b9BfguVewiJoaAk65i2ooKG03N2XM51/MdjRMdiVNhHjpuPuBMYXg4VwLSESOs/9khPeeBEu/m7WPyJO+E4zPPdLWHlRMnT96O6/479m6B79q6Of5VOf/JOU8BKkJSpoy1u5y6eHoncfNyf5+an94wu6Jpf4CBgCg46Rm2ndowppMuOVex22ci8hAsF+CYZtBXu/Qsa8BRU0lM627sug/IvBVgNrspVLe9ZnWJYQCZ3XDzif8/wRkSwHXF61jXXH3YpdtQ4umtg9aqrOBZzZo973/zTgu5cfxz/Hj/EP2/bxucZlfCx6HNWjQ+z91VDy+//q60f54wvem3XgvQX++IL38urrR6mrOT5w+aAte9lC0Ve2PJGy7YWioCGw2O5RT77FeKebQprMeFMRooIodrZaoS17YVvBvtyChtLZ1n0ZWMAxWmFbQiR0TnJ/4ef5I8IrdzDxBpGfXce7Tl9H1Wcmdo/ae6/i7Z9dT2LZpdRFTsz4/b/meODX7ofL+/4X0lL0jZ89zRtvj/KnzacHLg/BWvbSQ1E2XigKGhqL6R4t5LFNYVEZ/4uLBFD2Kf8lzFYrZDbooX3PMW9pPf9S3559DNjSeg7te64iWjZmWygNm7AtIRI67mOnePgW+MzdE/6I4OFvge+xU78YvJ/1r70AG+7M2D1qLvoqx32n2SnXclXy+3/iS//Kol1/z7veGH+Y+zsnLuXQmv+HN075cPL77w9F+RaDLaa8p9AxZtlCUTZBQ2OxY+QKNd1j2PS/msw6YVsSISjvL+vTcBZ3TRlTZJ/nY0PdMNRdMS0bsy2Uhs1M/3kpN/9jp8jy2KkXfI+duuxUC78hb/foZac6nX2Llq1gUeJX8HgXnH55yrpt73r4Fk5+vAs2fA+WOUvQpIeiDyyP5Kx/0PJBx5gFFTQ0Bu0e9fM/1urJFxMZH2s13WPYFNJEZpj0lo257gekTuyvlJaN2RZKZWYJ+tip+d7PZZ7u0WS5sVHnmaanX57aUre80dm+97Pw87+AM64YXx6kjIKOMQsqaGgMOkbOU+hjrUoZw1ZICMzHWJspe0ohjDE1wMjIyAg1NTXTXR2pEHt/9Qin/fAK9n76p8kFWmezoM/uFJlKKS1LY6Ms+Pd7OeWRTl66sIvDv/eZZHBKtiyNjcJ/Pxvq1mTuHr33s3BwN3x5p/PaZx+Guz4BXxzMHOpeeNx5KP3VP4GVF03t9eYwVUtYePUpZJ00rz7ZHmvlxSf/Y63S/ealET5x2yP85EsX5hzDlh4CAU72jdk7cuQI8+fPB5hvrT2S7TxqSROZZkGX7Jht1N0mYTZhzFX1BfAInLL6Ak5ZNrGLjapquOwmuO8LTiC76M98j536lvOEgw3fG28VK2L2aDkFHWNWbrm6Iw+9/nZyAoLXshd0yY5iFPJs0wtOPbGgcymkiUyzcs82FZGQWX2lE8R+fr3TCuaJrHD2r75yfF/A2aO89rLzkU/QJzGEVNDZo0GX7Aiq0BD4T9esLeh8Cmki00yz50RmsPRQdOiZ1M+e9FC0+kpnHFnse/CTr8Anvg0NX5g4rizg7NGUZ4/mcsnX4aOdhV5laAVt2SvmsVZBFBoCd/z2cEHnU0gTmWbqzhOZwbKFoh9sSt32QlF6qDvuxPHPL/sWPvNCXdDu0fRnj/77P8HDNzuL5v7e70949uhsU/YlOwoMd6+8Xlg5hTQREZFi+UNRLl4oChrqIFj3qBfudt/vlE887+x/+Gb49X1O4POXn2VKWbKjEIWGu8UnFVZOIU1ERKRYQcd2BQ11Xstb5FRo+W7mlrF9T6TWY/f9Tsvb6ZfDH/69r+XtFmd/erCbRYpdsgMKW1Kj0BB47nsXFFRfLcFRAi3BISIiZfV/uoKNMQu6xMcslW+JjFLKe7M7IXMI9GZ3FrIEh0JaCRTSRESkrILO1gzZumphNjpm8z7WCopbV03rpImIiFS6oN2pIVtXLcyqqwzvf08EgPe/J5K1i7OYddUKfbZpPlX5i4iIiMiM4F9XLZP0ddUkpyDrqqUrJATmo5Y0ERGRShF0XbVZJv2xVnsPvp7y2eM9Rqrc66rlo5AmIiJSKYKuqzbLBH1AfLnXVctHIU1ERKRSeMt1NP8V/Nv/TF1Xbd4yZ3/kVKfcvKWpExPGRuHlJ+HNV+HdC2Hp+1MXv62ABXCDPkaq3Ouq5aOQJiIiUilyPRbqtX0w8JfO196SHf7yVdVOUPP4t2fpY6RKWVdtMiikiYiIVIqgi+Wu/WPnkVQD/xVOa3YWyU12j94Mz2x1Wt/ev6G89Q6xy886mds/3zBhSY2lOdZVmywKaSIiIpUiaLfkiYth2x3O0wn8Ew2WN8Jn7nHGtW37X3D+fy5PfWeIyVpSIygtwSEiIjJbPfdL5/meF301dSYoONsX/RkknnPKzXKTsaRGUAppIiIis5UWvw01hTQREZHZSovfhlqoxqQZY9qBhLsZsdZuLvA1APUA1tq2IOcs5j1FREQqgha/DbXQtKR5Ycta22ut7QVixpiePK/pttZudj/a3H0DhZ6zmPcUERGpGG+8Ao2bnEVu773KeQD70decz/de5exv/E9OOZlyYWpJ6wRWehvW2kE3cLVlKmyMiQANxpiItTbh7u4BdhhjotbaeAHnDPSeIiIiFcW/TtreASeUearmANZZW+3tNypinbSZJhQhzRgTxelqTGQ41mStHczy0rVAFIi523H3cyTfOd2yxbyniIhIZfCvq5bviQOQ+oSCXCrkCQVBn/U52UIR0nCCViYJIJLpgBuuFqTtbnI/x3ECXK5zBn5PY8xcYK5v17ws5xAREQm/9DD1nnNzl8/1RAO/CnlCQdBnfRYa6k6wRylEWEJaNsNAkAdidQJt1tqEMVnXL/HOmSjiPTuBGwLUR0REpHKkP9Hg0DPwg03wB3fAotPH91dAKxoEf9ZnoaGu7UOFPaUg7CGt4IBmjOkGtrgTAEo5Z67jXcC3fNvzgBcLqJ6IiMjMl60bc9HpsOzsKa9OuQV91mehoe4Ee5TrCjhfWEJaPMv+SI5jScaYFmAoLaDlO2fg97TWHgWSbZQ5WutEREQq29go7NvpfL1vJyx93/gYtlmq0FB35MiRgs5nrLX5S00BY8xh4Fx3Vqa3z1prcyYhdxJAxFrb725HgFprbTzfOYt9T1/ZGmBkZGSEmpqagq9VRERkRtt9P/z8eueRUp7IqXDZTbD6yumr1wxx5MgR5s+fDzDfWps1sYVmnTScrkRv4L/XOtbr2476Fq719jUADTjrm0XdGZ2tOOPK8p6zgOMiIiLit/t+uO8LULcGvjgInS85n+vWOPt33z/dNawYoWlJg+Tisl6rVqO1tsN3rBXosNbWu9sR4FkyzMT0t4TlOmchx/PUVy1pIiIye4yNwn8/2wlkmZ5QcO9n4eBu+PLOWd/1mUuhLWmhCmkzjUKaiIjMKs8+DHd9wmk5W9448fgLj8N3muHqn8DKi6a+fjPETOzuFBERkTB7/YDzue7MzMe9/V45KYlCmoiIiBTmJHd5iYNPZT7u7T8p/zIUkp9CmoiIiBRmxQXOLM6Hb3HGoPmNjcHD34LICqeclEwhTURERApTVe0ss/HMA84kgRceh6OvOZ/v/ayz/7L/pkkDk0QTB0qgiQMiIjIrZVwnbYUT0LROWl6FThwIyxMHREREZKZYfSWccQXEvgc/+Qp84tvQ8AW1oE0ydXeKiIhIcFXVsOwc5+tl5yiglYFa0kRERKQwr73sfHgOPZP62eM9iD29fDbZHtw+yymkiYiISGG23wm/+ObE/T/YlLp9ydfho53Zy6fzyksKTRwogSYOiIjIrBK0ZSxTy9sPNsEf3AGLTp9YfpbQxAERERGZXEHDlL/82Cjs2+l8/fYbsPR9GseWhyYOiIiISHntvt95MPtPvuJs/+Qrzvbu+6evTjOAQpqIiIiUz+774b4vQN0a58HsnS85n+vWOPsV1LLSmLQSaEyaiIhIDmOjTotZ3Rr4zN1Q5WsbGhtznlJwcDd8eees6vosdEyaWtJERESkPJ77pfNUgou+mhrQwNm+6M8g8ZxTTiZQSBMREZHyeP2A87nuzMzHvf1eOUmhkCYiIiLlcdIS5/PBpzIf9/Z75SSFQpqIiIiUx4oLIHIqPHyLMwbNb2wMHv6W82D2FRdMT/1CTiFNREREyqOqGi67CZ55wJkk8MLjcPQ15/O9n3X2X/bfZtWkgSA0u7MEmt0pIiJSgN33w8+vdyYReCIrnIC2+srpq9c0KXR2p0JaCbyQ9sILLyikiYiI5DI2Ck/cA1u/Duu+CWdfNWtb0I4cOcLy5ctBIa18jDGnAC9Odz1ERERkRnqPtfalbAcV0kpgjDHAMuC1Ek81DyfsvWcSzjUT6Horm663sul6K5uud2rfe5/NEcT0gPUSuN/YrAm4UE7WA+C1XM2elULXW9l0vZVN11vZdL1TKu/7aXaniIiISAgppImIiIiEkEJaOBwFbnQ/zwa63sqm661sut7KpusNEU0cEBEREQkhtaSJiIiIhJBCmoiIiEgIKaSJiIiIhJBCmoiIiEgIaTHbaWKMaQLagAEgDjQD26y1/dNasUlijIkAG4D11trmDMfbgYS7GbHWbp662k2+XNdbqffavYcA9QDW2rYMxxPuZiXc46zXW2n32PfvGZzrjQKbrLUJX5mKub/5rrfS7m86Y8xAhv+3Kub+pku/3lDfX2utPqbhA2gBDgMWGAJap7tOk3htDUAr0A7syHC8HWj3bTcBPdNd7zJeb8Xda6A7bbsHGKjge5zveivqHrvXF51F9zff9VbU/U279hbcB+hU6v0t4HpDe3/Vkja9VlrfX6aVwlobA2LGmJYsRTqBlb7yg8aYAZy/ZGacAq4XKuheu60ODcaYiO+aeoAdxpiotTZOBd3jAq8XKuge47QktQBe68kQ4y1NUEH315XveqGy7i+Q/Lddm+FQpd1fIOf1Qkjvr8akyZQyxkRxms4TGY41TX2NpEhrcX6xebygEqnQe5z1eqe+KuVnrW22qd1bjcAgVObPcK7rrXAbgPv8Oyrx/vpMuN6wU0va9NpgjBnGSfb11tqO6a7QFIhm2Z+gQn/huSrmXrv/eS9I2+395x3HCTSZJJiB97iA6/VUzD32c1uII8B6d1dF/wxnuF5PRd1fN3BlCqIVeX9zXK8nlPdXIW36xAC8rhJjTKsxps9am/4fw2zh/XBUotlwrzuBNmttwhiTrUwl3ePk9brbFXePfYPpI0BfAV1BM/r+5rneiru/OK1lcfe6CzGj7y+5rze091fdndPEWhv3jWUBpwm2JcAPTKWZyT/8OVX6vTbGdANbrLW9eYpWxD3OdL2VeI+ttQlrba/XDWiMOZznemb0/c11vZV2f40xrTb4zMUZe3/zXW+Y769C2jRJH2Tu+6stW1NzpYhn2R/JcWxGq+R77V7bUNp4noq9x1mut6LusTEmYozpTvsFNYhz/5qosPtbwPVW2v1tALbnKFJp9zff9Yb6/qq7cxq4/xn0GWPqfc2rEffwjPshCMJtbk6kzYrzjlXcQN1KvtfeIGKvRcmbOVWp9zjb9eJ0A1XSPY7iLMHQg2+dLPdzogLvb87rrcCf4Vqc2creuMp6SK6LFrfW9lfY/c15vTiBPLT3VyFtGrjjdjan/QC0Av1hnAJcgmzN4104f6F6v+xavK9nuAnXW6n32v3rtAHod2eDgbOEgXcfK+oe57reSrvH1tpYhuvZCMR8v6Qr5v4Wcr0Vdn8H8Q2gd/9tt6a1DlfS/c17vWG+v8Y6C7nJFHOTeqtv18KwzCYplftLrAXnP7oGnLWHUlZv9v0VA9A4k6893/VW2r12r+dZMsz0stYaX7mKuMeFXG+F3mP/9dQDHf5fWpVyfyH/9Vba/fW44Wsj42vEDfiCacXcX0+26w3z/VVIExEREQkhTRwQERERCSGFNBEREZEQUkgTERERCSGFNBEREZEQUkgTERERCSGFNBEREZEQUkgTERERCSGFNBGRKeY+LzIy3fUQkXBTSBMRmXqdhODhzSISbgppIiJTr8FaG5vuSohIuCmkiYhMIWNMEzAw3fUQkfBTSBMRmVrrgf7proSIhJ9CmojI1Ipaa+PTXQkRCb85010BEZEwMsY0AGuBemAbMAi0uocT1treIs7ZAvTlONYIDAFx92PYWpsIXHkRqQhqSRMRSeMuj9Fkre211nYAdwCd1trNbpGOIk+9Ebgvw/u1As3W2g43/EVwwtraIt9HRCqAWtJERCZq9QUyz5D7OQa0FXneSHrLmDEmCnQDK327EwDW2sEi30dEKoBCmojIRMmB/W6IiuC2gKUHJ/d4C073ZCPQk2nMmdta1pPhvXqAwbTw1owTBkVkFlNIExFJkxaymoB4jrFhfdbacwGMMYPAg8C5Gcqtt9Y2Z9jfhDPj068BZwyciMxiGpMmIpJbM2lLZniPdHInFyS5QS7itq6ll0+kn9hXLr3VTGupiYhCmohIOrdr0tOCM7szeczXqpZtYH9D2na2rk4gteXOXewWa+2gMaYhPQiKyOyhkCYi4uMGtG736xZ83Y4ZHooeAYbT9iWA2rR9zZkmAbjhLO4FMff8bTjj28CZYaqxaSKzlMakiYikGgR63bC2HSc0dRhjAGrT1kdLMDGQRfAFN7dLM9fiteuBNmPMDgBr7XpjTJ/7/gpoIrOYsdZOdx1ERGYktwXsDm/igLvvMHCu14VpjOkGtqhFTESCUneniEiR3OAV8bbd7sp42uzQBgU0ESmGujtFREqz3m0t24azTlpyOQ23pU0BTUSKou5OEZEyMcb0AN16oLqIFEPdnSIi5VOrgCYixVJLmoiIiEgIqSVNREREJIQU0kRERERCSCFNREREJIQU0kRERERCSCFNREREJIQU0kRERERCSCFNREREJIQU0kRERERC6P8CeTcCrJtaS18AAAAASUVORK5CYII=\n",
+ "image/png": "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\n",
"text/plain": [
""
]
@@ -300,7 +301,7 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAGNCAYAAADaX58UAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAq7ElEQVR4nO3df2xd5Z3n8c+TlMQwse/NjzExxIE4tGVMujBOnJaoaFaDzZLRZItGSYgEXQmtSMioq261VdJUdLOIKplEbVdoqjJx/2wy6hBmBAqasGBmFlE1DVAP0oZsmGIDodQZE4d7b9Jgh7W/+8c917m+uT/OOb4/zr33/ZIscs85OfdhzjT58Dzf53ucmQkAAADBzav1AAAAAOoVQQoAACAkghQAAEBIBCkAAICQCFIAAAAhEaQAAABCIkgBAACE9LlaD8AP51xc0nZJMrODtR0NAABAWr3MSPVJWlrrQQAAAGSrixkpM3vWObdEUjzo73XOOUk3SbpY7nEBAICG1irpd1bkNTBVC1Le8txWSVvMrD/P+V2SEt7HeBmX8G6S9Nsy3QsAADSXFZI+KnSyKkHKOdcjaZ3SM0pL8pzfJUlmNuB97nPOHTKzHWX4+ouS9OGHH6qtra0MtwMAAI0ulUqps7NTKrGiVZUgZWZDkoacc5sLXLJH0qqs6wedcy9LKkeQkiS1tbURpAAAQFnVvNjcOdel9FJeIs+5vhD3W+ica8v8KL2+CQAAUHY1D1KSugocT8grLvcCVb+k/iKzWhl7JCWzfqiPAgAAFRHlXXsX5NVTmdmgpEGfv2+/pB9lfW4VYQoAAFRAlIPUNUXpfpjZpKTJzOd09wMAAIDyi8LS3kiB4/Ei5wAAAGqu5kHKzEYkJbyi89xzfpfzAAAAqq7aQarQct1+pV8DI0nyCsoHqjIiAACAkKoSpJxzXV7TzR2SepxzB7J333ldzOPOuc3e8d4yNeMEAACoGFfk9TENwesllUwmkzTkBAAAvqRSKcViMUmKmVmq0HU1r5ECAACoVwQpAACAkAhSAAAAIRGkAAAAQiJIAQAAhESQAgAACIkgBQAAEBJBCgAAICSCFAAAQEgEKQAAgJAIUgAAACERpAAAAEIiSAEAAIREkAIAAAiJIAUAABASQQoAACAkghQAAEBIBCkAAICQCFIAAAAhEaQAAABC+lytBwAAAFALU9Om19+7oLGLE2pvbdH6VUs0f54LdA+CFAAAaDovnhrVE8dOazQ5MXOsI9aivZu6df+aDt/3cWZWifFFhnOuTVIymUyqra2t1sMBAAAV5GeW6cVTo9p5eEi5CShz1dMP92jDyj9QLBaTpJiZpQp9HzNSAACgIfiZZRpNfKrHnzt1TYiSNHPs8edO6W//07/z9Z0UmwMAgEibmjadGB7X8299pBPD45qavjYGZWaZskOUJJ1LTmjn4SG9eGpUkvTkC6d1/tKVot93/tIVHfxfZ3yNjRkpAAAQWX5mmaamTU8cO11wlslJeuLYafV3L9enn035+l6/1zEjBQAAIsnvLNPRN89ec002kzSanNDRN89q67pOX9/9F3+8wtd1BCkAAFB1pZbrSs0ySelZpqlp009fe8/Xd/70tfd03x3L1RFrUaEmB07pGa8//aMbfd2TpT0AAFBVfpbrgswyPXrPKn3nH06V/N5H71ml+fOc9m7q1s7DQ3LSrKCWCVd7N3X77ifFjBQAAKgav8t1QWaZtqxb6WuWacu6lZKk+9d06OmHe7Q81jLruuWxFj39cE+gPlLMSAEAgLIo1cMpSFF4pWeZ7l/Tof7u5XQ2BwAAtVfu5bot61bqqVfe1bnkRN7g5ZSeQcqdZcodw/Ii3crnz3O6e/XSUP++M+OgszkAAJgLP53C71/ToXt/+L81/PHvS95v9R/+gV75b/9+5r5S/lmmfMtw5Xh/niSlUilfnc2pkQIAAAWVc3fdo/es8vWdmevC1DJlZpm+dtfNunv10lAhKgiW9gAAQF61Xq6TylfLVCnMSAEAgGtUYnddpihc0jU77Iq1Hqj2LFMQBCkAADBL1JbrooylPQAAmkypguyX3j7na7nupbfPNeRyXRAEKQAAmoifuqdn3vzQ172eefNDbfxSR6hO4eVoPRAFLO0BANAk/NY9XX/dfF/3y1zXaMt1QdBHCgCABlBquW408ak2/fgXOn/pSsF7LFu0QMe+8VVJ8n1tR/x632OoJ377SNXF0p5zbrOkJZLWSjpqZoM1HhIAAJHhZ7nuyRdOFw1GknT+0hU9+cJp/eThtfr+A2uKNsP8/gNrZoUoqXGW64KI/NKec65HksxsQNJuSUdrOyIAAKLD73Ldp59N+bpf5rpmXq4Loh5mpJZI6pf0rJklnHMXnHM9ZjZU64EBAFBLQV4CvHVdp/75nY9L3nPrus6ZXzfS7rpKKUuQcs7FJW2VtMXM+vOc3yUp4X2Mm9lBv/f2lvGyl/KWEKIAAM2gVM1R0K7iHbGWkm0K7rtj+azjzbhcF8Scg5S39LZOUlzp2aPc87ukmaU5Oef6nHOHzGxHiO86JOnROQ0YAIA64KfuKUhX8W3rbwnVpgDFlW3XnlcQvsfM1uYc/0TSKjNLZB0zM3Per3dJyhd1x7Nnrrz7y8yeDTgudu0BAOpKpu4p92/oTMTJ1Cj9/PUP9J1/OFXyfn/1F2u0bf0tM/cuFdAQkV17zrkupZfyEnnO9ZnZoJ9lPudcn6SEmQ16M2AJMxsp/4gBAKgsP20KHn/uVNHXszz+3CnduSLe9F3Fo6DSxeZdBY4nlF4KLMkLY0e9X0vpYFbwaTvnFkpamHWo1c/3AABQaZVoU9DMXcWjoFbtDy4oTz1VPmY2YmaLs35KReY9kpJZP7+d21ABAJg72hQ0plq1P/AVokLaL+lHWZ9bRZgCANQQbQoaV6WDVKE6pniRc3NiZpOSJjOfveVAAAAqplTd00tvn/PVpuClt8/pvjuW06agjlQ0SJnZiHMu4Zzryi0O5zUvAIBG4Kfu6Zk3P/R1r2fe/FAbv9RBm4I6Us4aqULLdfsl9WU+eG0MBsr4vQAA1ITfuqfrr5vv636Z66h7qh9z7iPl7arbLOlBST2SDkp6I7vfk9crKjMj1Wtmu+f0pcHGRx8pAEBgftoUbPrxL4rusFu2aIGOfeOrkuT72uwXAZcaAyrHbx+psjXkjCqCFAAgKD/LdX95+Nf6x1PnSt7rz9Ys108eXjszeyXlX65jpila/AapWrU/AAAgkmhTgCBq1f4AAIDIoU0BgiJIAQDgoU0BgmJpDwDQNKamTSeGx/X8Wx/pxPC4pqZnR6AgbQrmz3Pau6lb0tU6pwzaFDQPZqQAAE3BTwF52DYFufddnnNfNC527QEAGl6mgDz3b7zcHXNBWhrQpqCxsWsPAACl+z09/typggXkJunx505pNPGpOuLX6/sPrJFT/uU6J+n7D6yZFaKkq3VPX7vrZt29eikhqokQpAAAda1U3dOTL5wuOsMkSecvXdGTL5yWRJsCBEONFACgbvmpewra70miTQH8Y0YKAFCX/DbOzO7jVEzudSzXwQ+CFACg7gSpe8r0eyoUg5zSs1i5/Z4APwhSAIDIKWfdE/2eUEnUSAEAIqUSdU/0e0Kl0EcKABAZfvs9Hf8/o9p5ZKjk/Z5+qEcbv3Q1JNHvCX757SPFjBQAoCpKhZhSdU9Suu7pzhVx3nOHyCBIAQAqzs9yXZC6p588vFZ7N3Vr5+EhOWlWmKLuCdVEsTkAoKL8tikIW/dE40zUEjNSAIDQyrlct3Vdp/75nY9Lfmd2vycaZ6LWCFIAgFD8LNf94KV3fC3X/eCld3Rw853UPaHusLQHAAjM73Ld6j9c5Ot+q/9wEf2eUJcIUgCAWUo1w5yaNj1x7HTR5bonjp3W1LRp+ONLvr4zcx11T6g3LO0BAGb4Wa576e1z18xEZTNJo8kJvfT2OX37vi/q1X/9uOjy3rJFC/Tt+74485m6J9QTZqQAAJL8L9c98+aHvu73zJsfqiN+vb7/wBo55V+uc5K+/8AadcSvn3WOFwajXhCkAACBXgJ8/XXzfd0zcx3LdWhkLO0BQBMo1aYgyO667/15t15//0LJ5brv/Xn3zGeW69CoCFIA0OD81D0F2V2XWa7beTj9rrt8XcWLLdcBjYSlPQBoYH7rnthdB4TjzPKtiDcO51ybpGQymVRbW1uthwMAVTOa+FSbfvyLkktwx77xVUnyfW32TFOpJUOgXqVSKcViMUmKmVmq0HXMSAFAgwpS98TuOiAcghQANKggdU8Sy3VAGBSbA0CdKrWsFrTuSWJ3HRAUQQoA6pCfnXhhuopL7K4DgmBpDwDqjN+deGHrngD4R5ACgDoSpAO5RN0TUGm0PwCACClV9/SXh3+tfzx1ruR9/mzNcv3k4bW+7wtgNr/tD6iRAoCI8FP39OlnU77ulXsddU9AZbC0BwAVNjVtOjE8ruff+kgnhsc1NX3tSoDfuqet6zp9faff6wDMDTNSAFBBfmaZStU9Sem6pztXxHXfHcvVEWvRueRE3uud0vVP992xvNz/KgDyYEYKACrE7yxTkA7k8+c57d3ULSn/TjxJ2rupm/onoEoIUgBQAUF219GBHKhfLO0BQAildsEFmWXyiw7kQPQQpAAgID91T3d1xvX3Qx+VvNddnXH1/dGNdCAH6lRdLO05544653q8nwO1Hg+A5uW37mnZooW+7rds0UI6kAN1rC6ClKQuSa9IOiBpf43HAqBBlWpTEKTu6fRowf59s2Suo+4JqE/1srS338yerfUgADQuP8t1T75w2lfd05MvnNb/+I93qHXh57Tv+JmC13534+164I9vnvlM3RNQf8oSpJxzcUlbJW0xs/4853dJSngf42Z2MOBX9DrnJGmJJJnZQOjBAkCOzHJd7kxTZrkuMyMUpKt4e1uLtv/Jaq1cekPJgJaNuiegvsw5SDnneiStkxSXF3Ryzu+SroYf51yfc+6Qme3w+x1mtjvrfsPOuWfMLDHHoQNoAqV21wVphrl1Xaf++Z2PS35ndldxZpmAxjbnIGVmQ5KGnHObC1yyR9KqrOsHnXMvS9ohzQStfP/5NW5mB7379maFqYTSNVNDcx07gMbmZ7kuSJuCg5vvDNVVnFkmoHFVtEbKOdel9FJeIs+5PjMb9LHMN6Kry4Ly7keIAppYqVkmyf9yXZBmmJmu4jsPD8lJs+5NV3GgOVW62LyrwPGE0kuBJZnZkHNuc2ZmStI1NVjZnHMLJWXvO2718z0A6kO5312X3eSymMx1md11uWNYXqTuCUDjqtWuvQvKU09VSNaOPT879/ZI2htmUACize8sU5Dddd/78+7AzTCpewKQUas+Ur5DVAj7JcWyflZU8LsAVEmQHk5BdteFbYaZqXv62l036+7VSwlRQJOqdJAaKXA8XuTcnJjZpJmlMj+SLlbiewBUV5Ci8Oxdc8VkrqMZJoCwKrq0Z2YjzrmEc67LzEZyzg1W8rsBNJYg7667747lgXfXsVwHIIxyBqlCy3X7JfVJyvSR2pz5NQBklNqJF+TddWF319GmAEBQ5WjI2SVps6QHJWVeKvxGpkDc6wW1K6vPVG+QZpwAGp+fnXhB3l238Usd7K4DUBXOLN/Ed+NwzrVJSiaTSbW1tdV6OAByFNqJl5krytQojaUm9Ny/fOTr3XXtbVdrnfz0nAKAXKlUSrFYTJJiXs11XgQpABXj5/Usm378i5KtB45946szu+b8zF4BwFz5DVK16iMFoMGV+/UsP9x6lySKwgFEC0EKQNlV4vUs2SgKBxAVtWrICaBBBWmcGfT1LAAQNQQpAIFMTZtODI/r+bc+0onhcU1Nz45MQZbrvn3fF7Vs0YKi1+a+ngUAooSlPQC++al7CrJcl3k9y87DQ5Ly93vK93oWAIgKZqQA+JKpe8oOUdLVuqcXT41K8r8Ml7mO17MAqGe0PwBQUpA2BZICtzSQ6PcEIFr8tj9gRgpAWeueMst1TleX5zIyx/It12V24n3trpt19+qlhCgAdYEaKaDJlbvuSRKvZwHQNAhSQIPys1Tmt99TmDYFNM4E0AwIUkAD8jPLVKrfk5Tu93Tniri+fd8X9eq/flyy7im3TQGNMwE0OmqkgAYylprQwKvDeizP7rrR5IQeOzykgVeHNZaaqErdEwA0OoIU0EB+9qsPtO/4maLX7Dt+Rj/71Qeh655oUwAAV7G0B9SRUnVP3R3+Wnx0d7Rp8P/+m69rqXsCgMIIUkDEjaUmNHZxUr9897wGXhuZtRy3bNECbb+nSxtuW6b21oU6f2nS1z3PX5qk7gkAyoAgBUTckZNn9dQrv8l77vylKzNLed+89/P67SeXfd3zrQ8T+vrdt/J6FgCYI2qkgIjb1tvp68W+23o7A78EmLonAJgbZqSAiHt//LKv3XXvj1/W3auXBp5lou4JAMIjSAE1VqqAfOziRJHffVXmujBdxal7AoBwCFJADflpnNne2lLot8+SfR2zTABQHQQpoAbGUhN67l8+ytvzKdM487sbb9cDf3yz1q9aoo5Yi84lJ/J2IXdKzzatX7Vk1nFmmQCg8ig2B2ogSOPM8UuTemTDrXlDlJSug3pkw60a99n6AABQPsxIARVQzsaZxdofZOw7fka/vzKlb/V/YU7jBgAEQ5ACysxP3dOVqWlf97oyNa2HvrxS/d03SkoHtLd/l9Qnlz/T4huu0x03xWYCWnvrwjL/mwAASiFIAT6V3F0XoO4pSAF5e1v6J+POzvic/10AAOVBkAJ88DPL9LNffaC//qd3i95n3/Ezujj5//Rf+74QqoAcABAtFJsDJbx4alQ7Dw/NClGSdC45oZ2Hh/TiqVFJweqeKCAHgMZAkAKKGE18qsefO5U38Jj38/hzpzSa+DRQ3dORk2d97do7cvJs4DEDAKqHpT00tVJ1Tz946R1fr2f5wUvvqO+PbvT1nQvmz6OAHAAaBEEKTctP3dNdnXH9/dBHJe91V2dcp0dTvr739GhKG7/UQQE5ADQAlvbQlPzWPd3W3urrfre1t+rrX7lF3914e9Hrvrvxdn39K7eEGzQAIHIIUmg6Qeqebl16g5YtWlD0fssWLdCtS29Qe1uLtv/Jav3Nwz3qiM1ub9ARa9HfPNyj7X+yetZMFACgvrG0h6YTpO5pxeIbfF378zc+nOkqzguDAaB5EKTQdILUPf2HO5arv/tG/fLd8xp4bWRWqFq2aIG239OlDbctu6YonBcGA0BzIEih4ZTaiRek7inTVXzNzTH953u6mGUCAMxCkEJD8bMTL1P3VGzJLlP3lI1ZJgBALorN0RDGUhMaeHVYj+XZiZd5z93Aq8MaS03o52986LvuCQCAYpiRQkMI8p67r3/lllB1TwAA5CJIoSEEec8ddU8AgHIhSKEhBHnPXTbqngAAc0GQQl0otROvvdVfk0u/1wEA4EddBCnn3Obsz2b2bK3GguoZS01o7OKkr1qmsDvxAACYi8gHKedcXFKXmR30Ph+SRJBqAkdOntVTr/wm77nzl65o3/EzkqRv3vv5mWPF5HYgBwBgriIfpMws4Zzb4ZwbNLMhSYlajwnVsa23U0dOflBylmlbb6fmz3PsxAMAVF1ZgpQ3a7RV0hYz689zfpeuBqB4ZnYpgN2Sfu2cG5J07xyGijry/vhlX7NM749f1t2rl7ITDwBQdXMOUs65HknrJMUlLclzfpckmdmA97nPOXfIzHYE+JpeSWslHZD0ivdrNLixixOlL8pzHTvxAADVMucg5S23DeUWhGfZI2lV1vWDzrmXJe2QZoJWvr/1xs3soHffl73v6XfOHXLO9ZnZ4FzHjtpiJx4AoN5VtEbKOdel9FJeIs+5PjMb9LHMt0TSSNbnlyVdKPKdCyVlF8L4e0MtqiLITrz1q5aoI9aic8kJWZ57OUnLY+kABgBALVS62LyrwPGE0kuBJZnZgHNul3NunXfogjc7VcgeSXt9jxBVFWQn3rf6v6C9m7q18/CQnDQrTGXmrfZu6qb+CQBQM7V6afEF5amnKsTMDprZgPdTqvXBfkmxrJ8V4YeJctvW26llixYUvSazE28sNaEVi2/Qno23a2nO71m6aIH2bLxdKxbfoLGUv1oqAADKrVbtDyq2FmNmk5ImM5+dY7YiSoLsxPvVyHig2SsAAKqt0kFqpMDxeJFzaGBBduI99OWV6u++seS19IYCANRKRYOUmY045xLOuS4zG8k5x667BlTOnXjtbekfAACiqpxBqtBy3X5JfZIyfaQ2Z36NxvLiqVE9cey0RpNXZ506Yi3au6lb96/pkCR24gEAGsqci82dc11eL6gdknqccweye0p57Q3izrnN3vHegM04EXFjqQkNvDqsxw4PzQpRkjSanNBjh4c08OqwxlITGr80qUc23Jo3REnpnXmPbLhV45cmC1wBAEB0OLNCf6U1Budcm6RkMplUW1tbrYfTkH740jv66396t+R1/+VPb9M85woWkGejgBwAUEupVEqxWEySYmaWKnRd5F9ajOjr7vAXULs72rT2lsUzBeRT06a3f5fUJ5c/0+IbrtMdN8Vm6qkoIAcA1AOCFObsytS07+tyC8jv7IxXaFQAAFRerRpyooHwTjwAQLMiSGHOMjvxCrU+dUrv3mMnHgCg0RCkUNLUtOnE8Lief+sjnRge19T07A0K7MQDADQraqSQ11hqQmMXJ/XLd89r4LWRWa91WbZogbbf06UNty1Te+vCoi8izth3/Ix+f2WKnXgAgIZC+wPk9T9f/lffbQoe+vJKjV1MzzaV2olHp3IAQD2g/QHmZFtvp46c/KDoC4aXLVqgbb2d7MQDADQtaqSQ1/vjl4uGKEk6f+mK3h+/XKURAQAQPQQp5DV2caL0RQGuAwCgERGkkBe9oQAAKI0ghbzoDQUAQGkEKeRFbygAAEojSCGvIyfPat/xM0Wv2Xf8jI6cPFulEQEAED20P0BeD315pfq7b5RUujcUAADNiiCFvOgNBQBAaSztAQAAhESQAgAACImlvSY1NW16/b0LGrs4ofbWdBuDTN0TAADwhyDVRMZSExq7OKlfvnteA6+NzHoFzLJFC7T9ni5tuG0ZLxcGAMAnglQTOXLyrJ565Td5z52/dGWm3cE37/28vtX/hWoODQCAukSNVBPZ1tupZYsWFL1m2aIF2tbbWaURAQBQ3whSTeT98cuzlvPyOX/pit4fv1ylEQEAUN8IUk1k7OJEWa8DAKDZEaSaSHurvwJyv9cBANDsCFJNZP2qJeqItahQkwMnqSOWboUAAABKI0g1kfFLk3pkw62yAudN0iMbbtX4pclqDgsAgLpFkGoiR06enWlxUMi+42d05OTZKo0IAID6Rh+pJvLQl1eqv/tGSenO5m//LqlPLn+mxTdcpztuis10Nm9vXVjLYQIAUDcIUk2kva1lVsfyOzvjtRsMAAANgKU9AACAkAhSAAAAIRGkAAAAQiJIAQAAhESQAgAACIkgBQAAEBJBCgAAICSCFAAAQEgEKQAAgJAIUgAAACERpAAAAEIiSAEAAIQUqZcWO+fikrZLkpkdLHUcAACglqI2I9UnaWmA4wAAADUTqSBlZs9KGvZ7HAAAoJYCLe15S2xbJW0xs/4853dJSngf4yzDVdfUtOn19y5o7OKE2ltbtH7VEs2f52o9LAAAGpbvIOWc65G0TlJc0pI853dJkpkNeJ/7nHOHzGxHeYaKfMZSExq7OKlfvnteA6+N6PylKzPnli1aoO33dGnDbcvU3rpQ7W0tNRwpAACNx3eQMrMhSUPOuc0FLtkjaVXW9YPOuZcl7ZBmgla+OqdxZq7CO3LyrJ565Td5z52/dEX7jp+RJH3z3s/rW/1fqObQAABoeGXZteec61J6KS+R51yfmQ1WKyw55xZKWph1qLUa31sr23o7deTkB7NmonItW7RA23o7qzgqAACaQ7mKzbsKHE8ovRToi3OuT1K/pP7sma9CxwvYIymZ9fNbv99fj94fv1w0REnpman3xy9XaUQAADSPSveRuqA89VSFmNmgpEG/xwvYL+lHWZ9b1cBhauziRFmvAwAA/lU6SPkOUeViZpOSJjOfnWvsXWvtrf4KyP1eBwAA/CvX0t5IgePxIudQButXLVFHrEWF4qKT1BFLt0IAAADlVZYgZWYjkhJe0XnuOb9Lcghh/NKkHtlwq6zAeZP0yIZbNX5pssAVAAAgrDBBqtDUxn6lX+UiSfKKwgfCDAr+HTl5dqbFQSH7jp/RkZNnqzQiAACahzMrNJeRc2F6tmmzpAcl9Ug6KOkN7/UtmWt26epSXq+Z7S7vcINzzrVJSiaTSbW1tdV6OGWXacgppTubv/27pD65/JkW33Cd7rgpNtPZnIacAAD4l0qlFIvFJClmZqlC1/kOUvWq0YMUAAAoP79BKlIvLQYAAKgnBCkAAICQCFIAAAAhEaQAAABCIkgBAACERJACAAAIiSAFAAAQEkEKAAAgJIIUAABASAQpAACAkAhSAAAAIRGkAAAAQiJIAQAAhESQAgAACIkgBQAAEBJBCgAAICSCFAAAQEgEKQAAgJAIUgAAACERpAAAAEIiSAEAAIREkAIAAAiJIAUAABASQQoAACAkghQAAEBIBCkAAICQCFIAAAAhEaQAAABCIkgBAACERJACAAAIiSAFAAAQEkEKAAAgJIIUAABASAQpAACAkAhSAAAAIRGkAAAAQiJIAQAAhESQAgAACIkgBQAAENLnaj0AFDc1bXr9vQsauzih9tYWrV+1RPPnuVoPCwAAiCAVaS+eGtUTx05rNDkxc6wj1qK9m7p1/5qOGo4MAABIEVvac87FnXO7nHO7Cpzf7Jzrq/a4qm0sNaGBV4f12OGhWSFKkkaTE3rs8JAGXh3WWGqiwB0AAEA1RCpISeqTtDTfCedcXNIeSfEqjqcmfvarD7Tv+Jmi1+w7fkY/+9UHVRoRAADIJ1JBysyelTRc4PRWSX9XxeHUTHdHW1mvAwAAlRGoRsqbFdoqaYuZ9ec5v0tSwvsYN7ODcx2gd98eSYOSNpfjflF3ZWq6rNcBAIDK8D0j5YWZrUovrS3Jc36XJJnZgJkNSBpyzh0q0zi7zGykTPeKvPbWlrJeBwAAKsP3jJSZDSkdjgrNCu2RtCrr+kHn3MuSdkgzQStf/dN4sZkr7/eNeN/bK2m1c27EG09DWr9qiTpiLTqXnJDlOe8kLY+lWyEAAIDaKUv7A+dcl9JLeYk85/rMbDDsMl/273PO9Up6o5FDlCTNn+e0d1O3dh4ekpNmhalMB6m9m7rpJwUAQI2Vq9i8q8DxhALssvNaG/RL6s+d+fLO9Ul60Atuhe6x0DnXlvmR1Or3+6NiLDWhFYtv0J6Nt2vpogWzzi1dtEB7Nt6uFYtvoP0BAAA1VumGnBeUp56qEDMbVLqovNC5tT5us0fSXr/fGUVHTp7VU6/8Ju+585euzLRG+Oa9n9e3+r9QzaEBAIAslQ5StSji2S/pR1mfWyX9tgbjCO2hL69Uf/eNJa9rb11YhdEAAIBCyhWkCu2oixc5VxFmNilpMvPZufqrI2pva1F7GzvyAACIurIEKTMbcc4lnHPXtCnwluQig5cAAwCAcgkTpAot1+1Xuhh8QEq/Fy/z66jgJcAAAKCcnFm+TkV5LkzvlNss6UFJPZIOKt2K4Nmsa3bp6lJer5ntLu9wg/N27iWfPfGOvv3cb67py5SZi3r64R7CFAAAkCSlUinFYjFJiplZqtB1voNUvcoEqXX//Xl9PDk//zVKN7j8xe4/ZZkPAAD4DlKRemlxJf1barLgOZM0mpzQ0TfPVm9AAACg7jVNkPLjp6+9V+shAACAOkKQyvLoPatKXwQAAOBpmiB1Y9tCFap+ckrv3tuybmU1hwQAAOpc0wSp72y8XZKuCVO1eAnw1LTpxPC4nn/rI50YHtfUdGMX/AMA0Kgq/YqYyOjvXq6nF7Ve00dqeZX7SNHLCgCAxtE07Q+SyaTa2tpq2tn8xVOj2nl4iF5WAABEnN/2B00zI5Uxf57T3auXVv17p6ZNTxw7fU2IktLtF5ykJ46dVn/3cnpZAQBQJ5qmRiqMctYyHX3z7KzlvFz0sgIAoP403YyUX+WuZfLbo+qnr72nbetvCXx/AABQfcxI5ZGpZcqdQTqXnNDOw0N68dRo4Hv67VFFLysAAOoHQSpHqVomKV3LFHSZb8u6leqItdDLCgCABkKQyhG2lqlUPdX8eU57N3VLikYvKwAAMHfUSOUIU8vkt57q/jUdevrhnpr3sgIAAOXRdH2kSvn56x/oO/9wquR1f/UXa7Rt/S2hekPVspcVAAAozW8fKZb2cgSpZQpbT5XpZfW1u27W3auXEqIAAKhTBKkcQWqZ6A0FAEBzI0jlkallWh5rmXV8eaxl1lJdkHoqAADQeCg2L+D+NR3q715etJbp0XtW+aqnojcUAACNiSBVRKn38m1Zt1JPvfKuziUn8tZJOaVnsegNBQBAY2Jpbw7oDQUAQHMjSM2R33oqAADQeOgjVSb0hgIAoHH47SNFjVSZlKqnAgAAjYelPQAAgJAIUgAAACERpAAAAEIiSAEAAIREkAIAAAiJIAUAABASQQoAACCkpukjlUoV7KUFAAAwi9/c0AydzW+W9NtajwMAANSlFWb2UaGTzRCknKSbJF3MOtyqdLhakXMc0cZzq088t/rEc6tPPLfyapX0OysSlhp+ac/7l5+VJNPZSpJ0sdj7cxAtPLf6xHOrTzy3+sRzK7uS/zek2BwAACAkghQAAEBIzRqkJiU94f0T9YPnVp94bvWJ51afeG5V1vDF5gAAAJXSrDNSAAAAc0aQAgAACIkgBQAAEBJBCgAAIKSGb8iZyzm3S1LC+xg3s4M1HA7ycM7FJW2VtMXM+vOc5xlGlPdsJGm1JJnZjjznE95Hnl0EZP3vTUo/ty5Jj5pZIusanlvEOedezv3zkudWHU01I5X5Q97MBsxsQNKQc+5QjYeFLM65HqX/UI9LWpLnPM8wopxzB8zsoPezwzv2ctZ5nl00HZA06D2X3ZIuSDqaOclziz7n3GZJfTnHeG5V0lTtD5xzn0halfNfWmZmrvDvQi14fzDsMbO1Ocd5hhHkzWocVXoWMeEd65H0a0mrzWyEZxdNXth9OTNb4f0FvMfMFnufeW4RljWjeCj7mfDcqqdpZqScc11KT20m8pzru/Z3IGp4hpG3TulloYwR759xnl10mVl/zpJPr6RBif/N1Ymtkp7JPsBzq65mqpHqKnA8ofQyEqKPZxhR3h/Yi3MOZ/7AHlE6ZOWTEM8uMryZ4LikLd4h/jcXYV4oGsxziudWRc0UpAq5oDy1OKgrPMNo2iNph5klst5In4tnFwFZy0NxSUfzzWTk4LlFQ9xbNo/7vJ7nVgFNs7RXBP9PVf94hhHjnDsg6e+8ItdieHYRYGYJryg5Uyf1SYm/nHluNeac225mzwb8bTy3CmimIDVS4Hi8yDlEC8+wDnjLQ8M5dTc8uwhyzsWdcwdyQtOg0s+lTzy3SPI2crxZ5BKeWxU1TZAysxFJCa8IL/dcvjVmRAzPMPoyhayZmSjvL+ounl1kdUnapdkzFXHvnwmeW2QtkdTnnNvl7bI8IKV3XDrnNvPcqqtpgpRnv7J6bXj/5Vxq6QG1UWgKmmcYUd5/Jfco3a+my/tDfLvSdRkSzy5yzGxI0kHvL96MByUNZf2Fy3OLGDMbzOrZdlDSIe/4wazlPp5blTRVHylppkdK5g+NXq8BHSLC+8t3s9J/mPdIOijpjexaAJ5h9HhLQ+8pz46gnN42PLuI8Z7d9qxDqyXtztPZnOcWQV5AelDpPzcPKt0TLNO+gudWBU0XpAAAAMql2Zb2AAAAyoYgBQAAEBJBCgAAICSCFAAAQEgEKQAAgJAIUgAAACERpAAAAEIiSAFAHt7rbeK1HgeAaCNIAUB+e5R+Fx0AFESQAoD8erx30QFAQQQpAMjhnOuT9HKtxwEg+ghSAHCtLZKeLXkVgKZHkAKAa3WZ2UitBwEg+j5X6wEAQFjOuR5J6yStlvSGpEFJ273TCTMbCHHPzZKOFjnXK2lY0oj3c8HMEoEHD6AhMCMFoC55rQn6zGzAzHZL+qmkPWZ20Ltkd8hbPyjpmTzft11Sv5nt9gJaXOlAtS7k9wBoAMxIAahX27NCU8aw988hSTtC3jeeO8PknOuSdEDSqqzDCUkys8GQ3wOgARCkANSrmWJwL+jE5c0k5YYb7/xmpZfieiUdylcD5c06HcrzXYckDeYErH6lAxuAJkaQAlCXcoJQn6SRIrVKR81srSQ55wYlvSJpbZ7rtphZf57jfUrv5MvWo3RNFoAmRo0UgEbQr5x2BZnXu3gF6TO8sBX3Zqlyr0/k3jjrutzZJ3pNASBIAahP3jJcxmald+3NnMuanSpUDN6T87nQsp6k2TNgXsNOmdmgc64nN6wBaB4EKQB1xwtRB7xfb1bWElueFw3HJV3IOZaQtCTnWH++wnEvQI1kwpJ3/x1K11tJ6Z2D1EoBTYoaKQD1aFDSgBeo3lQ62Ox2zknSkpz+UQldG5riygpX3vJdsQacWyTtcM79WpLMbItz7qj3/YQooIk5M6v1GACgYryZpJ9mis29Y59IWptZrnPOHZD0d8wsAQiKpT0ADc0LR/HMZ29pbiRn118PIQpAGCztAWgGW7xZpzeU7iM108rAm7EiRAEIhaU9AE3NOXdI0gFeUgwgDJb2ADS7JYQoAGExIwUAABASM1IAAAAhEaQAAABCIkgBAACERJACAAAIiSAFAAAQEkEKAAAgJIIUAABASAQpAACAkP4/++OkbBj6YOAAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
@@ -313,7 +314,7 @@
],
"source": [
"difference_m_eff = np.abs(periodic_m_eff - m_eff)\n",
- "difference_m_eff.show([0, 47], logscale=True)"
+ "difference_m_eff.show([0, 47], logscale=True, auto_gamma=True)"
]
},
{
@@ -356,13 +357,13 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 19,
"id": "165550d9",
"metadata": {},
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlMAAAGLCAYAAADjxBc3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABHXUlEQVR4nO3df3hcZZ3//9fdsrTWNpmmpbQWrEwtai2C09ZVL5GVThBEXNxP2roK7rULJB+UtbuVnRjd/fhRd62TrVyLen3dSUHdtbq0yUcRVJAZuiJ7IdImdAErS80A0looJZ20BQua3N8/zpzpzGR+ZjIzJzPPx3XNlZxz3zPnfU7Tk3fuX8dYawUAAIDJmVHvAAAAAKYzkikAAIAKkEwBAABUgGQKAACgAiRTAAAAFSCZAgAAqADJFAAAQAVOq3cA1WaMMZJeI+l4vWMBAADTyjxJv7VFFuVs+GRKTiJ1oN5BAACAaeksSQcLVWiGZOq4JD3zzDNqaWmpdywAAGAaOHbsmM4++2yphJ6tZkimJEktLS0kUwAAYMoxAB0AAKACJFMAAAAVIJkCAACoAMkUAABABUimAAAAKkAyBQAAUAGSKQAAgAqQTAEAAFSAZAoAAKACTbMCOgA0osPHTurw8ZeL1ls0b5YWtcyuQURA8yGZyiH95jQ2bvXL347q6Eu/1/w5f6Q3v6ZVM2cYSdycANTfd37xG9187/6i9TatW6G/bT+3BhEBzafiZMoY45O0QdJ6a217jvJQ8tvlkmSt7cpRnkhu+qy1veWUVwM3JwDTxUf++LVqX3lmavvXh0/ob3bs1b9svECvXzQ3tX/RvFn1CA9oChUlU8aYgKQ1knyS2nKUh6213WnbEWNM1E263ETLWtuX3A4aYyJuwlWsvFo+8sev1atPn6kv3vV43jqfvuyNuvKtS6sZBgAUtahlds4W8tcvmqtVS1vrEJHU23vqb94XXnhBXV1dGhgYUCgUKvAuFNLV1aWdO3eqv79fwWCw3uEUNTQ0pO7ubsXjcQ0PD9c7nKqraAC6tXYomejEs8uSLVaB5FdXRFLQGONPbvdI6kv7vJikzrT6xcqrYsHcWfrmA0/lLTeSvvnAU1owl7/0AHjH2LjVIwcSkqRHDiQ0Nm5rHkNXV5eCwaBCoZBCoZDC4bC6u7u1e/fumscyVfr6+opXSuru7tb69eunPIZIJCK/31+8okcEAgF1d3cXr5hDOdfbK6o9m2+NpPR/fTfp8iUTKp+1NpH9pmQLVMHyfAc0xswyxrS4L0nzyg36oSdHdGj0ZN5yK+nQ6Ek99ORIuR8NAFVx92OH9K7wLn36+49Jkj79/cf0rvAu3f3YoZrGsXPnTgUCgYx927Ztq2kMUy0ajZZct729XRs3bqxiNNNHW9uEDquSlHO9vaJqyZS1NmGtnW+tHUrb7SZBcWUmWekScroNi5Xn0yNpNO11oKSA0xw+nj+Rmkw9AKimux87pOu3D034I/DZ0ZO6fvtQTROqRCKheDyzs8Ln82nt2rU1i2Eq9fX1TTifQoLBoDo6OqoYUWMr93p7Ra1n8/VI6rLWJowx+eqMyBl/lShSns8WSTelbc9TmQnVonmlzdArtR4AVMvYuNXn7tynXB16Vs6whM/duU/tKxenZiJXUyAQUHt7uyKRSMbYHne81MDAgLZs2aJ4PJ4a/xOPx9Xe3i6/369IJKJ4PJ7qItq2bZvi8bhGRkY0ODioSCSivr4+tbW1aceOHerp6Um1hMVisUm9T3LGefn9fsXjcfn9fnV0dCgWiykajSoej6fGgYVCodRx/H6/urq6Ui0pGzduzDlOqK+vT36/P5Vo+nw+dXZ25j1uekw+n29SLTzZXWXu8dKPKUnxeDz1b5PvvNrb23PuD4fDRc8hWyKRSF2PaDSqrq6ujH+/XNd7snG78dWEtbbil6QOSYNF6oQlhdK2g87hJ9Q7KmdcVMHyMmJrkWRHR0dtqX579CW7+gv32GXdP8z7Wv2Fe+xvj75U8mcCQDU88OsjBe9V7uuBXx+pSTzDw8PW7/dbObmcDQaDNhqNZtSJRqPW7/dn7AuHwznrpL/X7/fbUCiU2u7v77eBQKDi93V0dNj+/v7UdjAYtIODg6nPyz5G+mdEo1E7ODiY+vzBwcGMc+vv77eRSCTj+rjbhY4bCoUy3nf06FEracK1zCUcDk84X/c4HR0dGZ8xPDxsg8Fg0fPKt7/QOWRfC/e8hoeHU9t+v98ePXo0tZ3vek827kqMjo66P8cttkiuUZMV0I0xHZKGbeayBvna8XzJsmLlVXPb7md05MQrBescOfGKbtv9TDXDAICivDYswe/3a3h4WNFoVKFQSCMjI2pvb9fAwECqTjAY1MjIiIaGhjLel66trU3xeDyjdSu7TiAQmNAlVO774vG4BgYGMlpT1q9fr0gkUvA8fT6fhoaGFAwGFQgECraC9Pf3K5FIpGJZs2ZNweMmEgn19vZmtCb5fL4JY9FySSQS6u7uVk9PT2rfjh07FI/HNTQ0pFgsNuHajIyMKBaLFTyvXPsnc+3i8XjqWO7x07dzqSTuWql6N587WNyeWt7AJ6nNWhs3xiSMMX5rbcb/BuvM2lOx8mpx12154NdH1Hd/PCOxWjj3dHVe6Nc7X7+QdVsA1J1XhyUEg8HUL7/u7m5dd911Gb90Ozs7tWPHDgUCgQm/KF3ZSZDP59Py5cuLHruc98ViMfl8voxf6MPDwyWN2ylldl1HR4cikYjmz5+vQCCgjRs3KhQKqa+vL+9x3ZgmY8+ePfL5fBnv7+/vl3SquzHXeUSj0dS/Qb7zyt4/mWvnxuJ2eY6MjGhkpPBkrj179lQUdy1MVTKVs0M3uQ5VQNJA2nIIHTq13MEWOd15bqKVXlZKeVW467asWtqqay7066EnR3T4+EktmjdbbzunrSbjDgCgFG87p01LWmfr2dGTOcdNGUmLW517V7UlEgnFYrEJY2bC4bB6e3uVSCRSv+Q3btyodevWpVo46rV2UiKRkN/vzzh+oVjccUGSSk54otFoqnUlvdUm33EHBgYmPRPObQErtyxdvvPK3l/utZOcVqYtW7aovb1dGzZsKJoAxePxiuOuhYq6+Ywx/uTCml1y1pQKJxMetwXqXjljpYbTXmGbXO4g2e3nM8Z0JN+31qYtyFmsvBZmzjB6x/IF+tMLluodyxeQSAHwlJkzjD57xUpJTuKUzt3+7BUra3bvyreelN/vz/hlFwgE1NbWVlHiMBVydRVK+ROP9K7JUrgDwQOBgEKhkAYHB1MtcvmOm6+sFIFAIGfsiUQiNdg/Wzwen9Rsy3KvXSKR0Lp169TT06POzk75fL5U3Xzn63bdTWXc1VDpop1xa22vtXa1tdZYa7uttQPJMndpBJP9yvqMXmvtQPI1YYWvYuUA0OwuXbVEX78qoMWtmV15i1tn6+tXBXTpqiU1i6Wvr2/CGJhcrVWSs8BndvdfIaW2UJTzvmAwqDVr1mSM6ZKc9bIkpWapSc4v71LGLWUfO3tmnduak++4fr9fnZ2dGe9LJBIaGhoqeg3c2XTpq9AnEonU+l/BYDDj38dNDieznEOxa5fNbWVKv4ZuF58bR67rPdVxV0WxEerT/aVJzOYDgOnoD2Pj9jsPPmWXdf/QfufBp+wfxsZrevyjR4/aSCRio9GoDYfDGa9choeHbUdHx4T9g4ODtqOjw0pKvTccDlufz5eaHZheJxQK2aNHj076fdaemj2XPvPNFQqFMmbXRaNRGwwGrc/ns+FwODU7LdfxI5FIxueGw+GM2WuFjhsOh21/f7+NRqOpWW7ujLViQqFQ6v3pswLTjxmJRDJmveU7r3z7C51D9nXOvpbuObk/A+nnnn29Jxt3pcqZzWesrf3jBmopuQr66OjoqFpaWuodDgBU1WMHR/X+r/6XfvjX76rbs/lKlUgktGfPnmnxrDk0n2PHjqm1tVWSWq21xwrVrfWinQCAKXT42EkdPv5yavvXh09kfHUtmjcr5wORay19EPrOnTszpv8D0xXJFABMY9/5xW908737J+z/mx17M7Y3rVuhv20/t0ZR5dfd3a3Vq1ers7OzrgPPgalENx8ATGPZLVP5eKVlamhoSHv27JEkWqXgaeV085FMAQAAZCknmarJ42QAAAAaFckUAABABUimAAAAKsBsPgCYzo4/67yKmbfYeQGYciRTADCd7fmmdN+Xite76FPSe3qqHw/QhEimAGA6W/OX0hsuO7V95Anpe9dJf7ZNWpi2rhStUkDVkEwBwHSWr/tu4bnSay6oeThAM2IAOgA0ivEx6bcPO9//9mFnu4bi8bi6u7s1f/58LV++XL29valXV1eX5s+fr+7u7prGVIgbUywWq3comOZIpgCgEey7Q/rKBdIP/8bZ/uHfONv77qhZCH6/X+FwWH6/X8FgUKFQKPWKRCK69957lUgkUvW7u7u1fv36io/b19c3qfdFIhH5/f6Kjz9V55Et13lV61ioDMkUAEx3++6Qdn5UWvRm6ZqY1HPQ+brozc7+GiZUkvI+cy8QCGj58uWp7fb2dm3cuLHi40Wj0Yo/oxJTdR7Zcp1XtY6FyjBmCgCms/Ex6Z7PSOdeKn3ou9KM5N/IZ691tm/7sHTP30tvvFyaMbO+sUry+Xyp74PBYMWf19fXp3g8XvHnVGIqziNbvvOqxrFQOVqmAGA6e/oBKfEb6cJPnkqkXDNmSBdulhJPO/XqJBaLpRID9+HGQ0NDam9vz2ipisViWr16tdavX69YLKbu7u7UGKu+vj7FYjENDAyot7c3tR2NRhWPx1Njs4px3zswMKCBgYG8ddzjuHXyxZbrPAYGBrR69eqM8VjxeFzLly9Xe3u74vG4EolE6vO7uro0NDSUcR1ynddkj5XvnDCFrLUN/ZLUIsmOjo5aAGg4j/Rb+9kWa08ez11+8phT/kh/zUIKBoO2s7Mztd3Z2WmHh4cn1BscHLR+vz9jX39/vw0EAjYajdrBwUEbCoVsf3+/jUQiqTrDw8Op7Wg0agOBQElxhUKhjM85evSolWSj0WhqX0dHh+3vP3WtgsGgHRwczBtbvvOIRqMT9oXD4YxY0q+J3++3R48ezXh/rvOazLEKnRPyGx0dtZKspBZbJNegZQoAprO5ZzpfD/8qd7m7361XI3v27FFvb6+6u7u1c+fOkt/n8/k0NDSkYDCoQCCgcDgsServ708NXvf7/VqzZk1Z8bgtQW7LmHusQCCQ2o7H4xoYGFBHR0dq3/r16xWJRArGlkswGNTIyEhGi1N6F2c8Hs+YRej3+yc9q7DQsYqdE6YGY6YAYDpb9k7J91rp/i9njpmSpPFx6f6bJN8yp14NrVmzRqFQSJK0du3ast6bPcOuo6NDkUhE8+fPVyAQ0MaNG1OfXapYLJaRzBSqk57UDA8PZ4xdKmf2X2dnpyKRiCKRiGKxmDZs2JAq6+/vl+QkefF4XCMjIxoZGSn5s0s9VinnhMqRTAHAdDZjpnTJPzmz9m77sDNGatGbnBap+2+Snrhb2vDvdR18Xu6g6VxJTzQa1dDQkGKxWKpVJVdCFY/H8yY8+WYZuhKJRGpZB1d27MUSsnRdXV1avXq1IpGI4vF4xmcNDQ1py5Ytam9v14YNG4omaYXOq9CxSjknVI5uPgCY7lZ+wEmYDv9SurVd2nKW8/XwPmf/yg/UNTyfz1dWEpLNXW8pEAgoFAppcHBQO3bsyFk3vasrXSAQKNoak69O+tpY5fD7/Wpra9PAwEBGIpdIJLRu3Tr19PSos7NTPp8vdYx8MeY7r2LHmupzQm4kUwDQCFZ+QPrEXun9/+Jsv/9fpE88XJdEqpLuqlwSicSEBSzdVhq/359KFuLxeMYYqOz6nZ2dGZ+TSCQ0NDSUSiyCwaDWrFkzYbZbOWO+snV1dem6667LaA1yZ/Olx+peMzdpKvW8ih2rGueEiSru5jPG+CRtkLTeWtueozwkKZHc9Flre6eyHACQNGOm9Jq3Ot+/5q0179pzBzunT/0PBAI5u5Xcbi53+n8oFFIsFlM4HE7t6+jokN/vT7VquQlBPB7Xtm3bJJ1Kkrq7u7V8+fKMAebZIpFIamkA9zMDgYC2bNkin8+nYDCoaDSq7u5ujYyMpFp4Ojs788aW6zzSdXZ2anh4OKNlzm1h6+7uVnu782uzv79f3d3dqQU5c53XZI4lKe85YeoY6ywfMLk3GxOQtEaST9JGa+3qrPKQJLkJkDEmKCfp6pqK8hJjbJE0Ojo6qpaWlkmfKwBMC7/dK/VdJHXex4OOgQocO3ZMra2tktRqrT1WqG5FyVTqQ4zpkNSTI5k6Kukca20ibZ+11pqpKC8xNpIpAI3r+LPOy3XkCel710l/tk1aeO6p/fMWOy8AJSknmarabD5jjF9Ot1wiR1lQUryScmstj/kGgD3flO770sT937suc/uiT0nv6alNTECTqebSCPnmcCbkdAtWWp6TMWaWpFlpu+blqwsA096av5TecFnxerRKAVVTj3WmRiS16dSg8smW59Mj6bOTjA0Aphe674C6q8fSCIVXTau8fIuk1rTXWSXGBQAAULZqtkzlWx3NlyyrtDwna+3Lkl52t40peaw6AABA2aqWTFlr48aYhDHGb62NZ5XFJKnScgBods+/9Lye/93zReud8aozdMacM2oQEdB8piqZytf1tkVSUFKflFpCoW8KywGgqfU/0a+v//fXi9a7/vzr9bELPlaDiIDmU+minX5JHZI2SgpI6pW021o7kFYnpFPdcmuttd1Zn1FReQkxss4UgIaV3TIVH42r5/4ebblwi/ytpyZF0zIFlKfmi3Z6GckUgGay74V92vjDjdrx/h1auWBlvcMBpq1ykikedAwAmFK9vb2pV3d3d+pZcl7U1dWl+fPnKxYrfyhuJe9FY6nHOlMAgCoYGx/TL4/8UpL0yyO/1Bvmv0Eza/yw466uLnV1dSkQCKT2rV+/vqYxlCMSiWjPnj01f286N+Hs7++v+LPS9fX1TXigcbWO1exomQKABhB7OqbLv3+5Pv/g5yVJn3/w87r8+5cr9nRtW0127tyZkUhJ0rZt22oaw3TT3t6ujRs3TvnnRqPRmh2r2dEyBQDTXOzpmDb/dLMuOusihd8d1grfCu1P7Nctj9yizT/drJv+5CYFlwVrEksikVA8Hpfff2rwu8/n09q1a2ty/OkoGJz6f5u+vj7F4xOXZKzGsUAyBQDT2tj4mLbu2aqLzrpIN198s2YYp8Ph/DPO180X36xNuzZp656tes/Z76lJl18gEFB7e7sikUjGL+5QKJRRr7e3V36/P5V4dXR0pMr6+jJXwEnvqnLfJ0nxeDz1ubFYTN3dzmTvbdu2KR6PKx6P64UXXlA4HJ5wbJ/Pp7a2Yg/UmKiU9+Y6Nzc+v9+vrq6uVKvRxo0bU11vw8PDkqSBgQFt2bIl1R0XDAYVj8fV3t4uv9+vSCSitrY29fX1ye/3KxqNZnStxmIxRaPRjLFqoVBIQ0NDkzqW3+8v+O8FSdbahn5JapFkR0dHLQA0mocOPWRXfWuV3Xt4b87yh5972K761ir70KGHahLP8PCw9fv9VpKVZIPBoI1Goxl1Ojo6bH9/f2o7GAzawcFBa6214XDYhkKhVFl/f3+qbkdHR8ZnDQ8P22AwmNqORqPW7/dn1PH7/anPttbaUChkI5FIavvo0aNW0oQYcynlvYXOrb+/3wYCARuNRu3g4GDqPAcHB63f7884lnsu6cLhcEYsw8PDGed59OjRjPcHAoEJ5zCZYxU6p0Y2Ojrq/hy32CK5BmOmpoGxcaufD7+gH+w9qJ8Pv6Cx8cZezgJA6Z5/yVljaoVvRc7yFfNXZNSrNr/fr+HhYUWjUYVCIY2MjKi9vV0DA87yg/F4XAMDAxktG+vXr1ckElEikVB3d7d6enpSZTt27FA8HtfQ0JBisVhGa5ff79fIyEhqNl1bW5vi8fiEOm53VyKRUG9vb0ZLl8/nmzDGK5dS3lvo3Nz6Q0NDCgaDCgQCE1rM0gWDQY2MjGhoaCjjeOnHSp9F6Pf7Jz2rsNCxip0THHTzedThYyd1+PjLeuDXR9R3f1xHTrySKls493R1XujXO1+/UIvmzdKiltl1jBRAPbkLce5P7Nf5Z5w/oXz/0f0Z9WolGAymkpru7m5dd911qe4un8+X8Yt/eHhY8Xhce/bskc/ny0ga3FlnbpdWNrebyz1Wdh2fz6eRkRFJSh17Mkp5b6FzS4+3VJ2dnYpEIopEIorFYtqwYUOqzL0u7hi1kZGR1HlORr5jlXJOIJnyrO/84je6+d79OcuOnHhFX7zrcUnSpnUr9Lft59YyNAAeElgU0NK5S3XLI7dkjJmSpHE7rlsfvVVL5y5VYFHx1pdKJRIJxWKxCeNpwuGwent7lUgklEgk5Pf7M1qP3O/d1qt8nz0VJjNOqtT3Fjo3VznJXFdXl1avXq1IJDKhxW1oaEhbtmxRe3u7NmzYUDRJy54UUOqxSjknsDSCZ31o7dlaOPf0gnUWzj1dH1p7do0iAuBFM2fM1I1rbtR9B+7Tpl2btPfwXr34+xe19/Bebdq1SfcduE83rrmxZutN7d69O+d+v9+f6hbL1aqRSCQUCARyJk2JRCI1MDpbPB4veaZgvmNP1XsLndtk+P1+tbW1aWBgICORSyQSWrdunXp6etTZ2Smfz5c6Rr4Y07vwyjnWVJ9ToyKZ8qinXngpo2svlyMnXtFTL7xUo4gAeFVwWVA3/clN2p/Yr6vvulpv/+7bdfVdV2t/Yn9Nl0WQnO647LE76a1VwWBQa9asmdAKtXPnztQssfTV0hOJRGrtqmAwmPHZboJQaGZZ+i99v9+vzs7OjNmCiURCQ0NDRZODUt5b6Nwmq6urS9ddd11Ga1A8Hk8lny63i8+9JuljxeLxeEnjwnIdqxrn1Ih4Np9H/WDvQW26bW/Rejd/6AL96QVLqx8QAM8bGx/T9/Z/T59/8PP6P2//P/qzFX9W0xXQ3cTH7/dPaAnJXhqhu7tby5cvT7WCpCdE3d3dWrBgQWqAefqgb/d9kjN2xx3E7XZ7DQwMKBwOKxQKqbe3V1u2bJHf71dPT0/qGO40f7fLzV1SIRwOF+3CKuW9uc4tFospHA5rz549qVjc65Qdd/Y17e7unjDg2z1ue3u7JCd56u7u1saNG1Pn6dZZvny5Ojs7J32sfOfU6HjQcZrpmkz9fPgF/fm2B4vW+4/r3q53LF9Qg4gATAc86BiYGuUkUwxA96jXLZijhXNPL9jVt3Du6Xrdgjk1jAqA1zz/0vN6/nenlj2Ij8YzvrrOeNUZNZ/RBzQLkimPum33MyWNmbpt9zPM5gOaWP8T/fr6f399wv6e+3sytq8//3p97IKP1SosoKnQzedRrDMFoBTZLVP50DIFlIcxU2mmazKVbmzc6qEnR3T4+EktmjdbbzunTTNnmHqHBQBAw2LMVIOZOcMwyBwAAI9inSkAAIAKkEwBAABUgGQKAACgAiRTAAAAFSCZAgAAqADJFAAAQAVqsjSCMaZTkk9SQtJySVustYm08lCyTJJ81trerPcXLAcAAKiXqidTyUSoz02ejDE+SdskrU8rl7W2L7kdNMZErLVdpZQDAADUU9VXQDfGRK217fn2GWOOSjonq6XKWmtNKeUlHH/ar4AOAABqq5wV0GsxZiphjIkmW6RkjPFLiqd970tPlFzJFqiC5dUMGgAAoBS1GDN1naRBSUeNMb2ShtO66Px53pOQM8aqWPkExphZkmal7ZpXVrQAAABlqHrLVLJVKSxpQFJI0nq3laqAEUltkyzvkTSa9jpQRrgAAABlqXoyZYwJS4pba9fLmcnXJqelqpBCiVSx8i2SWtNeZ5UYKgAAQNmq2s2XNuYpJknW2rik1caYQWNMh6ShPG/1yRlXFS9SPoG19mVJL6fFMKnYAQAASlHtlim/Tq0PlS4ipZKrRDLpymCtjRUrn+JYAQAAylbVZCqZ8ARyjJFaba0dSH6/RVJqZl6yxaovrW6xcgAAgLqpxTpTPjmDwl/QqVl4fXbiCuhut91aa2131mcULC9yfNaZAgAAZSlnnamqJ1P1RjIFAADK5bVFOwEAABoWyRQAAEAFSKYAAAAqQDIFAABQAZIpAACACpBMAQAAVIBkCgAAoAJVfTYfGsfYuNVDT47o8PGTWjRvtt52TptmzuC5hwAAkEwhr8PHTurw8Zf1wK+PqO/+uI6ceCVVtnDu6eq80K93vn6hFs2bpUUts+sYKQAA9UMyhby+84vf6OZ79+csO3LiFX3xrsclSZvWrdDftp9by9AAAPAMxkwhrw+tPVsL555esM7CuafrQ2vPrlFEAAB4D8kU8nrqhZcyuvZyOXLiFT31wks1iggAAO8hmUJeh4+fnNJ6AAA0IpIp5LVoXmmDykutBwBAIyKZQl6vWzCnpDFTr1swp0YRAQDgPSRTyOu23c+UNGbqtt3P1CgiAAC8h6URkNdH/vi1al95ZknrTAEA0KyMtbbeMVSVMaZF0ujo6KhaWlrqHc60xQroAIBmcuzYMbW2tkpSq7X2WKG6tEyhJDNnGL1j+YJ6hwEAgOcwZgoAAKACJFMAAAAVIJkCAACoAMkUAABABUimAAAAKkAyBQAAUIGaLY1gjAlLGk5ujlhrB9LKQpISyU2ftbY3670FywEAAOql6smUMcYn6V5J66y1CWNMQNKgJJMsD0mStbYvuR00xkSstV2llAMAANRT1VdAN8ZEJA2ntyYZY4LW2ljy+6OSzrHWJtLKrbXWlFJewvFZAR0AAJSlnBXQazFmqlPSgDHGb4wJSlJaIuWX022XyH5TsgWqYHmugxljZhljWtyXpHlTdyoAAACZqppMJZMhSQpI8kmKG2MiaYmQP+cbnfFRvhLKc+mRNJr2OlBGyAAAAGWpdsuUmwwlrLVD1tq4pG5J/UXeNyKpbZLlWyS1pr3OKj1cAACA8tRqNt8e95vkIHRfvm66pEKJVMFya+3Lkl52t40paWgVAADApFS7ZSqeZ39CTqtVvnJfsqxYOQAAQF1VNZlKduvFNXHsk0/SnmR5Im1sVfp7Y8XKqxAyAABAWWoxm69b0kZ3wxjTISlmrR1K7toiKZhV3pf2/mLlaBJj41Y/H35BP9h7UD8ffkFj49Vd1gMAgFJUfZ0pSTLGdOrU7LsF1trurPKQTnXbrS23vMixWWeqAdz92CF97s59OjR6MrVvSetsffaKlbp01ZI6RgYAaETlrDNVk2SqnkimprfDx07q9ocP6ot3PZ63zqcve6OufOtSLWqZXcPIAACNzGuLdgKT9u0Hny6YSEnSF+96XN9+8OkaRQQAQCaSKXjayiWltSaWWg8AgKlGMgVPe2VsfErrAQAw1Uim4GmL5pU2DqrUegAATDWSKXja6xbM0cK5pxess3Du6Xrdgjk1iggAgEwkU/C023Y/oyMnXilY58iJV3Tb7mdqFBEAAJlq9Ww+YFI+8sevVfvKM/XAr4+o7/54RmK1cO7p6rzQr3e+fqEWzZtVxygBAM2MdaYwbYyNWz305IgOHz+pRfNm623ntGnmDB5kDQCYeuWsM0XLFKaNmTOM3rF8Qb3DAAAgA2OmAAAAKkAyBQAAUAGSKQAAgAqQTAEAAFSAZAoAAKACJFMAAAAVIJkCAACoAMkUAABABUimAAAAKsAK6EAZeKQNACAbyRRQorsfO6TP3blPh0ZPpvYtaZ2tz16xUpeuWlLHyAAA9UQ3H1DE4WMn1XffsP739qGMREqSDo2e1P/ePqS++4Z1+NjJPJ8AAGhkJFNAEd9+8Gl98a7HC9b54l2P69sPPl2jiAAAXkIyBRSxcknLlNYDADQWkimgiFfGxqe0HgCgsdR8ALoxJmqtbc/aF5KUSG76rLW95ZQD1XT6zNL+5ii1HgCgsdT07m+M6ZAUzNoXkiRrbZ+1tk/SkDEmUmo5UG37Dh2b0noAgMZirLW1OZAxPkkbJEWstSZt/1FJ51hrE2n7rFunWHkJx22RNDo6OqqWFsa0oHyHj53U7Q8fLDgI/dOXvVFXvnWpFrXMrmFkAIBqOXbsmFpbWyWp1Vpb8K/lWrZMbZC0M32HMcYvp9sukV3ZGBMsVp7rIMaYWcaYFvclad5UBI/mtahltjovWq5/vSqgJa2ZydKS1tn616sC6rxoOYkUADSpmoyZSiY+sRxF/jxvSUjylVCeS4+kz5YcHFCiS1ctUfvKxayADgDIUKsB6D5rbTzZ1VeKEUltOjXoPF95Llsk3ZS2PU/SgRKPCxQ0c4bRO5YvqHcYAAAPqXoyZYzpTA4cL0e+RKloubX2ZUkvpx2/zEMDAACUrqpjpowxAUl7ClSJ59nvS5YVKwcAAKirardMtUkKpA0WXy6lljuIW2sHjDEJY4zfWpuRHFlrY8m6BcsBAADqqWZLI0iplqrBrKURQpISbldgci2qdmttVynlJRyTpREAAEBZylkaoWYroCeToI3J78OSotbamLW21xgTSpZL0tr0RKlYOdBsxsYtMwoBwENq2jJVD7RMoZHc/dghfe7OfTo0ejK1b0nrbH32ipW6dNWSOkYGAI3Fq4t2AqjA3Y8d0vXbhzISKUl6dvSkrt8+pLsfO1SnyACguZFMAdPAocTv9Pe3P6Zc7cg2+fr72x/TocTvahwZAIBkCpgGtt7zPzpy4pWCdY6ceEVb7/mfGkUEAHCRTAHTwAVn+6a0HgBg6pBMAdPAwrmzprQeAGDqkEwB08C+QwUnkpRdDwAwdUimgGng6rcv06cve2PBOp++7I26+u3LahQRAMBVs0U7AUzeopbZ6rxouV67YA7rTAGAx7BoJzDNsAI6AFSfJx8nA2BqzJxh9I7lC+odBgAgiTFTAAAAFaBlCkDZ6GoEgFNIpgCUhYctA0AmuvkAlIyHLQPARCRTAErCw5YBIDeSKQAl4WHLAJAbyRSAkiw/Y+6U1gOARkEyBaAkw8+fmNJ6ANAoSKYAlOTGS96ghXNPL1hn4dzTdeMlb6hRRADgDSRTAEqyxPcq/eOVq2QkZa8o5e77xytXaYnvVbUPDgDqiGQKQMkuXbVEX78qoMWtszP2L26dra9fFWCdKQBNiQcdFzE2Pqahw0N6/qXndcacMxRYFNDMGTOnPlBgGvHCCuheiAFA4+JBx1Mk9nRMW/ds1cETB1P7ls5dqhvX3KjgsmAdIwPqq94PW2YVdgBeQjdfHrGnY9r8081a4Vuh7e/brl98+Bfa/r7tWuFboc0/3azY07F6hwg0JVZhB+A1NenmM8aEkt8ulyRrbVeO8kRy02et7S2nvMixy+7me/bFZ/WRH39Eb2p7k75y8Vc0w5zKOcftuD6x6xN6fORxbX/fdi1+9eJSQwFQoUOJ3+mKr/1XwcVDF849XXfe8C4GwgOoSDndfFVvmTLGhK21vclXV3JfNK08JEnW2j5rbZ+kIWNMpNTyavjqw1/V4ZcO67q3XJeRSEnSDDND1553rZ576Tl99eGvVjMMAFlYhR2AF1U1mTLG+CQFkl9dEUlBY4w/ud0jqc8ttNbGJHWm1S9WPuXOaTlHkrTCtyJn+Yr5KzLqAagNVmEH4EW1GDO1RpI/bTue/OpLJlQ+a20i+03GmGCx8irEKkl68tiTkqT9if05y/cf3Z9RD0BtsAo7AC+qajJlrU1Ya+dba4fSdrtJUFyZSVa6hCRfCeUTGGNmGWNa3JekeWWGrb9+619r0ZxF2vbINo3b8YyycTuuWx69RWfOOVN//da/LvejAVSAVdgBeFE9ZvP1SOrK1dqUZkRS2yTLeySNpr0OlBvg4lcvVs/bevSzAz/Tpl2btPfwXr34+xe19/Bebdq1ST878DN96m2fYvA5UGNeW4V9bNzq58Mv6Ad7D+rnwy9obLyx1+0DkFtNF+00xoQlveDOxkt21UWttSar3lFJ3XJar/KWJwekZx9jlqRZabvmSTowmUU7WWcK8CYvrDPlhRgAVE85s/lqlkwZYzoktaUnQMkxUcM5kiUrqV1OMpW3PDkYvdhxWQEdaED1XAHdXesq++7pHp1H6wDTn+eSqWQLlM9aO5Dc9slJrOLJVqbV1tp4Wn3rJlDFyks4dkXJFACkY60roDl4bZ2pgKSAnPWh/MnWqE45454kaYtODUp3W7DSu++KlQNAzbDWFYBsVX02X7IF6l45M+/C6WXuuClrba8xJpRMkiRpbfoK6cXKAaCWWOsKQLaqJlPJGXvzS6iX/niYgXLLAaBWvLbWVT3HjgFwVDWZAoBGc+Mlb9B9TzxfdMxULda6YkYh4A31WGcKAKYtr6x15c4oTE+kJOnZ0ZO6fvuQ7n7sUFWPD+AUkikAKNOlq5bo61cFtLh1dsb+xa2za7IswqHE7/T3tz82YWkGSbLJ19/f/pgOJX5X1TgAOOjmA4BJuHTVErWvXFyX8UrlzCj88oYLqh4P0OxIpgBgkmbOMHrH8gU1P67XZhQyCB7NjmQKAKYZL80oZBA8wJipaWFsfEy7n92tH8d/rN3P7tbY+Fi9QwJQRzde8gYtnHt6wTq1mFHIIHjAQcuUx/GwZQDZ3BmF128fkqSMgehu51q1ZxQWGwQvOYPgzz/Lx2N10PBomfKw2NMxbf7pZq3wrdD2923XLz78C21/33at8K3Q5p9uVuzpos95BtCg6j2j0GuP1Rkbt/r58Av6wd6D+vnwCxobr/5zZwEXLVMe9eyLz2rLQ1v07rPerZsvvlkzjJP3nn/G+br54pv1iV2f0Jce+pJWLVylxa9eXOdoAdRDPWcUemkQPOO2UG+0THnUP+/+Zx1+6bCue8t1qUTKNcPM0LXnXavnXnpO/7z7n+sUIQAvcGcU/ukFS/WO5QtqNovOK4PgGbcFLyCZ8qjf/cFZbG+Fb0XO8hXzV2TUA4Ba8sIgeK8tXkpXY/MimfKoD77+g5Kk/Yn9Ocv3H92fUQ8AaskLj9Xx0ritux87pHeFd+nPtz2oTbft1Z9ve1DvCu+iZaxJkEx51MWvvVhL5y7VLY/conE7nlE2bsd166O3auncpbr4tRfXKUIAza7eg+C9Mm6LrkYwAN2jZs6YqRvX3KjNP92sTbs26ZrzrtGK+Su0/+h+3frorbrvwH266U9u0swZM2sSz9j4mIYOD+n5l57XGXPOUGBRoGbHBuBd9RwE74VxW2PjVp+7c1/erkYj6XN37lP7ysU1uSasRl8fxtrG7tM1xrRIGh0dHVVLS0u9wymbF9aZ8kIMAJDtUOJ3uuJr/1Wwq2/h3NN15w3vqlp3412PHtL13xkqWu/rHwnosvOq21LHrMapdezYMbW2tkpSq7X2WKG6JFPTQD1bhdy1ri466yJd+5ZrtcK3QvsT+3XLI7ekWsdIqADUi9vFJuVevLTa3Y1/+c2H9J//83zReu95wxn65l++rWpxuNch+zd6ra5DukZpHSsnmaKbbxqYOWOm1i5eW/PjstYVAK9zx21lt8gsrlGLzKv+qLQ/bEutNxleWo3eK61jtU7oaJlCXp/86Sd1z9P3aPv7tuv8M86fUL738F5dfdfVumTZJfryn3y56vEwbgtAPvVqDfFCV+PHtg/qx489W7Te+1Yt1v931eqqxCB5p3VsqhI6WqYwJby01pVXxm2R0AHe5C5eWmteeE7i734/NqX1JsMrrWP5Ejp3ZmW1EjqWRkBeXlnryivPKIw9HdPl379cf/WTv1L3/d36q5/8lS7//uU1f0bi2PiYdj+7Wz+O/1i7n92tsfHq3SABFFfvJSI2rDl7SutNxhd+uK+kNb++8MN9VYuh2MxKyZlZWY3FVGmZQl7pa12lj5mSarfWlVfGbaUPxA+/O5wxEH/zTzfXbCA+LXSAN9VziYhL3rxYS1pn69nRkzkTCSMnsbvkzdW7R3qhdeyeXz47Ya2vdFbSodGTuueXz075zEpappCXu9bVfQfu06Zdm7T38F69+PsXtffwXm3atUn3HbhPN665saq/RL3wjMKx8TFt3bNVF511kW6++Gadf8b5mvNHc1IJ3UVnXaSte7ZWvYWIFrpMXmih80IM8I56PSdx5gyjz16xUlLu1egl6bNXrKxqPF5oHdu555kprVcOWqZQUHBZUDf9yU3aumerrr7r6tT+pXOX1qQ1xgvjtnb9ZpcOnjio8LvDORO6a867RlffdbV2/WaX2l/XXpUYshO67Ba6Tbs2aeuerXrP2e+panJLC523YpC80UpIDPWPwe1q/L93Pqbnf/8rmdOOy/5hns74ozfp/16xqupdjV5oHavnzMppkUwZY0KSEslNn7W2t47hNJ3gsqDec/Z76nKT+ODrP6j7D96v/Yn9OWcU1mLc1vd//X1JxRO67//6+1VLpkjoTvFCQueFGNw46p3QEYN3Yjht3i/VumKrXnzxt6l9ra9+jU6b93eSqptMua1j128fktG4Zsx5MpXQjb90jqQZVW8d+4f3r9RDT40kx26Na2ZaDGPJGBbOPV3/8P6VU35sz3fzJRMpWWv7rLV9koaMMZE6h9V03LWu3ud/n9YuXluzv7a88IzCV53mzDwpNhDfrVcN5SR01XL7/tt18MRBXfuWa/MmdAdPHNTt+2+vWgxe6HL1QgySN7p9icF7MZw7/9yMGM6df27NYrh01RJ97PKX5HvDlzVn2Ta9aultmrNsm3xv+LI+dvlLVW8dc2dWnjbvMbWu2JoRQ+uKrTpt3mPVm1lprfX0S9JROa1R6ftsGe9vkWRHR0ctpqfoU1F73rfOszfEbrAPP/ewPfHKCfvwcw/bG2I32PO+dZ6NPhWt6vEPnThkL955sf147ON2bHwso2xsfMx+PPZxu27nOnvoxKGqxbD5PzfbVd9aZfce3puz/OHnHrarvrXKbv7PzVWL4YrvXWFXfWuVffGVF3OWn3jlhF31rVX2iu9dUbUYBh4fKOk6DDw+0NAx/GHsD/a9A++1N8RuyPkzeUPsBvvegffaP4z9gRiIoSYxWHvqXv3x2Mft3sN77YuvvGj3Ht5rPx77eE3u1ZkxfCwzhujHyo5hdHTUyhm33mKL5BqebpkyxvjlJFKJHGU8w6RJuOO29if26+q7rtbbv/t2XX3X1dqf2F+T7pTFr16snrf16GcHfpZzIP7PDvxMn3rbp6o6m/Dv1v6dFs1ZpG2PbMvZQnfLo7fozDln6u/W/l3VYviLlX8hqXgLnVuvGv5t379JKt5C59Zr1Bi80EpIDN6JwR0GUCyGXb/ZVbUY0mdef+Xir2S02H7l4q/o3We9W1966Et69sXii4tO1tj4mLb+/Au66KwL9ZWLv5oZw7qv6qKlF2rrz79QlVZjTydTkvx59ick+XIVGGNmGWNa3JekeVWKDTUUXBbUjz74I33jvd9Q+MKwvvHeb+hHH/xRzcYikNBJV664sqQu1ytXXFm1GLyQ0HkhBi8kdMTgnRi8MAzACzOvb3/i/+ngyyO69i2duZPKt1yngy+P6PYn/t+UH9vryVQ+I5La8pT1SBpNex2oVVCornqN23I1e0LnhaUyvJDQeSEGLyR0xOCdGObMnFVSDG69avjd71+UVMLM62S9aog+dHNJMbj1ptJ0TabyJVKStEVSa9rrrJpEhKZAQkdC54UYvJDQXbniSi2d1aZb/rsvdwyPbNPSWW2NH8PyK7TUztQtj+SJ4dFtWmpn6srlV1Qthp5Z52jpmHRLnmEAtz56i5aOOfWqZf0M59dysYTOrVcNH3jxREkxuPWmkqcfdJwcMzVsrTVZ+62kdmtt0ekJPOgYmHr1XtPHC9PQY0/HtHX3P+tg2jT0WsaQWp5h6YW65i3XacX8Fdp/dL9ufWSb7jt4f/WT2/Exxb5+gTbPlS466yJdc961p2J49Bbdd+A+3XRCCl6/V6rWz8boQcX+PajNLaflj+HYmIIfjUqtS6sTw+C/KXZvtzafuSgZwzVpMdzqxPDcYQXXhaXVVWqd+tpaxV56pngMc86WbthdlRDGvrZGl895WSuWXaSbL/7KhCdmbNr1Ce1/+j796KVZmnnDnurEsOebuvyRm4rH8JbNmrnmL4t+XjkPOvZ0MiVJxpijklZba+Np+2x2glXg/SRTQAOqd0KnfXdo7J7PaOjkc3p+5kydMTamwOwzNfOSf5JWfqAmx4/9sEtbl5ylg+OnHqGxdMZs3XjogILvj1Q3jn0/kHZ+VLErwtr61O0TE9vX/amCd35K2vDv0so/rU4MO/9C2nd78RhWXiltqNKYpa+tlY48odhV39HW//7axBjO/7iC26+SFp5btURGg/8m3fmJ4tfhiq9UL6HzQlI5xQl+oyVTIUkJ66wxJWNMh5xWqa4S308yBTSi8THp6QekE89Jc8+Ulr2zei0g2fbdIe38qHTupdKFn5QWvUk6/Cvp/i9LT9ydTCCqmMiMHpRuWSctOV9jG7Zr6MjeU0nlwgs0c+dV0qFHpGtj1WuR+c56af89Us9Bjf3RqyYmtr9/SdpylrTiEukj/dWJYft66dclxPD6S6SrqhRDMpHRNTGNLQ1MjOHgoHRre3UTmfEx6SsXSIverLEN387x83C1dHif9ImHq/d/JBlDbOHZ2jp7bGKL7e9mKHjkQHVjkKb0j4yGSqakVELltkyttdZ2l/Fekimg0ey7Q7rnM1LiN6f2+V4r1aJVKO0Xlz70XWlG2tDT8XHptg9X/xdXskVG18Sks9dOLH/mIecXeDVbZHb8hfSrEmJ405XSxirFkGwdKxpDNVvHvPDzIGUl+JvTEvybapPgp8UwtuK9Gjrvcj0/+9U64+SLCjz6I83c/5PaxJCMYypajRsumaoEyRRQBc3cKpTWElHwF3g1WyLSWmQ0a+7E8pePV79FJq11TB/6jxxJxJ9Xv3WMRGZiHBP+yFgmXfKPtTm+V2KQpuQeRTKVhmQKmGLN3iqUHCNTNJGp5hgZL7TISN5IIrwQgxtHgyQRDRHDFCCZSkMyBUwhWoW8EYMXkkqXF5IIL8QgNUwSAQfJVBqSKTScet2wvfAL3AutQl64DpJ3WmQkbyQRXogBDaWcZOq02oQEYErUs4vt4e3Ocf/XNzITCMnZvnCz0yLz8Pbqtci84wanVejwr3K3Ch3+1al61TJjpnO9d37USZzyJTLV/kW+8gPOce75jHPdXb5ltU2kJOdcz7mwdsfzagxoWrRMAdNFvbvYaBXKRNcS0NDo5ktDMoWG4IUkwgtjhSS6twDUBMlUGpIpTKl6/fL0wuwtLyR0Lq+0CgFoWIyZAqqh3uOVJKcVJhd3/8Pbq5dMeWWskORc7zdeTqsQAE8gmQJKkd619L++kTleaedHq9+1dNoc52uxgdduvWph0DMATEA3H1CMF7q3vLDadDrGCgFocOV0880oVAhA0uM/dLr2Lvxk/iUBEk879aqldal0Wa/0xE+c5O2Zh5zZc8885Gw/8RPpsnBtEinpVKvQeR3OVxIpAE2Mbj6gGC+MV5K81cUGAEghmcL0Ua+uJa+MV5IYeA0AHkQyhemhnjPpLv2idOAX0v1bc49Xuv/L0rzXOPVqgYHXAOApjJmC97kz6Ra92Vlnqeeg83XRm539++6o7vG9Nl4JAOApzOaDt3lpFhsLRQJA02DRTjSOXV+Qjh+SNnw7z0y6TzqDsXd9Qfrgv1Y3FsYrAQByIJmCty081/labCadW6/aGK8EAMjCmCl425EnnK/ujLls7n63HgAANUYyBW+7+B+keUucmXTj45ll6TPpLv6H+sQHAGh6JFMozfiY9OT90qMDztfxsdocl5l0AACPYzYfiqvnGk8FY2AmHQCgOsqZzUcyhcLcNZ7OvdSZObfoTc44pfu/LD1xd20fY8LDdQEANUIylYZkqgJeWuMJAIAaKieZYswU8nPXeLrwxvxrPB3/rVMPAIAmVfV1powxoeS3yyXJWtuVozyR3PRZa3vLKUcVeW2NJwAAPKiqLVPGmLC1tjf56krui6aVhyTJWttnre2TNGSMiZRajipjjScAAIqq2pgpY4xPUr+k9dbaRHJfQNKgpOXW2rgx5qikc9zyZB1rrTXJ7wuWlxgHY6YmizFTAIAm5aUxU2sk+dO248mvPmOMX063XSL7TcaYYLHyfAc0xswyxrS4L0nzKjmBpsYaTwAAFFW1MVPJJGh+1m43CYrLSbRySUjyKTMJy1WeT4+kzxaPECVZ+QFn+YN7PuM8UNjlW1bbZREAAPCoWj/ouEdSl7U2YUzenroRSW06Neg8X3k+WyTdlLY9T9KB8sJEhpUfkN54OWs8AQCQQ8nJlDGmQ9LGEqpusdYO5Xh/WNKO5EDyQgolSkXLrbUvS3o57bhFPg4lmTFTOufCekcBAIDnlJxMWWsHJA1M5iDJRGw4K5GK56nuS5YVKwcAAKi7qi/a6Q4WdxMpY4zPGOO31sYlJZIDzTNYa2PFyqsdNwAAQCmqvc5UQFJAzvpQ/mRi1Cln3JPkjG8KptXvkJTeelWsvDmMj0lP3i89OuB8HR+rd0QAACCp2utMPakcM+/S14lKLszpdtuttdZ2Z31OwfIS4pje60ztu8OZSZf4zal9vtdKl/wTM+kAAKgSHnScZlonU/vukHZ+VDr3Uuc5eIve5Kw6fv+XpSfuZmkCAACqhGQqzbRNplh9HACAuvHSCuiYrF1fkI4fki68MTORkpztCz8pHf+tUw8AANQNyZRXLTzX+broTbnL3f1uPQAAUBckU1515Ann6+Ff5S5397v1AABAXZBMedXF/yDNWyLdv9UZI5VufNwZhD7vNU49AABQNyRTXtW6VLqsV3riJ9JtH5aeeUh6+bjz9bYPO/svCzP4HACAOmM2n9flXGdqmXTJP7IsAgAAVVLObL6Sn82HOln5AemNl0tPPyCdeE6ae6a07J3Og4cBAEDdkUxNBzNmSudcWO8oAABADoyZAgAAqADJFAAAQAVIpgAAACpAMgUAAFABkikAAIAKkEwBAABUgGQKAACgAiRTAAAAFSCZAgAAqADJFAAAQAVIpgAAACpAMgUAAFABkikAAIAKkEwBAABUgGQKAACgAqfV8mDGmKi1tj1rX0hSIrnps9b2llMOAABQTzVrmTLGdEgKZu0LSZK1ts9a2ydpyBgTKbUcAACg3oy1tvoHMcYnaYOkiLXWpO0/Kukca20ibZ916xQrL/HYLZJGR0dH1dLSUn7w42PS0w9IJ56T5p4pLXunNGNm+Z8DAACmjWPHjqm1tVWSWq21xwrVrVU33wZJOyWltzr55XTbJbIrG2OCkuKFyq21sVwHMsbMkjQrbde8SUe97w7pns9Iid+c2ud7rXTJP0krPzDpjwUAAI2j6t18ycQoV+Ljz/OWhCRfCeX59EgaTXsdKB5lDvvukHZ+VFr0ZumamNRz0Pm66M3O/n13TOpjAQBAY6nFmCmftTZeRv0RSW0VlG+R1Jr2OquMYztGD0p3haRz3yt96LvS2WulWXOdrx/6rrP/rm6nHgAAaGold/MlB5BvLKHqFmvtUPI9ncmB4+UolCgVLbfWvizpZXfbmJKHV52y6wvS8UPShm9LM7LyzRkzpAs/Kd3a7tT74L+W//kAAKBhlJxMWWsHJA2UWt8YE5C0p0CVfK1VvmRZsfLqWXiu83XRm3KXu/vdegAAoGlVcwB6m6RAcsyUJC2XUssdxK21A8aYhDHGn90N6A4uL1ZeNUeecL4e/pXTtZft8K8y6wEAgKZVk6URpFRL1WDW0gghSQm3KzDZldhure0qpbzE45a/NMLoQemWddKS86UP/UdmV9/4uHTbn0uHHpGujUmtS0sNBQAATBPlLI1Qk0U7k0lQT/L7sNtalVzN3GeM6UjWWZueKBUrr5rWpdJlvdITP5Fu+7D0zEPSy8edr7d92Nl/WZhECgAA1K5lql4qWrQz5zpTy6RL/pF1pgAAaGBeXLRzelr5AemNl7MCOgAAyItkqpgZM6VzLqx3FAAAwKNq9qBjAACARkQyBQAAUAGSKQAAgAqQTAEAAFSAZAoAAKACJFMAAAAVIJkCAACoAMkUAABABZpm0c5jxwquBA8AAJBSTt7QDM/mWyrpQL3jAAAA09JZ1tqDhSo0QzJlJL1G0vF6x1KheXKSwrM0/c+lElwHB9fBwXVwcB0cXAcH18ExFddhnqTf2iLJUsN38yUvQMGMcjpwckJJ0vFiT69uZFwHB9fBwXVwcB0cXAcH18ExRdehpPcxAB0AAKACJFMAAAAVIJmaPl6W9Lnk12bGdXBwHRxcBwfXwcF1cHAdHDW7Dg0/AB0AAKCaaJkCAACoAMkUAABABUimAAAAKkAyBQAAUIGGX7SzERhjwpKGk5sj1tqBesZTD8aYTkk+SQlJyyVtsdYm6hhS1RljfJI2SFpvrW3PUR6Scz0kyWet7a1ddLVT4nWQnJ8LWWu7ahdd7RS7Dll1o8XqTFelXIdmuGeW8P+iae6Zxe4BtbhXkkx5WPI/y72S1llrE8aYgKRBSabgGxtM8j9Cn3sjSF6XbZLW1zGsqkr+W6+RczNsy1EekiRrbV9yO2iMiTRaIlHCdQhba7vTtiONmEgUuw5ZdTskBWsQVs2V8PPgUxPcM0u8PzTFPbPYPaBW90q6+bwtLGmH+x/CWjskqaF+SZSoPf0vquT3vnoFUwvW2qHkf/54nio9kvrS6sckddYitloqdB2SvyACya+uiKSgMcZfmwhro4SfB0mpa1Iw2ZrOSrgOTXHPLOE6NMU9s8R7QE3ulSRT3tYpacAY4zfGBKXUD0KzSRhjou5/mOR/koK/VBpZ8vx9uZrs3Z+TJrJGUnri5P5c+GofiidskLSz3kHUEfdMRzPdM/PeA2p5rySZ8qi0rDog5xdDPNl82Wy/LCXpOjn/WY4mx0IEG607q0z5Wl0SaqIkwlqbsNbOT7Y+uNz/H436iyOv5L2hGRMHSdwzszTFPbOEe0DN7pUkU97l/hAkkk26cUndkvrrGFNdJP+qCEsakBSStD6rWReOETVwF0+JeiR1NepA2yJ8yftEs+KemdTk98xS7gFTfq8kmfK+Pe43br93s/2llfzLKm6tXS9ntkabnEGlyNTUiVTy52SHO9C0mRhjOhtxxtokcc9s0ntmGfeAKb9Xkkx5V76/MBPK33TZcNL6vGOSZK2NW2tXyxkT0FHf6Oom38+Gr0BZQ0v+LAw36vIQhSRndu0pWrHxcc9U894z89wDanavZGkEj7LWxo0xbp9ven+wT8114/Tr1Pog6SI1jsMzkj8bCWOMP7tbpxkH26YNNHanPvsktTVRl1ebnBlNbuvLcik1JTzeLC1W3DNTmu6eWegeUKt7JS1T3tYtaaO7kcy8Y1mD7Rpa8gc+e+qrJK1ukl8S+ZqjtyhtLaHkz0Yjd2/lvA7JVpmApKHkDC6/nBldI7UMroYmXAdrbcxa2+u+lPylmdxu1P8j+f5fNNs9M+fPg5ronlnCPaAm90pjrZ3qz8QUSlvFVpIWpC9O1iySN4UeSS/o1CyM1IJ0jSh5Q+iQ84shIKlX0u70m6Hb8pDcXNuIPxuFrkPy5+JJ5ZiVY61ttEUai/48JOu5dTqSdaKN1FpZ4v+Lhr9nFrsOzXLPLPUeUIt7JckUAABABejmAwAAqADJFAAAQAVIpgAAACpAMgUAAFABkikAAIAKkEwBAABUgGQKAACgAiRTAJCDMcaXYxVpAJiAZAoAcutREz0gF8DkkUwBQG6BBn6mG4ApRDIFAFmST6GP1jsOANMDyRQATLRe0kDRWgAgkikAyMVvrY0XrwYA0mn1DgAAJssYE5C0RtJySbslxSR1JosT1tq+SXxmh6T+AmVrJQ1LiidfI9baRNnBA2gYtEwBmJaSyxYErbV91tpuSdsk9Vhre5NVuif50Rsl7cxxvE5J7dba7mSS5pOTVK2Z5HEANAhapgBMV51piZNrOPl1SFLXJD/Xl93SZIzxSwpLOidtd0KSrLWxSR4HQIMgmQIwXaUGiCeTHZ+SLUrZCU6yvENOt9xaSZFcY6KSrU+RHMeKSIplJVntcpI2AE2OZArAtJSVDAUlxQuMXeq31q6WJGNMTNK9klbnqLfeWtueY39Qzgy/dAE5Y7QANDnGTAFoBO3KWsrAfRRMcpB6SjLh8iVbq7LrJ7I/OK1edisUa1EBkEQyBWCaSnbJuTrkzOZLlaW1UuUbIB7I2s7XxScpsyUsuainrLUxY0wgO2ED0FxIpgBMO8lEKpz8vkNp3W05Hk7skzSStS8hqS1rX3uuweTJJCruJkzJz++SM/5KcmYUMnYKaGKMmQIwHcUk9SWTqj1ykptuY4wktWWtL5XQxMTJp7QEK9mVV2iRzvWSuowxg5JkrV1vjOlPHp9ECmhyxlpb7xgAoGqSLUrb3AHoyX1HJa12u+6MMWFJO2hhAjAZdPMBaGjJBMnnbie76eJZswEDJFIAJotuPgDNYH2y9Wm3nHWmUsscJFuuSKQATBrdfACamjEmIinMg40BTBbdfACaXRuJFIBK0DIFAABQAVqmAAAAKkAyBQAAUAGSKQAAgAqQTAEAAFSAZAoAAKACJFMAAAAVIJkCAACoAMkUAABABf5/deDvK0KYRKcAAAAASUVORK5CYII=\n",
+ "image/png": "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\n",
"text/plain": [
""
]
@@ -374,7 +375,7 @@
}
],
"source": [
- "symmetrised_correlator.show([5, 20], comp=[first_derivative, second_derivative], y_range=[-500, 1300])"
+ "symmetrised_correlator.show([5, 20], comp=[first_derivative, second_derivative], y_range=[-500, 1300], auto_gamma=True)"
]
},
{
@@ -479,7 +480,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -493,7 +494,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.10"
+ "version": "3.8.8"
}
},
"nbformat": 4,
diff --git a/examples/04_fit_example.ipynb b/examples/04_fit_example.ipynb
index 06bfc29d..554c6be3 100644
--- a/examples/04_fit_example.ipynb
+++ b/examples/04_fit_example.ipynb
@@ -46,7 +46,8 @@
}
],
"source": [
- "fP = pe.Corr(pe.input.json.load_json(\"./data/f_P\"), padding=[1, 1])"
+ "fP = pe.Corr(pe.input.json.load_json(\"./data/f_P\"), padding=[1, 1])\n",
+ "fP.gamma_method()"
]
},
{
@@ -116,6 +117,7 @@
"stop_fit = 18\n",
"\n",
"fit_result = fP.fit(func_exp, [start_fit, stop_fit], resplot=True)\n",
+ "fit_result.gamma_method()\n",
"print(\"\\n\", fit_result)"
]
},
@@ -197,6 +199,7 @@
}
],
"source": [
+ "m_eff_fP.gamma_method()\n",
"m_eff_plateau = m_eff_fP.plateau([start_fit, stop_fit])\n",
"m_eff_plateau.gamma_method()\n",
"print()\n",
@@ -320,7 +323,7 @@
}
],
"source": [
- "beta = pe.fits.odr_fit(ox, oy, func)\n",
+ "beta = pe.fits.total_least_squares(ox, oy, func)\n",
"\n",
"for i, item in enumerate(beta):\n",
" item.gamma_method()\n",
diff --git a/examples/05_matrix_operations.ipynb b/examples/05_matrix_operations.ipynb
index 926d1734..a49a7ee0 100644
--- a/examples/05_matrix_operations.ipynb
+++ b/examples/05_matrix_operations.ipynb
@@ -393,7 +393,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -407,7 +407,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.10"
+ "version": "3.8.8"
}
},
"nbformat": 4,
diff --git a/examples/06_gevp.ipynb b/examples/06_gevp.ipynb
index 95a02172..73b6f980 100644
--- a/examples/06_gevp.ipynb
+++ b/examples/06_gevp.ipynb
@@ -72,10 +72,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[Obs[0.95214(67)] Obs[0.01240(11)] Obs[0.005965(72)] Obs[0.002719(40)]]\n",
- " [Obs[0.01241(12)] Obs[0.004389(60)] Obs[0.002672(41)] Obs[0.001432(25)]]\n",
- " [Obs[0.005975(74)] Obs[0.002672(41)] Obs[0.001741(29)] Obs[0.000990(18)]]\n",
- " [Obs[0.002729(41)] Obs[0.001433(25)] Obs[0.000990(18)] Obs[0.000596(12)]]]\n"
+ "[[Obs[0.9521372299563664] Obs[0.012396221358945024]\n",
+ " Obs[0.005964522290444636] Obs[0.00271868582032491]]\n",
+ " [Obs[0.012406080421737313] Obs[0.004389377599144552]\n",
+ " Obs[0.0026720900942348203] Obs[0.0014322792739559524]]\n",
+ " [Obs[0.00597528112202714] Obs[0.0026722311560493962]\n",
+ " Obs[0.0017410144722897988] Obs[0.0009900129922259138]]\n",
+ " [Obs[0.002728787039125839] Obs[0.001432511366233049]\n",
+ " Obs[0.0009901084333529782] Obs[0.0005964594911910594]]]\n"
]
}
],
@@ -120,7 +124,7 @@
"Many methods we could use for regular correlators do not work with matrix-correlators. \n",
"In order to get the effective mass, we need to convert to a regular correlator first. \n",
"\n",
- "One way to do it, is to pick a smearing out of the matrix:"
+ "One way to do it, is to pick an element out of the matrix:"
]
},
{
@@ -130,7 +134,7 @@
"metadata": {},
"outputs": [],
"source": [
- "single_smearing = matrix_V1V1.smearing(0,0)"
+ "single_smearing = matrix_V1V1.item(0,0)"
]
},
{
@@ -138,7 +142,7 @@
"id": "5c25a23c",
"metadata": {},
"source": [
- "**Corr.smearing(i,j)** picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice. \n",
+ "**Corr.index(i,j)** picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice. \n",
"But there is a more usefull way to retrieve a single value per timeslice. \n",
"We might want a linear combination of different sources and sinks. \n",
"We can formalize this as\n",
@@ -188,7 +192,7 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk8AAAGLCAYAAADeVnZRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3z0lEQVR4nO3df3xU9Z3v8fd3gAQoJMMPw28p4UcRddUoWF2xd9sE8Lr1ul1A4bp2u7ZQ+2i1Ky6U2ta11SIstMV2lwWvdrUWqHDvttqtRLLbLrioIKFdeKASCFV+xwpJoEKQzPf+cc6EyWTOzDmTTGYyeT0fjzySOT/mfOcrkjff7/d8jrHWCgAAAP6Est0AAACAroTwBAAAEADhCQAAIADCEwAAQACEJwAAgAAITwAAAAEQngAAAALome0GdDRjjJE0XNLpbLcFAAB0Kf0lHbUpimDmXXiSE5wOZ7sRAACgSxop6UiyA/IxPJ2WpEOHDqmoqCjbbQEAAF1AY2OjRo0aJfmYucrH8CRJKioqIjwBAIAOx4JxAACAAAhPAAAAARCeAAAAAiA8AQAABNApC8aNMQvdH8dKkrV2vs9z6t2XYWvtssy0DgAAwL+MhydjzFJr7aKY16uNMZuttRVJzlkoSdbaNe7rcmPMaj+hCwAAIJMyOm1njAlLKnO/R62WVG6MKU1y6mJJa6IvrLVVkuZloo0AAABBdMaap+skxQalWvd7ONHBbqgKW2vrE+wr7+jGAQAABJHRaTs3AA2I2xwNQLVKzGtEql4JApcxplBSYcym/r4bCAAAEFA27rZbLGl+opGlFE5KGujxfg0xXzzXDgAAZEynhidjzFJJP4suBA8oUXCSpCWSimO+RqbZPAAAgJQ67dl2xpiZkg74CE5e03nhRPustU2SmmKuk24TAQAAUuqUkafoQu+Y0gNhr7vtrLW1kuoT7XfvugMAAMiajIcnY0yZpDJJ1caYUjcUzZOzhknutoVxpy3RxYXl0VGrdKb6Uos0Swe3Srs3Ot8jzRm5DAAAyA/GWpu5N3fqOx1UgrvkrLXGPWaepEXW2rFx5y7UxWm6ybGFNlNcs0hSQ0NDg4qKipIfvPcF6eWHpPp3L24LXypNe0yadJufywEAgDzQ2Nio4uJiSSq21jYmOzaj4SkbfIenvS9Iz98tTZghTV0glVwm1b0pbV0h7dskzX6WAAUAQDdBeEoVnhqOSP/nU9Kwq6Q710mhmNnLSERaP0c69t/S56uk4hGd0m4AAJA9QcJTNuo8ZV/l16XTx6SpD7YOTpLzeuoC6fRR5zgAAIAY3TM8nf/A+V5yWeL90e3R4wAAAFzdMzyV3eV8r3sz8f7o9uhxAAAArrwPT80Rq1cPvK9f/PaIXj3wvpojVpr4585ddVtXOGucYkUi0tbvSeHRznEAAAAxOq3CeDZs2nNMj7y4V8cazrVsG1bcWw9/epJmTHvMudtu/Vxp6gMxd9t97+LddqEeWWw9AADIRXl7t93GV9/Wgz+vUfyniz68ZdVdZZoR2pGgztNoadqjlCkAAKAboVSB1HD1Q/+qUxd6eR43uF+BXvzyTRpWVCC9s006c0LqN0QafSMjTgAAdDOUKpD0/h8/TLr/D2fOa/nLbztBacxU6cqZzneCEwAASCJvw5MfYy/pl+0mAACALqZbh6cD753JdhMAAEAXk7fhadBHvNc7Sc6apwenfayTWgMAAPJF3oanb/z5JBldvLsuKrrt0duv0LBwn85vGAAA6NLyNjxVTBqqVXeVaWhx71bbhxb3dsoUXDEsSy0DAABdWd6WKmhoaFBRUZGaI1bbD55U3elzKunfW1PGDFSPUPx4FAAA6M6ClCrI6wrjktQjZHTD2EHZbgYAAMgTeTttBwAAkAmEJwAAgAAITwAAAAEQngAAAAIgPAEAAARAeAIAAAiA8AQAABBA3td5ardIs/TONunMCanfEGn0jVKoR7ZbBQAAsoTwlMzeF6SXH5Lq3724LXypNO0xadJt2WsXAADIGqbtvOx9QXr+bqnkcumeKmnxEed7yeXO9r0vZLuFAAAgC/L+2XZpiTRLT1ztBKU710qhmIwZiUjr50p1e6X7djGFBwBAHgjybDtGnhJ565fOVN3UBa2Dk+S8nvqAVP+OcxwAAOhWCE+J7HrO+V5yWeL90e3R4wAAQLdBeEqkZ1/ne92bifdHt0ePAwAA3QbhKZEZ35X6D5O2LnfWOMWKRKStK6T+w53jAABAt0J4SqR4hHTLMmlfpbM4/NB2qem08339XGf7LUud4wAAQLfC3XbJJKzzNFqa9ih1ngAAyCNB7rajSGYyk26TJt5KhXEAANCC8JRKqIc0Zmq2WwEAAHJExtc8GWPCxph5xpjNPo8vN8ZscM8pN8YsNcbMzHQ7AQAA/MjoyJMxpkzSdZLCkgb6PC0sqVzSTEm1kpZaazdmon0AAABBZTQ8WWurJVWnMXI0xlpbn4EmAQAAtAulCgAAAALI1QXjs40xJ+VM9Y211i7yOtAYUyipMGZT/0w3DgAAdF+5GJ6qJclaWytJ7sLxDdbaWR7HL5b0cGc1DgAAdG85N21nra2NBifX85JmGmPCHqcskVQc8zUysy0EAADdWc6Fp/jF5TELx0sTHW+tbbLWNka/JJ3OcBMBAEA3llPhyR1d2mCMKY3bJjllCwAAALKqs8JTwhpPxphSY8zC6Gt3lGlZ3LTdPEkbc7Z0QaRZOrhV2r3R+R5pznaLAABABmW6SGapnGKXd0gqM8YslbQjpuhluaT5kpbFnLYkNlBJGpRksXh2JXxw8KXStMd4cDAAAHnKWGuz3YYOZYwpktTQ0NCgoqKizF1o7wvS83dLE2ZIUxdIJZdJdW9KW1dI+zZJs58lQAEA0EU0NjaquLhYkordNdSeCE/piDRLT1wtlVwu3blWCsXMfkYi0vq5Ut1e6b5dzoOFAQBATgsSnnJqwXiX8dYvnam6qQtaByfJeT31Aan+Hec4AACQVwhP6dj1nPO95LLE+6Pbo8cBAIC8QXhKR8++zve6NxPvj26PHgcAAPIG4SkdM74r9R8mbV3urHGKFYk4i8b7D3eOAwAAeYXwlI7iEdIty6R9lc7i8EPbpabTzvf1c53ttyx1jgMAAHmFu+3aI2Gdp9HStEcpUwAAQBcS5G67jBbJzHuTbpMm3iq9s006c0LqN0QafSPlCQAAyGOEp/YK9ZDGTM12KwAAQCdhzRMAAEAAjDx1hkgzU3sAAOQJwlOm8fBgAADyCtN2mRR9eHDJ5dI9VdLiI873ksud7XtfyHYLAQBAQJQqyBQeHgwAQJfBg4FzAQ8PBgAgLxGeMoWHBwMAkJcIT5nCw4MBAMhLhKdM4eHBAADkJcJTpgR5eHCkWTq4Vdq90fkeac526wEAgAfutsu0VA8Ppg4UAABZF+RuO8JTZ/CqMB6tAzVhhnNXXsllzlqorSukfZuk2c8SoAAA6ASEp1wLT4lQBwoAgJxBnaeuYNdz/upAUcoAAICcQnjKlld/5HxPVQfq1R+xoBwAgBzCg4Gz5YYvSy/e56xxGjW57f5oHaiPTnWm91hQDgBATmDkKVuuucsJQVtXeNSB+p7U9xLpjad5sDAAADmEBePZ1Opuuwdi7rb7nrTvJanPQGnUFOnOdQkWlM+Rjv239Pkqqf/QxHfzAQAAX7jbrquEJ8m7DlS/IdLh7c5IU6JpvUPbpacqpJFTpDPHU0/reZVLAAAAgcITa56ybdJt0sRb2wabtXc6+1MtKD+8wxm5+sunW9eJev7ui3WiKMQJAECHITzlglAPaczU1tvK7pL2v+y9oPz4Hue8cRWt60SNmuy8Xj9HemmR9MFJ6ZdfTR2wGJkCAMAXpu1yVaoimk9Pc0adUk3rFfRz7thLVoiz4tvS5m8mH5kiXAEA8hjTdgE0R6y2HzyputPnVNK/t6aMGageIeN7f8aEejjh5fm7ZdfPkYl5fIvdukLm8A7nuFTTeufPJC/E+VSFtOGvk49MSamn/fyEKwKYL1n7MwcA8KVbh6dNe47pkRf36ljDuZZtw4p76+FPT9KMK4al3C/5+0WXdkCbdJt23bBSw19/TEP2VbQcfyI0VKfHf0Hja55MXSdK8g5YgyekmPqbK/3yAemDP7Q/XPlZd5UqXHVG+GrnNZovXNBbr1fq7Kkj6jNghCZeP109esb9b5bkGn7+zHWETAc0AiCAfNZtp+027Tmme5+rVvynj/71Pu/mMVqz5aDn/lV3lUlSyl907QloknTvc9UyimhK6C2VqF51CmtHZKIkac+gr6nPiCu9p+QObpE+/KP31N72J6VfPei9/51XpWdudcNVonIJc6XDb0gf/EF2wnSZqQ/GjI4tl9lXeTFcPX93ymPsyw/JxIQrG75UJhqufIQvP8El6TF7X0jehhTn76p8xgm6kRMt558IDdHR6x/SNdM/m/QajVP/Xj87c7W++9JbCsX9994emaiIQvr6LRN1+zUjVNKvV7tC5qY9x/SdF3Zr1JnftVzjUL+r9M3brrwY0NoRIn29PwDkGEoVpAhPx+rP6tM/ekV/OHPe+32kNsEpVv/ePXX63IWE50kXw1W6Ac0muUbUrL7VWhZZITt+ukI3X5zWi2xZIVNTKfPpH0i/eVx22FUyCcKPXfMJmeP/7RTfLOzX9gL7KqW1s1OGKzuuIvH7r58jc2KvZCRbMsn7mMM7Zd0AFooJV5Ety53PceNXpG0/dOthLWg9+rVvkzT7We06dCplcEkabkYNkHUDXsI2JLlGzdVf0wfnL6h8z0Jp/HSFbm59vmoqVXXFMl0/ZpCKXrzH8xpfPH+/JOnhwrUabutarnHUlOiRprmqjEzRyqsO6bYT/5hWyKwbOU0/33VEOyuf9bzGtdPv1h39fquirX8fOES+/8EFX+9/+zUjVFLUm2lcADklp8KTMSYsabakWdbaihSHR89ZKKnefRm21i4LcL2U4WnB87/V/60+4vct0zKgby9J0qkPPvQ8JlVA82N6aHuCX1RD9O2mOfqz2+/RgHc3xfxSbx2wVLPJKTHvFY5+87j0myXph6voovVk14gGsLEVMnPahqvI2julg79WaOwnPUe/mt7Zrl5NJz2Dy+9uWClJuurV+z2O2aRzBYPUe/RkhRK1Yd0cnf39dvX58JTn+fUmrPC4j3uef7ymWn0KQioefbXnMfU1ryqsRs/PsebDWzW/17+lDJleI3y/+Njj+tXuY1pVsDL9ayQJkb8ouVc7361P+v73nr9fE/7HXC0Y+XbqkUSm/gB0opwJT8aYMknXSQpLusNae62PcxZKUjQwGWPK5QSv+T6vmTI8/dOv92tZ5du+PkNX4DXN06dXSGc/jCQJWHfoW4XrNXRcWeJf6E9NU+hIkjv6UoWrptPSkpHOz+kGMJ9Ti57ha90c1dVUyxjpknQ/Z6prpDq/g0Kkrf21zNhPJv4Ma++Uan8tM+6TniN8597dpfomqyFe/ZDqGuvm6IODr6vvhfr0Q+T+XTpx9Vd0za5vJh1J3BSZzNQfgE6VM3fbWWurJVUbY2YGOG2xpDEx71FljNksyVd48uPAe2c66q1yQkQhvRaZ1Gb72Q+dZ+ZVRqZo89nrEgYs2xTSqpqViqyb03Zk6sgOnTRhhbcsT/zLsKbKGbnys2jd65iju5zvXovae/ZOvr+pUYo0y9z8YMI7CkM3L9DQmgpniM/rmPHl0pEd6V8j1fmx29O9xoQKaX+l92eI7p+aeL+ZukB9nqpQHyn1e3jtv+mr6nfgVtnx01sHvFHOiF3kqWkaeGSH9/k3L9DwmgoN3L1UmjA94U0Kdv0c/fGFv9MvGu/QhsJ1Gl4QE/g/LNEja+fq3dipPwDIgpx6MLAxplTONF19gn3lHXWdB6d9TIP7FSRvS0ddLEdEA9YLkRv1WmSSIu5/+srIFN17/n4d31/tjI4sGSk9VaHj+3fp3vNf1eKmv5ZqKhVZN8cZQWk6LR3a7rx2w1Vky/KEDzeObFmhoyrRMVPifUxNlfNzbNCKdeFc8v2pwpef4DL8mvZdI9X58SEynWukCpGp9vvph/YG1fHlvtrQ+8LppCGv37nj+qeCJzR0XFmrB2IPHVemVQUrtbPyWf3ktXcSXwMAOkFOhSdJpR7b6+VM/bVhjCk0xhRFvyT1T3WRYeE+evT2K2TUNiRFt827eYznfslZzJ3MgL69WtY9eUkV0KLX8GpDR6mMTNFNZ7+nO89/Q/ed/7LuPP8N3XR2hSojU9oXrmoq9cj5ufr7prnpB7B9m9UcKkg/fPkJLoVFUqhH+tdIdf6WFTqW6RCZar+ffmhvUA0SIlOVzxg/3RntHDXZme51R7c0froeLlyny4ubEp8PAJ0g18KTl5OSBnrsWyypIebrsJ83nHHFMK26q0xDi1sP/Q8t7q1Vd5Vp8f+c5Ln/n+8q0z/M/JOk4WvJZ67Uks9cmXZAM5L+Yeaf6J892rDkL65IOXoWJMB5jUwZJQ9Xm613uPrS+fu16yM36Y0+N6UfwPa/rCebprVr9CtlcHnlBzoZ6Zf+NVKdX1OpF4d+yVeItFsTX8PWpAiRqUKmOwp4qleSfmhvUPURIs+EipO/x+4NKadhh9sT6rf72cTnA0An6JRSBe6ap8WpFoy7U3ObrbUmbvspSYustWsSnFMoqTBmU39Jh/0+nqU9Fcb9FDTMZCHOaK0qqfVde4nKJXgdEy2X0N79IUU0Oa4WVUShVm1IdEyzQvrMNSP0x9/9a8JF7Y80zVFlZIrnovdHmuY4n7XlDq/4Oworta3se3GlBNoe88yIb+u1g+97XuPjYwbps0e+5Xl+1RXL1Legp8b/9vFWd6EdDw3Vseu/rhE33JHkNn7nGn9ZNkIVexZKE6a3qSivfZVa/eGtmtfr3zzbsCbF/nvP368bSgfps4e/5VneIvk1Ui8Ir6/ZpgE67fn+e4b9pQYd3+J9k8KaTyiUrHyGexPC7yYt0hUzF3M3HoAOkzN327VcxH94KpV0IEF4spIqrLVVPq7Vqc+2y2iFcR86I8B1RAD08x6J7q4aNai/Xjt4UpL3XYWS9JWhe3VX45MJg0uyOk+xx6Qq7pjqfCl1oc6UBSQT1mkarYapD+tnZ65OGr629rxBUy+86rl/Z9+b9OKXb9Kwo5sTFOocrUYf17hyRJG+9N53kobI68cMSlAnarTMtEf1i8Zx+tULP0sSdlOUz3DvXNz4kblacWFmxiuxA+g+umx4co89Jelaa21tzDYbH6iSnJ8fDwYOoDMCXEcEwHTeo67xXMqCpoP7FejFL9+kkn692ldh3E8b/Tx+JYWUfZXi8S1e4UvyHuGLjgL6qSDeESHS6/1f2n1M9/60Ov3yGevmqOH3u3Tt6RWS1KbyfpvPCQA+5WJ4midpfnx4ckeaZsYWwYwWyIxO0bnBq6Ij6zyha/EzPdmdflm2dyq5vdeQ0g+RK15+Wz/8j/2SvEcSp4e2658LVnpO/S0MLVDjuQueVcxbRtjCfXx/XgDImfAUDUeS7pBUJmmZpB3W2o3u/nly1jKNjTtvoaToyNNka+2iANckPOWhznpgbj7I5crcdY3n9PNdR/Tdl97yPObrt0z0eETMaD3T7/N6tfb9lFXM+139F1ox++pO+EQA8kXOhKdsIDzlr1wOBQjGVxhOMPX33Gu/1yc3z0g6rXd8/y79R8VLuuvGsQIAv3KmwjjQkXqEjG4YOyjbzUAHmHHFMFVMGpo8DId6SGOmtjpvQsM2Z6ouRRXzCQ3bJBGeAGQG4QlAVqQThge+vc75IUUV84Fvr5Nu+av2NA8APHWVIpkAoJGXuLVyU1QxbzkOADKA8ASgy+j950ul/sO8K7FvXSH1H+4cBwAZQngC0HUUj5BuWSazr1J2fevH3Nj1c2T2VUq3LHWOA4AM4W47AF2PRyV2TXtUmnRb9toFoMvibjsA+W3SbdLEWz2rpANAJhGeAHRNCUoZAEBnYM0TAABAAIQnAACAAAhPAAAAARCeAAAAAiA8AQAABEB4AgAACIDwBAAAEADhCQAAIADCEwAAQACEJwAAgAAITwAAAAEQngAAAAIgPAEAAARAeAIAAAiA8AQAABAA4QkAACAAwhMAAEAAhCcAAIAACE8AAAABEJ4AAAACIDwBAAAEQHgCAAAIgPAEAAAQAOEJAAAgAMITAABAAIQnAACAAAhPAAAAAfTsjIsYYxZKqndfhq21y1IcXy5pvqTNkmolVUjaYa3dmMl2AgAApJLxkSc3OMlau8Zau0ZStTFmdYrTwpLKJa12vw4QnAAAQC7ojJGnxZLGRF9Ya6uMMZvljCwlM8ZaW5/JhgEAAASV0fBkjCmVM01Xn2BfubW2KpPXB9C9/OHoO6p/75AkqTlitfu9Zp08G9HAPiFdeUkP9QgZSVL4klEaPHx0NpsKoAvL9MhTqcf2ejlTc8nMNsaclDRQ0lhr7aJEBxljCiUVxmzqH7CNAPJEzUs/1A2HntSm5sn6zod3aVToPZWoXnUK6/uRS/TNXs9pRo8denXUFzT4nuXZbi6ALqpTFownEA1FXqolyVpbK0nGmHnGmA3W2lkJjl0s6eGObyKArmb8LV/Rj6tv1WvbfqMNfR7TcFvXsu+oKdEjTXN17PqH9Okyr3/XAUBq2SpVkCw4yVpbGw1OruclzTTGhBMcvkRScczXyI5qJICuZcDQS/X2b7dpVcFKDR1XJt1TJS0+It1TpaHjyrSqYKXe/u02DRh6ababCqALy3R4qvXYHk6yT8aYmbGvY9ZMtfnnorW2yVrbGP2SdDq9pgLo6rYfeE/3Nf+LNH66QnPWSaMmS4X9pFGTndfjp+u+5me0/cB72W4qgC4so+HJHT2qdxeOx+9LuFjcHV3aEHtOzIiTZ+ACgObf/5eG2zqFbn5QCsX99RYKKXTzAg23J9T8+//KTgMB5IXOmLZbIqdmk6SWUaU1Ma9Lo7WgpJZRpmVx03bzJG2kdAGAZEpMvfvDZR4HXNb6OABIQ8bDk1tNPGyMmekGp8nW2tgaT9Fq4rGWGGMWRr8kDfJYLA4ALcaWjnV+qHsz8QHu9pbjACANxlqb7TZ0KGNMkaSGhoYGFRUVZbs5ADpRXf0f1Xf1deo78k+cNU6xU3eRiCLr5uiDw7v1wfwdKgl/JHsNBZBzGhsbVVxcLEnF7hpqTzwYGEDe+OmOI1rQMFuqqVRk3Rzp0Hap6bR0aLvzuqZSCxpm6ac7jmS7qQC6sGzVeQKADvdXlxeqvqRCJ4701eA9Tyv0VEXLvuaPDNUfpizW3434U4UvKUzyLgCQHOEJQN4Y/PZaDf7PxxPu6/XH4xq2/bvOi098TRq+uBNbBiCfEJ4A5I/rPid97JbUx/Ufmvm2AMhbhCcA+aP/UIIRgIxjwTgAAEAAhCcAAIAACE8AAAABEJ4AAAACIDwBAAAEQHgCAAAIgPAEAAAQAOEJAAAgAMITAABAAIQnAACAAAhPAAAAARCeAAAAAiA8AQAABEB4AgAACIDwBAAAEADhCQAAIADCEwAAQACEJwAAgAAITwAAAAEQngAAAAIgPAEAAARAeAIAAAiA8AQAABAA4QkAACAAwhMAAEAAhCcAAIAACE8AAAABEJ4AAAACIDwBAAAEQHgCAAAIoGdnXMQYs1BSvfsybK1dlolzAAAAMi3jI09uCJK1do21do2kamPM6o4+BwAAoDMYa21mL2DMKUljrLX1MdustdZ05DkxxxVJamhoaFBRUVG72g4AALqHxsZGFRcXS1KxtbYx2bEZHXkyxpTKmXKrT7CvvKPOAQAA6CyZXvNU6rG9XlK4I84xxhRKKozZ1N9XywAAANKQrbvtTkoa2EHnLJbUEPN1uH1NAwAA8Jat8BQ0OCU7Z4mk4pivkek2CgAAIJVMT9vVemwPJ9kX6BxrbZOkpuhrY1KuKQcAAEhbRkeerLW1kurdReDx+6o66hwAAIDO0hnTdksktdwlZ4yZKWlNzOvSaF0nv+cAAABkS8bDk1sZPGyMmemGoMnW2vkxh5RLmh/wHAAAgKzIeJHMzkaRTAAAEFTOFMkEAADIN4QnAACAAAhPAAAAARCeAAAAAiA8AQAABEB4AgAACIDwBAAAEADhCQAAIADCEwAAQACEJwAAgAAITwAAAAEQngAAAAIgPAEAAARAeAIAAAiA8AQAABAA4QkAACAAwhMAAEAAhCcAAIAACE8AAAABEJ4AAAACIDwBAAAEQHgCAAAIgPAEAAAQAOEJAAAgAMITAABAAIQnAACAAHpmuwEA0KlOH3e+Uuk/1PkCgDiEJwDdyxs/lv7z8dTHfeJr0p8tznx7AHQ5hCcA3ct1n5M+dovzc6RZevtX0tbl0tQHpY/9TynUw9nHqBMAD4QnAN1KnQ2rzvZR0cGXNPT1R1Vw+pCzY+tynf/tz3T8+m+occwtKrGFKsluUwHkKMITgG7lp6+/q7d+/VOtKlgpjZ8uzf6xVHKZVPemem5ZrpFVX9S95+/XxD/73/rbignZbi6AHGSstdluQ4cyxhRJamhoaFBRUVG2mwMgx9TV/1F9V1+nviP/RKE566RQzE3HkYgi6+bog8O79cH8HSoJfyR7DQXQqRobG1VcXCxJxdbaxmTHUqoAQLcy6ORO9Tt7VKGbH2wdnCQpFFLo5gXqd/aIBp3cmZ0GAsh5hCcA3cqB2gPODyWXJT7A3d5yHADEITwB6FbqbNj94U2PA95sfRwAxCE8AehWenz0T3XUlCiyZbkUibTeGYkosmWFjpoh6vHRP81OAwHkvIyHJ2PMQmPMPPdroY/jy40xG9zjy40xS40xMzPdTgDdw5Sxl+iJHn8t1VQqsm6OdGi71HRaOrTdeV1TqSd6fFZTxl6S7aYCyFEZLVUQDUvW2jXu63JjzGpr7fwkp4UllUuaKalW0lJr7cZMthNA93Hq+Lv62NU36t5t9+vh/Ws1vKaiZd9xM0SPnL9fH7/uRp06/q4GDx+dxZYCyFWZrvO0WNKY6AtrbZUxZrOkZOFJksZYa+sz2TAA3VPNSz/U5w49qWE9JmvW2Yc0KvSeSlSvOoV1KDJY3+z1U8144wd69cQXNPie5dluLoAclLE6T8aYUkkHrLUmbruVVGGtrfI4b6akKr/hyRhTKKkwZlN/SYep8wQgkT8cfUf17zlVxZsjVrvfa9bJsxEN7BPSlZf0UI+Q81dW+JJRjDwB3UiQOk+ZHHkq9dheL2dqLpnZxpiTkgZKGmutXZTk2MWSHg7cOgDd0uDho1uFoo9lsS0AuqZs3G0XDUVequWMPG1010odMMZsSHL8EknFMV8jO6ylAAAAcXyPPLnTaXf4OHSJtbY6yf5kwUnW2tq4Tc9LWm2MCSeayrPWNklqimmnjyYCAACkx3d4cu94C3LXW3wIigon2SdjzMzYu+ustfVuICqVMyoFAACQNRmbtnNHkOrdhePx+7wWi4clbYg9x90mJQlcAAAAnSXTa56WyKnZJKll6m9NzOvS2MKZ7rTcsripu3mSNlK6AAAA5IKMlSpouYATjqJhaHLsnXPGmHmSFllrx8ZsC8sJTFGDUtxtF3+9IkkNlCoAAAB+BSlVkPHw1NkITwAAIKgg4YkHAwMAAARAeAIAAAiA8AQAABAA4QkAACAAwhMAAEAAhCcAAIAACE8AAAABEJ4AAAACIDwBAAAEQHgCAAAIgPAEAAAQAOEJAAAgAMITAABAAIQnAACAAAhPAAAAARCeAAAAAiA8AQAABEB4AgAACIDwBAAAEADhCQAAIADCEwAAQACEJwAAgAAITwAAAAH0zHYDACBXNUesth88qbrT51TSv7emjBmoHiGT7WYByDLCEwAksGnPMX3nhd0adeZ3KlG96hTWoX5X6Zu3XakZVwzLdvMAZBHhCQBi1DWe0893HdHOyme1oXCthhfUtew7+mGJHlk7V+9Ov1u3XzNCJUW9s9hSANnCmicAiPGT197RzspntapgpYaOK5PuqZIWH5HuqdLQcWVaVbBSOyuf1U9eeyfbTQWQJYQnAIhxeXGTHi5cK42frtCcddKoyVJhP2nUZOf1+Ol6uHCdLi9uynZTAWQJ4QkAYvTb/ayG2zqFbn5QCsX9FRkKKXTzAg23J9Rv97PZaSCArCM8AUCM/kUDnR9KLkt8gLu95TgA3Q7hCQBihOr2OD/UvZn4AHd7y3EAuh3CEwDEGHb7o/pj4RBFtiyXIpHWOyMRRbas0JneQzXs9kez00AAWUd4AoAYg0eW6iP/a7lMTaUi6+ZIh7ZLTaelQ9sVWTdHpqZS/W77Bw0eWZrtpgLIEmOtzXYbOpQxpkhSQ0NDg4qKirLdHABd1d4XZF9+SKb+3ZZNNjxaZtqj0qTbOuwyVDEHckNjY6OKi4slqdha25jsWIpkAkAik26TmXir9M426cwJqd8QmdE3SqEeF4+JNLfar/j9KWzac0yPvLhXxxrOtWwbVtxbD396UksVc8IVkHsyPvJkjAlLmi1plrW2wuc5CyXVuy/D1tplAa7HyBOAzEs4MnWpzLTHLo5MJQlXm/Yc073PVcsooimht1oeAbMjMlERhbTqrjJJShmuOkN7A1x3CYCpPqeffugufZWLgow8ZTQ8GWPKJF0nKSzpDmvttT7OWShJ0cBkjCmXE7zm+7wm4QlAZu19Qfb5u2UnTFdo6oNO+YK6NxXZ4qyVMrOdGlBe4erY8Ap9+kev6NoPXtHDhWs13MY8AsaU6JGmudpWcKNOn7ugUJJwNeOKYSlHv3z9wr5wQW+9Xqmzp46oz4ARmnj9dPXo6UxMtPcZf35G11K1wZdU/eDj/dsTflJ9Tj/94LevkumIANdd5Ux4armIMTMlLfYZnk5JGmOtrY/ZZq21vv7rEp4AZNIfDteqz09mqM+l1zgVx2MLaUYiiqybo6bfv6beHzZ4hqtnRn5br9a+r1UFK51K5je3PkY1lbr3/P2S5Bmudva9SZtnNGjAK49IMQFN4Usld/TLT/DZVfmMhr/+mIZETrS8xYnQENVc/TXtLf6EdlY+69mGa91n/A3q2zNhMPEzujbjimGebTh6/UO6ZvpnJaUIPylGAf28f6q+8tp/X/lENZz9UN996a02QXe7+zn/bOIl+vVb73nu//otE1Xcp5e+9v92K/43cvQXX7SvMh3gpMyPNObqCFyXDU/GmFJJB+KDkjHGSqqw1lYlOKdQUmHMpv6SDhOeAGTCm0/8pS47WeU8827U5LYHvPOq9MytsmMrZDzCVf3BajU1S0PGlXkGsPqaVxVWo2e4WvPhrZrf69+kCdNlYgKa3bpc2lepzVcs0/+tPpI0+Exq+E/dWP1A0mvM6/VvSQNe2aVh3V63qk0w2XfVIv3t7kuTjq7t7HuTvn/lu/rTXQs8r/G7G1ZKknf4GTUg6SjgwQl/o4/uezrp+58YMU0/X/vP+laCdn67aa5G33SH3nnlZwn3P9I0V5WRKZoe2u75Of3s79Orh85+2OwZsAb3K9CCigl64j/2twk/X/3U+JYA5+Uz14zQ/9t1pM32+HDW3nV4nTUCl4kRtq4cnsolbU4Qnk5J+oK1dmOCc/5e0sPx2wlPADJh7z/dpUl1LzoPCy7s1/aAfZXS2tne4erQdukpd/lnugFs7Z2ytb9WaNwnZe5su9+un6NT+7YprNOeoeFL57+ihwvXewc49xpm7CfbFfCSha+UbVg3Rw37X1Wx9brGJp0rGKTeoyen/RnqDuzS8sj/1jJ9P+3P0d79956/31fAkpRwGre5A6oORcPZ1/91T9LRL8l7HZ4k3ftctef5824eozVbDnruf/wzV6YMgdFRuh/8e027R9ji5WN4OiBpqbV2TYJzGHkC0Gk2/+u/qOJ393sHn988Lv1miXe4ajotLRnp/JxuANv+pPSrB9s1+nWy5nUN1qnMXcNHcEnZhlTXeGqaQkd2pP8Z3CD7vhmgAeOuTy+AtXf/ujk6vn+XvtN0p/6x4Im0p3G9wlV05MqPwp4hNV2IeO7v37unTp+70Ga7kWST7I8/zkufXiGd/dD7+sn4DWgtawUTyEipAjcA3eHj0CXW2mq/7+uT50OkrLVNkloeb24MC98AZE7l+St1uSnR0C3LE/8yrKlyflXVvZn4F3bsY1+8jjm6y/nu9Xy9nr2T729qlCLNMkkebjy4piKz15hQIe2vlNrThlTXGF8uHdmR/mdwtw+yp7zbmepztHf/zQs0vKZCjxY+K42b3vrP1ChnRC2ybo6W1PzYGeUbN915LzdcDd2yXKtqVnZIuEoWnCR5BiObYn/8cV7SDU6x750oOMXu/8bP9+iqkWENC/dJ+1pSgArj1tqN1tpZPr7aE5xqPbaHk+wDgE6zYPokfd/cLXlUINeRHTppwkkf73JUJWrsdYmzPinBMXa/u7zT6/l6F84l358qfMVuz9Q1fAaXdl1j+DXJz0/1GWK3p/s52rs/JsCFvALWTV/VwNAZmfFuuBo12RmxdMOVxk/XkoIfa1XBSg0dV+aMtC0+It1TpaHjyrSqYKWmh7Zremi7XunzgNYXPKonCn6k9QWP6pU+D2h6aHvitnVBqQLaH86c1/KX3273dXLq8SzW2lpJ9e7C8fh9bRaLA0BnGxbuo0995vP60vn7dXx/tbN+aclI6akKHd+/S/ee/6q+be/xDlc1lfp+6G41T39cZl+l7PrWx9j1c2QO75D6DPQOVzWb1Rwq8A5oNSnCl7v9fTPA+z32tfMaPoNL0jakukZhkRTqkf5n2LJC7yvcvs/R3v1+AlyqEbgOCFe399558S0V0cdDe3VbaJs+HtqrkNIfEcpFYy9JMFUeUGeFp4TTbsaY0mhdpxhLJJXHHDNTUpu1TgCQLTOuGKbb535Rs3r9o+48/w3dd/7LuvP8NzSr14/0F3O/qBkzv+AZrr50/n596jOf14DrZkqzn5Wp29vqGFP3pjT7J9KnV3qGK9W8rCebprVr9Kux9wj91/i/836P/S9r94g7vZ/xd2SH6kNJruEGF88AuHWFmosvVfWkr6X/OV75gU5G+iX9DM9EZiQNsm9e802d6TM8/QC2b7MiyT5nzWapR/J+UO8Bzut0R+A6IFx9q2CtQopkdHQq1aKaAX17aUDfXu2+TioH3jvT7vfIdJHMUknRtVJlkpZJ2hG9a84YM0/SImvt2LjzFuriNN1ka+2iANekzhOATpHqlm1fxSWTFXfc+4L08kNxdZxG69RN31LFpmKPMgBD9EjTHBX17qllkRWy46crdPOCmAXIKy4W8vSogXQ8NFTHrv+6UwMpyTP+dh06patevd9d5Nz6Gqqp1O8n/I1K9z0tO2G6zNSL++3WFTL7KqUUbdh/9SJ9cP6Cyvcs9LzGMyO+rdcOvp+wH77dNEe3z/2ihhx5OfVnfP5u77668Suy236YdL+2/dD7c6baP/NfpKpvSiWXS3eubbOOTk9Pkw4nWRif6iYFn3eA7hz1OV1z6F88F61/NfK3euH8dW3Pd0UXjMcvDI9fzC2P/dG7+e59rjrhMR2xKH1wvwK9+OWbEq55yrm77ToT4QlAruiQQn8e4SpagDKkiCZ7FaAM7fD1cOOU1beTBDw/4StRAFSANqS6hp+gmvIzpnoQtI/9ST+nn/3P3y1NmCFNfaAluGjr96R9LznTuKOmJC5N8fQ0Z6q3vXeAFnxE9qNTPctfnDuyR1e8/7gkef6Zk5I/Uqi9dZ4k73Al+QtoHXG3HeEJALooX/Vs2vnwYj/aE7466hqZDKqdtj9ZwJIktxho29GrTVKfgdKoKVKC4JNy5MpP7TH3mJoxf6Wid15OXg0+wxXGO6qSejzCE+EJQDfBs8ryTBrTuLHhKtnIlWe4Wj9H2v/vUuRDX/XJ7IQZbarax07DdoZuUWG8MxGeAAB5KyPhapN07eeknU+nLFiqcRUeAWyuVLdXum9Xh49sdhbCE+EJANAdpRuuJt4qPXF1+ovWo1N/s5+VJv55xqeKM4HwRHgCAKCtVOEq2dSflHpab9hV0tlTcQHtUmnaY502pZcuwhPhCQCA4LxGp/oNkQ5v97Ho3Ljha0FM+FrhTA124pqodBCeCE8AAKQn0ejU6ePS//mUM7KUaM3Tujul2l9LYz/ZZddEBQlPOfV4FgAAkGWhHtKYqdKVM53voR5S8QjplmVOwc31c1tVa9f6uVJNpdR8XpqauMq5pj4g1b8jvfXL7HymDtYz9SEAAKDbm3SbM/X28kMX60JJzrTe0Kuk479L/SDoXc9Jk/5X5tuaYYQnAADgz6TbnDvz4qf1NvyNE57q3ky8Jir63L6efTu3vRlCeAIAAP5Fp/VizfiudPh1aevyxGuetq6Q+g93jssDrHkCAADtk2pN1L5K6ZalznGRZungVmn3Rud7pDnbrQ+Mu+0AAEDHSOsByblRB4pSBYQnAACyw6sQZ6sinLlXB4rwRHgCACB3RJqTP/4lB+pAUecJAADkjrd+6UzVTV2QF3WgCE8AACCzdj3nfPdTB6oLIDwBAIDMitZ3itZ7itfF6kARngAAQGbN+K7Uf5hTByoSab2vC9aBIjwBAIDMClIHqgvgbjsAANA5UtWByqIgd9vxeBYAANA5vJ6Nl6XyBOkiPAEAgM6T6Nl4XQxrngAAAALI25Gnxsak05UAAAAtguSGfFwwPkLS4Wy3AwAAdEkjrbVHkh2Qj+HJSBou6XTM5v5yAtXIuO0Ihn7sOPRlx6AfOw592THox46Tjb7sL+moTRGO8m7azv3ArRKjk6ckSadT3X4Ib/Rjx6EvOwb92HHoy45BP3acLPWlr+uwYBwAACAAwhMAAEAA3SU8NUl6xP2O9NGPHYe+7Bj0Y8ehLzsG/dhxcrYv827BOAAAQCZ1l5EnAACADkF4AgAACIDwBAAAEADhCQAAIIC8K5IZyxizUFK9+zJsrV2WxeZ0GcaYsKTZkmZZaysS7KdffXL7SpLGSpK1dn6C/fXuS/rSQ8yfScnpy1JJX7DW1sccQ18GZIzZHP//OP3ojzGmXNJ8SZsl1UqqkLTDWrsx5hj60idjzFJJB9yXJ3O9H/M2PEV/aVlr17ivy40xq+N/eaE1Y0yZpOskhSUNTLCffvXJGLPUWrso5vXq2F9W9GUgSyUttdbWSk5fStog5xcWfZkGY8xMSeVx2+hH/8Jy+m+mnPC0NMEvfPoyBfcfRv8u6VPW2nr3d9BOScbdn5P9mLelCowxpySNifuXqbXWGu+zEOX+xbrYWntt3Hb61Qf3L4QNckbv6t1t0b8Uxlpra+lL/4wxmyVtjv6L0/0LdbG1doD7mr4MIGYkb3VsH9GP/rl/R1bF9lXcfvrSB/cfQgdiR5OMMeXW2ir355zsx7xc82SMKZUztFefYF952zPgB/0a2HVyppeiat3vYfoyGGttRdxQ/WRJ0b9c6cvgZkt6PnYD/dhx6MtA5knaaIwpjfZNTHDK2X7M12m7Uo/t9XKGWpEe+tUn93/2AXGbo/+z18oJVonUi75Myv0Xf1jSLHcTfy4DcH/pVCXYRT8GN9sYc1LOEoexMdP09KUPbjiSpDI5fy/WRqfk3QCVs/2Yr+HJS/QPOToW/erPYknz3Xl9r2PoSw8xU01hOX+51qc4hb5MLOxOG4d9Hk8/JlYtSTHr8OYZYzZYa2clOYe+bC0ajuqttdWSZIxZJOmg2v7jM1bW+7G7hSf+0GYG/ZqCeyfJz6KLHpOgLz24YSm6aHRedC1EklPoyzjGmHk+/gzGox8TiIamGM9LWp0ilNKXib0R/cH9x2U4xbRc1vsxL9c86eLaknjhJPuQGv2aBnea6UDcmh360if3L9Klcb+UqnTxbif60gf3hoU3khxCPwbg/n/dImYktFT0pV9efVGvHO/HvAxP7r8I6mPmU2P3JZrrhw/0a3AxCyCjIyZhY0wpfRlIqaSFav2vzbD7vZ6+9G2gpHJjzEL3bsWlknPnojFmJv3oX/Ru2ti+ign3tfSlP24/1art2qawpDdyuR/zMjy5liimhon7r4Sgw9XdmdewKP3qk/sv/TJJ1e6dJKVy7iw56R5CX/rgroVYFjdNcoek6pi/QOnLFKy1VdbaZdEvSavd7cti6hPRjz64o0zxfybnSdoYMwJFX/qzSM7/z5JalYCodjflZD/mbZ0nqaUWTPQP9+TYgoVIzP0FP1POH+YyScuUuGou/ZqE+6/Qg0pwR0hcXR360ge3P+fFbBoraVGCCuP0pQ/uL6A75Py/vkxODa3o7eH0ow8J/kwOiu8r+tIfY8w8Xfy7skv0Y16HJwAAgI6Wz9N2AAAAHY7wBAAAEADhCQAAIADCEwAAQACEJwAAgAAITwAAAAEQngAAAAIgPAGAWh6dE852OwDkPsITADgWq+0ztgCgDcITADjKYp6nBQCeCE8Auj1jTLmkzdluB4CugfAEANIsSRtTHgUAIjwBgCSVWmtrUx8GAFLPbDcAAPwyxpRJuk7SWEk7JFVJmufurrfWrknjPWdK2pBk32RJByTVul8nrbX1gRsPIG8w8gSgS3DLCJRba9dYaxdJelLSYmvtMveQRWm+9R2Snk9wvXmSKqy1i9xQFpYToq5L8zoA8gQjTwC6inkxQSnqgPu9WtL8NN83HD+SZIwplbRU0piYzfWSZK2tSvM6APIE4QlAV9GyoNsNN2G5I0bxgcbdP1PONNtkSasTrWlyR5dWJ7jWaklVcaGqQk5IA9DNEZ4AdAlx4adcUm2StUcbrLXXSpIxpkrSv0u6NsFxs6y1FQm2l8u5Ay9WmZw1VgC6OdY8AeiKKhRXWiD6aBV3UXkLN2CF3dGo+OPr49845rj4USZqQQGQRHgC0EW4U2xRM+XcbdeyL2YUymtBd1nca68pO0mtR7rcIpqy1lYZY8riAxqA7oXwBCDnucFpqfvzTMVMnyV4mG9Y0sm4bfWSBsZtq0i0+NsNTbXRgOS+/3w566ck544/1j4B3RhrngB0BVWS1rgh6g05YWaRMUaSBsbVd6pX26AUVkygcqfmkhXFnCVpvjFmpyRZa2cZYza41yc4Ad2csdZmuw0A0GHcEaMnowvG3W2nJF0bnYozxiyV9DNGkACkg2k7AHnFDUTh6Gt32q027m69MoITgHQxbQcgH81yR5d2yKnz1FJ2wB2ZIjgBSBvTdgC6FWPMaklLeRAwgHQxbQeguxlIcALQHow8AQAABMDIEwAAQACEJwAAgAAITwAAAAEQngAAAAIgPAEAAARAeAIAAAiA8AQAABAA4QkAACCA/w9wCFnEsOly+AAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
@@ -200,7 +204,7 @@
}
],
"source": [
- "matrix_V1V1.projected(vec).m_eff().show(comp=single_smearing.m_eff())"
+ "matrix_V1V1.projected(vec).m_eff().show(comp=single_smearing.m_eff(), auto_gamma=True)"
]
},
{
@@ -214,7 +218,7 @@
"This gives us a new correlator with one Obs per timeslice. We then calculate its effective mass and plot it. \n",
"We tell the **Corr.show** method to show another correlator as a comparison. \n",
"\n",
- "We can see, that the projected correlator (*blue*) converges to a mass plateau much quicker than the single smearing."
+ "We can see, that the projected correlator (*blue*) converges to a mass plateau much quicker than the single smearing level."
]
},
{
@@ -232,7 +236,7 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 12,
"id": "def98bc0",
"metadata": {},
"outputs": [
@@ -240,22 +244,12 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Data has been written using pyerrors 2.0.0+dev.\n",
- "Format version 0.1\n",
- "Written by jan on 2022-01-27 10:49:51 +0100 on host endwings, Linux-5.13.0-27-generic-x86_64-with-glibc2.10\n",
- "Data has been written using pyerrors 2.0.0+dev.\n",
- "Format version 0.1\n",
- "Written by jan on 2022-01-27 10:49:51 +0100 on host endwings, Linux-5.13.0-27-generic-x86_64-with-glibc2.10\n",
- "Fit with 1 parameter\n",
- "Method: Levenberg-Marquardt\n",
- "`ftol` termination condition is satisfied.\n",
- "chisquare/d.o.f.: 0.692947327942094\n",
"--- The mass was calculated to be 3079.8(7.9) MeV ---\n"
]
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
""
]
@@ -268,8 +262,8 @@
],
"source": [
"# We do not just have V1V1, but also the two other spacial directions. We can average over them for better statistics. \n",
- "matrix_V2V2= pe.input.json.load_json(\"./data/matrix_correlator_V2V2\")\n",
- "matrix_V3V3= pe.input.json.load_json(\"./data/matrix_correlator_V3V3\")\n",
+ "matrix_V2V2= pe.input.json.load_json(\"./data/matrix_correlator_V2V2\", verbose=False)\n",
+ "matrix_V3V3= pe.input.json.load_json(\"./data/matrix_correlator_V3V3\", verbose=False)\n",
"matrix_VnVn=(matrix_V1V1 + matrix_V2V2 + matrix_V3V3) / 3. \n",
"\n",
"#We then solve the GEVP to get eigenvectors corresponding to the ground state. \n",
@@ -284,9 +278,9 @@
"m_eff_Jpsi = corr_ground.m_eff(variant=\"cosh\")\n",
"\n",
"# We can now pick a plateau range and get a single value for the mass. \n",
- "\n",
- "m_Jpsi = m_eff_Jpsi.plateau([5, 24])\n",
- "\n",
+ "m_eff_Jpsi.gamma_method()\n",
+ "m_Jpsi = m_eff_Jpsi.plateau([5, 24],method=\"avg\")\n",
+ "m_Jpsi.gamma_method()\n",
"# We can now visually compare our plateau value to the data\n",
"\n",
"m_eff_Jpsi.show([10, 25], plateau=m_Jpsi)\n",
@@ -313,7 +307,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -327,7 +321,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.10"
+ "version": "3.8.8"
}
},
"nbformat": 4,
diff --git a/examples/json_schema.json b/examples/json_schema.json
new file mode 100644
index 00000000..c836c195
--- /dev/null
+++ b/examples/json_schema.json
@@ -0,0 +1,343 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "$id": "https://github.com/fjosw/pyerrors/tree/develop/examples/json_schema.json",
+ "type": "object",
+ "title": "pyerrors JSON file format",
+ "description": "Schema to validate JSON files according to the pyerrors file format 1.0.",
+ "required": [
+ "obsdata"
+ ],
+ "optional": [
+ "program",
+ "version",
+ "who",
+ "date",
+ "host",
+ "description"
+ ],
+ "properties": {
+ "program": {
+ "type": "string",
+ "description": "The program that was used to write the file",
+ "examples": [
+ "pyerrors"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the file format.",
+ "examples": [
+ "1.0"
+ ]
+ },
+ "who": {
+ "type": "string",
+ "description": "The username of the creator of this file."
+ },
+ "date": {
+ "type": "string",
+ "description": "Date, when this file has been written.",
+ "examples": [
+ "2021-11-29 09:55:05"
+ ]
+ },
+ "host": {
+ "type": "string",
+ "description": "Hostname of the machine where the file has been written."
+ },
+ "description": {
+ "type": ["number","string","boolean","object","array","null"],
+ "description": "A description of the content of the file."
+ },
+ "obsdata": {
+ "type": "array",
+ "description": "Contains the actual data. One entry per structure. A structure is either a single Obs or a one-dimensional representation of a multi-dimensional object (list, array, Corr). Each Obs inside a structure has to be defined on the same set of configs.",
+ "items": {
+ "$ref": "#/$defs/obsdata_items"
+ }
+ }
+ },
+ "$defs": {
+ "obsdata_items": {
+ "type": "object",
+ "description": "Contains the information for one structure of Observables.",
+ "required": [
+ "type",
+ "value"
+ ],
+ "optional": [
+ "layout",
+ "tag",
+ "reweighted",
+ "data",
+ "cdata"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Specifies the type of the structure, needed for the correct parsing of flattened structures.",
+ "examples": [
+ "Obs", "List", "Array", "Corr"
+ ]
+ },
+ "layout": {
+ "type": "string",
+ "description": "The layout of the structure. One entry per dimension, separated by commas",
+ "default": "1",
+ "examples": [
+ "1", "1, 2", "2, 2, 4"
+ ]
+ },
+ "value": {
+ "type": "array",
+ "description": "The mean values of all Obs inside the structure.",
+ "examples": [
+ [1.2],
+ [2.3, 2.1, 3.1]
+ ],
+ "items": [{
+ "type": "number",
+ "description": "A mean value of an Obs."
+ }]
+ },
+ "tag": {
+ "type": ["number","string","boolean","object","array","null"],
+ "description": "Optional descriptor of the structure."
+ },
+ "reweighted": {
+ "type": "boolean",
+ "description": "May be used to specify whether the Obs inside the structure have been reweighted."
+ },
+ "data": {
+ "type": "array",
+ "description": "Contains the data for each ensemble.",
+ "items": {
+ "$ref": "#/$defs/ensdata_items"
+ }
+ },
+ "cdata": {
+ "type": "array",
+ "description": "Contains the data for each covariance matrix.",
+ "items": {
+ "$ref": "#/$defs/cdata_items"
+ }
+ }
+ }
+ },
+ "ensdata_items": {
+ "type": "object",
+ "description": "The data for one single ensemble",
+ "required": [
+ "id",
+ "replica"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The id of the ensemble"
+ },
+ "replica": {
+ "type": "array",
+ "description": "Contains the data for each replica of the ensemble.",
+ "items": {
+ "$ref": "#/$defs/repdata_items"
+ }
+ }
+ }
+ },
+
+ "repdata_items": {
+ "type": "object",
+ "description": "The data for one single replica",
+ "required": [
+ "name",
+ "deltas"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the replica."
+ },
+ "deltas": {
+ "type": "array",
+ "description": "The actual data: Contains configuration numbers and the deltas, i.e., the deviations from the mean value, for each Obs inside the structure.",
+ "items": {
+ "$ref": "#/$defs/deltas_items"
+ }
+ }
+ }
+ },
+
+ "deltas_items": {
+ "type": "array",
+ "description": "First entry is the configuration number. Each further entry is the delta, i.e., the deviation from the mean value, for one Obs inside the structure.",
+ "prefixItems": [{
+ "type": "integer"
+ }],
+ "items": [{
+ "type": "number"
+ }]
+ },
+
+ "cdata_items": {
+ "type": "object",
+ "description": "Contains the data for one covariance matrix.",
+ "required": [
+ "id",
+ "layout",
+ "cov",
+ "grad"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The identifier of the covariance matrix."
+ },
+ "layout": {
+ "type": "string",
+ "description": "The layout of the NxN covariance matrix",
+ "examples": [
+ "1, 1", "2, 2"
+ ]
+ },
+ "cov": {
+ "type": "array",
+ "description": "Contains the NxN covariance matrix, stored in row-major format.",
+ "items": [{
+ "type": "number"
+ }]
+ },
+ "grad": {
+ "type": "array",
+ "description": "The gradient of all Obs inside the structure with respect to the corresponding (diagonal) elements of the covariance matrix.",
+ "items": [{
+ "type": "array",
+ "description": "The gradient of all Obs with respect to the Ith element of the covariance matrix, where I is the position of this array inside grad.",
+ "items": [{
+ "type": "number"
+ }]
+ }]
+ }
+ }
+ }
+ },
+ "examples": [
+ {
+ "program": "pyerrors 2.0.0+dev",
+ "version": "1.0",
+ "who": "s-kuberski",
+ "date": "2022-02-16 12:59:09 +0100",
+ "host": "Hostname",
+ "obsdata": [
+ {
+ "type": "Obs",
+ "layout": "1",
+ "value": [
+ 1.0
+ ],
+ "data": [
+ {
+ "id": "A",
+ "replica": [
+ {
+ "name": "A|r1",
+ "deltas": [
+ [1, -4.579833517667820e-02],
+ [2, 1.272532469141094e-01],
+ [3, -7.042514710393744e-02],
+ [4, -4.800967024769492e-01],
+ [5, 2.967284377711763e-01],
+ [6, 3.156118966788146e-01],
+ [7, 1.139599354351861e-02],
+ [8, -1.546693901500542e-01]
+ ]
+ },
+ {
+ "name": "A|r2",
+ "deltas": [
+ [1, 2.003189752235817e-01],
+ [2, 1.456782186748891e-01],
+ [3, -2.417953154609670e-01],
+ [4, 1.112557347812830e-01],
+ [5, -6.889549539458262e-02],
+ [6, 2.984543471692340e-01],
+ [7, -4.874803852180309e-01],
+ [8, 4.246392022459267e-02]
+ ]
+ }
+ ]
+ },
+ {
+ "id": "B",
+ "replica": [
+ {
+ "name": "B|r1",
+ "deltas": [
+ [1, -2.726195322210824e-01],
+ [2, 3.949288132215630e-01],
+ [3, -2.832514721110847e-01],
+ [4, -8.371015800402004e-02],
+ [5, 2.643463355004773e-01],
+ [6, -2.265154600267616e-02],
+ [7, -1.954084091845127e-01],
+ [8, 1.983659688013363e-01]
+ ]
+ }
+ ]
+ }
+ ],
+ "cdata": [
+ {
+ "id": "#renorm",
+ "layout": "2, 2",
+ "cov": [1.000000000000000e-01, 5.000000000000000e-02, 5.000000000000000e-02, 2.000000000000000e-02],
+ "grad": [
+ [1.000000000000000e+00],
+ [0.000000000000000e+00]
+ ]
+ }
+ ]
+ },
+ {
+ "type": "List",
+ "layout": "2",
+ "value": [
+ 1.2,
+ 0.8333333333333334
+ ],
+ "data": [
+ {
+ "id": "B",
+ "replica": [
+ {
+ "name": "B|r1",
+ "deltas": [
+ [1, 2.368958758731594e-01, 1.645110249119163e-01],
+ [2, 3.164596213857241e-01, 2.197636259623084e-01],
+ [3, -2.422021289001151e-01, -1.681959228473022e-01],
+ [4, 1.365207560473117e-01, 9.480608058841092e-02],
+ [5, -1.958565486752142e-02, -1.360114921355654e-02],
+ [6, -6.335145310374894e-01, -4.399406465538122e-01],
+ [7, 1.945374561549609e-02, 1.350954556631673e-02],
+ [8, 1.859723158834354e-01, 1.291474415857190e-01]
+ ]
+ }
+ ]
+ }
+ ],
+ "cdata": [
+ {
+ "id": "renorm",
+ "layout": "2, 2",
+ "cov": [1.000000000000000e-01, 5.000000000000000e-02, 5.000000000000000e-02, 2.000000000000000e-02],
+ "grad": [
+ [1.000000000000000e+00, -6.944444444444444e-01],
+ [0.000000000000000e+00, 0.000000000000000e+00]
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/pyerrors/__init__.py b/pyerrors/__init__.py
index 7687ad53..6ec89a04 100644
--- a/pyerrors/__init__.py
+++ b/pyerrors/__init__.py
@@ -26,7 +26,7 @@ print(my_new_obs) # Print the result to stdout
# The `Obs` class
`pyerrors` introduces a new datatype, `Obs`, which simplifies error propagation and estimation for auto- and cross-correlated data.
-An `Obs` object can be initialized with two arguments, the first is a list containing the samples for an Observable from a Monte Carlo chain.
+An `Obs` object can be initialized with two arguments, the first is a list containing the samples for an observable from a Monte Carlo chain.
The samples can either be provided as python list or as numpy array.
The second argument is a list containing the names of the respective Monte Carlo chains as strings. These strings uniquely identify a Monte Carlo chain/ensemble.
@@ -38,7 +38,7 @@ my_obs = pe.Obs([samples], ['ensemble_name'])
## Error propagation
-When performing mathematical operations on `Obs` objects the correct error propagation is intrinsically taken care using a first order Taylor expansion
+When performing mathematical operations on `Obs` objects the correct error propagation is intrinsically taken care of using a first order Taylor expansion
$$\delta_f^i=\sum_\alpha \bar{f}_\alpha \delta_\alpha^i\,,\quad \delta_\alpha^i=a_\alpha^i-\bar{a}_\alpha\,,$$
as introduced in [arXiv:hep-lat/0306017](https://arxiv.org/abs/hep-lat/0306017).
The required derivatives $\bar{f}_\alpha$ are evaluated up to machine precision via automatic differentiation as suggested in [arXiv:1809.01289](https://arxiv.org/abs/1809.01289).
@@ -96,7 +96,7 @@ my_sum.details()
The integrated autocorrelation time $\tau_\mathrm{int}$ and the autocorrelation function $\rho(W)$ can be monitored via the methods `pyerrors.obs.Obs.plot_tauint` and `pyerrors.obs.Obs.plot_tauint`.
-If the parameter $S$ is set to zero it is assumed that dataset does not exhibit any autocorrelation and the windowsize is chosen to be zero.
+If the parameter $S$ is set to zero it is assumed that the dataset does not exhibit any autocorrelation and the windowsize is chosen to be zero.
In this case the error estimate is identical to the sample standard error.
### Exponential tails
@@ -187,7 +187,7 @@ obs3.details()
```
-`Obs` objects defined on regular and irregular histories of the same ensemble can be computed with each other and the correct error propagation and estimation is automatically taken care of.
+`Obs` objects defined on regular and irregular histories of the same ensemble can be combined with each other and the correct error propagation and estimation is automatically taken care of.
**Warning:** Irregular Monte Carlo chains can result in odd patterns in the autocorrelation functions.
Make sure to check the autocorrelation time with e.g. `pyerrors.obs.Obs.plot_rho` or `pyerrors.obs.Obs.plot_tauint`.
@@ -195,7 +195,7 @@ Make sure to check the autocorrelation time with e.g. `pyerrors.obs.Obs.plot_rho
For the full API see `pyerrors.obs.Obs`.
# Correlators
-When one is not interested in single observables but correlation functions, `pyerrors` offers the `Corr` class which simplifies the corresponding error propagation and provides the user with a set of standard methods. In order to initialize a `Corr` objects one needs to arrange the data as a list of `Obs´
+When one is not interested in single observables but correlation functions, `pyerrors` offers the `Corr` class which simplifies the corresponding error propagation and provides the user with a set of standard methods. In order to initialize a `Corr` objects one needs to arrange the data as a list of `Obs`
```python
my_corr = pe.Corr([obs_0, obs_1, obs_2, obs_3])
print(my_corr)
@@ -247,7 +247,7 @@ my_new_corr = 0.3 * my_corr[2] * my_corr * my_corr + 12 / my_corr
For the full API see `pyerrors.correlators.Corr`.
-# Complex observables
+# Complex valued observables
`pyerrors` can handle complex valued observables via the class `pyerrors.obs.CObs`.
`CObs` are initialized with a real and an imaginary part which both can be `Obs` valued.
@@ -270,12 +270,101 @@ print(my_derived_cobs)
> (1.668(23)+0.0j)
```
-# Optimization / fits / roots
-`pyerrors.fits`
-`pyerrors.roots`
+# The `Covobs` class
+In many projects, auxiliary data that is not based on Monte Carlo chains enters. Examples are experimentally determined mesons masses which are used to set the scale or renormalization constants. These numbers come with an error that has to be propagated through the analysis. The `Covobs` class allows to define such quantities in `pyerrors`. Furthermore, external input might consist of correlated quantities. An example are the parameters of an interpolation formula, which are defined via mean values and a covariance matrix between all parameters. The contribution of the interpolation formula to the error of a derived quantity therefore might depend on the complete covariance matrix.
+
+This concept is built into the definition of `Covobs`. In `pyerrors`, external input is defined by $M$ mean values, a $M\times M$ covariance matrix, where $M=1$ is permissible, and a name that uniquely identifies the covariance matrix. Below, we define the pion mass, based on its mean value and error, 134.9768(5). Note, that the square of the error enters `cov_Obs`, since the second argument of this function is the covariance matrix of the `Covobs`.
+
+```python
+import pyerrors.obs as pe
+
+mpi = pe.cov_Obs(134.9768, 0.0005**2, 'pi^0 mass')
+mpi.gamma_method()
+mpi.details()
+> Result 1.34976800e+02 +/- 5.00000000e-04 +/- 0.00000000e+00 (0.000%)
+> pi^0 mass 5.00000000e-04
+> 0 samples in 1 ensemble:
+> · Covobs 'pi^0 mass'
+```
+The resulting object `mpi` is an `Obs` that contains a `Covobs`. In the following, it may be handled as any other `Obs`. The contribution of the covariance matrix to the error of an `Obs` is determined from the $M \times M$ covariance matrix $\Sigma$ and the gradient of the `Obs` with respect to the external quantities, which is the $1\times M$ Jacobian matrix $J$, via
+$$s = \sqrt{J^T \Sigma J}\,,$$
+where the Jacobian is computed for each derived quantity via automatic differentiation.
+
+Correlated auxiliary data is defined similarly to above, e.g., via
+```python
+RAP = pe.cov_Obs([16.7457, -19.0475], [[3.49591, -6.07560], [-6.07560, 10.5834]], 'R_AP, 1906.03445, (5.3a)')
+print(RAP)
+> [Obs[16.7(1.9)], Obs[-19.0(3.3)]]
+```
+where `RAP` now is a list of two `Obs` that contains the two correlated parameters.
+
+Since the gradient of a derived observable with respect to an external covariance matrix is propagated through the entire analysis, the `Covobs` class allows to quote the derivative of a result with respect to the external quantities. If these derivatives are published together with the result, small shifts in the definition of external quantities, e.g., the definition of the physical point, can be performed a posteriori based on the published information. This may help to compare results of different groups. The gradient of an `Obs` `o` with respect to a covariance matrix with the identifying string `k` may be accessed via
+```python
+o.covobs[k].grad
+```
+
+# Error propagation in iterative algorithms
+
+`pyerrors` supports exact linear error propagation for iterative algorithms like various variants of non-linear least sqaures fits or root finding. The derivatives required for the error propagation are calculated as described in [arXiv:1809.01289](https://arxiv.org/abs/1809.01289).
+
+## Least squares fits
+
+Standard non-linear least square fits with errors on the dependent but not the independent variables can be performed with `pyerrors.fits.least_squares`. As default solver the Levenberg-Marquardt algorithm implemented in [scipy](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html) is used.
+
+Fit functions have to be of the following form
+```python
+import autograd.numpy as anp
+
+def func(a, x):
+ return a[1] * anp.exp(-a[0] * x)
+```
+**It is important that numerical functions refer to `autograd.numpy` instead of `numpy` for the automatic differentiation in iterative algorithms to work properly.**
+
+Fits can then be performed via
+```python
+fit_result = pe.fits.least_squares(x, y, func)
+print("\n", fit_result)
+> Fit with 2 parameters
+> Method: Levenberg-Marquardt
+> `ftol` termination condition is satisfied.
+> chisquare/d.o.f.: 0.9593035785160936
+
+> Goodness of fit:
+> χ²/d.o.f. = 0.959304
+> p-value = 0.5673
+> Fit parameters:
+> 0 0.0548(28)
+> 1 1.933(64)
+```
+where x is a `list` or `numpy.array` of `floats` and y is a `list` or `numpy.array` of `Obs`.
+
+Data stored in `Corr` objects can be fitted directly using the `Corr.fit` method.
+```python
+my_corr = pe.Corr(y)
+fit_result = my_corr.fit(func, fitrange=[12, 25])
+```
+this can simplify working with absolute fit ranges and takes care of gaps in the data automatically.
+
+For fit functions with multiple independent variables the fit function can be of the form
+
+```python
+def func(a, x):
+ (x1, x2) = x
+ return a[0] * x1 ** 2 + a[1] * x2
+```
+
+`pyerrors` also supports correlated fits which can be triggered via the parameter `correlated_fit=True`.
+Details about how the required covariance matrix is estimated can be found in `pyerrors.obs.covariance`.
+
+Direct visualizations of the performed fits can be triggered via `resplot=True` or `qqplot=True`. For all available options see `pyerrors.fits.least_squares`.
+
+## Total least squares fits
+`pyerrors` can also fit data with errors on both the dependent and independent variables using the total least squares method also referred to orthogonal distance regression as implemented in [scipy](https://docs.scipy.org/doc/scipy/reference/odr.html), see `pyerrors.fits.least_squares`. The syntax is identical to the standard least squares case, the only diffrence being that `x` also has to be a `list` or `numpy.array` of `Obs`.
+
+For the full API see `pyerrors.fits` for fits and `pyerrors.roots` for finding roots of functions.
# Matrix operations
-`pyerrors` provides wrappers for `Obs`-valued matrix operations based on `numpy.linalg`. The supported functions include:
+`pyerrors` provides wrappers for `Obs`- and `CObs`-valued matrix operations based on `numpy.linalg`. The supported functions include:
- `inv` for the matrix inverse.
- `cholseky` for the Cholesky decomposition.
- `det` for the matrix determinant.
@@ -287,14 +376,75 @@ print(my_derived_cobs)
For the full API see `pyerrors.linalg`.
# Export data
-The preferred exported file format within `pyerrors` is json.gz
-## Jackknife samples
-For comparison with other analysis workflows `pyerrors` can generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object.
-See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details.
+The preferred exported file format within `pyerrors` is json.gz. Files written to this format are valid JSON files that have been compressed using gzip. The structure of the content is inspired by the dobs format of the ALPHA collaboration. The aim of the format is to facilitate the storage of data in a self-contained way such that, even years after the creation of the file, it is possible to extract all necessary information:
+- What observables are stored? Possibly: How exactly are they defined.
+- How does each single ensemble or external quantity contribute to the error of the observable?
+- Who did write the file when and on which machine?
-# Input
-`pyerrors` includes an `input` submodule in which input routines and parsers for the output of various numerical programs are contained. For details see `pyerrors.input`.
+This can be achieved by storing all information in one single file. The export routines of `pyerrors` are written such that as much information as possible is written automatically as described in the following example
+```python
+my_obs = pe.Obs([samples], ["test_ensemble"])
+my_obs.tag = "My observable"
+
+pe.input.json.dump_to_json(my_obs, "test_output_file", description="This file contains a test observable")
+# For a single observable one can equivalently use the class method dump
+my_obs.dump("test_output_file", description="This file contains a test observable")
+
+check = pe.input.json.load_json("test_output_file")
+
+print(my_obs == check)
+> True
+```
+The format also allows to directly write out the content of `Corr` objects or lists and arrays of `Obs` objects by passing the desired data to `pyerrors.input.json.dump_to_json`.
+
+## json.gz format specification
+The first entries of the file provide optional auxiliary information:
+- `program` is a string that indicates which program was used to write the file.
+- `version` is a string that specifies the version of the format.
+- `who` is a string that specifies the user name of the creator of the file.
+- `date` is a string and contains the creation date of the file.
+- `host` is a string and contains the hostname of the machine where the file has been written.
+- `description` contains information on the content of the file. This field is not filled automatically in `pyerrors`. The user is advised to provide as detailed information as possible in this field. Examples are: Input files of measurements or simulations, LaTeX formulae or references to publications to specify how the observables have been computed, details on the analysis strategy, ... This field may be any valid JSON type. Strings, arrays or objects (equivalent to dicts in python) are well suited to provide information.
+
+The only necessary entry of the file is the field
+-`obsdata`, an array that contains the actual data.
+
+Each entry of the array belongs to a single structure of observables. Currently, these structures can be either of `Obs`, `list`, `numpy.ndarray`, `Corr`. All `Obs` inside a structure (with dimension > 0) have to be defined on the same set of configurations. Different structures, that are represented by entries of the array `obsdata`, are treated independently. Each entry of the array `obsdata` has the following required entries:
+- `type` is a string that specifies the type of the structure. This allows to parse the content to the correct form after reading the file. It is always possible to interpret the content as list of Obs.
+- `value` is an array that contains the mean values of the Obs inside the structure.
+The following entries are optional:
+- `layout` is a string that specifies the layout of multi-dimensional structures. Examples are "2, 2" for a 2x2 dimensional matrix or "64, 4, 4" for a Corr with $T=64$ and 4x4 matrices on each time slices. "1" denotes a single Obs. Multi-dimensional structures are stored in row-major format (see below).
+- `tag` is any JSON type. It contains additional information concerning the structure. The `tag` of an `Obs` in `pyerrors` is written here.
+- `reweighted` is a Bool that may be used to specify, whether the `Obs` in the structure have been reweighted.
+- `data` is an array that contains the data from MC chains. We will define it below.
+- `cdata` is an array that contains the data from external quantities with an error (`Covobs` in `pyerrors`). We will define it below.
+
+The array `data` contains the data from MC chains. Each entry of the array corresponds to one ensemble and contains:
+- `id`, a string that contains the name of the ensemble
+- `replica`, an array that contains an entry per replica of the ensemble.
+
+Each entry of `replica` contains
+`name`, a string that contains the name of the replica
+`deltas`, an array that contains the actual data.
+
+Each entry in `deltas` corresponds to one configuration of the replica and has $1+N$ many entries. The first entry is an integer that specifies the configuration number that, together with ensemble and replica name, may be used to uniquely identify the configuration on which the data has been obtained. The following N entries specify the deltas, i.e., the deviation of the observable from the mean value on this configuration, of each `Obs` inside the structure. Multi-dimensional structures are stored in a row-major format. For primary observables, such as correlation functions, $value + delta_i$ matches the primary data obtained on the configuration.
+
+The array `cdata` contains information about the contribution of auxiliary observables, represented by `Covobs` in `pyerrors`, to the total error of the observables. Each entry of the array belongs to one auxiliary covariance matrix and contains:
+- `id`, a string that identifies the covariance matrix
+- `layout`, a string that defines the dimensions of the $M\times M$ covariance matrix (has to be "M, M" or "1").
+- `cov`, an array that contains the $M\times M$ many entries of the covariance matrix, stored in row-major format.
+- `grad`, an array that contains N entries, one for each `Obs` inside the structure. Each entry itself is an array, that contains the M gradients of the Nth observable with respect to the quantity that corresponds to the Mth diagonal entry of the covariance matrix.
+
+A JSON schema that may be used to verify the correctness of a file with respect to the format definition is stored in ./examples/json_schema.json. The schema is a self-descriptive format definition and contains an exemplary file.
+
+Julia I/O routines for the json.gz format, compatible with [ADerrors.jl](https://gitlab.ift.uam-csic.es/alberto/aderrors.jl), can be found [here](https://github.com/fjosw/ADjson.jl).
+
+# Citing
+If you use `pyerrors` for research that leads to a publication please consider citing:
+- Ulli Wolff, *Monte Carlo errors with less errors*. Comput.Phys.Commun. 156 (2004) 143-153, Comput.Phys.Commun. 176 (2007) 383 (erratum).
+- Stefan Schaefer, Rainer Sommer, Francesco Virotta, *Critical slowing down and error analysis in lattice QCD simulations*. Nucl.Phys.B 845 (2011) 93-119.
+- Alberto Ramos, *Automatic differentiation for error analysis of Monte Carlo data*. Comput.Phys.Commun. 238 (2019) 19-35.
'''
from .obs import *
from .correlators import *
diff --git a/pyerrors/correlators.py b/pyerrors/correlators.py
index 1f47de87..ac3f8b07 100644
--- a/pyerrors/correlators.py
+++ b/pyerrors/correlators.py
@@ -1,4 +1,5 @@
import warnings
+from itertools import permutations
import numpy as np
import autograd.numpy as anp
import matplotlib.pyplot as plt
@@ -6,7 +7,6 @@ import scipy.linalg
from .obs import Obs, reweight, correlate, CObs
from .misc import dump_object, _assert_equal_properties
from .fits import least_squares
-from .linalg import eigh, inv, cholesky
from .roots import find_root
@@ -16,10 +16,10 @@ class Corr:
Everything, this class does, can be achieved using lists or arrays of Obs.
But it is simply more convenient to have a dedicated object for correlators.
One often wants to add or multiply correlators of the same length at every timeslice and it is inconvenient
- to iterate over all timeslices for every operation. This is especially true, when dealing with smearing matrices.
+ to iterate over all timeslices for every operation. This is especially true, when dealing with matrices.
The correlator can have two types of content: An Obs at every timeslice OR a GEVP
- smearing matrix at every timeslice. Other dependency (eg. spatial) are not supported.
+ matrix at every timeslice. Other dependency (eg. spatial) are not supported.
"""
@@ -39,7 +39,7 @@ class Corr:
region indentified for this correlator.
"""
- if isinstance(data_input, np.ndarray): # Input is an array of Corrs
+ if isinstance(data_input, np.ndarray):
# This only works, if the array fulfills the conditions below
if not len(data_input.shape) == 2 and data_input.shape[0] == data_input.shape[1]:
@@ -55,8 +55,8 @@ class Corr:
N = data_input.shape[0]
input_as_list = []
for t in range(T):
- if any([(item.content[t][0] is None) for item in data_input.flatten()]):
- if not all([(item.content[t][0] is None) for item in data_input.flatten()]):
+ if any([(item.content[t] is None) for item in data_input.flatten()]):
+ if not all([(item.content[t] is None) for item in data_input.flatten()]):
warnings.warn("Input ill-defined at different timeslices. Conversion leads to data loss!", RuntimeWarning)
input_as_list.append(None)
else:
@@ -69,10 +69,10 @@ class Corr:
if isinstance(data_input, list):
- if all([(isinstance(item, Obs) or isinstance(item, CObs)) for item in data_input]):
+ if all([isinstance(item, (Obs, CObs)) for item in data_input]):
_assert_equal_properties(data_input)
self.content = [np.asarray([item]) for item in data_input]
- if all([(isinstance(item, Obs) or isinstance(item, CObs)) or item is None for item in data_input]):
+ if all([isinstance(item, (Obs, CObs)) or item is None for item in data_input]):
_assert_equal_properties([o for o in data_input if o is not None])
self.content = [np.asarray([item]) if item is not None else None for item in data_input]
self.N = 1
@@ -95,11 +95,8 @@ class Corr:
# An undefined timeslice is represented by the None object
self.content = [None] * padding[0] + self.content + [None] * padding[1]
self.T = len(self.content)
-
self.prange = prange
- self.gamma_method()
-
def __getitem__(self, idx):
"""Return the content of timeslice idx"""
if self.content[idx] is None:
@@ -140,8 +137,6 @@ class Corr:
if self.N == 1:
raise Exception("Trying to project a Corr, that already has N=1.")
- self.gamma_method()
-
if vector_l is None:
vector_l, vector_r = np.asarray([1.] + (self.N - 1) * [0.]), np.asarray([1.] + (self.N - 1) * [0.])
elif(vector_r is None):
@@ -160,9 +155,6 @@ class Corr:
raise Exception("Vectors are of wrong shape!")
if normalize:
vector_l, vector_r = vector_l / np.sqrt((vector_l @ vector_l)), vector_r / np.sqrt(vector_r @ vector_r)
- # if (not (0.95 < vector_r @ vector_r < 1.05)) or (not (0.95 < vector_l @ vector_l < 1.05)):
- # print("Vectors are normalized before projection!")
-
newcontent = [None if (item is None) else np.asarray([vector_l.T @ item @ vector_r]) for item in self.content]
else:
@@ -174,10 +166,7 @@ class Corr:
newcontent = [None if (self.content[t] is None or vector_l[t] is None or vector_r[t] is None) else np.asarray([vector_l[t].T @ self.content[t] @ vector_r[t]]) for t in range(self.T)]
return Corr(newcontent)
- def sum(self):
- return np.sqrt(self.N) * self.projected(np.ones(self.N))
-
- def smearing(self, i, j):
+ def item(self, i, j):
"""Picks the element [i,j] from every matrix and returns a correlator containing one Obs per timeslice.
Parameters
@@ -188,7 +177,7 @@ class Corr:
Second index to be picked.
"""
if self.N == 1:
- raise Exception("Trying to pick smearing from projected Corr")
+ raise Exception("Trying to pick item from projected Corr")
newcontent = [None if(item is None) else item[i, j] for item in self.content]
return Corr(newcontent)
@@ -199,7 +188,7 @@ class Corr:
timeslice and the error on each timeslice.
"""
if self.N != 1:
- raise Exception("Can only make Corr[N=1] plottable") # We could also autoproject to the groundstate or expect vectors, but this is supposed to be a super simple function.
+ raise Exception("Can only make Corr[N=1] plottable")
x_list = [x for x in range(self.T) if not self.content[x] is None]
y_list = [y[0].value for y in self.content if y is not None]
y_err_list = [y[0].dvalue for y in self.content if y is not None]
@@ -229,7 +218,9 @@ class Corr:
if self.T % 2 != 0:
raise Exception("Can not symmetrize odd T")
- if not all([o.is_zero_within_error(3) for o in self.content[0]]):
+ test = 1 * self
+ test.gamma_method()
+ if not all([o.is_zero_within_error(3) for o in test.content[0]]):
warnings.warn("Correlator does not seem to be anti-symmetric around x0=0.", RuntimeWarning)
newcontent = [self.content[0]]
@@ -242,13 +233,13 @@ class Corr:
raise Exception("Corr could not be symmetrized: No redundant values")
return Corr(newcontent, prange=self.prange)
- def smearing_symmetric(self):
- """Symmetrizes the matrices and therefore make them positive definite."""
+ def matrix_symmetric(self):
+ """Symmetrizes the correlator matrices on every timeslice."""
if self.N > 1:
transposed = [None if (G is None) else G.T for G in self.content]
return 0.5 * (Corr(transposed) + self)
if self.N == 1:
- raise Exception("Trying to symmetrize a smearing matrix, that already has N=1.")
+ raise Exception("Trying to symmetrize a correlator matrix, that already has N=1.")
def GEVP(self, t0, ts=None, state=0, sorted_list=None):
"""Solve the general eigenvalue problem on the current correlator
@@ -264,9 +255,9 @@ class Corr:
The state one is interested in ordered by energy. The lowest state is zero.
sorted_list : string
if this argument is set, a list of vectors (len=self.T) is returned. If it is left as None, only one vector is returned.
- "Eigenvalue" - The eigenvector is chosen according to which einvenvalue it belongs individually on every timeslice.
+ "Eigenvalue" - The eigenvector is chosen according to which eigenvalue it belongs individually on every timeslice.
"Eigenvector" - Use the method described in arXiv:2004.10472 [hep-lat] to find the set of v(t) belonging to the state.
- The referense state is identified by its eigenvalue at t=ts
+ The reference state is identified by its eigenvalue at t=ts
"""
if sorted_list is None:
if (ts is None):
@@ -274,10 +265,11 @@ class Corr:
if (self.content[t0] is None) or (self.content[ts] is None):
raise Exception("Corr not defined at t0/ts")
G0, Gt = np.empty([self.N, self.N], dtype="double"), np.empty([self.N, self.N], dtype="double")
+ symmetric_corr = self.matrix_symmetric()
for i in range(self.N):
for j in range(self.N):
- G0[i, j] = self.content[t0][i, j].value
- Gt[i, j] = self.content[ts][i, j].value
+ G0[i, j] = symmetric_corr.content[t0][i, j].value
+ Gt[i, j] = symmetric_corr[ts][i, j].value
sp_vecs = _GEVP_solver(Gt, G0)
sp_vec = sp_vecs[state]
@@ -309,24 +301,26 @@ class Corr:
return all_vecs
- def Eigenvalue(self, t0, state=1):
- G = self.smearing_symmetric()
- G0 = G.content[t0]
- L = cholesky(G0)
- Li = inv(L)
- LT = L.T
- LTi = inv(LT)
- newcontent = []
- for t in range(self.T):
- if self.content[t] is None:
- newcontent.append(None)
- else:
- Gt = G.content[t]
- M = Li @ Gt @ LTi
- eigenvalues = eigh(M)[0]
- eigenvalue = eigenvalues[-state]
- newcontent.append(eigenvalue)
- return Corr(newcontent)
+ def Eigenvalue(self, t0, ts=None, state=0, sorted_list=None):
+ """Determines the eigenvalue of the GEVP by solving and projecting the correlator
+
+ Parameters
+ ----------
+ t0 : int
+ The time t0 for G(t)v= lambda G(t_0)v
+ ts : int
+ fixed time G(t_s)v= lambda G(t_0)v if return_list=False
+ If return_list=True and sorting=Eigenvector it gives a reference point for the sorting method.
+ state : int
+ The state one is interested in ordered by energy. The lowest state is zero.
+ sorted_list : string
+ if this argument is set, a list of vectors (len=self.T) is returned. If it is left as None, only one vector is returned.
+ "Eigenvalue" - The eigenvector is chosen according to which eigenvalue it belongs individually on every timeslice.
+ "Eigenvector" - Use the method described in arXiv:2004.10472 [hep-lat] to find the set of v(t) belonging to the state.
+ The reference state is identified by its eigenvalue at t=ts
+ """
+ vec = self.GEVP(t0, ts=ts, state=state, sorted_list=sorted_list)
+ return self.projected(vec)
def Hankel(self, N, periodic=False):
"""Constructs an NxN Hankel matrix
@@ -353,8 +347,8 @@ class Corr:
new_content.append(array.copy())
def wrap(i):
- if i >= self.T:
- return i - self.T
+ while i >= self.T:
+ i -= self.T
return i
for t in range(self.T):
@@ -383,6 +377,24 @@ class Corr:
"""Reverse the time ordering of the Corr"""
return Corr(self.content[:: -1])
+ def thin(self, spacing=2, offset=0):
+ """Thin out a correlator to suppress correlations
+
+ Parameters
+ ----------
+ spacing : int
+ Keep only every 'spacing'th entry of the correlator
+ offset : int
+ Offset the equal spacing
+ """
+ new_content = []
+ for t in range(self.T):
+ if (offset + t) % spacing != 0:
+ new_content.append(None)
+ else:
+ new_content.append(self.content[t])
+ return Corr(new_content)
+
def correlate(self, partner):
"""Correlate the correlator with another correlator or Obs
@@ -448,7 +460,9 @@ class Corr:
T_partner = parity * partner.reverse()
t_slices = []
- for x0, t_slice in enumerate((self - T_partner).content):
+ test = (self - T_partner)
+ test.gamma_method()
+ for x0, t_slice in enumerate(test.content):
if t_slice is not None:
if not t_slice[0].is_zero_within_error(5):
t_slices.append(x0)
@@ -614,7 +628,7 @@ class Corr:
function : obj
function to fit to the data. See fits.least_squares for details.
fitrange : list
- Range in which the function is to be fitted to the data.
+ Two element list containing the timeslices on which the fit is supposed to start and stop.
If not specified, self.prange or all timeslices are used.
silent : bool
Decides whether output is printed to the standard output.
@@ -627,14 +641,18 @@ class Corr:
fitrange = self.prange
else:
fitrange = [0, self.T - 1]
+ else:
+ if not isinstance(fitrange, list):
+ raise Exception("fitrange has to be a list with two elements")
+ if len(fitrange) != 2:
+ raise Exception("fitrange has to have exactly two elements [fit_start, fit_stop]")
xs = [x for x in range(fitrange[0], fitrange[1] + 1) if not self.content[x] is None]
ys = [self.content[x][0] for x in range(fitrange[0], fitrange[1] + 1) if not self.content[x] is None]
result = least_squares(xs, ys, function, silent=silent, **kwargs)
- result.gamma_method()
return result
- def plateau(self, plateau_range=None, method="fit"):
+ def plateau(self, plateau_range=None, method="fit", auto_gamma=False):
""" Extract a plateau value from a Corr object
Parameters
@@ -646,6 +664,8 @@ class Corr:
method to extract the plateau.
'fit' fits a constant to the plateau region
'avg', 'average' or 'mean' just average over the given timeslices.
+ auto_gamma : bool
+ apply gamma_method with default parameters to the Corr. Defaults to None
"""
if not plateau_range:
if self.prange:
@@ -656,13 +676,14 @@ class Corr:
raise Exception("Correlator must be projected before getting a plateau.")
if(all([self.content[t] is None for t in range(plateau_range[0], plateau_range[1] + 1)])):
raise Exception("plateau is undefined at all timeslices in plateaurange.")
+ if auto_gamma:
+ self.gamma_method()
if method == "fit":
def const_func(a, t):
return a[0]
return self.fit(const_func, plateau_range)[0]
elif method in ["avg", "average", "mean"]:
returnvalue = np.mean([item[0] for item in self.content[plateau_range[0]:plateau_range[1] + 1] if item is not None])
- returnvalue.gamma_method()
return returnvalue
else:
@@ -680,8 +701,8 @@ class Corr:
self.prange = prange
return
- def show(self, x_range=None, comp=None, y_range=None, logscale=False, plateau=None, fit_res=None, ylabel=None, save=None):
- """Plots the correlator, uses tag as label if available.
+ def show(self, x_range=None, comp=None, y_range=None, logscale=False, plateau=None, fit_res=None, ylabel=None, save=None, auto_gamma=False):
+ """Plots the correlator using the tag of the correlator as label if available.
Parameters
----------
@@ -689,19 +710,26 @@ class Corr:
list of two values, determining the range of the x-axis e.g. [4, 8]
comp : Corr or list of Corr
Correlator or list of correlators which are plotted for comparison.
+ The tags of these correlators are used as labels if available.
logscale : bool
Sets y-axis to logscale
plateau : Obs
- plateau to be visualized in the figure
+ Plateau value to be visualized in the figure
fit_res : Fit_result
Fit_result object to be visualized
ylabel : str
Label for the y-axis
save : str
path to file in which the figure should be saved
+ auto_gamma : bool
+ Apply the gamma method with standard parameters to all correlators and plateau values before plotting.
"""
if self.N != 1:
raise Exception("Correlator must be projected before plotting")
+
+ if auto_gamma:
+ self.gamma_method()
+
if x_range is None:
x_range = [0, self.T - 1]
@@ -713,7 +741,6 @@ class Corr:
if logscale:
ax1.set_yscale('log')
else:
- # we generate ylim instead of using autoscaling.
if y_range is None:
try:
y_min = min([(x[0].value - x[0].dvalue) for x in self.content[x_range[0]: x_range[1] + 1] if (x is not None) and x[0].dvalue < 2 * np.abs(x[0].value)])
@@ -724,19 +751,23 @@ class Corr:
else:
ax1.set_ylim(y_range)
if comp:
- if isinstance(comp, Corr) or isinstance(comp, list):
+ if isinstance(comp, (Corr, list)):
for corr in comp if isinstance(comp, list) else [comp]:
+ if auto_gamma:
+ corr.gamma_method()
x, y, y_err = corr.plottable()
plt.errorbar(x, y, y_err, label=corr.tag, mfc=plt.rcParams['axes.facecolor'])
else:
- raise Exception('comp must be a correlator or a list of correlators.')
+ raise Exception("'comp' must be a correlator or a list of correlators.")
if plateau:
if isinstance(plateau, Obs):
+ if auto_gamma:
+ plateau.gamma_method()
ax1.axhline(y=plateau.value, linewidth=2, color=plt.rcParams['text.color'], alpha=0.6, marker=',', ls='--', label=str(plateau))
ax1.axhspan(plateau.value - plateau.dvalue, plateau.value + plateau.dvalue, alpha=0.25, color=plt.rcParams['text.color'], ls='-')
else:
- raise Exception('plateau must be an Obs')
+ raise Exception("'plateau' must be an Obs")
if self.prange:
ax1.axvline(self.prange[0], 0, 1, ls='-', marker=',')
ax1.axvline(self.prange[1], 0, 1, ls='-', marker=',')
@@ -761,9 +792,36 @@ class Corr:
if isinstance(save, str):
fig.savefig(save)
else:
- raise Exception("Safe has to be a string.")
+ raise Exception("'save' has to be a string.")
- return
+ def spaghetti_plot(self, logscale=True):
+ """Produces a spaghetti plot of the correlator suited to monitor exceptional configurations.
+
+ Parameters
+ ----------
+ logscale : bool
+ Determines whether the scale of the y-axis is logarithmic or standard.
+ """
+ if self.N != 1:
+ raise Exception("Correlator needs to be projected first.")
+
+ mc_names = list(set([item for sublist in [o[0].mc_names for o in self.content if o is not None] for item in sublist]))
+ x0_vals = [n for (n, o) in zip(np.arange(self.T), self.content) if o is not None]
+
+ for name in mc_names:
+ data = np.array([o[0].deltas[name] + o[0].r_values[name] for o in self.content if o is not None]).T
+
+ fig = plt.figure()
+ ax = fig.add_subplot(111)
+ for dat in data:
+ ax.plot(x0_vals, dat, ls='-', marker='')
+
+ if logscale is True:
+ ax.set_yscale('log')
+
+ ax.set_xlabel(r'$x_0 / a$')
+ plt.title(name)
+ plt.draw()
def dump(self, filename, datatype="json.gz", **kwargs):
"""Dumps the Corr into a file of chosen type
@@ -801,8 +859,6 @@ class Corr:
content_string += "Description: " + self.tag + "\n"
if self.N != 1:
return content_string
- # This avoids a crash for N>1. I do not know, what else to do here. I like the list representation for N==1. We could print only one "smearing" or one matrix. Printing everything will just
- # be a wall of numbers.
if range[1]:
range[1] += 1
@@ -837,7 +893,7 @@ class Corr:
newcontent.append(self.content[t] + y.content[t])
return Corr(newcontent)
- elif isinstance(y, Obs) or isinstance(y, int) or isinstance(y, float) or isinstance(y, CObs):
+ elif isinstance(y, (Obs, int, float, CObs)):
newcontent = []
for t in range(self.T):
if (self.content[t] is None):
@@ -845,6 +901,11 @@ class Corr:
else:
newcontent.append(self.content[t] + y)
return Corr(newcontent, prange=self.prange)
+ elif isinstance(y, np.ndarray):
+ if y.shape == (self.T,):
+ return Corr(list((np.array(self.content).T + y).T))
+ else:
+ raise ValueError("operands could not be broadcast together")
else:
raise TypeError("Corr + wrong type")
@@ -860,7 +921,7 @@ class Corr:
newcontent.append(self.content[t] * y.content[t])
return Corr(newcontent)
- elif isinstance(y, Obs) or isinstance(y, int) or isinstance(y, float) or isinstance(y, CObs):
+ elif isinstance(y, (Obs, int, float, CObs)):
newcontent = []
for t in range(self.T):
if (self.content[t] is None):
@@ -868,6 +929,11 @@ class Corr:
else:
newcontent.append(self.content[t] * y)
return Corr(newcontent, prange=self.prange)
+ elif isinstance(y, np.ndarray):
+ if y.shape == (self.T,):
+ return Corr(list((np.array(self.content).T * y).T))
+ else:
+ raise ValueError("operands could not be broadcast together")
else:
raise TypeError("Corr * wrong type")
@@ -881,8 +947,6 @@ class Corr:
newcontent.append(None)
else:
newcontent.append(self.content[t] / y.content[t])
- # Here we set the entire timeslice to undefined, if one of the smearings has encountered an division by zero.
- # While this might throw away perfectly good values in other smearings, we will never have to check, if all values in our matrix are defined
for t in range(self.T):
if newcontent[t] is None:
continue
@@ -893,7 +957,7 @@ class Corr:
raise Exception("Division returns completely undefined correlator")
return Corr(newcontent)
- elif isinstance(y, Obs) or isinstance(y, CObs):
+ elif isinstance(y, (Obs, CObs)):
if isinstance(y, Obs):
if y.value == 0:
raise Exception('Division by zero will return undefined correlator')
@@ -909,7 +973,7 @@ class Corr:
newcontent.append(self.content[t] / y)
return Corr(newcontent, prange=self.prange)
- elif isinstance(y, int) or isinstance(y, float):
+ elif isinstance(y, (int, float)):
if y == 0:
raise Exception('Division by zero will return undefined correlator')
newcontent = []
@@ -919,6 +983,11 @@ class Corr:
else:
newcontent.append(self.content[t] / y)
return Corr(newcontent, prange=self.prange)
+ elif isinstance(y, np.ndarray):
+ if y.shape == (self.T,):
+ return Corr(list((np.array(self.content).T / y).T))
+ else:
+ raise ValueError("operands could not be broadcast together")
else:
raise TypeError('Corr / wrong type')
@@ -930,7 +999,7 @@ class Corr:
return self + (-y)
def __pow__(self, y):
- if isinstance(y, Obs) or isinstance(y, int) or isinstance(y, float) or isinstance(y, CObs):
+ if isinstance(y, (Obs, int, float, CObs)):
newcontent = [None if (item is None) else item**y for item in self.content]
return Corr(newcontent, prange=self.prange)
else:
@@ -1042,7 +1111,7 @@ def _sort_vectors(vec_set, ts):
if vec_set[t] is None:
sorted_vec_set.append(None)
elif not t == ts:
- perms = permutation([i for i in range(N)])
+ perms = [list(o) for o in permutations([i for i in range(N)], N)]
best_score = 0
for perm in perms:
current_score = 1
@@ -1060,21 +1129,8 @@ def _sort_vectors(vec_set, ts):
return sorted_vec_set
-def permutation(lst): # Shamelessly copied
- if len(lst) == 1:
- return [lst]
- ll = []
- for i in range(len(lst)):
- m = lst[i]
- remLst = lst[:i] + lst[i + 1:]
- # Generating all permutations where m is first
- for p in permutation(remLst):
- ll.append([m] + p)
- return ll
-
-
def _GEVP_solver(Gt, G0): # Just so normalization an sorting does not need to be repeated. Here we could later put in some checks
- sp_val, sp_vecs = scipy.linalg.eig(Gt, G0)
+ sp_val, sp_vecs = scipy.linalg.eigh(Gt, G0)
sp_vecs = [sp_vecs[:, np.argsort(sp_val)[-i]] for i in range(1, sp_vecs.shape[0] + 1)]
sp_vecs = [v / np.sqrt((v.T @ G0 @ v)) for v in sp_vecs]
return sp_vecs
diff --git a/pyerrors/covobs.py b/pyerrors/covobs.py
index 2c8f81fc..49953983 100644
--- a/pyerrors/covobs.py
+++ b/pyerrors/covobs.py
@@ -45,6 +45,16 @@ class Covobs:
return float(np.dot(np.transpose(self.grad), np.dot(self.cov, self.grad)))
def _set_cov(self, cov):
+ """ Set the covariance matrix of the covobs
+
+ Parameters
+ ----------
+ cov : list or array
+ Has to be either of:
+ 0 dimensional number: variance of a single covobs,
+ 1 dimensional list or array of lenght N: variances of multiple covobs
+ 2 dimensional list or array (N x N): Symmetric, positive-semidefinite covariance matrix
+ """
self._cov = np.array(cov)
if self._cov.ndim == 0:
self.N = 1
@@ -59,7 +69,26 @@ class Covobs:
else:
raise Exception('Covariance matrix has to be a 2 dimensional square matrix!')
+ for i in range(self.N):
+ for j in range(i):
+ if not self._cov[i][j] == self._cov[j][i]:
+ raise Exception('Covariance matrix is non-symmetric for (%d, %d' % (i, j))
+
+ evals = np.linalg.eigvalsh(self._cov)
+ for ev in evals:
+ if ev < 0:
+ raise Exception('Covariance matrix is not positive-semidefinite!')
+
def _set_grad(self, grad):
+ """ Set the gradient of the covobs
+
+ Parameters
+ ----------
+ grad : list or array
+ Has to be either of:
+ 0 dimensional number: gradient w.r.t. a single covobs,
+ 1 dimensional list or array of lenght N: gradient w.r.t. multiple covobs
+ """
self._grad = np.array(grad)
if self._grad.ndim in [0, 1]:
self._grad = np.reshape(self._grad, (self.N, 1))
diff --git a/pyerrors/fits.py b/pyerrors/fits.py
index 22c69fe3..cfb10907 100644
--- a/pyerrors/fits.py
+++ b/pyerrors/fits.py
@@ -39,7 +39,6 @@ class Fit_result(Sequence):
[o.gamma_method() for o in self.fit_parameters]
def __str__(self):
- self.gamma_method()
my_str = 'Goodness of fit:\n'
if hasattr(self, 'chisquare_by_dof'):
my_str += '\u03C7\u00b2/d.o.f. = ' + f'{self.chisquare_by_dof:2.6f}' + '\n'
@@ -72,9 +71,10 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs):
fit function, has to be of the form
```python
+ import autograd.numpy as anp
+
def func(a, x):
- y = a[0] + a[1] * x + a[2] * anp.sinh(x)
- return y
+ return a[0] + a[1] * x + a[2] * anp.sinh(x)
```
For multiple x values func can be of the form
@@ -86,7 +86,7 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs):
```
It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation
- will not work
+ will not work.
priors : list, optional
priors has to be a list with an entry for every parameter in the fit. The entries can either be
Obs (e.g. results from a previous fit) or strings containing a value and an error formatted like
@@ -95,24 +95,25 @@ def least_squares(x, y, func, priors=None, silent=False, **kwargs):
If true all output to the console is omitted (default False).
initial_guess : list
can provide an initial guess for the input parameters. Relevant for
- non-linear fits with many parameters.
- method : str
+ non-linear fits with many parameters.
+ method : str, optional
can be used to choose an alternative method for the minimization of chisquare.
The possible methods are the ones which can be used for scipy.optimize.minimize and
migrad of iminuit. If no method is specified, Levenberg-Marquard is used.
Reliable alternatives are migrad, Powell and Nelder-Mead.
- resplot : bool
- If true, a plot which displays fit, data and residuals is generated (default False).
- qqplot : bool
- If true, a quantile-quantile plot of the fit result is generated (default False).
- expected_chisquare : bool
- If true prints the expected chisquare which is
- corrected by effects caused by correlated input data.
- This can take a while as the full correlation matrix
- has to be calculated (default False).
correlated_fit : bool
- If true, use the full correlation matrix in the definition of the chisquare
- (only works for prior==None and when no method is given, at the moment).
+ If True, use the full inverse covariance matrix in the definition of the chisquare cost function.
+ For details about how the covariance matrix is estimated see `pyerrors.obs.covariance`.
+ In practice the correlation matrix is Cholesky decomposed and inverted (instead of the covariance matrix).
+ This procedure should be numerically more stable as the correlation matrix is typically better conditioned (Jacobi preconditioning).
+ At the moment this option only works for `prior==None` and when no `method` is given.
+ expected_chisquare : bool
+ If True estimates the expected chisquare which is
+ corrected by effects caused by correlated input data (default False).
+ resplot : bool
+ If True, a plot which displays fit, data and residuals is generated (default False).
+ qqplot : bool
+ If True, a quantile-quantile plot of the fit result is generated (default False).
'''
if priors is not None:
return _prior_fit(x, y, func, priors, silent=silent, **kwargs)
@@ -133,9 +134,10 @@ def total_least_squares(x, y, func, silent=False, **kwargs):
func has to be of the form
```python
+ import autograd.numpy as anp
+
def func(a, x):
- y = a[0] + a[1] * x + a[2] * anp.sinh(x)
- return y
+ return a[0] + a[1] * x + a[2] * anp.sinh(x)
```
For multiple x values func can be of the form
@@ -159,6 +161,8 @@ def total_least_squares(x, y, func, silent=False, **kwargs):
This can take a while as the full correlation matrix
has to be calculated (default False).
+ Notes
+ -----
Based on the orthogonal distance regression module of scipy
'''
@@ -238,7 +242,7 @@ def total_least_squares(x, y, func, silent=False, **kwargs):
if kwargs.get('covariance') is not None:
cov = kwargs.get('covariance')
else:
- cov = covariance_matrix(np.concatenate((y, x.ravel())))
+ cov = covariance(np.concatenate((y, x.ravel())))
number_of_x_parameters = int(m / x_f.shape[-1])
@@ -248,7 +252,7 @@ def total_least_squares(x, y, func, silent=False, **kwargs):
new_jac = np.concatenate((fused_row1, fused_row2), axis=1)
A = W @ new_jac
- P_phi = A @ np.linalg.inv(A.T @ A) @ A.T
+ P_phi = A @ np.linalg.pinv(A.T @ A) @ A.T
expected_chisquare = np.trace((np.identity(P_phi.shape[0]) - P_phi) @ W @ cov @ W)
if expected_chisquare <= 0.0:
warnings.warn("Negative expected_chisquare.", RuntimeWarning)
@@ -259,7 +263,10 @@ def total_least_squares(x, y, func, silent=False, **kwargs):
output.chisquare_by_expected_chisquare)
fitp = out.beta
- hess_inv = np.linalg.pinv(jacobian(jacobian(odr_chisquare))(np.concatenate((fitp, out.xplus.ravel()))))
+ try:
+ hess_inv = np.linalg.pinv(jacobian(jacobian(odr_chisquare))(np.concatenate((fitp, out.xplus.ravel()))))
+ except TypeError:
+ raise Exception("It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.") from None
def odr_chisquare_compact_x(d):
model = func(d[:n_parms], d[n_parms:n_parms + m].reshape(x_shape))
@@ -292,11 +299,6 @@ def total_least_squares(x, y, func, silent=False, **kwargs):
return output
-def prior_fit(x, y, func, priors, silent=False, **kwargs):
- warnings.warn("prior_fit renamed to least_squares", DeprecationWarning)
- return least_squares(x, y, func, priors=priors, silent=silent, **kwargs)
-
-
def _prior_fit(x, y, func, priors, silent=False, **kwargs):
output = Fit_result()
@@ -415,11 +417,6 @@ def _prior_fit(x, y, func, priors, silent=False, **kwargs):
return output
-def standard_fit(x, y, func, silent=False, **kwargs):
- warnings.warn("standard_fit renamed to least_squares", DeprecationWarning)
- return least_squares(x, y, func, silent=silent, **kwargs)
-
-
def _standard_fit(x, y, func, silent=False, **kwargs):
output = Fit_result()
@@ -464,15 +461,13 @@ def _standard_fit(x, y, func, silent=False, **kwargs):
x0 = [0.1] * n_parms
if kwargs.get('correlated_fit') is True:
- cov = covariance_matrix(y)
- covdiag = np.diag(1. / np.sqrt(np.diag(cov)))
- corr = np.copy(cov)
- for i in range(len(y)):
- for j in range(len(y)):
- corr[i][j] = cov[i][j] / np.sqrt(cov[i][i] * cov[j][j])
+ corr = covariance(y, correlation=True)
+ covdiag = np.diag(1 / np.asarray(dy_f))
condn = np.linalg.cond(corr)
- if condn > 1e4:
- warnings.warn("Correlation matrix may be ill-conditioned! condition number: %1.2e" % (condn), RuntimeWarning)
+ if condn > 0.1 / np.finfo(float).eps:
+ raise Exception(f"Cannot invert correlation matrix as its condition number exceeds machine precision ({condn:1.2e})")
+ if condn > 1 / np.sqrt(np.finfo(float).eps):
+ warnings.warn("Correlation matrix may be ill-conditioned, condition number: {%1.2e}" % (condn), RuntimeWarning)
chol = np.linalg.cholesky(corr)
chol_inv = np.linalg.inv(chol)
chol_inv = np.dot(chol_inv, covdiag)
@@ -487,25 +482,21 @@ def _standard_fit(x, y, func, silent=False, **kwargs):
chisq = anp.sum(((y_f - model) / dy_f) ** 2)
return chisq
- if 'method' in kwargs:
- output.method = kwargs.get('method')
- if not silent:
- print('Method:', kwargs.get('method'))
- if kwargs.get('method') == 'migrad':
- fit_result = iminuit.minimize(chisqfunc, x0)
- fit_result = iminuit.minimize(chisqfunc, fit_result.x)
+ output.method = kwargs.get('method', 'Levenberg-Marquardt')
+ if not silent:
+ print('Method:', output.method)
+
+ if output.method != 'Levenberg-Marquardt':
+ if output.method == 'migrad':
+ fit_result = iminuit.minimize(chisqfunc, x0, tol=1e-4) # Stopping criterion 0.002 * tol * errordef
+ output.iterations = fit_result.nfev
else:
- fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method'))
- fit_result = scipy.optimize.minimize(chisqfunc, fit_result.x, method=kwargs.get('method'), tol=1e-12)
+ fit_result = scipy.optimize.minimize(chisqfunc, x0, method=kwargs.get('method'), tol=1e-12)
+ output.iterations = fit_result.nit
chisquare = fit_result.fun
- output.iterations = fit_result.nit
else:
- output.method = 'Levenberg-Marquardt'
- if not silent:
- print('Method: Levenberg-Marquardt')
-
if kwargs.get('correlated_fit') is True:
def chisqfunc_residuals(p):
model = func(p, x)
@@ -540,9 +531,9 @@ def _standard_fit(x, y, func, silent=False, **kwargs):
if kwargs.get('expected_chisquare') is True:
if kwargs.get('correlated_fit') is not True:
W = np.diag(1 / np.asarray(dy_f))
- cov = covariance_matrix(y)
+ cov = covariance(y)
A = W @ jacobian(func)(fit_result.x, x)
- P_phi = A @ np.linalg.inv(A.T @ A) @ A.T
+ P_phi = A @ np.linalg.pinv(A.T @ A) @ A.T
expected_chisquare = np.trace((np.identity(x.shape[-1]) - P_phi) @ W @ cov @ W)
output.chisquare_by_expected_chisquare = chisquare / expected_chisquare
if not silent:
@@ -550,7 +541,10 @@ def _standard_fit(x, y, func, silent=False, **kwargs):
output.chisquare_by_expected_chisquare)
fitp = fit_result.x
- hess_inv = np.linalg.pinv(jacobian(jacobian(chisqfunc))(fitp))
+ try:
+ hess_inv = np.linalg.pinv(jacobian(jacobian(chisqfunc))(fitp))
+ except TypeError:
+ raise Exception("It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.") from None
if kwargs.get('correlated_fit') is True:
def chisqfunc_compact(d):
@@ -587,17 +581,16 @@ def _standard_fit(x, y, func, silent=False, **kwargs):
return output
-def odr_fit(x, y, func, silent=False, **kwargs):
- warnings.warn("odr_fit renamed to total_least_squares", DeprecationWarning)
- return total_least_squares(x, y, func, silent=silent, **kwargs)
-
-
def fit_lin(x, y, **kwargs):
"""Performs a linear fit to y = n + m * x and returns two Obs n, m.
- y has to be a list of Obs, the dvalues of the Obs are used as yerror for the fit.
- x can either be a list of floats in which case no xerror is assumed, or
- a list of Obs, where the dvalues of the Obs are used as xerror for the fit.
+ Parameters
+ ----------
+ x : list
+ Can either be a list of floats in which case no xerror is assumed, or
+ a list of Obs, where the dvalues of the Obs are used as xerror for the fit.
+ y : list
+ List of Obs, the dvalues of the Obs are used as yerror for the fit.
"""
def f(a, x):
@@ -615,8 +608,8 @@ def fit_lin(x, y, **kwargs):
def qqplot(x, o_y, func, p):
- """ Generates a quantile-quantile plot of the fit result which can be used to
- check if the residuals of the fit are gaussian distributed.
+ """Generates a quantile-quantile plot of the fit result which can be used to
+ check if the residuals of the fit are gaussian distributed.
"""
residuals = []
@@ -632,7 +625,7 @@ def qqplot(x, o_y, func, p):
fit_stop = my_x[-1]
samples = np.arange(fit_start, fit_stop, 0.01)
plt.plot(samples, samples, 'k--', zorder=11, label='Standard normal distribution')
- plt.plot(samples, probplot[1][0] * samples + probplot[1][1], zorder=10, label='Least squares fit, r=' + str(np.around(probplot[1][2], 3)))
+ plt.plot(samples, probplot[1][0] * samples + probplot[1][1], zorder=10, label='Least squares fit, r=' + str(np.around(probplot[1][2], 3)), marker='', ls='-')
plt.xlabel('Theoretical quantiles')
plt.ylabel('Ordered Values')
@@ -669,22 +662,9 @@ def residual_plot(x, y, func, fit_res):
plt.draw()
-def covariance_matrix(y):
- """Returns the covariance matrix of y."""
- length = len(y)
- cov = np.zeros((length, length))
- for i, item in enumerate(y):
- for j, jtem in enumerate(y[:i + 1]):
- if i == j:
- cov[i, j] = item.dvalue ** 2
- else:
- cov[i, j] = covariance(item, jtem)
- return cov + cov.T - np.diag(np.diag(cov))
-
-
def error_band(x, func, beta):
"""Returns the error band for an array of sample values x, for given fit function func with optimized parameters beta."""
- cov = covariance_matrix(beta)
+ cov = covariance(beta)
if np.any(np.abs(cov - cov.T) > 1000 * np.finfo(np.float64).eps):
warnings.warn("Covariance matrix is not symmetric within floating point precision", RuntimeWarning)
diff --git a/pyerrors/input/__init__.py b/pyerrors/input/__init__.py
index 2797841c..3b585614 100644
--- a/pyerrors/input/__init__.py
+++ b/pyerrors/input/__init__.py
@@ -1,3 +1,10 @@
+r'''
+`pyerrors` includes an `input` submodule in which input routines and parsers for the output of various numerical programs are contained.
+
+# Jackknife samples
+For comparison with other analysis workflows `pyerrors` can also generate jackknife samples from an `Obs` object or import jackknife samples into an `Obs` object.
+See `pyerrors.obs.Obs.export_jackknife` and `pyerrors.obs.import_jackknife` for details.
+'''
from . import bdio
from . import hadrons
from . import json
diff --git a/pyerrors/input/bdio.py b/pyerrors/input/bdio.py
index 0a15cceb..ef0e7f68 100644
--- a/pyerrors/input/bdio.py
+++ b/pyerrors/input/bdio.py
@@ -1,6 +1,3 @@
-#!/usr/bin/env python
-# coding: utf-8
-
import ctypes
import hashlib
import autograd.numpy as np # Thinly-wrapped numpy
diff --git a/pyerrors/input/hadrons.py b/pyerrors/input/hadrons.py
index 371d1525..e9097625 100644
--- a/pyerrors/input/hadrons.py
+++ b/pyerrors/input/hadrons.py
@@ -1,9 +1,11 @@
import os
+import warnings
+from collections import Counter
import h5py
import numpy as np
-from collections import Counter
from ..obs import Obs, CObs
from ..correlators import Corr
+from ..dirac import epsilon_tensor_rank4
def _get_files(path, filestem, idl):
@@ -43,13 +45,16 @@ def _get_files(path, filestem, idl):
raise Exception("Unsorted files")
if len(dc) == 1:
idx = range(cnfg_numbers[0], cnfg_numbers[-1] + dc[0], dc[0])
+ elif idl:
+ idx = idl
+ warnings.warn("Configurations are not evenly spaced.", RuntimeWarning)
else:
- raise Exception('Configurations are not evenly spaced.')
+ raise Exception("Configurations are not evenly spaced.")
return filtered_files, idx
-def read_meson_hd5(path, filestem, ens_id, meson='meson_0', tree='meson', idl=None):
+def read_meson_hd5(path, filestem, ens_id, meson='meson_0', idl=None):
"""Read hadrons meson hdf5 file and extract the meson labeled 'meson'
Parameters
@@ -73,14 +78,16 @@ def read_meson_hd5(path, filestem, ens_id, meson='meson_0', tree='meson', idl=No
corr_data = []
infos = []
for hd5_file in files:
- file = h5py.File(path + '/' + hd5_file, "r")
- raw_data = list(file[tree + '/' + meson + '/corr'])
+ h5file = h5py.File(path + '/' + hd5_file, "r")
+ if not tree + '/' + meson in h5file:
+ raise Exception("Entry '" + meson + "' not contained in the files.")
+ raw_data = list(h5file[tree + '/' + meson + '/corr'])
real_data = [o[0] for o in raw_data]
corr_data.append(real_data)
if not infos:
- for k, i in file[tree + '/' + meson].attrs.items():
+ for k, i in h5file[tree + '/' + meson].attrs.items():
infos.append(k + ': ' + i[0].decode())
- file.close()
+ h5file.close()
corr_data = np.array(corr_data)
l_obs = []
@@ -278,10 +285,17 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]):
for vertex in vertices:
lorentz_names = _get_lorentz_names(vertex)
for v_name in lorentz_names:
- if vertex not in intermediate_dict:
- intermediate_dict[vertex] = np.array(corr_data[v_name])
+ if v_name in [('SigmaXY', 'SigmaZT'),
+ ('SigmaXT', 'SigmaYZ'),
+ ('SigmaYZ', 'SigmaXT'),
+ ('SigmaZT', 'SigmaXY')]:
+ sign = -1
else:
- intermediate_dict[vertex] += np.array(corr_data[v_name])
+ sign = 1
+ if vertex not in intermediate_dict:
+ intermediate_dict[vertex] = sign * np.array(corr_data[v_name])
+ else:
+ intermediate_dict[vertex] += sign * np.array(corr_data[v_name])
result_dict = {}
@@ -301,12 +315,27 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]):
def _get_lorentz_names(name):
- assert len(name) == 2
+ lorentz_index = ['X', 'Y', 'Z', 'T']
res = []
- if not set(name) <= set(['S', 'P', 'V', 'A', 'T']):
- raise Exception("Name can only contain 'S', 'P', 'V', 'A' or 'T'")
+ if name == "TT":
+ for i in range(4):
+ for j in range(i + 1, 4):
+ res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[i] + lorentz_index[j]))
+ return res
+
+ if name == "TTtilde":
+ for i in range(4):
+ for j in range(i + 1, 4):
+ for k in range(4):
+ for o in range(k + 1, 4):
+ fac = epsilon_tensor_rank4(i, j, k, o)
+ if not np.isclose(fac, 0.0):
+ res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[k] + lorentz_index[o]))
+ return res
+
+ assert len(name) == 2
if 'S' in name or 'P' in name:
if not set(name) <= set(['S', 'P']):
@@ -317,14 +346,9 @@ def _get_lorentz_names(name):
res.append((g_names[name[0]], g_names[name[1]]))
- elif 'T' in name:
- if not set(name) <= set(['T']):
- raise Exception("'" + name + "' is not a Lorentz scalar")
- raise Exception("Tensor operators not yet implemented.")
else:
if not set(name) <= set(['V', 'A']):
raise Exception("'" + name + "' is not a Lorentz scalar")
- lorentz_index = ['X', 'Y', 'Z', 'T']
for ind in lorentz_index:
res.append(('Gamma' + ind + (name[0] == 'A') * 'Gamma5',
diff --git a/pyerrors/input/json.py b/pyerrors/input/json.py
index 6f5cf470..a6060d5f 100644
--- a/pyerrors/input/json.py
+++ b/pyerrors/input/json.py
@@ -1,11 +1,13 @@
import json
import gzip
-import numpy as np
import getpass
import socket
import datetime
import platform
import warnings
+import re
+import gc
+import numpy as np
from ..obs import Obs
from ..covobs import Covobs
from ..correlators import Corr
@@ -20,7 +22,7 @@ def create_json_string(ol, description='', indent=1):
Parameters
----------
ol : list
- List of objects that will be exported. At the moments, these objects can be
+ List of objects that will be exported. At the moment, these objects can be
either of: Obs, list, numpy.ndarray, Corr.
All Obs inside a structure have to be defined on the same set of configurations.
description : str
@@ -37,6 +39,8 @@ def create_json_string(ol, description='', indent=1):
my_encoder.default = _default
class Deltalist:
+ __slots__ = ['cnfg', 'deltas']
+
def __init__(self, li):
self.cnfg = li[0]
self.deltas = li[1:]
@@ -52,6 +56,8 @@ def create_json_string(ol, description='', indent=1):
return self.__repr__()
class Floatlist:
+ __slots__ = ['li']
+
def __init__(self, li):
self.li = list(li)
@@ -170,6 +176,9 @@ def create_json_string(ol, description='', indent=1):
names.append(key)
idl.append(value)
my_obs = Obs(samples, names, idl)
+ my_obs._covobs = obs._covobs
+ for name in obs._covobs:
+ my_obs.names.append(name)
my_obs.reweighted = obs.reweighted
my_obs.is_merged = obs.is_merged
return my_obs
@@ -198,7 +207,7 @@ def create_json_string(ol, description='', indent=1):
d = {}
d['program'] = 'pyerrors %s' % (pyerrorsversion.__version__)
- d['version'] = '0.2'
+ d['version'] = '1.0'
d['who'] = getpass.getuser()
d['date'] = datetime.datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S %z')
d['host'] = socket.gethostname() + ', ' + platform.platform()
@@ -218,14 +227,18 @@ def create_json_string(ol, description='', indent=1):
else:
raise Exception("Unkown datatype.")
- jsonstring = json.dumps(d, indent=indent, cls=my_encoder, ensure_ascii=False)
+ jsonstring = ''
+ for chunk in my_encoder(indent=indent, ensure_ascii=False).iterencode(d):
+ jsonstring += chunk
- def remove_quotationmarks(s):
+ del d
+ gc.collect()
+
+ def remove_quotationmarks_split(split):
"""Workaround for un-quoting of delta lists, adds 5% of work
but is save, compared to a simple replace that could destroy the structure
"""
deltas = False
- split = s.split('\n')
for i in range(len(split)):
if '"deltas":' in split[i] or '"cov":' in split[i] or '"grad":' in split[i]:
deltas = True
@@ -235,7 +248,8 @@ def create_json_string(ol, description='', indent=1):
deltas = False
return '\n'.join(split)
- jsonstring = remove_quotationmarks(jsonstring)
+ jsonstring = jsonstring.split('\n')
+ jsonstring = remove_quotationmarks_split(jsonstring)
jsonstring = jsonstring.replace('nan', 'NaN')
return jsonstring
@@ -246,7 +260,7 @@ def dump_to_json(ol, fname, description='', indent=1, gz=True):
Parameters
----------
ol : list
- List of objects that will be exported. At the moments, these objects can be
+ List of objects that will be exported. At the moment, these objects can be
either of: Obs, list, numpy.ndarray, Corr.
All Obs inside a structure have to be defined on the same set of configurations.
fname : str
@@ -277,8 +291,9 @@ def dump_to_json(ol, fname, description='', indent=1, gz=True):
fp.close()
-def import_json_string(json_string, verbose=True, full_output=False):
- """Reconstruct a list of Obs or structures containing Obs from a json string.
+def _parse_json_dict(json_dict, verbose=True, full_output=False):
+ """Reconstruct a list of Obs or structures containing Obs from a dict that
+ was built out of a json string.
The following structures are supported: Obs, list, numpy.ndarray, Corr
If the list contains only one element, it is unpacked from the list.
@@ -303,10 +318,16 @@ def import_json_string(json_string, verbose=True, full_output=False):
retd['is_merged'] = {}
for ens in d:
for rep in ens['replica']:
- retd['names'].append(rep['name'])
+ rep_name = rep['name']
+ if len(rep_name) > len(ens["id"]):
+ if rep_name[len(ens["id"])] != "|":
+ tmp_list = list(rep_name)
+ tmp_list = tmp_list[:len(ens["id"])] + ["|"] + tmp_list[len(ens["id"]):]
+ rep_name = ''.join(tmp_list)
+ retd['names'].append(rep_name)
retd['idl'].append([di[0] for di in rep['deltas']])
retd['deltas'].append(np.array([di[1:] for di in rep['deltas']]))
- retd['is_merged'][rep['name']] = rep.get('is_merged', False)
+ retd['is_merged'][rep_name] = rep.get('is_merged', False)
return retd
def _gen_covobsd_from_cdatad(d):
@@ -426,8 +447,6 @@ def import_json_string(json_string, verbose=True, full_output=False):
my_corr.prange = temp_prange
return my_corr
- json_dict = json.loads(json_string)
-
prog = json_dict.get('program', '')
version = json_dict.get('version', '')
who = json_dict.get('who', '')
@@ -475,8 +494,28 @@ def import_json_string(json_string, verbose=True, full_output=False):
return ol
+def import_json_string(json_string, verbose=True, full_output=False):
+ """Reconstruct a list of Obs or structures containing Obs from a json string.
+
+ The following structures are supported: Obs, list, numpy.ndarray, Corr
+ If the list contains only one element, it is unpacked from the list.
+
+ Parameters
+ ----------
+ json_string : str
+ json string containing the data.
+ verbose : bool
+ Print additional information that was written to the file.
+ full_output : bool
+ If True, a dict containing auxiliary information and the data is returned.
+ If False, only the data is returned.
+ """
+
+ return _parse_json_dict(json.loads(json_string), verbose, full_output)
+
+
def load_json(fname, verbose=True, gz=True, full_output=False):
- """Import a list of Obs or structures containing Obs from a .json.gz file.
+ """Import a list of Obs or structures containing Obs from a .json(.gz) file.
The following structures are supported: Obs, list, numpy.ndarray, Corr
If the list contains only one element, it is unpacked from the list.
@@ -499,11 +538,223 @@ def load_json(fname, verbose=True, gz=True, full_output=False):
if not fname.endswith('.gz'):
fname += '.gz'
with gzip.open(fname, 'r') as fin:
- d = fin.read().decode('utf-8')
+ d = json.load(fin)
else:
if fname.endswith('.gz'):
warnings.warn("Trying to read from %s without unzipping!" % fname, UserWarning)
with open(fname, 'r', encoding='utf-8') as fin:
- d = fin.read()
+ d = json.loads(fin.read())
- return import_json_string(d, verbose, full_output)
+ return _parse_json_dict(d, verbose, full_output)
+
+
+def _ol_from_dict(ind, reps='DICTOBS'):
+ """Convert a dictionary of Obs objects to a list and a dictionary that contains
+ placeholders instead of the Obs objects.
+
+ Parameters
+ ----------
+ ind : dict
+ Dict of JSON valid structures and objects that will be exported.
+ At the moment, these object can be either of: Obs, list, numpy.ndarray, Corr.
+ All Obs inside a structure have to be defined on the same set of configurations.
+ reps : str
+ Specify the structure of the placeholder in exported dict to be reps[0-9]+.
+ """
+
+ obstypes = (Obs, Corr, np.ndarray)
+
+ if not reps.isalnum():
+ raise Exception('Placeholder string has to be alphanumeric!')
+ ol = []
+ counter = 0
+
+ def dict_replace_obs(d):
+ nonlocal ol
+ nonlocal counter
+ x = {}
+ for k, v in d.items():
+ if isinstance(v, dict):
+ v = dict_replace_obs(v)
+ elif isinstance(v, list) and all([isinstance(o, Obs) for o in v]):
+ v = obslist_replace_obs(v)
+ elif isinstance(v, list):
+ v = list_replace_obs(v)
+ elif isinstance(v, obstypes):
+ ol.append(v)
+ v = reps + '%d' % (counter)
+ counter += 1
+ elif isinstance(v, str):
+ if bool(re.match(r'%s[0-9]+' % (reps), v)):
+ raise Exception('Dict contains string %s that matches the placeholder! %s Cannot be savely exported.' % (v, reps))
+ x[k] = v
+ return x
+
+ def list_replace_obs(li):
+ nonlocal ol
+ nonlocal counter
+ x = []
+ for e in li:
+ if isinstance(e, list):
+ e = list_replace_obs(e)
+ elif isinstance(e, list) and all([isinstance(o, Obs) for o in e]):
+ e = obslist_replace_obs(e)
+ elif isinstance(e, dict):
+ e = dict_replace_obs(e)
+ elif isinstance(e, obstypes):
+ ol.append(e)
+ e = reps + '%d' % (counter)
+ counter += 1
+ elif isinstance(e, str):
+ if bool(re.match(r'%s[0-9]+' % (reps), e)):
+ raise Exception('Dict contains string %s that matches the placeholder! %s Cannot be savely exported.' % (e, reps))
+ x.append(e)
+ return x
+
+ def obslist_replace_obs(li):
+ nonlocal ol
+ nonlocal counter
+ il = []
+ for e in li:
+ il.append(e)
+
+ ol.append(il)
+ x = reps + '%d' % (counter)
+ counter += 1
+ return x
+
+ nd = dict_replace_obs(ind)
+
+ return ol, nd
+
+
+def dump_dict_to_json(od, fname, description='', indent=1, reps='DICTOBS', gz=True):
+ """Export a dict of Obs or structures containing Obs to a .json(.gz) file
+
+ Parameters
+ ----------
+ od : dict
+ Dict of JSON valid structures and objects that will be exported.
+ At the moment, these objects can be either of: Obs, list, numpy.ndarray, Corr.
+ All Obs inside a structure have to be defined on the same set of configurations.
+ fname : str
+ Filename of the output file.
+ description : str
+ Optional string that describes the contents of the json file.
+ indent : int
+ Specify the indentation level of the json file. None or 0 is permissible and
+ saves disk space.
+ reps : str
+ Specify the structure of the placeholder in exported dict to be reps[0-9]+.
+ gz : bool
+ If True, the output is a gzipped json. If False, the output is a json file.
+ """
+
+ if not isinstance(od, dict):
+ raise Exception('od has to be a dictionary. Did you want to use dump_to_json?')
+
+ infostring = ('This JSON file contains a python dictionary that has been parsed to a list of structures. '
+ 'OBSDICT contains the dictionary, where Obs or other structures have been replaced by '
+ '' + reps + '[0-9]+. The field description contains the additional description of this JSON file. '
+ 'This file may be parsed to a dict with the pyerrors routine load_json_dict.')
+
+ desc_dict = {'INFO': infostring, 'OBSDICT': {}, 'description': description}
+ ol, desc_dict['OBSDICT'] = _ol_from_dict(od, reps=reps)
+
+ dump_to_json(ol, fname, description=desc_dict, indent=indent, gz=gz)
+
+
+def _od_from_list_and_dict(ol, ind, reps='DICTOBS'):
+ """Parse a list of Obs or structures containing Obs and an accompanying
+ dict, where the structures have been replaced by placeholders to a
+ dict that contains the structures.
+
+ The following structures are supported: Obs, list, numpy.ndarray, Corr
+
+ Parameters
+ ----------
+ ol : list
+ List of objects -
+ At the moment, these objects can be either of: Obs, list, numpy.ndarray, Corr.
+ All Obs inside a structure have to be defined on the same set of configurations.
+ ind : dict
+ Dict that defines the structure of the resulting dict and contains placeholders
+ reps : str
+ Specify the structure of the placeholder in imported dict to be reps[0-9]+.
+ """
+ if not reps.isalnum():
+ raise Exception('Placeholder string has to be alphanumeric!')
+
+ counter = 0
+
+ def dict_replace_string(d):
+ nonlocal counter
+ nonlocal ol
+ x = {}
+ for k, v in d.items():
+ if isinstance(v, dict):
+ v = dict_replace_string(v)
+ elif isinstance(v, list):
+ v = list_replace_string(v)
+ elif isinstance(v, str) and bool(re.match(r'%s[0-9]+' % (reps), v)):
+ index = int(v[len(reps):])
+ v = ol[index]
+ counter += 1
+ x[k] = v
+ return x
+
+ def list_replace_string(li):
+ nonlocal counter
+ nonlocal ol
+ x = []
+ for e in li:
+ if isinstance(e, list):
+ e = list_replace_string(e)
+ elif isinstance(e, dict):
+ e = dict_replace_string(e)
+ elif isinstance(e, str) and bool(re.match(r'%s[0-9]+' % (reps), e)):
+ index = int(e[len(reps):])
+ e = ol[index]
+ counter += 1
+ x.append(e)
+ return x
+
+ nd = dict_replace_string(ind)
+
+ if counter == 0:
+ raise Exception('No placeholder has been replaced! Check if reps is set correctly.')
+
+ return nd
+
+
+def load_json_dict(fname, verbose=True, gz=True, full_output=False, reps='DICTOBS'):
+ """Import a dict of Obs or structures containing Obs from a .json(.gz) file.
+
+ The following structures are supported: Obs, list, numpy.ndarray, Corr
+
+ Parameters
+ ----------
+ fname : str
+ Filename of the input file.
+ verbose : bool
+ Print additional information that was written to the file.
+ gz : bool
+ If True, assumes that data is gzipped. If False, assumes JSON file.
+ full_output : bool
+ If True, a dict containing auxiliary information and the data is returned.
+ If False, only the data is returned.
+ reps : str
+ Specify the structure of the placeholder in imported dict to be reps[0-9]+.
+ """
+ indata = load_json(fname, verbose=verbose, gz=gz, full_output=True)
+ description = indata['description']['description']
+ indict = indata['description']['OBSDICT']
+ ol = indata['obsdata']
+ od = _od_from_list_and_dict(ol, indict, reps=reps)
+
+ if full_output:
+ indata['description'] = description
+ indata['obsdata'] = od
+ return indata
+ else:
+ return od
diff --git a/pyerrors/input/openQCD.py b/pyerrors/input/openQCD.py
index a1b4e61d..05e9fdb7 100644
--- a/pyerrors/input/openQCD.py
+++ b/pyerrors/input/openQCD.py
@@ -2,7 +2,10 @@ import os
import fnmatch
import re
import struct
+import warnings
import numpy as np # Thinly-wrapped numpy
+import matplotlib.pyplot as plt
+from matplotlib import gridspec
from ..obs import Obs
from ..fits import fit_lin
@@ -27,6 +30,9 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs):
list which contains the first config to be read for each replicum
r_stop : list
list which contains the last config to be read for each replicum
+ r_step : int
+ integer that defines a fixed step size between two measurements (in units of configs)
+ If not given, r_step=1 is assumed.
postfix : str
postfix of the file to read, e.g. '.ms1' for openQCD-files
files : list
@@ -64,8 +70,7 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs):
r_start = kwargs.get('r_start')
if len(r_start) != replica:
raise Exception('r_start does not match number of replicas')
- # Adjust Configuration numbering to python index
- r_start = [o - 1 if o else None for o in r_start]
+ r_start = [o if o else None for o in r_start]
else:
r_start = [None] * replica
@@ -76,15 +81,26 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs):
else:
r_stop = [None] * replica
+ if 'r_step' in kwargs:
+ r_step = kwargs.get('r_step')
+ else:
+ r_step = 1
+
print('Read reweighting factors from', prefix[:-1], ',',
replica, 'replica', end='')
if names is None:
rep_names = []
for entry in ls:
- truncated_entry = entry.split('.')[0]
+ truncated_entry = entry
+ suffixes = [".dat", ".rwms", ".ms1"]
+ for suffix in suffixes:
+ if truncated_entry.endswith(suffix):
+ truncated_entry = truncated_entry[0:-len(suffix)]
idx = truncated_entry.index('r')
rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:])
+ else:
+ rep_names = names
print_err = 0
if 'print_err' in kwargs:
@@ -93,6 +109,10 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs):
deltas = []
+ configlist = []
+ r_start_index = []
+ r_stop_index = []
+
for rep in range(replica):
tmp_array = []
with open(path + '/' + ls[rep], 'rb') as fp:
@@ -129,12 +149,13 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs):
if not struct.unpack('i', fp.read(4))[0] == 0:
print('something is wrong!')
+ configlist.append([])
while 0 < 1:
t = fp.read(4)
if len(t) < 4:
break
- if print_err:
- config_no = struct.unpack('i', t)
+ config_no = struct.unpack('i', t)[0]
+ configlist[-1].append(config_no)
for i in range(nrw):
if(version == '2.0'):
tmpd = _read_array_openQCD2(fp)
@@ -165,22 +186,50 @@ def read_rwms(path, prefix, version='2.0', names=None, **kwargs):
print('Partial factor:', tmp_nfct)
tmp_array[i].append(tmp_nfct)
+ diffmeas = configlist[-1][-1] - configlist[-1][-2]
+ configlist[-1] = [item // diffmeas for item in configlist[-1]]
+ if configlist[-1][0] > 1 and diffmeas > 1:
+ warnings.warn('Assume thermalization and that the first measurement belongs to the first config.')
+ offset = configlist[-1][0] - 1
+ configlist[-1] = [item - offset for item in configlist[-1]]
+
+ if r_start[rep] is None:
+ r_start_index.append(0)
+ else:
+ try:
+ r_start_index.append(configlist[-1].index(r_start[rep]))
+ except ValueError:
+ raise Exception('Config %d not in file with range [%d, %d]' % (
+ r_start[rep], configlist[-1][0], configlist[-1][-1])) from None
+
+ if r_stop[rep] is None:
+ r_stop_index.append(len(configlist[-1]) - 1)
+ else:
+ try:
+ r_stop_index.append(configlist[-1].index(r_stop[rep]))
+ except ValueError:
+ raise Exception('Config %d not in file with range [%d, %d]' % (
+ r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None
+
for k in range(nrw):
- deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]])
+ deltas[k].append(tmp_array[k][r_start_index[rep]:r_stop_index[rep] + 1][::r_step])
+
+ if np.any([len(np.unique(np.diff(cl))) != 1 for cl in configlist]):
+ raise Exception('Irregular spaced data in input file!', [len(np.unique(np.diff(cl))) for cl in configlist])
+ stepsizes = [list(np.unique(np.diff(cl)))[0] for cl in configlist]
+ if np.any([step != 1 for step in stepsizes]):
+ warnings.warn('Stepsize between configurations is greater than one!' + str(stepsizes), RuntimeWarning)
print(',', nrw, 'reweighting factors with', nsrc, 'sources')
result = []
+ idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]] + 1, r_step) for rep in range(replica)]
+
for t in range(nrw):
- if names is None:
- result.append(Obs(deltas[t], rep_names))
- else:
- print(names)
- result.append(Obs(deltas[t], names))
+ result.append(Obs(deltas[t], rep_names, idl=idl))
return result
-def extract_t0(path, prefix, dtr_read, xmin,
- spatial_extent, fit_range=5, **kwargs):
+def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, **kwargs):
"""Extract t0 from given .ms.dat files. Returns t0 as Obs.
It is assumed that all boundary effects have
@@ -188,7 +237,11 @@ def extract_t0(path, prefix, dtr_read, xmin,
The data around the zero crossing of t^2 - 0.3
is fitted with a linear function
from which the exact root is extracted.
- Only works with openQCD v 1.2.
+
+ It is assumed that one measurement is performed for each config.
+ If this is not the case, the resulting idl, as well as the handling
+ of r_start, r_stop and r_step is wrong and the user has to correct
+ this in the resulting observable.
Parameters
----------
@@ -212,8 +265,24 @@ def extract_t0(path, prefix, dtr_read, xmin,
list which contains the first config to be read for each replicum.
r_stop : list
list which contains the last config to be read for each replicum.
+ r_step : int
+ integer that defines a fixed step size between two measurements (in units of configs)
+ If not given, r_step=1 is assumed.
plaquette : bool
If true extract the plaquette estimate of t0 instead.
+ names : list
+ list of names that is assigned to the data according according
+ to the order in the file list. Use careful, if you do not provide file names!
+ files : list
+ list which contains the filenames to be read. No automatic detection of
+ files performed if given.
+ plot_fit : bool
+ If true, the fit for the extraction of t0 is shown together with the data.
+ assume_thermalization : bool
+ If True: If the first record divided by the distance between two measurements is larger than
+ 1, it is assumed that this is due to thermalization and the first measurement belongs
+ to the first config (default).
+ If False: The config numbers are assumed to be traj_number // difference
"""
ls = []
@@ -224,18 +293,21 @@ def extract_t0(path, prefix, dtr_read, xmin,
if not ls:
raise Exception('Error, directory not found')
- for exc in ls:
- if not fnmatch.fnmatch(exc, prefix + '*.ms.dat'):
- ls = list(set(ls) - set([exc]))
- if len(ls) > 1:
- ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
+ if 'files' in kwargs:
+ ls = kwargs.get('files')
+ else:
+ for exc in ls:
+ if not fnmatch.fnmatch(exc, prefix + '*.ms.dat'):
+ ls = list(set(ls) - set([exc]))
+ if len(ls) > 1:
+ ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
replica = len(ls)
if 'r_start' in kwargs:
r_start = kwargs.get('r_start')
if len(r_start) != replica:
raise Exception('r_start does not match number of replicas')
- r_start = [o - 1 if o else None for o in r_start]
+ r_start = [o if o else None for o in r_start]
else:
r_start = [None] * replica
@@ -246,10 +318,28 @@ def extract_t0(path, prefix, dtr_read, xmin,
else:
r_stop = [None] * replica
+ if 'r_step' in kwargs:
+ r_step = kwargs.get('r_step')
+ else:
+ r_step = 1
+
print('Extract t0 from', prefix, ',', replica, 'replica')
+ if 'names' in kwargs:
+ rep_names = kwargs.get('names')
+ else:
+ rep_names = []
+ for entry in ls:
+ truncated_entry = entry.split('.')[0]
+ idx = truncated_entry.index('r')
+ rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:])
+
Ysum = []
+ configlist = []
+ r_start_index = []
+ r_stop_index = []
+
for rep in range(replica):
with open(path + '/' + ls[rep], 'rb') as fp:
@@ -271,11 +361,13 @@ def extract_t0(path, prefix, dtr_read, xmin,
Ysl = []
+ configlist.append([])
while 0 < 1:
t = fp.read(4)
if(len(t) < 4):
break
nc = struct.unpack('i', t)[0]
+ configlist[-1].append(nc)
t = fp.read(8 * tmax * (nn + 1))
if kwargs.get('plaquette'):
@@ -293,6 +385,38 @@ def extract_t0(path, prefix, dtr_read, xmin,
current + tmax - xmin])
for current in range(0, len(item), tmax)])
+ diffmeas = configlist[-1][-1] - configlist[-1][-2]
+ configlist[-1] = [item // diffmeas for item in configlist[-1]]
+ if kwargs.get('assume_thermalization', True) and configlist[-1][0] > 1:
+ warnings.warn('Assume thermalization and that the first measurement belongs to the first config.')
+ offset = configlist[-1][0] - 1
+ configlist[-1] = [item - offset for item in configlist[-1]]
+
+ if r_start[rep] is None:
+ r_start_index.append(0)
+ else:
+ try:
+ r_start_index.append(configlist[-1].index(r_start[rep]))
+ except ValueError:
+ raise Exception('Config %d not in file with range [%d, %d]' % (
+ r_start[rep], configlist[-1][0], configlist[-1][-1])) from None
+
+ if r_stop[rep] is None:
+ r_stop_index.append(len(configlist[-1]) - 1)
+ else:
+ try:
+ r_stop_index.append(configlist[-1].index(r_stop[rep]))
+ except ValueError:
+ raise Exception('Config %d not in file with range [%d, %d]' % (
+ r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None
+
+ if np.any([len(np.unique(np.diff(cl))) != 1 for cl in configlist]):
+ raise Exception('Irregular spaced data in input file!', [len(np.unique(np.diff(cl))) for cl in configlist])
+ stepsizes = [list(np.unique(np.diff(cl)))[0] for cl in configlist]
+ if np.any([step != 1 for step in stepsizes]):
+ warnings.warn('Stepsize between configurations is greater than one!' + str(stepsizes), RuntimeWarning)
+
+ idl = [range(configlist[rep][r_start_index[rep]], configlist[rep][r_stop_index[rep]] + 1, r_step) for rep in range(replica)]
t2E_dict = {}
for n in range(nn + 1):
samples = []
@@ -300,8 +424,8 @@ def extract_t0(path, prefix, dtr_read, xmin,
samples.append([])
for cnfg in rep:
samples[-1].append(cnfg[n])
- samples[-1] = samples[-1][r_start[nrep]:r_stop[nrep]]
- new_obs = Obs(samples, [(w.split('.'))[0] for w in ls])
+ samples[-1] = samples[-1][r_start_index[nrep]:r_stop_index[nrep] + 1][::r_step]
+ new_obs = Obs(samples, rep_names, idl=idl)
t2E_dict[n * dn * eps] = (n * dn * eps) ** 2 * new_obs / (spatial_extent ** 3) - 0.3
zero_crossing = np.argmax(np.array(
@@ -314,6 +438,40 @@ def extract_t0(path, prefix, dtr_read, xmin,
[o.gamma_method() for o in y]
fit_result = fit_lin(x, y)
+
+ if kwargs.get('plot_fit'):
+ plt.figure()
+ gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1], wspace=0.0, hspace=0.0)
+ ax0 = plt.subplot(gs[0])
+ xmore = list(t2E_dict.keys())[zero_crossing - fit_range - 2: zero_crossing + fit_range + 2]
+ ymore = list(t2E_dict.values())[zero_crossing - fit_range - 2: zero_crossing + fit_range + 2]
+ [o.gamma_method() for o in ymore]
+ ax0.errorbar(xmore, [yi.value for yi in ymore], yerr=[yi.dvalue for yi in ymore], fmt='x')
+ xplot = np.linspace(np.min(x), np.max(x))
+ yplot = [fit_result[0] + fit_result[1] * xi for xi in xplot]
+ [yi.gamma_method() for yi in yplot]
+ ax0.fill_between(xplot, y1=[yi.value - yi.dvalue for yi in yplot], y2=[yi.value + yi.dvalue for yi in yplot])
+ retval = (-fit_result[0] / fit_result[1])
+ retval.gamma_method()
+ ylim = ax0.get_ylim()
+ ax0.fill_betweenx(ylim, x1=retval.value - retval.dvalue, x2=retval.value + retval.dvalue, color='gray', alpha=0.4)
+ ax0.set_ylim(ylim)
+ ax0.set_ylabel(r'$t^2 \langle E(t) \rangle - 0.3 $')
+ xlim = ax0.get_xlim()
+
+ fit_res = [fit_result[0] + fit_result[1] * xi for xi in x]
+ residuals = (np.asarray([o.value for o in y]) - [o.value for o in fit_res]) / np.asarray([o.dvalue for o in y])
+ ax1 = plt.subplot(gs[1])
+ ax1.plot(x, residuals, 'ko', ls='none', markersize=5)
+ ax1.tick_params(direction='out')
+ ax1.tick_params(axis="x", bottom=True, top=True, labelbottom=True)
+ ax1.axhline(y=0.0, ls='--', color='k')
+ ax1.fill_between(xlim, -1.0, 1.0, alpha=0.1, facecolor='k')
+ ax1.set_xlim(xlim)
+ ax1.set_ylabel('Residuals')
+ ax1.set_xlabel(r'$t/a^2$')
+
+ plt.draw()
return -fit_result[0] / fit_result[1]
@@ -350,7 +508,7 @@ def _read_array_openQCD2(fp):
elif size == 16:
types = 'dd'
else:
- print('Type not known!')
+ raise Exception("Type for size '" + str(size) + "' not known.")
m = n[0]
for i in range(1, d):
m *= n[i]
@@ -362,8 +520,288 @@ def _read_array_openQCD2(fp):
return {'d': d, 'n': n, 'size': size, 'arr': arr}
-def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs):
- """Read qtop format from given folder structure.
+def read_qtop(path, prefix, c, dtr_cnfg=1, version="openQCD", **kwargs):
+ """Read the topologial charge based on openQCD gradient flow measurements.
+
+ Parameters
+ ----------
+ path : str
+ path of the measurement files
+ prefix : str
+ prefix of the measurement files, e.g. _id0_r0.ms.dat.
+ Ignored if file names are passed explicitly via keyword files.
+ c : double
+ Smearing radius in units of the lattice extent, c = sqrt(8 t0) / L.
+ dtr_cnfg : int
+ (optional) parameter that specifies the number of measurements
+ between two configs.
+ If it is not set, the distance between two measurements
+ in the file is assumed to be the distance between two configurations.
+ steps : int
+ (optional) Distance between two configurations in units of trajectories /
+ cycles. Assumed to be the distance between two measurements * dtr_cnfg if not given
+ version : str
+ Either openQCD or sfqcd, depending on the data.
+ L : int
+ spatial length of the lattice in L/a.
+ HAS to be set if version != sfqcd, since openQCD does not provide
+ this in the header
+ r_start : list
+ list which contains the first config to be read for each replicum.
+ r_stop : list
+ list which contains the last config to be read for each replicum.
+ files : list
+ specify the exact files that need to be read
+ from path, practical if e.g. only one replicum is needed
+ names : list
+ Alternative labeling for replicas/ensembles.
+ Has to have the appropriate length.
+ Zeuthen_flow : bool
+ (optional) If True, the Zeuthen flow is used for Qtop. Only possible
+ for version=='sfqcd' If False, the Wilson flow is used.
+ integer_charge : bool
+ If True, the charge is rounded towards the nearest integer on each config.
+ """
+ known_versions = ["openQCD", "sfqcd"]
+
+ if version not in known_versions:
+ raise Exception("Unknown openQCD version.")
+ if "steps" in kwargs:
+ steps = kwargs.get("steps")
+ if version == "sfqcd":
+ if "L" in kwargs:
+ supposed_L = kwargs.get("L")
+ else:
+ supposed_L = None
+ postfix = ".gfms.dat"
+ else:
+ if "L" not in kwargs:
+ raise Exception("This version of openQCD needs you to provide the spatial length of the lattice as parameter 'L'.")
+ else:
+ L = kwargs.get("L")
+ postfix = ".ms.dat"
+
+ if "files" in kwargs:
+ files = kwargs.get("files")
+ postfix = ''
+ else:
+ found = []
+ files = []
+ for (dirpath, dirnames, filenames) in os.walk(path + "/"):
+ found.extend(filenames)
+ break
+ for f in found:
+ if fnmatch.fnmatch(f, prefix + "*" + postfix):
+ files.append(f)
+
+ if 'r_start' in kwargs:
+ r_start = kwargs.get('r_start')
+ if len(r_start) != len(files):
+ raise Exception('r_start does not match number of replicas')
+ r_start = [o if o else None for o in r_start]
+ else:
+ r_start = [None] * len(files)
+
+ if 'r_stop' in kwargs:
+ r_stop = kwargs.get('r_stop')
+ if len(r_stop) != len(files):
+ raise Exception('r_stop does not match number of replicas')
+ else:
+ r_stop = [None] * len(files)
+ rep_names = []
+
+ zeuthen = kwargs.get('Zeuthen_flow', False)
+ if zeuthen and version not in ['sfqcd']:
+ raise Exception('Zeuthen flow can only be used for version==sfqcd')
+
+ r_start_index = []
+ r_stop_index = []
+ deltas = []
+ configlist = []
+ for rep, file in enumerate(files):
+ with open(path + "/" + file, "rb") as fp:
+
+ Q = []
+ traj_list = []
+ if version in ['sfqcd']:
+ if zeuthen:
+ obspos = 0
+ else:
+ obspos = 8
+ t = fp.read(12)
+ header = struct.unpack(' if it's equal to 2 it means that the Zeuthen flow is also 'measured' (apart from the Wilson flow)
+ ncs = header[1] # number of different values for c in t_flow=1/8 c² L² -> measurements done for ncs c's
+ tmax = header[2] # lattice T/a
+
+ t = fp.read(12)
+ Ls = struct.unpack(' cmax:
+ raise Exception('Flow has been determined between c=0 and c=%lf with tolerance %lf' % (cmax, tol))
+
+ if(zthfl == 2):
+ nfl = 2 # number of flows
+ else:
+ nfl = 1
+ iobs = 8 * nfl # number of flow observables calculated
+
+ while 0 < 1:
+ t = fp.read(4)
+ if(len(t) < 4):
+ break
+ traj_list.append(struct.unpack('i', t)[0]) # trajectory number when measurement was done
+
+ for j in range(ncs + 1):
+ for i in range(iobs):
+ t = fp.read(8 * tmax)
+ if (i == obspos): # determines the flow observable -> i=0 <-> Zeuthen flow
+ Q.append(struct.unpack('d' * tmax, t))
+
+ else:
+ t = fp.read(12)
+ header = struct.unpack(' 1:
+ offset = configlist[-1][0] - 1
+ warnings.warn('Assume thermalization and that the first measurement belongs to the first config. Offset = %d configs (%d trajectories / cycles)' % (
+ offset, offset * steps))
+ configlist[-1] = [item - offset for item in configlist[-1]]
+
+ if r_start[rep] is None:
+ r_start_index.append(0)
+ else:
+ try:
+ r_start_index.append(configlist[-1].index(r_start[rep]))
+ except ValueError:
+ raise Exception('Config %d not in file with range [%d, %d]' % (
+ r_start[rep], configlist[-1][0], configlist[-1][-1])) from None
+
+ if r_stop[rep] is None:
+ r_stop_index.append(len(configlist[-1]) - 1)
+ else:
+ try:
+ r_stop_index.append(configlist[-1].index(r_stop[rep]))
+ except ValueError:
+ raise Exception('Config %d not in file with range [%d, %d]' % (
+ r_stop[rep], configlist[-1][0], configlist[-1][-1])) from None
+
+ if version in ['sfqcd']:
+ cstepsize = cmax / ncs
+ index_aim = round(c / cstepsize)
+ else:
+ t_aim = (c * L) ** 2 / 8
+ index_aim = round(t_aim / eps / dn)
+
+ Q_sum = []
+ for i, item in enumerate(Q):
+ Q_sum.append([sum(item[current:current + tmax])
+ for current in range(0, len(item), tmax)])
+ Q_top = []
+ if version in ['sfqcd']:
+ for i in range(len(Q_sum) // (ncs + 1)):
+ Q_top.append(Q_sum[i * (ncs + 1) + index_aim][0])
+ else:
+ for i in range(len(Q) // dtr_cnfg):
+ Q_top.append(Q_sum[dtr_cnfg * i][index_aim])
+ if len(Q_top) != len(traj_list) // dtr_cnfg:
+ raise Exception("qtops and traj_list dont have the same length")
+
+ if kwargs.get('integer_charge', False):
+ Q_top = [round(q) for q in Q_top]
+
+ truncated_file = file[:-len(postfix)]
+
+ if "names" not in kwargs:
+ try:
+ idx = truncated_file.index('r')
+ except Exception:
+ if "names" not in kwargs:
+ raise Exception("Automatic recognition of replicum failed, please enter the key word 'names'.")
+ ens_name = truncated_file[:idx]
+ rep_names.append(ens_name + '|' + truncated_file[idx:])
+ else:
+ names = kwargs.get("names")
+ rep_names = names
+ deltas.append(Q_top)
+
+ idl = [range(int(configlist[rep][r_start_index[rep]]), int(configlist[rep][r_stop_index[rep]]) + 1, 1) for rep in range(len(deltas))]
+ deltas = [deltas[nrep][r_start_index[nrep]:r_stop_index[nrep] + 1] for nrep in range(len(deltas))]
+ result = Obs(deltas, rep_names, idl=idl)
+ return result
+
+
+def qtop_projection(qtop, target=0):
+ """Returns the projection to the topological charge sector defined by target.
+
+ Parameters
+ ----------
+ path : Obs
+ Topological charge.
+ target : int
+ Specifies the topological sector to be reweighted to (default 0)
+ """
+ if qtop.reweighted:
+ raise Exception('You can not use a reweighted observable for reweighting!')
+
+ proj_qtop = []
+ for n in qtop.deltas:
+ proj_qtop.append(np.array([1 if round(qtop.value + q) == target else 0 for q in qtop.deltas[n]]))
+
+ reto = Obs(proj_qtop, qtop.names, idl=[qtop.idl[name] for name in qtop.names])
+ reto.is_merged = qtop.is_merged
+ return reto
+
+
+def read_qtop_sector(path, prefix, c, target=0, **kwargs):
+ """Constructs reweighting factors to a specified topological sector.
Parameters
----------
@@ -373,18 +811,19 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs):
prefix of the measurement files, e.g. _id0_r0.ms.dat
c : double
Smearing radius in units of the lattice extent, c = sqrt(8 t0) / L
+ target : int
+ Specifies the topological sector to be reweighted to (default 0)
dtr_cnfg : int
(optional) parameter that specifies the number of trajectories
between two configs.
if it is not set, the distance between two measurements
- in the file is assumed to be
- the distance between two configurations.
+ in the file is assumed to be the distance between two configurations.
steps : int
- (optional) (maybe only necessary for openQCD2.0)
- nt step size, guessed if not given
+ (optional) Distance between two configurations in units of trajectories /
+ cycles. Assumed to be the distance between two measurements * dtr_cnfg if not given
version : str
version string of the openQCD (sfqcd) version used to create
- the ensemble
+ the ensemble. Default is 2.0. May also be set to sfqcd.
L : int
spatial length of the lattice in L/a.
HAS to be set if version != sfqcd, since openQCD does not provide
@@ -400,200 +839,15 @@ def read_qtop(path, prefix, c, dtr_cnfg=1, version="1.2", **kwargs):
names : list
Alternative labeling for replicas/ensembles.
Has to have the appropriate length
- """
- known_versions = ["1.0", "1.2", "1.4", "1.6", "2.0", "sfqcd"]
-
- if version not in known_versions:
- raise Exception("Unknown openQCD version.")
- if "steps" in kwargs:
- steps = kwargs.get("steps")
- if version == "sfqcd":
- if "L" in kwargs:
- supposed_L = kwargs.get("L")
- else:
- if "L" not in kwargs:
- raise Exception("This version of openQCD needs you to provide the spatial length of the lattice as parameter 'L'.")
- else:
- L = kwargs.get("L")
- r_start = 1
- if "r_start" in kwargs:
- r_start = kwargs.get("r_start")
- if "r_stop" in kwargs:
- r_stop = kwargs.get("r_stop")
- if "files" in kwargs:
- files = kwargs.get("files")
- else:
- found = []
- files = []
- for (dirpath, dirnames, filenames) in os.walk(path + "/"):
- # print(filenames)
- found.extend(filenames)
- break
- for f in found:
- if fnmatch.fnmatch(f, prefix + "*" + ".ms.dat"):
- files.append(f)
- print(files)
- rep_names = []
-
- deltas = []
- idl = []
- for rep, file in enumerate(files):
- with open(path + "/" + file, "rb") as fp:
- t = fp.read(12)
- header = struct.unpack(' 1:
- ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
if not appended:
+ if len(ls) > 1:
+ # New version, to cope with ids, etc.
+ ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
replica = len(ls)
else:
replica = len([file.split(".")[-1] for file in ls]) // len(set([file.split(".")[-1] for file in ls]))
- print("Read", part, "part of '" + str(name) + "' with prefix '" + str(prefix) + "' (" + str(replica) + " replica)")
+ print('Read', part, 'part of', name, 'from', prefix[:-1],
+ ',', replica, 'replica')
if 'names' in kwargs:
new_names = kwargs.get('names')
if len(new_names) != len(set(new_names)):
@@ -176,110 +164,121 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0,
else:
sub_ls.extend(dirnames)
break
-
- for exc in sub_ls:
- if compact:
+ if compact:
+ for exc in sub_ls:
if not fnmatch.fnmatch(exc, prefix + '*'):
sub_ls = list(set(sub_ls) - set([exc]))
- sub_ls.sort(key=lambda x:
- int(re.findall(r'\d+', x)[-1]))
- else:
+ sub_ls.sort(key=lambda x: int(re.findall(r'\d+', x)[-1]))
+ else:
+ for exc in sub_ls:
if not fnmatch.fnmatch(exc, 'cfg*'):
sub_ls = list(set(sub_ls) - set([exc]))
- sub_ls.sort(key=lambda x: int(x[3:]))
+ sub_ls.sort(key=lambda x: int(x[3:]))
rep_idl = []
no_cfg = len(sub_ls)
for cfg in sub_ls:
try:
if compact:
- rep_idl.append(int(cfg.split("n")[-1]))
+ rep_idl.append(int(cfg.split(cfg_separator)[-1]))
else:
rep_idl.append(int(cfg[3:]))
except Exception:
raise Exception("Couldn't parse idl from directroy, problem with file " + cfg)
rep_idl.sort()
+ # maybe there is a better way to print the idls
print(item, ':', no_cfg, ' configurations')
idl.append(rep_idl)
+ # here we have found all the files we need to look into.
if i == 0:
- if compact:
+ # here, we want to find the place within the file,
+ # where the correlator we need is stored.
+ # to do so, the pattern needed is put together
+ # from the input values
+ if version == "0.0":
+ pattern = "# " + name + " : offset " + str(noffset) + ", wf " + str(wf)
+ # if b2b, a second wf is needed
+ if b2b:
+ pattern += ", wf_2 " + str(wf2)
+ qs = quarks.split(" ")
+ pattern += " : " + qs[0] + " - " + qs[1]
+ file = open(path + '/' + item + '/' + sub_ls[0] + '/' + name, "r")
+ for k, line in enumerate(file):
+ if read == 1 and not line.strip() and k > start + 1:
+ break
+ if read == 1 and k >= start:
+ T += 1
+ if pattern in line:
+ read = 1
+ start = k + 1
+ print(str(T) + " entries found.")
+ file.close()
+ else:
pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf)
if b2b:
pattern += '\nwf_2 ' + str(wf2)
- with open(path + '/' + item + '/' + sub_ls[0], 'r') as file:
- content = file.read()
- match = re.search(pattern, content)
- if match:
- # the start and end point of the correlator
- # in question is extracted for later use in
- # the other files
- start_read = content.count('\n', 0, match.start()) + 5 + b2b
- end_match = re.search(r'\n\s*\n', content[match.start():])
- T = content[match.start():].count('\n', 0, end_match.start()) - 4 - b2b
- assert T > 0
- print(T, 'entries, starting to read in line', start_read)
- else:
- raise Exception('Correlator with pattern\n' + pattern + '\nnot found.')
- else:
- # this part does the same as above,
- # but for non-compactified versions of the files
- with open(path + '/' + item + '/' + sub_ls[0] + '/' + name) as fp:
- for k, line in enumerate(fp):
- if version == "0.0":
- # check if this is really the right file
- # by matching pattern similar to above
- pattern = "# " + name + " : offset " + str(noffset) + ", wf " + str(wf)
- # if b2b, a second wf is needed
- if b2b:
- pattern += ", wf_2 " + str(wf2)
- qs = quarks.split(" ")
- pattern += " : " + qs[0] + " - " + qs[1]
- if read == 1 and not line.strip() and k > start + 1:
- break
- if read == 1 and k >= start:
- T += 1
+ # and the file is parsed through to find the pattern
+ if compact:
+ file = open(path + '/' + item + '/' + sub_ls[0], "r")
+ else:
+ # for non-compactified versions of the files
+ file = open(path + '/' + item + '/' + sub_ls[0] + '/' + name, "r")
- if version == "0.0":
- if pattern in line:
- # print(line)
- read = 1
- start = k + 1
- else:
- if '[correlator]' in line:
- read = 1
- start = k + 7 + b2b
- T -= b2b
- print(str(T) + " entries found.")
+ content = file.read()
+ match = re.search(pattern, content)
+ if match:
+ start_read = content.count('\n', 0, match.start()) + 5 + b2b
+ end_match = re.search(r'\n\s*\n', content[match.start():])
+ T = content[match.start():].count('\n', 0, end_match.start()) - 4 - b2b
+ assert T > 0
+ print(T, 'entries, starting to read in line', start_read)
+ file.close()
+ else:
+ file.close()
+ raise Exception('Correlator with pattern\n' + pattern + '\nnot found.')
+
+ # we found where the correlator
+ # that is to be read is in the files
+ # after preparing the datastructure
+ # the correlators get parsed into...
deltas = []
for j in range(T):
deltas.append([])
for t in range(T):
deltas[t].append(np.zeros(no_cfg))
- # we iterate through all measurement files in the path given...
if compact:
for cfg in range(no_cfg):
with open(path + '/' + item + '/' + sub_ls[cfg]) as fp:
lines = fp.readlines()
+ # check, if the correlator is in fact
+ # printed completely
if(start_read + T > len(lines)):
raise Exception("EOF before end of correlator data! Maybe " + path + '/' + item + '/' + sub_ls[cfg] + " is corrupted?")
+ # and start to read the correlator.
+ # the range here is chosen like this,
+ # since this allows for implementing
+ # a security check for every read correlator later...
for k in range(start_read - 6, start_read + T):
if k == start_read - 5 - b2b:
if lines[k].strip() != 'name ' + name:
- raise Exception('Wrong format',
- sub_ls[cfg])
+ raise Exception('Wrong format', sub_ls[cfg])
if(k >= start_read and k < start_read + T):
floats = list(map(float, lines[k].split()))
deltas[k - start_read][i][cfg] = floats[-2:][im]
else:
for cnfg, subitem in enumerate(sub_ls):
with open(path + '/' + item + '/' + subitem + '/' + name) as fp:
+ # since the non-compatified files
+ # are typically not so long,
+ # we can iterate over the whole file.
+ # here one can also implement the chekc from above.
for k, line in enumerate(fp):
- if(k >= start and k < start + T):
+ if(k >= start_read and k < start_read + T):
floats = list(map(float, line.split()))
if version == "0.0":
- deltas[k - start][i][cnfg] = floats[im]
+ deltas[k - start][i][cnfg] = floats[im - single]
else:
- deltas[k - start][i][cnfg] = floats[1 + im - single]
+ deltas[k - start_read][i][cnfg] = floats[1 + im - single]
else:
if "files" in kwargs:
@@ -289,8 +288,6 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0,
if not fnmatch.fnmatch(exc, prefix + '*.' + name):
ls = list(set(ls) - set([exc]))
ls.sort(key=lambda x: int(re.findall(r'\d+', x)[-1]))
- if len(ls) == 0:
- raise Exception('File(s) for correlator ' + name + ' not found.')
pattern = 'name ' + name + '\nquarks ' + quarks + '\noffset ' + str(noffset) + '\nwf ' + str(wf)
if b2b:
pattern += '\nwf_2 ' + str(wf2)
@@ -302,8 +299,7 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0,
for linenumber, line in enumerate(content):
if "[run]" in line:
data_starts.append(linenumber)
- if len(set([data_starts[i] - data_starts[i - 1] for i in
- range(1, len(data_starts))])) > 1:
+ if len(set([data_starts[i] - data_starts[i - 1] for i in range(1, len(data_starts))])) > 1:
raise Exception("Irregularities in file structure found, not all runs have the same output length")
chunk = content[:data_starts[1]]
for linenumber, line in enumerate(chunk):
@@ -312,25 +308,30 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0,
elif line.startswith("[correlator]"):
corr_line = linenumber
found_pat = ""
- for li in chunk[corr_line + 1:corr_line + 6 + b2b]:
+ for li in chunk[corr_line + 1: corr_line + 6 + b2b]:
found_pat += li
if re.search(pattern, found_pat):
start_read = corr_line + 7 + b2b
- T = len(chunk) - 1 - start_read
+ break
+ endline = corr_line + 6 + b2b
+ while not chunk[endline] == "\n":
+ endline += 1
+ T = endline - start_read
if rep == 0:
deltas = []
for t in range(T):
deltas.append([])
for t in range(T):
deltas[t].append(np.zeros(len(data_starts)))
+ # all other chunks should follow the same structure
for cnfg in range(len(data_starts)):
start = data_starts[cnfg]
stop = start + data_starts[1]
chunk = content[start:stop]
try:
- rep_idl.append(int(chunk[gauge_line].split("n")[-1]))
+ rep_idl.append(int(chunk[gauge_line].split(cfg_separator)[-1]))
except Exception:
- raise Exception("Couldn't parse idl from directroy, problem with chunk around line " + gauge_line)
+ raise Exception("Couldn't parse idl from directory, problem with chunk around line ", gauge_line)
found_pat = ""
for li in chunk[corr_line + 1:corr_line + 6 + b2b]:
@@ -338,7 +339,7 @@ def read_sfcf(path, prefix, name, quarks='.*', noffset=0, wf=0, wf2=0,
if re.search(pattern, found_pat):
for t, line in enumerate(chunk[start_read:start_read + T]):
floats = list(map(float, line.split()))
- deltas[t][rep][cnfg] = floats[-2:][im]
+ deltas[t][rep][cnfg] = floats[im + 1 - single]
idl.append(rep_idl)
if "check_configs" in kwargs:
diff --git a/pyerrors/misc.py b/pyerrors/misc.py
index f7fa0af3..bbfb8e7d 100644
--- a/pyerrors/misc.py
+++ b/pyerrors/misc.py
@@ -35,6 +35,38 @@ def load_object(path):
return pickle.load(file)
+def pseudo_Obs(value, dvalue, name, samples=1000):
+ """Generate an Obs object with given value, dvalue and name for test purposes
+
+ Parameters
+ ----------
+ value : float
+ central value of the Obs to be generated.
+ dvalue : float
+ error of the Obs to be generated.
+ name : str
+ name of the ensemble for which the Obs is to be generated.
+ samples: int
+ number of samples for the Obs (default 1000).
+ """
+ if dvalue <= 0.0:
+ return Obs([np.zeros(samples) + value], [name])
+ else:
+ for _ in range(100):
+ deltas = [np.random.normal(0.0, dvalue * np.sqrt(samples), samples)]
+ deltas -= np.mean(deltas)
+ deltas *= dvalue / np.sqrt((np.var(deltas) / samples)) / np.sqrt(1 + 3 / samples)
+ deltas += value
+ res = Obs(deltas, [name])
+ res.gamma_method(S=2, tau_exp=0)
+ if abs(res.dvalue - dvalue) < 1e-10 * dvalue:
+ break
+
+ res._value = float(value)
+
+ return res
+
+
def gen_correlated_data(means, cov, name, tau=0.5, samples=1000):
""" Generate observables with given covariance and autocorrelation times.
diff --git a/pyerrors/obs.py b/pyerrors/obs.py
index f395d7db..6874bd12 100644
--- a/pyerrors/obs.py
+++ b/pyerrors/obs.py
@@ -53,7 +53,7 @@ class Obs:
N_sigma_dict = {}
filter_eps = 1e-10
- def __init__(self, samples, names, idl=None, means=None, **kwargs):
+ def __init__(self, samples, names, idl=None, **kwargs):
""" Initialize Obs object.
Parameters
@@ -64,12 +64,9 @@ class Obs:
list of strings labeling the individual samples
idl : list, optional
list of ranges or lists on which the samples are defined
- means : list, optional
- list of mean values for the case that the mean values were
- already subtracted from the samples
"""
- if means is None and len(samples):
+ if kwargs.get("means") is None and len(samples):
if len(samples) != len(names):
raise Exception('Length of samples and names incompatible.')
if idl is not None:
@@ -115,8 +112,8 @@ class Obs:
self._value = 0
self.N = 0
- if means is not None:
- for name, sample, mean in sorted(zip(names, samples, means)):
+ if kwargs.get("means") is not None:
+ for name, sample, mean in sorted(zip(names, samples, kwargs.get("means"))):
self.shape[name] = len(self.idl[name])
self.N += self.shape[name]
self.r_values[name] = mean
@@ -263,6 +260,7 @@ class Obs:
gamma_div = np.zeros(w_max)
for r_name in e_content[e_name]:
gamma_div += self._calc_gamma(np.ones((self.shape[r_name])), self.idl[r_name], self.shape[r_name], w_max, fft)
+ gamma_div[gamma_div < 1] = 1.0
e_gamma[e_name] /= gamma_div[:w_max]
if np.abs(e_gamma[e_name][0]) < 10 * np.finfo(float).tiny: # Prevent division by zero
@@ -288,8 +286,6 @@ class Obs:
_compute_drho(1)
if self.tau_exp[e_name] > 0:
texp = self.tau_exp[e_name]
- # if type(self.idl[e_name]) is range: # scale tau_exp according to step size
- # texp /= self.idl[e_name].step
# Critical slowing down analysis
if w_max // 2 <= 1:
raise Exception("Need at least 8 samples for tau_exp error analysis")
@@ -447,17 +443,15 @@ class Obs:
"""
return self.is_zero() or np.abs(self.value) <= sigma * self._dvalue
- def is_zero(self, rtol=1.e-5, atol=1.e-8):
+ def is_zero(self, atol=1e-10):
"""Checks whether the observable is zero within a given tolerance.
Parameters
----------
- rtol : float
- Relative tolerance (for details see numpy documentation).
atol : float
Absolute tolerance (for details see numpy documentation).
"""
- return np.isclose(0.0, self.value, rtol, atol) and all(np.allclose(0.0, delta, rtol, atol) for delta in self.deltas.values()) and all(np.allclose(0.0, delta.errsq(), rtol, atol) for delta in self.covobs.values())
+ return np.isclose(0.0, self.value, 1e-14, atol) and all(np.allclose(0.0, delta, 1e-14, atol) for delta in self.deltas.values()) and all(np.allclose(0.0, delta.errsq(), 1e-14, atol) for delta in self.covobs.values())
def plot_tauint(self, save=None):
"""Plot integrated autocorrelation time for each ensemble.
@@ -588,7 +582,7 @@ class Obs:
ensemble to the error and returns a dictionary containing the fractions."""
if not hasattr(self, 'e_dvalue'):
raise Exception('Run the gamma method first.')
- if self._dvalue == 0.0:
+ if np.isclose(0.0, self._dvalue, atol=1e-15):
raise Exception('Error is 0.0')
labels = self.e_names
sizes = [self.e_dvalue[name] ** 2 for name in labels] / self._dvalue ** 2
@@ -599,7 +593,7 @@ class Obs:
return dict(zip(self.e_names, sizes))
- def dump(self, filename, datatype="json.gz", **kwargs):
+ def dump(self, filename, datatype="json.gz", description="", **kwargs):
"""Dump the Obs to a file 'name' of chosen format.
Parameters
@@ -609,6 +603,8 @@ class Obs:
datatype : str
Format of the exported file. Supported formats include
"json.gz" and "pickle"
+ description : str
+ Description for output file, only relevant for json.gz format.
path : str
specifies a custom path for the file (default '.')
"""
@@ -619,7 +615,7 @@ class Obs:
if datatype == "json.gz":
from .input.json import dump_to_json
- dump_to_json([self], file_name)
+ dump_to_json([self], file_name, description=description)
elif datatype == "pickle":
with open(file_name + '.p', 'wb') as fb:
pickle.dump(self, fb)
@@ -695,7 +691,7 @@ class Obs:
else:
if isinstance(y, np.ndarray):
return np.array([self + o for o in y])
- elif y.__class__.__name__ == 'Corr':
+ elif y.__class__.__name__ in ['Corr', 'CObs']:
return NotImplemented
else:
return derived_observable(lambda x, **kwargs: x[0] + y, [self], man_grad=[1])
@@ -711,7 +707,7 @@ class Obs:
return np.array([self * o for o in y])
elif isinstance(y, complex):
return CObs(self * y.real, self * y.imag)
- elif y.__class__.__name__ == 'Corr':
+ elif y.__class__.__name__ in ['Corr', 'CObs']:
return NotImplemented
else:
return derived_observable(lambda x, **kwargs: x[0] * y, [self], man_grad=[y])
@@ -725,16 +721,17 @@ class Obs:
else:
if isinstance(y, np.ndarray):
return np.array([self - o for o in y])
-
- elif y.__class__.__name__ == 'Corr':
+ elif y.__class__.__name__ in ['Corr', 'CObs']:
return NotImplemented
-
else:
return derived_observable(lambda x, **kwargs: x[0] - y, [self], man_grad=[1])
def __rsub__(self, y):
return -1 * (self - y)
+ def __pos__(self):
+ return self
+
def __neg__(self):
return -1 * self
@@ -744,7 +741,7 @@ class Obs:
else:
if isinstance(y, np.ndarray):
return np.array([self / o for o in y])
- elif y.__class__.__name__ == 'Corr':
+ elif y.__class__.__name__ in ['Corr', 'CObs']:
return NotImplemented
else:
return derived_observable(lambda x, **kwargs: x[0] / y, [self], man_grad=[1 / y])
@@ -755,7 +752,7 @@ class Obs:
else:
if isinstance(y, np.ndarray):
return np.array([o / self for o in y])
- elif y.__class__.__name__ == 'Corr':
+ elif y.__class__.__name__ in ['Corr', 'CObs']:
return NotImplemented
else:
return derived_observable(lambda x, **kwargs: y / x[0], [self], man_grad=[-y / self.value ** 2])
@@ -917,8 +914,11 @@ class CObs:
def __abs__(self):
return np.sqrt(self.real**2 + self.imag**2)
- def __neg__(other):
- return -1 * other
+ def __pos__(self):
+ return self
+
+ def __neg__(self):
+ return -1 * self
def __eq__(self, other):
return self.real == other.real and self.imag == other.imag
@@ -939,7 +939,7 @@ def _expand_deltas(deltas, idx, shape):
deltas : list
List of fluctuations
idx : list
- List or range of configs on which the deltas are defined.
+ List or range of configs on which the deltas are defined, has to be sorted in ascending order.
shape : int
Number of configs in idx.
"""
@@ -953,7 +953,7 @@ def _expand_deltas(deltas, idx, shape):
def _merge_idx(idl):
- """Returns the union of all lists in idl
+ """Returns the union of all lists in idl as sorted list
Parameters
----------
@@ -976,7 +976,7 @@ def _merge_idx(idl):
idstep = min([idx.step for idx in idl])
return range(idstart, idstop, idstep)
- return list(set().union(*idl))
+ return sorted(set().union(*idl))
def _expand_deltas_for_merge(deltas, idx, shape, new_idx):
@@ -990,11 +990,11 @@ def _expand_deltas_for_merge(deltas, idx, shape, new_idx):
List of fluctuations
idx : list
List or range of configs on which the deltas are defined.
- Has to be a subset of new_idx.
+ Has to be a subset of new_idx and has to be sorted in ascending order.
shape : list
Number of configs in idx.
new_idx : list
- List of configs that defines the new range.
+ List of configs that defines the new range, has to be sorted in ascending order.
"""
if type(idx) is range and type(new_idx) is range:
@@ -1125,14 +1125,7 @@ def derived_observable(func, data, array_mode=False, **kwargs):
raise Exception('Multi mode currently not supported for numerical derivative')
options = {
'base_step': 0.1,
- 'step_ratio': 2.5,
- 'num_steps': None,
- 'step_nom': None,
- 'offset': None,
- 'num_extrap': None,
- 'use_exact_steps': None,
- 'check_num_steps': None,
- 'scale': None}
+ 'step_ratio': 2.5}
for key in options.keys():
kwarg = kwargs.get(key)
if kwarg is not None:
@@ -1225,6 +1218,9 @@ def derived_observable(func, data, array_mode=False, **kwargs):
def _reduce_deltas(deltas, idx_old, idx_new):
"""Extract deltas defined on idx_old on all configs of idx_new.
+ Assumes, that idx_old and idx_new are correctly defined idl, i.e., they
+ are ordered in an ascending order.
+
Parameters
----------
deltas : list
@@ -1244,8 +1240,6 @@ def _reduce_deltas(deltas, idx_old, idx_new):
ret = np.zeros(shape)
oldpos = 0
for i in range(shape):
- if oldpos == idx_old[i]:
- raise Exception('idx_old and idx_new do not match!')
pos = -1
for j in range(oldpos, len(idx_old)):
if idx_old[j] == idx_new[i]:
@@ -1253,7 +1247,8 @@ def _reduce_deltas(deltas, idx_old, idx_new):
break
if pos < 0:
raise Exception('Error in _reduce_deltas: Config %d not in idx_old' % (idx_new[i]))
- ret[i] = deltas[j]
+ ret[i] = deltas[pos]
+ oldpos = pos
return np.array(ret)
@@ -1310,9 +1305,11 @@ def correlate(obs_a, obs_b):
obs_b : Obs
Second observable
+ Notes
+ -----
Keep in mind to only correlate primary observables which have not been reweighted
yet. The reweighting has to be applied after correlating the observables.
- Currently only works if ensembles are identical. This is not really necessary.
+ Currently only works if ensembles are identical (this is not strictly necessary).
"""
if sorted(obs_a.names) != sorted(obs_b.names):
@@ -1342,20 +1339,64 @@ def correlate(obs_a, obs_b):
return o
-def covariance(obs1, obs2, correlation=False, **kwargs):
- """Calculates the covariance of two observables.
+def covariance(obs, visualize=False, correlation=False, **kwargs):
+ r'''Calculates the covariance matrix of a set of observables.
- covariance(obs, obs) is equal to obs.dvalue ** 2
- The gamma method has to be applied first to both observables.
+ The gamma method has to be applied first to all observables.
- If abs(covariance(obs1, obs2)) > obs1.dvalue * obs2.dvalue, the covariance
- is constrained to the maximum value.
+ Parameters
+ ----------
+ obs : list or numpy.ndarray
+ List or one dimensional array of Obs
+ visualize : bool
+ If True plots the corresponding normalized correlation matrix (default False).
+ correlation : bool
+ If True the correlation instead of the covariance is returned (default False).
- Keyword arguments
- -----------------
- correlation -- if true the correlation instead of the covariance is
- returned (default False)
- """
+ Notes
+ -----
+ The covariance is estimated by calculating the correlation matrix assuming no autocorrelation and then rescaling the correlation matrix by the full errors including the previous gamma method estimate for the autocorrelation of the observables. The covariance at windowsize 0 is guaranteed to be positive semi-definite
+ $$v_i\Gamma_{ij}(0)v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i,j}v_i\delta_i^s\delta_j^s v_j=\frac{1}{N}\sum_{s=1}^N\sum_{i}|v_i\delta_i^s|^2\geq 0\,,$$ for every $v\in\mathbb{R}^M$, while such an identity does not hold for larger windows/lags.
+ For observables defined on a single ensemble our approximation is equivalent to assuming that the integrated autocorrelation time of an off-diagonal element is equal to the geometric mean of the integrated autocorrelation times of the corresponding diagonal elements.
+ $$\tau_{\mathrm{int}, ij}=\sqrt{\tau_{\mathrm{int}, i}\times \tau_{\mathrm{int}, j}}$$
+ This construction ensures that the estimated covariance matrix is positive semi-definite (up to numerical rounding errors).
+ '''
+
+ length = len(obs)
+
+ max_samples = np.max([o.N for o in obs])
+ if max_samples <= length and not [item for sublist in [o.cov_names for o in obs] for item in sublist]:
+ warnings.warn(f"The dimension of the covariance matrix ({length}) is larger or equal to the number of samples ({max_samples}). This will result in a rank deficient matrix.", RuntimeWarning)
+
+ cov = np.zeros((length, length))
+ for i in range(length):
+ for j in range(i, length):
+ cov[i, j] = _covariance_element(obs[i], obs[j])
+ cov = cov + cov.T - np.diag(np.diag(cov))
+
+ corr = np.diag(1 / np.sqrt(np.diag(cov))) @ cov @ np.diag(1 / np.sqrt(np.diag(cov)))
+
+ errors = [o.dvalue for o in obs]
+ cov = np.diag(errors) @ corr @ np.diag(errors)
+
+ eigenvalues = np.linalg.eigh(cov)[0]
+ if not np.all(eigenvalues >= 0):
+ warnings.warn("Covariance matrix is not positive semi-definite (Eigenvalues: " + str(eigenvalues) + ")", RuntimeWarning)
+
+ if visualize:
+ plt.matshow(corr, vmin=-1, vmax=1)
+ plt.set_cmap('RdBu')
+ plt.colorbar()
+ plt.draw()
+
+ if correlation is True:
+ return corr
+ else:
+ return cov
+
+
+def _covariance_element(obs1, obs2):
+ """Estimates the covariance of two Obs objects, neglecting autocorrelations."""
def expand_deltas(deltas, idx, shape, new_idx):
"""Expand deltas defined on idx to a contiguous range [new_idx[0], new_idx[-1]].
@@ -1379,29 +1420,18 @@ def covariance(obs1, obs2, correlation=False, **kwargs):
ret[idx[i] - new_idx[0]] = deltas[i]
return ret
- def calc_gamma(deltas1, deltas2, idx1, idx2, new_idx, w_max):
- gamma = np.zeros(w_max)
+ def calc_gamma(deltas1, deltas2, idx1, idx2, new_idx):
deltas1 = expand_deltas(deltas1, idx1, len(idx1), new_idx)
deltas2 = expand_deltas(deltas2, idx2, len(idx2), new_idx)
- new_shape = len(deltas1)
- max_gamma = min(new_shape, w_max)
- # The padding for the fft has to be even
- padding = new_shape + max_gamma + (new_shape + max_gamma) % 2
- gamma[:max_gamma] += (np.fft.irfft(np.fft.rfft(deltas1, padding) * np.conjugate(np.fft.rfft(deltas2, padding)))[:max_gamma] + np.fft.irfft(np.fft.rfft(deltas2, padding) * np.conjugate(np.fft.rfft(deltas1, padding)))[:max_gamma]) / 2.0
-
- return gamma
+ return np.sum(deltas1 * deltas2)
if set(obs1.names).isdisjoint(set(obs2.names)):
- return 0.
+ return 0.0
if not hasattr(obs1, 'e_dvalue') or not hasattr(obs2, 'e_dvalue'):
raise Exception('The gamma method has to be applied to both Obs first.')
- dvalue = 0
- e_gamma = {}
- e_dvalue = {}
- e_n_tauint = {}
- e_rho = {}
+ dvalue = 0.0
for e_name in obs1.mc_names:
@@ -1409,52 +1439,32 @@ def covariance(obs1, obs2, correlation=False, **kwargs):
continue
idl_d = {}
- r_length = []
for r_name in obs1.e_content[e_name]:
if r_name not in obs2.e_content[e_name]:
continue
idl_d[r_name] = _merge_idx([obs1.idl[r_name], obs2.idl[r_name]])
- if isinstance(idl_d[r_name], range):
- r_length.append(len(idl_d[r_name]))
- else:
- r_length.append((idl_d[r_name][-1] - idl_d[r_name][0] + 1))
- if not r_length:
- return 0.
-
- w_max = max(r_length) // 2
- e_gamma[e_name] = np.zeros(w_max)
+ gamma = 0.0
for r_name in obs1.e_content[e_name]:
if r_name not in obs2.e_content[e_name]:
continue
- e_gamma[e_name] += calc_gamma(obs1.deltas[r_name], obs2.deltas[r_name], obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name], w_max)
+ gamma += calc_gamma(obs1.deltas[r_name], obs2.deltas[r_name], obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name])
- if np.all(e_gamma[e_name] == 0.0):
+ if gamma == 0.0:
continue
- e_shapes = []
- for r_name in obs1.e_content[e_name]:
- e_shapes.append(obs1.shape[r_name])
- gamma_div = np.zeros(w_max)
+ gamma_div = 0.0
e_N = 0
for r_name in obs1.e_content[e_name]:
if r_name not in obs2.e_content[e_name]:
continue
- gamma_div += calc_gamma(np.ones(obs1.shape[r_name]), np.ones(obs2.shape[r_name]), obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name], w_max)
- e_N += np.sum(np.ones_like(idl_d[r_name]))
- e_gamma[e_name] /= gamma_div[:w_max]
+ gamma_div += calc_gamma(np.ones(obs1.shape[r_name]), np.ones(obs2.shape[r_name]), obs1.idl[r_name], obs2.idl[r_name], idl_d[r_name])
+ e_N += len(idl_d[r_name])
+ gamma /= max(gamma_div, 1.0)
- e_rho[e_name] = e_gamma[e_name][:w_max] / e_gamma[e_name][0]
- e_n_tauint[e_name] = np.cumsum(np.concatenate(([0.5], e_rho[e_name][1:])))
- # Make sure no entry of tauint is smaller than 0.5
- e_n_tauint[e_name][e_n_tauint[e_name] < 0.5] = 0.500000000001
-
- window = min(obs1.e_windowsize[e_name], obs2.e_windowsize[e_name])
# Bias correction hep-lat/0306017 eq. (49)
- e_dvalue[e_name] = 2 * (e_n_tauint[e_name][window] + obs1.tau_exp[e_name] * np.abs(e_rho[e_name][window + 1])) * (1 + (2 * window + 1) / e_N) * e_gamma[e_name][0] / e_N
-
- dvalue += e_dvalue[e_name]
+ dvalue += (1 + 1 / e_N) * gamma / e_N
for e_name in obs1.cov_names:
@@ -1463,47 +1473,9 @@ def covariance(obs1, obs2, correlation=False, **kwargs):
dvalue += float(np.dot(np.transpose(obs1.covobs[e_name].grad), np.dot(obs1.covobs[e_name].cov, obs2.covobs[e_name].grad)))
- if np.abs(dvalue / obs1.dvalue / obs2.dvalue) > 1.0:
- dvalue = np.sign(dvalue) * obs1.dvalue * obs2.dvalue
-
- if correlation:
- dvalue = dvalue / obs1.dvalue / obs2.dvalue
-
return dvalue
-def pseudo_Obs(value, dvalue, name, samples=1000):
- """Generate a pseudo Obs with given value, dvalue and name
-
- Parameters
- ----------
- value : float
- central value of the Obs to be generated.
- dvalue : float
- error of the Obs to be generated.
- name : str
- name of the ensemble for which the Obs is to be generated.
- samples: int
- number of samples for the Obs (default 1000).
- """
- if dvalue <= 0.0:
- return Obs([np.zeros(samples) + value], [name])
- else:
- for _ in range(100):
- deltas = [np.random.normal(0.0, dvalue * np.sqrt(samples), samples)]
- deltas -= np.mean(deltas)
- deltas *= dvalue / np.sqrt((np.var(deltas) / samples)) / np.sqrt(1 + 3 / samples)
- deltas += value
- res = Obs(deltas, [name])
- res.gamma_method(S=2, tau_exp=0)
- if abs(res.dvalue - dvalue) < 1e-10 * dvalue:
- break
-
- res._value = float(value)
-
- return res
-
-
def import_jackknife(jacks, name, idl=None):
"""Imports jackknife samples and returns an Obs
@@ -1531,6 +1503,8 @@ def merge_obs(list_of_obs):
list_of_obs : list
list of the Obs object to be combined
+ Notes
+ -----
It is not possible to combine obs which are based on the same replicum
"""
replist = [item for obs in list_of_obs for item in obs.names]
diff --git a/pyerrors/roots.py b/pyerrors/roots.py
index e26b44e7..5f6134b5 100644
--- a/pyerrors/roots.py
+++ b/pyerrors/roots.py
@@ -31,7 +31,10 @@ def find_root(d, func, guess=1.0, **kwargs):
# Error propagation as detailed in arXiv:1809.01289
dx = jacobian(func)(root[0], d.value)
- da = jacobian(lambda u, v: func(v, u))(d.value, root[0])
+ try:
+ da = jacobian(lambda u, v: func(v, u))(d.value, root[0])
+ except TypeError:
+ raise Exception("It is required to use autograd.numpy instead of numpy within root functions, see the documentation for details.") from None
deriv = - da / dx
res = derived_observable(lambda x, **kwargs: (x[0] + np.finfo(np.float64).eps) / (d.value + np.finfo(np.float64).eps) * root[0], [d], man_grad=[deriv])
diff --git a/pyerrors/version.py b/pyerrors/version.py
index 1452f094..69bd966d 100644
--- a/pyerrors/version.py
+++ b/pyerrors/version.py
@@ -1 +1 @@
-__version__ = "2.0.0+dev"
+__version__ = "2.0.0-rc.3+dev"
diff --git a/setup.py b/setup.py
index cef96ece..e7a997db 100644
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
from setuptools import setup, find_packages
setup(name='pyerrors',
- version='2.0.0+dev',
+ version='2.0.0-rc.3+dev',
description='Error analysis for lattice QCD',
author='Fabian Joswig',
author_email='fabian.joswig@ed.ac.uk',
diff --git a/tests/benchmark_test.py b/tests/benchmark_test.py
index ebdf4681..2b07578a 100644
--- a/tests/benchmark_test.py
+++ b/tests/benchmark_test.py
@@ -1,7 +1,6 @@
import numpy as np
import pyerrors as pe
import pytest
-import time
np.random.seed(0)
diff --git a/tests/correlators_test.py b/tests/correlators_test.py
index 8cec767c..8ebca6aa 100644
--- a/tests/correlators_test.py
+++ b/tests/correlators_test.py
@@ -24,6 +24,7 @@ def test_function_overloading():
for i, f in enumerate(fs):
t1 = f([corr_a, corr_b])
+ t1.gamma_method()
for o_a, o_b, con in zip(corr_content_a, corr_content_b, t1.content):
t2 = f([o_a, o_b])
t2.gamma_method()
@@ -98,6 +99,9 @@ def test_m_eff():
with pytest.warns(RuntimeWarning):
my_corr.m_eff('sinh')
+ with pytest.raises(Exception):
+ my_corr.m_eff('unkown_variant')
+
def test_reweighting():
my_corr = pe.correlators.Corr([pe.pseudo_Obs(10, 0.1, 't'), pe.pseudo_Obs(0, 0.05, 't')])
@@ -131,6 +135,11 @@ def test_fit_correlator():
assert fit_res[0] == my_corr[0]
assert fit_res[1] == my_corr[1] - my_corr[0]
+ with pytest.raises(Exception):
+ my_corr.fit(f, "from 0 to 3")
+ with pytest.raises(Exception):
+ my_corr.fit(f, [0, 2, 3])
+
def test_plateau():
my_corr = pe.correlators.Corr([pe.pseudo_Obs(1.01324, 0.05, 't'), pe.pseudo_Obs(1.042345, 0.008, 't')])
@@ -172,13 +181,16 @@ def test_utility():
corr_content.append(pe.pseudo_Obs(2 + 10 ** exponent, 10 ** (exponent - 1), 't'))
corr = pe.correlators.Corr(corr_content)
+ corr.gamma_method()
corr.print()
corr.print([2, 4])
corr.show()
+ corr.show(comp=corr)
corr.dump('test_dump', datatype="pickle", path='.')
corr.dump('test_dump', datatype="pickle")
new_corr = pe.load_object('test_dump.p')
+ new_corr.gamma_method()
os.remove('test_dump.p')
for o_a, o_b in zip(corr.content, new_corr.content):
assert np.isclose(o_a[0].value, o_b[0].value)
@@ -188,6 +200,7 @@ def test_utility():
corr.dump('test_dump', datatype="json.gz", path='.')
corr.dump('test_dump', datatype="json.gz")
new_corr = pe.input.json.load_json('test_dump')
+ new_corr.gamma_method()
os.remove('test_dump.json.gz')
for o_a, o_b in zip(corr.content, new_corr.content):
assert np.isclose(o_a[0].value, o_b[0].value)
@@ -195,19 +208,27 @@ def test_utility():
assert np.allclose(o_a[0].deltas['t'], o_b[0].deltas['t'])
+def test_prange():
+ corr_content = []
+ for t in range(8):
+ corr_content.append(pe.pseudo_Obs(2 + 10 ** (1.1 * t), 0.2, 't'))
+ corr = pe.correlators.Corr(corr_content)
+
+ corr.set_prange([2, 4])
+ with pytest.raises(Exception):
+ corr.set_prange([2])
+ with pytest.raises(Exception):
+ corr.set_prange([2, 2.3])
+ with pytest.raises(Exception):
+ corr.set_prange([4, 1])
+
+
def test_matrix_corr():
- def _gen_corr(val):
- corr_content = []
- for t in range(16):
- corr_content.append(pe.pseudo_Obs(val, 0.1, 't', 2000))
-
- return pe.correlators.Corr(corr_content)
-
corr_aa = _gen_corr(1)
- corr_ab = _gen_corr(0.5)
+ corr_ab = 0.5 * corr_aa
corr_mat = pe.Corr(np.array([[corr_aa, corr_ab], [corr_ab, corr_aa]]))
- corr_mat.smearing(0, 0)
+ corr_mat.item(0, 0)
vec_0 = corr_mat.GEVP(0, 0)
vec_1 = corr_mat.GEVP(0, 0, state=1)
@@ -221,6 +242,8 @@ def test_matrix_corr():
corr_mat.GEVP(0, 0, sorted_list="Eigenvalue")
corr_mat.GEVP(0, 0, sorted_list="Eigenvector")
+ corr_mat.matrix_symmetric()
+
with pytest.raises(Exception):
corr_mat.plottable()
@@ -240,4 +263,82 @@ def test_matrix_corr():
corr_mat.plateau([2, 4])
with pytest.raises(Exception):
- corr_o.smearing(0, 0)
+ corr_mat.hankel(3)
+
+ with pytest.raises(Exception):
+ corr_mat.fit(lambda x: x[0])
+
+ with pytest.raises(Exception):
+ corr_0.item(0, 0)
+
+ with pytest.raises(Exception):
+ corr_0.matrix_symmetric()
+
+
+def test_hankel():
+ corr_content = []
+ for t in range(8):
+ exponent = 1.2
+ corr_content.append(pe.pseudo_Obs(2 + t ** exponent, 0.2, 't'))
+
+ corr = pe.Corr(corr_content)
+ corr.Hankel(2)
+ corr.Hankel(6, periodic=True)
+
+
+def test_thin():
+ c = pe.Corr([pe.pseudo_Obs(i, .1, 'test') for i in range(10)])
+ c *= pe.cov_Obs(1., .1, '#ren')
+ thin = c.thin()
+ thin.gamma_method()
+ thin.fit(lambda a, x: a[0] * x)
+ c.thin(offset=1)
+ c.thin(3, offset=1)
+
+
+def test_corr_matrix_none_entries():
+ dim = 8
+ x = np.arange(dim)
+ y = 2 * np.exp(-0.06 * x) + np.random.normal(0.0, 0.15, dim)
+ yerr = [0.1] * dim
+
+ oy = []
+ for i, item in enumerate(x):
+ oy.append(pe.pseudo_Obs(y[i], yerr[i], 'test'))
+
+ corr = pe.Corr(oy)
+ corr = corr.deriv()
+ pe.Corr(np.array([[corr, corr], [corr, corr]]))
+
+
+def test_corr_vector_operations():
+ my_corr = _gen_corr(1.0)
+ my_vec = np.arange(1, 17)
+
+ my_corr + my_vec
+ my_corr - my_vec
+ my_corr * my_vec
+ my_corr / my_vec
+
+ assert np.all([o == 0 for o in ((my_corr + my_vec) - my_vec) - my_corr])
+ assert np.all([o == 0 for o in ((my_corr - my_vec) + my_vec) - my_corr])
+ assert np.all([o == 0 for o in ((my_corr * my_vec) / my_vec) - my_corr])
+ assert np.all([o == 0 for o in ((my_corr / my_vec) * my_vec) - my_corr])
+
+
+def test_spaghetti_plot():
+ corr = _gen_corr(12, 50)
+ corr += pe.pseudo_Obs(0.0, 0.1, 'another_ensemble')
+ corr += pe.cov_Obs(0.0, 0.01 ** 2, 'covobs')
+
+ corr.spaghetti_plot(True)
+ corr.spaghetti_plot(False)
+
+
+def _gen_corr(val, samples=2000):
+ corr_content = []
+ for t in range(16):
+ corr_content.append(pe.pseudo_Obs(val, 0.1, 't', samples))
+
+ return pe.correlators.Corr(corr_content)
+
diff --git a/tests/covobs_test.py b/tests/covobs_test.py
index 215c75d3..f0a53e89 100644
--- a/tests/covobs_test.py
+++ b/tests/covobs_test.py
@@ -39,8 +39,8 @@ def test_covobs():
assert(np.isclose(oc.value, op.value, rtol=1e-14, atol=1e-14))
[o.gamma_method() for o in cl]
- assert(pe.covariance(cl[0], cl[1]) == cov[0][1])
- assert(pe.covariance(cl[0], cl[1]) == cov[1][0])
+ assert(np.isclose(pe.covariance([cl[0], cl[1]])[0, 1], cov[0][1]))
+ assert(np.isclose(pe.covariance([cl[0], cl[1]])[0, 1], cov[1][0]))
do = cl[0] * cl[1]
assert(np.array_equal(do.covobs['rAP'].grad, np.transpose([pi[1], pi[0]]).reshape(2, 1)))
@@ -78,10 +78,22 @@ def test_covobs_init():
covobs = pe.cov_Obs(0.5, 0.002, 'test')
covobs = pe.cov_Obs([1, 2], [0.1, 0.2], 'test')
covobs = pe.cov_Obs([1, 2], np.array([0.1, 0.2]), 'test')
- covobs = pe.cov_Obs([1, 2], [[0.1, 0.2], [0.1, 0.2]], 'test')
- covobs = pe.cov_Obs([1, 2], np.array([[0.1, 0.2], [0.1, 0.2]]), 'test')
+ covobs = pe.cov_Obs([1, 2], [[0.21, 0.2], [0.2, 0.21]], 'test')
+ covobs = pe.cov_Obs([1, 2], np.array([[0.21, 0.2], [0.2, 0.21]]), 'test')
+def test_covobs_covariance():
+ a = pe.cov_Obs(2.47, 0.03 ** 2, "Cov_obs 1")
+ b = pe.cov_Obs(-4.3, 0.335 ** 2, "Cov_obs 2")
+
+ x = [a + b, a - b]
+ [o.gamma_method() for o in x]
+
+ covariance = pe.covariance(x)
+
+ assert np.isclose(covariance[0, 0], covariance[1, 1])
+ assert np.isclose(covariance[0, 1], a.dvalue ** 2 - b.dvalue ** 2)
+
def test_covobs_exceptions():
with pytest.raises(Exception):
@@ -92,3 +104,7 @@ def test_covobs_exceptions():
covobs = pe.cov_Obs([0.5, 0.1], np.array([[2, 1, 3], [1, 2, 3]]), 'test')
with pytest.raises(Exception):
covobs = pe.cov_Obs([0.5, 0.1], np.random.random((2, 2, 2)), 'test')
+ with pytest.raises(Exception):
+ covobs = pe.cov_Obs([1.5, 0.1], [[1., .2,], [.3, .5]] , 'test')
+ with pytest.raises(Exception):
+ covobs = pe.cov_Obs([1.5, 0.1], [[8, 4,], [4, -2]] , 'test')
diff --git a/tests/data/openqcd_test/openqcd2r1.ms.dat b/tests/data/openqcd_test/openqcd2r1.ms.dat
new file mode 100644
index 00000000..e51976e7
Binary files /dev/null and b/tests/data/openqcd_test/openqcd2r1.ms.dat differ
diff --git a/tests/data/openqcd_test/openqcd2r1.ms1.dat b/tests/data/openqcd_test/openqcd2r1.ms1.dat
new file mode 100644
index 00000000..cd5ee2c9
Binary files /dev/null and b/tests/data/openqcd_test/openqcd2r1.ms1.dat differ
diff --git a/tests/data/openqcd_test/sfqcdr1.gfms.dat b/tests/data/openqcd_test/sfqcdr1.gfms.dat
new file mode 100644
index 00000000..e75881d9
Binary files /dev/null and b/tests/data/openqcd_test/sfqcdr1.gfms.dat differ
diff --git a/tests/data/openqcd_test/sfqcdr1.rwms.dat b/tests/data/openqcd_test/sfqcdr1.rwms.dat
new file mode 100644
index 00000000..53f0f242
Binary files /dev/null and b/tests/data/openqcd_test/sfqcdr1.rwms.dat differ
diff --git a/tests/data/sfcf_test/data_a/data_a_r0.F_V0 b/tests/data/sfcf_test/data_a/data_a_r0.F_V0
new file mode 100644
index 00000000..1d490c03
--- /dev/null
+++ b/tests/data/sfcf_test/data_a/data_a_r0.F_V0
@@ -0,0 +1,1150 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:04:03 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n1
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_aF_V0
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:05 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n2
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_aF_V0
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:07 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n3
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_aF_V0
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:09 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n4
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_aF_V0
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:11 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n5
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_aF_V0
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
diff --git a/tests/data/sfcf_test/data_a/data_a_r0.f_1 b/tests/data/sfcf_test/data_a/data_a_r0.f_1
new file mode 100644
index 00000000..5b905ac5
--- /dev/null
+++ b/tests/data/sfcf_test/data_a/data_a_r0.f_1
@@ -0,0 +1,970 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:04:03 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n1
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_1
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:05 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n2
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_1
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:07 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n3
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_1
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:09 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n4
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_1
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:11 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n5
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_1
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
diff --git a/tests/data/sfcf_test/data_a/data_a_r0.f_A b/tests/data/sfcf_test/data_a/data_a_r0.f_A
new file mode 100644
index 00000000..58a7ca67
--- /dev/null
+++ b/tests/data/sfcf_test/data_a/data_a_r0.f_A
@@ -0,0 +1,400 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:04:03 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n1
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_A
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:05 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n2
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_A
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:07 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n3
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_A
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:09 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n4
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_A
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
+[run]
+
+version 2.1
+date 2022-01-19 11:04:11 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /data_a_r0_n5
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_af_A
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
diff --git a/tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1 b/tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1
new file mode 100644
index 00000000..90275570
--- /dev/null
+++ b/tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1
@@ -0,0 +1,476 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:03:58 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /unity
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_c
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
diff --git a/tests/data/sfcf_test/data_o/test_r0/cfg1/F_V0 b/tests/data/sfcf_test/data_o/test_r0/cfg1/F_V0
new file mode 100644
index 00000000..b0e4fb17
--- /dev/null
+++ b/tests/data/sfcf_test/data_o/test_r0/cfg1/F_V0
@@ -0,0 +1,230 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:04:00 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /unity
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_oF_V0
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900851147e+02 +3.0531839956225539e-10
+ 2 +6.6131885855823339e+02 +3.9736225045852382e-12
+ 3 +6.8367760900810049e+02 -2.5611665964422843e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168793060e+02 +3.0532966356282939e-10
+ 2 +6.6134325636407561e+02 +3.9737690976212336e-12
+ 3 +6.8370283168751973e+02 -2.5612610847134760e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437212463e+02 +3.0533056232915147e-10
+ 2 +6.6134520322615822e+02 +3.9737807346122766e-12
+ 3 +6.8370484437171353e+02 -2.5612686251836130e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168792889e+02 +3.0532890521977295e-10
+ 2 +6.6134325636407402e+02 +3.9730355551484655e-12
+ 3 +6.8370283168751791e+02 -2.5612686681440218e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529787934e+02 +3.0534016954586185e-10
+ 2 +6.6136765507001564e+02 +3.9731820664935325e-12
+ 3 +6.8372805529746825e+02 -2.5613631608015786e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805632656e+02 +3.0534106842445933e-10
+ 2 +6.6136960200392332e+02 +3.9731937804440792e-12
+ 3 +6.8373006805591558e+02 -2.5613707007587266e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437212156e+02 +3.0532220084664646e-10
+ 2 +6.6134520322615526e+02 +3.9656927030717790e-12
+ 3 +6.8370484437171069e+02 -2.5613522400086377e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805632599e+02 +3.0533346499198999e-10
+ 2 +6.6136960200392275e+02 +3.9658390079382195e-12
+ 3 +6.8373006805591490e+02 -2.5614467350834153e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082069789e+02 +3.0533436384459901e-10
+ 2 +6.6137154894356127e+02 +3.9658506942251639e-12
+ 3 +6.8373208082028680e+02 -2.5614542753491032e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr_t
+ 1 +6.8367760900918211e+02 -9.5149222536505804e-10
+ 2 +6.6131885855810310e+02 +3.2960434859595585e-10
+ 3 +6.8367760900806934e+02 -2.3744430846347533e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr_t
+ 1 +6.8370283168860135e+02 -9.5152732859532533e-10
+ 2 +6.6134325636394544e+02 +3.2961650841969937e-10
+ 3 +6.8370283168748858e+02 -2.3745306857315358e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr_t
+ 1 +6.8370484437279526e+02 -9.5153012965274573e-10
+ 2 +6.6134520322602793e+02 +3.2961747879154288e-10
+ 3 +6.8370484437168250e+02 -2.3745376753897864e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr_t
+ 1 +6.8370283168859953e+02 -9.5151770701795658e-10
+ 2 +6.6134325636394351e+02 +3.2962581533640458e-10
+ 3 +6.8370283168748665e+02 -2.3744344699578737e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr_t
+ 1 +6.8372805529855032e+02 -9.5155281099707234e-10
+ 2 +6.6136765506988547e+02 +3.2963797613709602e-10
+ 3 +6.8372805529743755e+02 -2.3745220688244645e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr_t
+ 1 +6.8373006805699742e+02 -9.5155561220425917e-10
+ 2 +6.6136960200379315e+02 +3.2963894649982994e-10
+ 3 +6.8373006805588454e+02 -2.3745290592048597e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr_t
+ 1 +6.8370484437279174e+02 -9.5153224647433932e-10
+ 2 +6.6134520322602452e+02 +3.2961543119772646e-10
+ 3 +6.8370484437167897e+02 -2.3745588436057620e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr_t
+ 1 +6.8373006805699617e+02 -9.5156735103669992e-10
+ 2 +6.6136960200379178e+02 +3.2962759157000606e-10
+ 3 +6.8373006805588329e+02 -2.3746464475292832e-10
+
+[correlator]
+
+name F_V0
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr_t
+ 1 +6.8373208082136819e+02 -9.5157015223999714e-10
+ 2 +6.6137154894343041e+02 +3.2962856194733528e-10
+ 3 +6.8373208082025531e+02 -2.3746534378088984e-10
+
diff --git a/tests/data/sfcf_test/data_o/test_r0/cfg1/f_1 b/tests/data/sfcf_test/data_o/test_r0/cfg1/f_1
new file mode 100644
index 00000000..09751218
--- /dev/null
+++ b/tests/data/sfcf_test/data_o/test_r0/cfg1/f_1
@@ -0,0 +1,194 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:04:00 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /unity
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_of_1
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 0
+corr
++3.5119415254545021e+02 +6.7620978057264750e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 1
+corr
++3.5120703575855339e+02 +6.5026340956203663e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 0
+wf_2 2
+corr
++3.5120808902177868e+02 +6.5443496235264788e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 0
+corr
++3.5120703575855515e+02 +6.9706500417651470e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 1
+corr
++3.5122001235609065e+02 +6.9516150897757419e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 1
+wf_2 2
+corr
++3.5122104108046199e+02 +6.9232860455434941e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 0
+corr
++3.5120808902177447e+02 +1.0849949614595719e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 1
+corr
++3.5122104108046182e+02 +1.0866063643253473e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 0
+wf 2
+wf_2 2
+corr
++3.5122207631098047e+02 +1.0827277318679030e-14
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 0
+corr
++3.5119415254545038e+02 +3.0143306723935508e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 1
+corr
++3.5120703575855367e+02 +4.3340379505972648e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 0
+wf_2 2
+corr
++3.5120808902177902e+02 +3.9652247575094006e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 0
+corr
++3.5120703575855526e+02 -8.2540994138261318e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 1
+corr
++3.5122001235609082e+02 -9.7121215247039609e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 1
+wf_2 2
+corr
++3.5122104108046227e+02 -9.0872484903683497e-16
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 0
+corr
++3.5120808902177453e+02 +5.1331372776616026e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 1
+corr
++3.5122104108046193e+02 +5.0816653044831932e-15
+
+[correlator]
+
+name f_1
+quarks lquark lquark
+offset 1
+wf 2
+wf_2 2
+corr
++3.5122207631098064e+02 +5.1165649253001659e-15
+
diff --git a/tests/data/sfcf_test/data_o/test_r0/cfg1/f_A b/tests/data/sfcf_test/data_o/test_r0/cfg1/f_A
new file mode 100644
index 00000000..74be18ea
--- /dev/null
+++ b/tests/data/sfcf_test/data_o/test_r0/cfg1/f_A
@@ -0,0 +1,80 @@
+[run]
+
+version 2.1
+date 2022-01-19 11:04:00 +0100
+host r04n07.palma.wwu
+dir /scratch/tmp/j_kuhl19
+user j_kuhl19
+gauge_name /unity
+gauge_md5 1ea28326e4090996111a320b8372811d
+param_name sfcf_unity_test.in
+param_md5 d881e90d41188a33b8b0f1bd0bc53ea5
+param_hash 686af5e712ee2902180f5428af94c6e7
+data_name ./output_10519905/data_of_A
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 0
+corr_t
+ 1 +6.5471188727972304e+01 -6.1214214711790100e-12
+ 2 +1.0447210336915187e+00 +8.9219487930753188e-13
+ 3 -4.1025094911185178e+01 -4.8315634170546161e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 1
+corr_t
+ 1 +6.5551520722862705e+01 +2.0963356863957609e-13
+ 2 +1.0542820240851569e+00 +2.3989756974599379e-15
+ 3 -4.1024441815729936e+01 -5.7107484666182308e-15
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 0
+wf 2
+corr_t
+ 1 +6.5529951269442847e+01 -6.6512260271334321e-14
+ 2 +1.0516822345055969e+00 -2.2935262162529075e-15
+ 3 -4.1025142768037746e+01 +3.7566377680004518e-16
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 0
+corr_t
+ 1 +6.5471188727965909e+01 -1.6112786177915427e-11
+ 2 +1.0447210337411881e+00 -7.0387528705692678e-13
+ 3 -4.1025094911167137e+01 +4.6509152745618223e-13
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 1
+corr_t
+ 1 +6.5551520722842213e+01 -8.1976426690345305e-13
+ 2 +1.0542820240843382e+00 +2.1626370477046812e-13
+ 3 -4.1024441815730086e+01 -2.4147931196409923e-14
+
+[correlator]
+
+name f_A
+quarks lquark lquark
+offset 1
+wf 2
+corr_t
+ 1 +6.5529951269443117e+01 +7.9192560386479701e-14
+ 2 +1.0516822345055870e+00 -1.2443038782429568e-14
+ 3 -4.1025142768037739e+01 +5.9315333178954509e-17
+
diff --git a/tests/data/sfcf_test/param/out.out b/tests/data/sfcf_test/param/out.out
new file mode 100644
index 00000000..0b3afcc7
--- /dev/null
+++ b/tests/data/sfcf_test/param/out.out
@@ -0,0 +1,3273 @@
+The following modules were not unloaded:
+ (Use "module --force purge" to unload all):
+
+ 1) palma/2019a
+
+Currently Loaded Modules:
+ 1) palma/2019a (S)
+ 2) GCCcore/8.2.0
+ 3) zlib/1.2.11
+ 4) binutils/2.31.1
+ 5) icc/2019.1.144-GCC-8.2.0-2.31.1
+ 6) ifort/2019.1.144-GCC-8.2.0-2.31.1
+ 7) impi/2018.4.274
+ 8) imkl/2019.1.144
+ 9) intel/2019a
+
+ Where:
+ S: Module is Sticky, requires --force to unload or purge
+
+
+
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=0 f=0 b=0 c=1 dname='./output_10519905/data_c' p=0 pname='./output_10519905/parameters_c')
+... creating data file './output_10519905/data_c' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.11e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 1.06e-03 1.06e-03 0.1 %
+ reading input 1 1.82e+00 1.82e+00 85.9 %
+ IO config 1 9.28e-04 9.28e-04 0.0 %
+ IO data 2 3.03e-03 6.06e-03 0.3 %
+ mem alloc 2 1.30e-03 2.60e-03 0.1 %
+ solver (sfcf only) 60 4.51e-03 2.70e-01 12.8 %
+ rr correlators 1 1.59e-02 1.59e-02 0.8 %
+ rs correlators 1 1.19e-06 1.19e-06 0.0 %
+
+End.
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=0 f=0 b=0 c=0 dname='./output_10519905/data_o' p=0 pname='./output_10519905/parameters_o')
+... creating data file './output_10519905/data_of_A' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+... creating data file './output_10519905/data_of_1' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+... creating data file './output_10519905/data_oF_V0' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.11e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 8.18e-04 8.18e-04 0.0 %
+ reading input 1 1.81e+00 1.81e+00 86.0 %
+ IO config 1 7.10e-04 7.10e-04 0.0 %
+ IO data 2 2.91e-03 5.82e-03 0.3 %
+ mem alloc 2 1.34e-03 2.68e-03 0.1 %
+ solver (sfcf only) 60 4.50e-03 2.70e-01 12.8 %
+ rr correlators 1 1.52e-02 1.52e-02 0.7 %
+ rs correlators 1 9.54e-07 9.54e-07 0.0 %
+
+End.
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=0 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a')
+... creating data file './output_10519905/data_af_A' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+... creating data file './output_10519905/data_af_1' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+... creating data file './output_10519905/data_aF_V0' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7, param_md5 = d881e90d41188a33b8b0f1bd0bc53ea5)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.10e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 7.49e-04 7.49e-04 0.0 %
+ reading input 1 1.81e+00 1.81e+00 85.9 %
+ IO config 1 6.98e-04 6.98e-04 0.0 %
+ IO data 2 3.40e-03 6.79e-03 0.3 %
+ mem alloc 2 1.30e-03 2.60e-03 0.1 %
+ solver (sfcf only) 60 4.52e-03 2.71e-01 12.9 %
+ rr correlators 1 1.51e-02 1.51e-02 0.7 %
+ rs correlators 1 0.00e+00 0.00e+00 0.0 %
+
+End.
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a')
+... checking data file './output_10519905/data_af_A' [dataio.c]
+... skipped 1 run records [dataio.c]
+... skipped 6 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_A' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_af_1' [dataio.c]
+... skipped 1 run records [dataio.c]
+... skipped 18 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_1' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_aF_V0' [dataio.c]
+... skipped 1 run records [dataio.c]
+... skipped 18 correlator records [dataio.c]
+... appending to data file './output_10519905/data_aF_V0' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.11e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 7.90e-04 7.90e-04 0.0 %
+ reading input 1 1.81e+00 1.81e+00 85.8 %
+ IO config 1 6.84e-04 6.84e-04 0.0 %
+ IO data 2 2.45e-03 4.91e-03 0.2 %
+ mem alloc 2 1.34e-03 2.68e-03 0.1 %
+ solver (sfcf only) 60 4.58e-03 2.75e-01 13.0 %
+ rr correlators 1 1.53e-02 1.53e-02 0.7 %
+ rs correlators 1 1.19e-06 1.19e-06 0.0 %
+
+End.
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a')
+... checking data file './output_10519905/data_af_A' [dataio.c]
+... skipped 2 run records [dataio.c]
+... skipped 12 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_A' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_af_1' [dataio.c]
+... skipped 2 run records [dataio.c]
+... skipped 36 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_1' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_aF_V0' [dataio.c]
+... skipped 2 run records [dataio.c]
+... skipped 36 correlator records [dataio.c]
+... appending to data file './output_10519905/data_aF_V0' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.11e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 8.06e-04 8.06e-04 0.0 %
+ reading input 1 1.81e+00 1.81e+00 85.8 %
+ IO config 1 7.46e-04 7.46e-04 0.0 %
+ IO data 2 2.60e-03 5.20e-03 0.2 %
+ mem alloc 2 1.33e-03 2.66e-03 0.1 %
+ solver (sfcf only) 60 4.57e-03 2.74e-01 13.0 %
+ rr correlators 1 1.60e-02 1.60e-02 0.8 %
+ rs correlators 1 0.00e+00 0.00e+00 0.0 %
+
+End.
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a')
+... checking data file './output_10519905/data_af_A' [dataio.c]
+... skipped 3 run records [dataio.c]
+... skipped 18 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_A' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_af_1' [dataio.c]
+... skipped 3 run records [dataio.c]
+... skipped 54 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_1' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_aF_V0' [dataio.c]
+... skipped 3 run records [dataio.c]
+... skipped 54 correlator records [dataio.c]
+... appending to data file './output_10519905/data_aF_V0' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.11e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 8.31e-04 8.31e-04 0.0 %
+ reading input 1 1.81e+00 1.81e+00 85.9 %
+ IO config 1 9.42e-04 9.42e-04 0.0 %
+ IO data 2 1.73e-03 3.45e-03 0.2 %
+ mem alloc 2 1.62e-03 3.24e-03 0.2 %
+ solver (sfcf only) 60 4.54e-03 2.72e-01 12.9 %
+ rr correlators 1 1.52e-02 1.52e-02 0.7 %
+ rs correlators 1 0.00e+00 0.00e+00 0.0 %
+
+End.
+Build info
+----------
+Global lattice: 4 x 4 x 4 x 4
+Local lattice: 4 x 4 x 4 x 4 (u: 320+0 s: 192+0)
+Using single MPI process
+SFCF version: 2.1
+Using geometry 2 (boundary spinors mapped to dummy, u_ipt != s_ipt)
+Using solvers from openQCD
+Using dfl_update in DFL_SAP_GCR solver from openQCD
+Using oqcd_utils2.c from SFCF
+Using profiler functions also in openQCD interface
+Using SSE3
+Using prefetch PM
+Using prefetch P4
+
+Initialization
+--------------
+... initializing geometry
+... allocating gauge field
+... using unit gauge field
+Gauge field checked (184320 B, unused links: 64 zero, 1216 unity, BF0)
+Gauge checksum (MD5): 1ea28326e4090996111a320b8372811d
+... reading input file ('sfcf_unity_test.in')
+... finished reading input file (without hash) [input.c]
+
+Basic parameters:
+ Nf = 3
+ beta = 3.552200000000
+ ct = 1.055185744046 (input)
+ cttilde= 0.974579134058 (input)
+ csw = 1.822845956831 (input)
+ isw = 0
+
+WARNING: The improvement coefficients have been calculated according to old
+ formulae, which were used in past simulations. If you do not need
+ compatibility to old simulations, you can use the newest formulae by
+ defining the preprocessor flag USE_LATEST_IMPROVEMENT.
+
+
+Solver parameters:
+ errsq = 1.000000e-18
+ nmax = 4096
+
+ oqcd_solver_select = -1
+ oqcd_solver_param = 0xf04
+
+ [Solver 0]
+ solver = DFL_SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 1]
+ solver = CGNE
+ nmx = 4096
+ res = 1.000000e-10
+ [Solver 2]
+ solver = SAP_GCR
+ nkv = 24
+ isolv = 1
+ nmr = 4
+ ncy = 5
+ nmx = 2048
+ res = 1.000000e-10
+ [Solver 3]
+ solver = CGNE_NO_EO
+ nkv = 0
+ isolv = 0
+ nmr = 0
+ ncy = 0
+ nmx = 4096
+ res = 1.000000e-10
+ [SAP]
+ bs = 4 4 4 4
+ [[Deflation subspace]
+ bs = 4 4 4 4
+ Ns = 20
+ [[Deflation subspace generation]
+ kappa = 1.371379e-01
+ mu = 0.000000e+00
+ ninv = 10
+ nmr = 4
+ ncy = 5
+ [[Deflation projection]
+ nkv = 18
+ nmx = 2048
+ res = 1.000000e-02
+
+Source offsets: 2
+ offsets[0] = (0.0000000000000000e+00,0.0000000000000000e+00,0.0000000000000000e+00) = (0,0,0) sites
+WARNING in safe_ftoi [utils.c]: Fractional part exceeds tolerance (|0.5|>1e-06). offsets[1] = (0.0000000000000000e+00,0.0000000000000000e+00,5.0000000000000000e-01) = (0,0,0) sites
+
+Wave-function parameters:
+ sigma type = delta
+ Wave-function basis:
+ element #0: n_H = 0.000000000000 r_H = 2.666666666667
+ element #1: n_H = 1.000000000000 r_H = 2.666666666667
+ element #2: n_H = 0.000000000000 r_H = 5.333333333333
+ Wave-function coefficients:
+ element #0: coeff = { 1.000000000000, 0.000000000000, 0.000000000000,}
+ element #1: coeff = { 0.000000000000, 1.000000000000, 0.000000000000,}
+ element #2: coeff = { 0.000000000000, 0.000000000000, 1.000000000000,}
+
+Relativistic quarks:
+ rel. quark #0: name = 'lquark' kappa = 0.137137900000 theta = 0.500000000000 0.500000000000 0.500000000000 persistent
+
+Measurements for rr: 1
+ mrr[0] = (0, 0)
+
+Correlators for rr: 3
+ crr[0] = 'f_A'
+ crr[1] = 'f_1'
+ crr[2] = 'F_V0'
+
+Static actions (`smearings'):
+
+Static quarks:
+
+Measurements for rs: 0
+
+Correlators for rs: 0
+
+... allocating rprop (32 blocks)
+... initializing dataio (a=1 f=0 b=0 c=0 dname='./output_10519905/data_a' p=0 pname='./output_10519905/parameters_a')
+... checking data file './output_10519905/data_af_A' [dataio.c]
+... skipped 4 run records [dataio.c]
+... skipped 24 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_A' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_af_1' [dataio.c]
+... skipped 4 run records [dataio.c]
+... skipped 72 correlator records [dataio.c]
+... appending to data file './output_10519905/data_af_1' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+... checking data file './output_10519905/data_aF_V0' [dataio.c]
+... skipped 4 run records [dataio.c]
+... skipped 72 correlator records [dataio.c]
+... appending to data file './output_10519905/data_aF_V0' [dataio.c]
+... wrote run record (param_hash = 686af5e712ee2902180f5428af94c6e7)
+
+Plaquette:
+
+ sum: 4.09557397714092622e+03
+ sum (time): 2.36757397714092622e+03
+ sum (space): 1.72800000000000000e+03
+ sum (avg.): 1.01576735544169794e+00
+ dS/deta: 0.00000000000000000e+00
+ vbar: 0.00000000000000000e+00
+
+
+
+RR Correlation Functions
+------------------------
+
+ offset[0] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +0.0000000000000000e+00}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.335827e-10
+ True residue: |r_n|/|v| = 8.335828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.534512e-10
+ True residue: |r_n|/|v| = 8.534511e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802722e-10
+ True residue: |r_n|/|v| = 8.802722e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.802562e-10
+ True residue: |r_n|/|v| = 8.802562e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.801999e-10
+ True residue: |r_n|/|v| = 8.801999e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796995e-10
+ True residue: |r_n|/|v| = 8.796995e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.684873e-10
+ True residue: |r_n|/|v| = 6.684873e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.682003e-10
+ True residue: |r_n|/|v| = 6.682002e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021740e-10
+ True residue: |r_n|/|v| = 6.021742e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021726e-10
+ True residue: |r_n|/|v| = 6.021726e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ offset[1] == {+0.0000000000000000e+00, +0.0000000000000000e+00, +5.0000000000000000e-01}
+ computing correlations between rel. quark 0 and rel. quark 0...
+ wave function: 0
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 9.352828e-10
+ True residue: |r_n|/|v| = 9.352828e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 42 iterations
+ Iterated residue: |r_n|/|v| = 8.277678e-10
+ True residue: |r_n|/|v| = 8.277678e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.800192e-10
+ True residue: |r_n|/|v| = 8.800192e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.804954e-10
+ True residue: |r_n|/|v| = 8.804953e-10
+ computing f_1 ...
+ computing F_V0 ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.806137e-10
+ True residue: |r_n|/|v| = 8.806137e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 48 iterations
+ Iterated residue: |r_n|/|v| = 8.796464e-10
+ True residue: |r_n|/|v| = 8.796464e-10
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 1
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.689213e-10
+ True residue: |r_n|/|v| = 6.689212e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 41 iterations
+ Iterated residue: |r_n|/|v| = 6.695514e-10
+ True residue: |r_n|/|v| = 6.695515e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ wave function: 2
+ computing f_A ...
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021731e-10
+ True residue: |r_n|/|v| = 6.021731e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+... start SFCF solver CG: iv=-1 ix=196 [solver.c]
+ CG converged after 39 iterations
+ Iterated residue: |r_n|/|v| = 6.021729e-10
+ True residue: |r_n|/|v| = 6.021727e-10
+ computing f_1 ...
+ computing F_V0 ...
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+ INFO from crr_bib [crr_contractions.c]: This routine is only exact for flat wave functions.
+
+
+RS Correlation Functions
+------------------------
+
+... finalizing dataio
+
+
+OK: All 197 PSDdummy are zero
+
+Maximum memory usage (rank 0): 8.61 MB (8.61 by SFCF, 0.00 by openQCD)
+Current memory usage (rank 0): 8.58 MB (8.58 by SFCF, 0.00 by openQCD)
+
+Total execution time with solver -1 (CG): 2.11e+00 sec
+
+ section count avg sec tot sec rel cost
+ -----------------------------------------------------------------
+ main 1 7.94e-04 7.94e-04 0.0 %
+ reading input 1 1.81e+00 1.81e+00 86.0 %
+ IO config 1 7.78e-04 7.78e-04 0.0 %
+ IO data 2 2.04e-03 4.08e-03 0.2 %
+ mem alloc 2 1.56e-03 3.13e-03 0.1 %
+ solver (sfcf only) 60 4.50e-03 2.70e-01 12.8 %
+ rr correlators 1 1.54e-02 1.54e-02 0.7 %
+ rs correlators 1 0.00e+00 0.00e+00 0.0 %
+
+End.
diff --git a/tests/data/sfcf_test/param/parameters_a b/tests/data/sfcf_test/param/parameters_a
new file mode 100644
index 00000000..8e573616
--- /dev/null
+++ b/tests/data/sfcf_test/param/parameters_a
@@ -0,0 +1,102 @@
+
+tsize 4
+l1 4
+l2 4
+l3 4
+nf 3
+beta +3.5522000000000000e+00
+ct +1.0551857440459433e+00
+cttilde +9.7457913405776697e-01
+csw +1.8228459568314139e+00
+isw 0
+errsq +1.0000000000000001e-18
+nmax 4096
+oqcd_solver_select -1
+oqcd_solver_param 3844
+
+[Solver 0]
+solver DFL_SAP_GCR
+nkv 24
+isolv 1
+nmr 4
+ncy 5
+nmx 2048
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 1]
+solver CGNE
+nkv 0
+isolv 0
+nmr 0
+ncy 0
+nmx 4096
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 2]
+solver SAP_GCR
+nkv 24
+isolv 1
+nmr 4
+ncy 5
+nmx 2048
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 3]
+solver CGNE_NO_EO
+nkv 0
+isolv 0
+nmr 0
+ncy 0
+nmx 4096
+res +1.0000000000000000e-10
+istop 0
+
+[SAP]
+bs 4 4 4 4
+
+[Deflation subspace]
+bs 4 4 4 4
+Ns 20
+
+[Deflation subspace generation]
+kappa +1.3713790000000001e-01
+mu +0.0000000000000000e+00
+ninv 10
+nmr 4
+ncy 5
+
+[Deflation projection]
+nkv 18
+nmx 2048
+res +1.0000000000000000e-02
+
+wf_offsets 2
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +5.0000000000000000e-01
+wf_basis 3
+ +0.0000000000000000e+00 +2.6666666666666665e+00
+ +1.0000000000000000e+00 +2.6666666666666665e+00
+ +0.0000000000000000e+00 +5.3333333333333330e+00
+wf_coeff 3
+ +1.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +1.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +1.0000000000000000e+00
+
+qr 1
+ lquark +1.3713790000000001e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 persistent
+mrr 1
+ lquark lquark
+crr 3
+ f_A
+ f_1
+ F_V0
+
+sg 0
+qs 0
+mrs 0
+crs 0
+
+# param_hash 686af5e712ee2902180f5428af94c6e7
diff --git a/tests/data/sfcf_test/param/parameters_c b/tests/data/sfcf_test/param/parameters_c
new file mode 100644
index 00000000..8e573616
--- /dev/null
+++ b/tests/data/sfcf_test/param/parameters_c
@@ -0,0 +1,102 @@
+
+tsize 4
+l1 4
+l2 4
+l3 4
+nf 3
+beta +3.5522000000000000e+00
+ct +1.0551857440459433e+00
+cttilde +9.7457913405776697e-01
+csw +1.8228459568314139e+00
+isw 0
+errsq +1.0000000000000001e-18
+nmax 4096
+oqcd_solver_select -1
+oqcd_solver_param 3844
+
+[Solver 0]
+solver DFL_SAP_GCR
+nkv 24
+isolv 1
+nmr 4
+ncy 5
+nmx 2048
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 1]
+solver CGNE
+nkv 0
+isolv 0
+nmr 0
+ncy 0
+nmx 4096
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 2]
+solver SAP_GCR
+nkv 24
+isolv 1
+nmr 4
+ncy 5
+nmx 2048
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 3]
+solver CGNE_NO_EO
+nkv 0
+isolv 0
+nmr 0
+ncy 0
+nmx 4096
+res +1.0000000000000000e-10
+istop 0
+
+[SAP]
+bs 4 4 4 4
+
+[Deflation subspace]
+bs 4 4 4 4
+Ns 20
+
+[Deflation subspace generation]
+kappa +1.3713790000000001e-01
+mu +0.0000000000000000e+00
+ninv 10
+nmr 4
+ncy 5
+
+[Deflation projection]
+nkv 18
+nmx 2048
+res +1.0000000000000000e-02
+
+wf_offsets 2
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +5.0000000000000000e-01
+wf_basis 3
+ +0.0000000000000000e+00 +2.6666666666666665e+00
+ +1.0000000000000000e+00 +2.6666666666666665e+00
+ +0.0000000000000000e+00 +5.3333333333333330e+00
+wf_coeff 3
+ +1.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +1.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +1.0000000000000000e+00
+
+qr 1
+ lquark +1.3713790000000001e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 persistent
+mrr 1
+ lquark lquark
+crr 3
+ f_A
+ f_1
+ F_V0
+
+sg 0
+qs 0
+mrs 0
+crs 0
+
+# param_hash 686af5e712ee2902180f5428af94c6e7
diff --git a/tests/data/sfcf_test/param/parameters_o b/tests/data/sfcf_test/param/parameters_o
new file mode 100644
index 00000000..8e573616
--- /dev/null
+++ b/tests/data/sfcf_test/param/parameters_o
@@ -0,0 +1,102 @@
+
+tsize 4
+l1 4
+l2 4
+l3 4
+nf 3
+beta +3.5522000000000000e+00
+ct +1.0551857440459433e+00
+cttilde +9.7457913405776697e-01
+csw +1.8228459568314139e+00
+isw 0
+errsq +1.0000000000000001e-18
+nmax 4096
+oqcd_solver_select -1
+oqcd_solver_param 3844
+
+[Solver 0]
+solver DFL_SAP_GCR
+nkv 24
+isolv 1
+nmr 4
+ncy 5
+nmx 2048
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 1]
+solver CGNE
+nkv 0
+isolv 0
+nmr 0
+ncy 0
+nmx 4096
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 2]
+solver SAP_GCR
+nkv 24
+isolv 1
+nmr 4
+ncy 5
+nmx 2048
+res +1.0000000000000000e-10
+istop 0
+
+[Solver 3]
+solver CGNE_NO_EO
+nkv 0
+isolv 0
+nmr 0
+ncy 0
+nmx 4096
+res +1.0000000000000000e-10
+istop 0
+
+[SAP]
+bs 4 4 4 4
+
+[Deflation subspace]
+bs 4 4 4 4
+Ns 20
+
+[Deflation subspace generation]
+kappa +1.3713790000000001e-01
+mu +0.0000000000000000e+00
+ninv 10
+nmr 4
+ncy 5
+
+[Deflation projection]
+nkv 18
+nmx 2048
+res +1.0000000000000000e-02
+
+wf_offsets 2
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +5.0000000000000000e-01
+wf_basis 3
+ +0.0000000000000000e+00 +2.6666666666666665e+00
+ +1.0000000000000000e+00 +2.6666666666666665e+00
+ +0.0000000000000000e+00 +5.3333333333333330e+00
+wf_coeff 3
+ +1.0000000000000000e+00 +0.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +1.0000000000000000e+00 +0.0000000000000000e+00
+ +0.0000000000000000e+00 +0.0000000000000000e+00 +1.0000000000000000e+00
+
+qr 1
+ lquark +1.3713790000000001e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 +5.0000000000000000e-01 persistent
+mrr 1
+ lquark lquark
+crr 3
+ f_A
+ f_1
+ F_V0
+
+sg 0
+qs 0
+mrs 0
+crs 0
+
+# param_hash 686af5e712ee2902180f5428af94c6e7
diff --git a/tests/fits_test.py b/tests/fits_test.py
index 48012edb..b6236fb9 100644
--- a/tests/fits_test.py
+++ b/tests/fits_test.py
@@ -1,4 +1,5 @@
-import autograd.numpy as np
+import numpy as np
+import autograd.numpy as anp
import math
import scipy.optimize
from scipy.odr import ODR, Model, RealData
@@ -41,12 +42,12 @@ def test_least_squares():
oy.append(pe.pseudo_Obs(y[i], yerr[i], str(i)))
def f(x, a, b):
- return a * np.exp(-b * x)
+ return a * anp.exp(-b * x)
popt, pcov = scipy.optimize.curve_fit(f, x, y, sigma=[o.dvalue for o in oy], absolute_sigma=True)
def func(a, x):
- y = a[0] * np.exp(-a[1] * x)
+ y = a[0] * anp.exp(-a[1] * x)
return y
out = pe.least_squares(x, oy, func, expected_chisquare=True, resplot=True, qqplot=True)
@@ -60,7 +61,7 @@ def test_least_squares():
beta[i].gamma_method(S=1.0)
assert math.isclose(beta[i].value, popt[i], abs_tol=1e-5)
assert math.isclose(pcov[i, i], beta[i].dvalue ** 2, abs_tol=1e-3)
- assert math.isclose(pe.covariance(beta[0], beta[1]), pcov[0, 1], abs_tol=1e-3)
+ assert math.isclose(pe.covariance([beta[0], beta[1]])[0, 1], pcov[0, 1], abs_tol=1e-3)
chi2_pyerrors = np.sum(((f(x, *[o.value for o in beta]) - y) / yerr) ** 2) / (len(x) - 2)
chi2_scipy = np.sum(((f(x, *popt) - y) / yerr) ** 2) / (len(x) - 2)
@@ -81,7 +82,34 @@ def test_least_squares():
betac[i].gamma_method(S=1.0)
assert math.isclose(betac[i].value, popt[i], abs_tol=1e-5)
assert math.isclose(pcov[i, i], betac[i].dvalue ** 2, abs_tol=1e-3)
- assert math.isclose(pe.covariance(betac[0], betac[1]), pcov[0, 1], abs_tol=1e-3)
+ assert math.isclose(pe.covariance([betac[0], betac[1]])[0, 1], pcov[0, 1], abs_tol=1e-3)
+
+
+def test_alternative_solvers():
+ dim = 192
+ x = np.arange(dim)
+ y = 2 * np.exp(-0.06 * x) + np.random.normal(0.0, 0.15, dim)
+ yerr = 0.1 + 0.1 * np.random.rand(dim)
+
+ oy = []
+ for i, item in enumerate(x):
+ oy.append(pe.pseudo_Obs(y[i], yerr[i], 'test'))
+
+ def func(a, x):
+ y = a[0] * anp.exp(-a[1] * x)
+ return y
+
+ chisquare_values = []
+ out = pe.least_squares(x, oy, func, method='migrad')
+ chisquare_values.append(out.chisquare)
+ out = pe.least_squares(x, oy, func, method='Powell')
+ chisquare_values.append(out.chisquare)
+ out = pe.least_squares(x, oy, func, method='Nelder-Mead')
+ chisquare_values.append(out.chisquare)
+ out = pe.least_squares(x, oy, func, method='Levenberg-Marquardt')
+ chisquare_values.append(out.chisquare)
+ chisquare_values = np.array(chisquare_values)
+ assert np.all(np.isclose(chisquare_values, chisquare_values[0]))
def test_correlated_fit():
@@ -118,7 +146,7 @@ def test_correlated_fit():
return p[1] + p[0] * x
else:
def fitf(p, x):
- return p[1] * np.exp(-p[0] * x)
+ return p[1] * anp.exp(-p[0] * x)
fitp = pe.least_squares(x, data, fitf, expected_chisquare=True)
@@ -145,10 +173,10 @@ def test_total_least_squares():
oy.append(pe.pseudo_Obs(y[i], yerr[i], str(i)))
def f(x, a, b):
- return a * np.exp(-b * x)
+ return a * anp.exp(-b * x)
def func(a, x):
- y = a[0] * np.exp(-a[1] * x)
+ y = a[0] * anp.exp(-a[1] * x)
return y
data = RealData([o.value for o in ox], [o.value for o in oy], sx=[o.dvalue for o in ox], sy=[o.dvalue for o in oy])
@@ -168,7 +196,7 @@ def test_total_least_squares():
beta[i].gamma_method(S=1.0)
assert math.isclose(beta[i].value, output.beta[i], rel_tol=1e-5)
assert math.isclose(output.cov_beta[i, i], beta[i].dvalue ** 2, rel_tol=2.5e-1), str(output.cov_beta[i, i]) + ' ' + str(beta[i].dvalue ** 2)
- assert math.isclose(pe.covariance(beta[0], beta[1]), output.cov_beta[0, 1], rel_tol=2.5e-1)
+ assert math.isclose(pe.covariance([beta[0], beta[1]])[0, 1], output.cov_beta[0, 1], rel_tol=2.5e-1)
out = pe.total_least_squares(ox, oy, func, const_par=[beta[1]])
@@ -191,7 +219,7 @@ def test_total_least_squares():
betac[i].gamma_method(S=1.0)
assert math.isclose(betac[i].value, output.beta[i], rel_tol=1e-3)
assert math.isclose(output.cov_beta[i, i], betac[i].dvalue ** 2, rel_tol=2.5e-1), str(output.cov_beta[i, i]) + ' ' + str(betac[i].dvalue ** 2)
- assert math.isclose(pe.covariance(betac[0], betac[1]), output.cov_beta[0, 1], rel_tol=2.5e-1)
+ assert math.isclose(pe.covariance([betac[0], betac[1]])[0, 1], output.cov_beta[0, 1], rel_tol=2.5e-1)
outc = pe.total_least_squares(oxc, oyc, func, const_par=[betac[1]])
@@ -206,7 +234,7 @@ def test_total_least_squares():
betac[i].gamma_method(S=1.0)
assert math.isclose(betac[i].value, output.beta[i], rel_tol=1e-3)
assert math.isclose(output.cov_beta[i, i], betac[i].dvalue ** 2, rel_tol=2.5e-1), str(output.cov_beta[i, i]) + ' ' + str(betac[i].dvalue ** 2)
- assert math.isclose(pe.covariance(betac[0], betac[1]), output.cov_beta[0, 1], rel_tol=2.5e-1)
+ assert math.isclose(pe.covariance([betac[0], betac[1]])[0, 1], output.cov_beta[0, 1], rel_tol=2.5e-1)
outc = pe.total_least_squares(oxc, oy, func, const_par=[betac[1]])
@@ -291,6 +319,23 @@ def test_prior_fit():
fitp = pe.fits.least_squares([0, 1], y, f, priors=y, resplot=True, qqplot=True)
+def test_correlated_fit_covobs():
+ x1 = pe.cov_Obs(1.01, 0.01 ** 2, 'test1')
+ x2 = pe.cov_Obs(2.01, 0.01 ** 2, 'test2')
+ x3 = pe.cov_Obs(2.99, 0.01 ** 2, 'test3')
+
+ [o.gamma_method() for o in [x1, x2, x3]]
+
+ def func(a, x):
+ return a[0] * x + a[1]
+
+ fit_res = pe.fits.least_squares(np.arange(1, 4), [x1, x2, x3], func, expected_chisquare=True)
+ assert np.isclose(fit_res.chisquare_by_dof, fit_res.chisquare_by_expected_chisquare)
+
+ fit_res_corr = pe.fits.least_squares(np.arange(1, 4), [x1, x2, x3], func, correlated_fit=True)
+ assert np.isclose(fit_res.chisquare_by_dof, fit_res_corr.chisquare_by_dof)
+
+
def test_error_band():
def f(a, x):
return a[0] + a[1] * x
@@ -309,6 +354,33 @@ def test_error_band():
pe.fits.error_band(x, f, fitp.fit_parameters)
+def test_fit_no_autograd():
+ dim = 10
+ x = np.arange(dim)
+ y = 2 * np.exp(-0.08 * x) + np.random.normal(0.0, 0.15, dim)
+ yerr = 0.1 + 0.1 * np.random.rand(dim)
+
+ oy = []
+ for i, item in enumerate(x):
+ oy.append(pe.pseudo_Obs(y[i], yerr[i], str(i)))
+
+ def func(a, x):
+ y = a[0] * np.exp(-a[1] * x)
+ return y
+
+ with pytest.raises(Exception):
+ pe.least_squares(x, oy, func)
+
+ with pytest.raises(Exception):
+ pe.total_least_squares(oy, oy, func)
+
+
+def test_singular_correlated_fit():
+ obs1 = pe.pseudo_Obs(1.0, 0.1, 'test')
+ with pytest.raises(Exception):
+ pe.fits.fit_lin([0, 1], [obs1, obs1], correlated_fit=True)
+
+
def test_ks_test():
def f(a, x):
y = a[0] + a[1] * x
diff --git a/tests/io_test.py b/tests/json_io_test.py
similarity index 63%
rename from tests/io_test.py
rename to tests/json_io_test.py
index c8fb8961..c82a17e9 100644
--- a/tests/io_test.py
+++ b/tests/json_io_test.py
@@ -4,7 +4,7 @@ import numpy as np
import pyerrors as pe
import pyerrors.input.json as jsonio
import pyerrors.input.dobs as dobsio
-
+import pytest
def test_jsonio():
o = pe.pseudo_Obs(1.0, .2, 'one')
@@ -231,3 +231,116 @@ def test_dobsio():
for j in range(len(or1)):
o = or1[j] - or2[j]
assert(o.is_zero())
+
+def test_json_dict_io():
+ def check_dict_equality(d1, d2):
+ def dict_check_obs(d1, d2):
+ for k, v in d1.items():
+ if isinstance(v, dict):
+ v = dict_check_obs(v, d2[k])
+ elif isinstance(v, list) and all([isinstance(o, pe.Obs) for o in v]):
+ for i in range(len(v)):
+ assert((v[i] - d2[k][i]).is_zero())
+ elif isinstance(v, list):
+ v = list_check_obs(v, d2[k])
+ elif isinstance(v, pe.Obs):
+ assert((v - d2[k]).is_zero())
+ elif isinstance(v, pe.Corr):
+ for i in range(v.T):
+ assert((v[i] - d2[k][i]).is_zero())
+ elif isinstance(v, np.ndarray):
+ a1 = np.ravel(v)
+ a2 = np.ravel(d2[k])
+ for i in range(len(a1)):
+ assert((a1[i] - a2[i]).is_zero())
+
+ def list_check_obs(l1, l2):
+ for ei in range(len(l1)):
+ e = l1[ei]
+ if isinstance(e, list):
+ e = list_check_obs(e, l2[ei])
+ elif isinstance(e, list) and all([isinstance(o, pe.Obs) for o in e]):
+ for i in range(len(e)):
+ assert((e[i] - l2[ei][i]).is_zero())
+ elif isinstance(e, dict):
+ e = dict_check_obs(e, l2[ei])
+ elif isinstance(e, pe.Obs):
+ assert((e - l2[ei]).is_zero())
+ elif isinstance(e, pe.Corr):
+ for i in range(e.T):
+ assert((e[i] - l2[ei][i]).is_zero())
+ elif isinstance(e, np.ndarray):
+ a1 = np.ravel(e)
+ a2 = np.ravel(l2[ei])
+ for i in range(len(a1)):
+ assert((a1[i] - a2[i]).is_zero())
+ dict_check_obs(d1, d2)
+ return True
+
+ od = {
+ 'l':
+ {
+ 'a': pe.pseudo_Obs(1, .2, 'testa', samples=10),
+ 'b': [pe.pseudo_Obs(1.1, .1, 'test', samples=10), pe.pseudo_Obs(1.2, .1, 'test', samples=10), pe.pseudo_Obs(1.3, .1, 'test', samples=10)],
+ 'c': {
+ 'd': 1,
+ 'e': pe.pseudo_Obs(.2, .01, 'teste', samples=10),
+ 'f': pe.Corr([pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10)]),
+ 'g': np.reshape(np.asarray([pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10), pe.pseudo_Obs(.1, .01, 'a', samples=10)]), (2, 2)),
+ }
+ },
+ 's':
+ {
+ 'a': 'Infor123',
+ 'b': ['Some', 'list'],
+ 'd': pe.pseudo_Obs(.01, .001, 'testd', samples=10) * pe.cov_Obs(1, .01, 'cov1'),
+ 'se': None,
+ 'sf': 1.2,
+ }
+ }
+
+ fname = 'test_rw'
+
+ desc = 'This is a random description'
+
+ with pytest.raises(Exception):
+ jsonio.dump_dict_to_json(od, fname, description=desc, reps='|Test')
+
+ jsonio.dump_dict_to_json(od, fname, description=desc, reps='TEST')
+ nd = jsonio.load_json_dict(fname, full_output=True, reps='TEST')
+
+ with pytest.raises(Exception):
+ nd = jsonio.load_json_dict(fname, full_output=True)
+
+ jsonio.dump_dict_to_json(od, fname, description=desc)
+ nd = jsonio.load_json_dict(fname, full_output=True)
+ assert (desc == nd['description'])
+
+ assert(check_dict_equality(od, nd['obsdata']))
+ nd = jsonio.load_json_dict(fname, full_output=False)
+ assert(check_dict_equality(od, nd))
+
+ nl = jsonio.load_json(fname, full_output=True)
+ nl = jsonio.load_json(fname, full_output=False)
+
+ with pytest.raises(Exception):
+ jsonio.dump_dict_to_json(nl, fname, description=desc)
+
+ od['k'] = 'DICTOBS2'
+ with pytest.raises(Exception):
+ jsonio.dump_dict_to_json(od, fname, description=desc)
+
+ od['k'] = ['DICTOBS2']
+ with pytest.raises(Exception):
+ jsonio.dump_dict_to_json(od, fname, description=desc)
+
+ os.remove(fname + '.json.gz')
+
+
+def test_renorm_deriv_of_corr(tmp_path):
+ c = pe.Corr([pe.pseudo_Obs(i, .1, 'test') for i in range(10)])
+ c *= pe.cov_Obs(1., .1, '#ren')
+ c = c.deriv()
+ pe.input.json.dump_to_json(c, (tmp_path / 'test').as_posix())
+ recover = pe.input.json.load_json((tmp_path / 'test').as_posix())
+ assert np.all([o == 0 for o in (c - recover)[1:-1]])
diff --git a/tests/linalg_test.py b/tests/linalg_test.py
index 61c71514..09db0ac5 100644
--- a/tests/linalg_test.py
+++ b/tests/linalg_test.py
@@ -314,6 +314,9 @@ def test_matrix_functions():
# Check determinant
assert pe.linalg.det(np.diag(np.diag(matrix))) == np.prod(np.diag(matrix))
+ with pytest.raises(Exception):
+ pe.linalg.det(5)
+
pe.linalg.pinv(matrix[:,:3])
@@ -347,3 +350,10 @@ def test_complex_matrix_operations():
diff = ta * tb - 1
for (i, j), entry in np.ndenumerate(diff):
assert entry.is_zero()
+
+
+def test_complex_matrix_real_entries():
+ my_mat = get_complex_matrix(4)
+ my_mat[0, 1] = 4
+ my_mat[2, 0] = pe.Obs([np.random.normal(1.0, 0.1, 100)], ['t'])
+ assert np.all((my_mat @ pe.linalg.inv(my_mat) - np.identity(4)) == 0)
diff --git a/tests/obs_test.py b/tests/obs_test.py
index cf09e0aa..c8aef487 100644
--- a/tests/obs_test.py
+++ b/tests/obs_test.py
@@ -1,7 +1,5 @@
import autograd.numpy as np
import os
-import random
-import string
import copy
import pyerrors as pe
import pytest
@@ -53,6 +51,12 @@ def test_Obs_exceptions():
my_obs.gamma_method()
my_obs.details()
+ obs = pe.Obs([np.random.normal(1.0, 0.1, 100)], ['t'])
+ one = obs / obs
+ one.gamma_method()
+ with pytest.raises(Exception):
+ one.plot_piechart()
+
def test_dump():
value = np.random.normal(5, 10)
dvalue = np.abs(np.random.normal(0, 1))
@@ -88,6 +92,8 @@ def test_comparison():
assert test_obs2 != value2
assert test_obs1 != test_obs2
assert test_obs2 != test_obs1
+ assert +test_obs1 == test_obs1
+ assert -test_obs1 == 0 - test_obs1
def test_function_overloading():
@@ -117,6 +123,10 @@ def test_function_overloading():
np.arctanh(1 / b)
np.sinc(1 / b)
+ b ** b
+ 0.5 ** b
+ b ** 0.5
+
def test_overloading_vectorization():
a = np.random.randint(1, 100, 10)
@@ -138,9 +148,8 @@ def test_overloading_vectorization():
assert [o.value for o in b / a] == [o.value for o in [b / p for p in a]]
-def test_gamma_method():
+def test_gamma_method_standard_data():
for data in [np.tile([1, -1], 1000),
- np.random.rand(100001),
np.zeros(1195),
np.sin(np.sqrt(2) * np.pi * np.arange(1812))]:
test_obs = pe.Obs([data], ['t'])
@@ -244,17 +253,6 @@ def test_gamma_method_kwargs():
assert my_obs.N_sigma['ens'] == pe.Obs.N_sigma_global
-def test_covariance_is_variance():
- value = np.random.normal(5, 10)
- dvalue = np.abs(np.random.normal(0, 1))
- test_obs = pe.pseudo_Obs(value, dvalue, 't')
- test_obs.gamma_method()
- assert np.abs(test_obs.dvalue ** 2 - pe.covariance(test_obs, test_obs)) <= 10 * np.finfo(np.float64).eps
- test_obs = test_obs + pe.pseudo_Obs(value, dvalue, 'q', 200)
- test_obs.gamma_method()
- assert np.abs(test_obs.dvalue ** 2 - pe.covariance(test_obs, test_obs)) <= 10 * np.finfo(np.float64).eps
-
-
def test_fft():
value = np.random.normal(5, 100)
dvalue = np.abs(np.random.normal(0, 5))
@@ -266,22 +264,7 @@ def test_fft():
assert np.abs(test_obs1.dvalue - test_obs2.dvalue) <= 10 * max(test_obs1.dvalue, test_obs2.dvalue) * np.finfo(np.float64).eps
-def test_covariance_symmetry():
- value1 = np.random.normal(5, 10)
- dvalue1 = np.abs(np.random.normal(0, 1))
- test_obs1 = pe.pseudo_Obs(value1, dvalue1, 't')
- test_obs1.gamma_method()
- value2 = np.random.normal(5, 10)
- dvalue2 = np.abs(np.random.normal(0, 1))
- test_obs2 = pe.pseudo_Obs(value2, dvalue2, 't')
- test_obs2.gamma_method()
- cov_ab = pe.covariance(test_obs1, test_obs2)
- cov_ba = pe.covariance(test_obs2, test_obs1)
- assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps
- assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps)
-
-
-def test_gamma_method():
+def test_gamma_method_uncorrelated():
# Construct pseudo Obs with random shape
value = np.random.normal(5, 10)
dvalue = np.abs(np.random.normal(0, 1))
@@ -304,14 +287,14 @@ def test_derived_observables():
d_Obs_fd = pe.derived_observable(lambda x, **kwargs: x[0] * x[1] * np.sin(x[0] * x[1]), [test_obs, test_obs], num_grad=True)
d_Obs_fd.gamma_method()
- assert d_Obs_ad.value == d_Obs_fd.value
+ assert d_Obs_ad == d_Obs_fd
assert np.abs(4.0 * np.sin(4.0) - d_Obs_ad.value) < 1000 * np.finfo(np.float64).eps * np.abs(d_Obs_ad.value)
assert np.abs(d_Obs_ad.dvalue-d_Obs_fd.dvalue) < 1000 * np.finfo(np.float64).eps * d_Obs_ad.dvalue
i_am_one = pe.derived_observable(lambda x, **kwargs: x[0] / x[1], [d_Obs_ad, d_Obs_ad])
i_am_one.gamma_method()
- assert i_am_one.value == 1.0
+ assert i_am_one == 1.0
assert i_am_one.dvalue < 2 * np.finfo(np.float64).eps
assert i_am_one.e_dvalue['t'] <= 2 * np.finfo(np.float64).eps
assert i_am_one.e_ddvalue['t'] <= 2 * np.finfo(np.float64).eps
@@ -392,6 +375,11 @@ def test_cobs():
obs2 = pe.pseudo_Obs(-0.2, 0.03, 't')
my_cobs = pe.CObs(obs1, obs2)
+ assert +my_cobs == my_cobs
+ assert -my_cobs == 0 - my_cobs
+ my_cobs == my_cobs
+ str(my_cobs)
+ repr(my_cobs)
assert not (my_cobs + my_cobs.conjugate()).real.is_zero()
assert (my_cobs + my_cobs.conjugate()).imag.is_zero()
assert (my_cobs - my_cobs.conjugate()).real.is_zero()
@@ -424,6 +412,23 @@ def test_cobs():
assert (other / my_cobs * my_cobs - other).is_zero()
+def test_cobs_overloading():
+ obs = pe.pseudo_Obs(1.1, 0.1, 't')
+ cobs = pe.CObs(obs, obs)
+
+ cobs + obs
+ obs + cobs
+
+ cobs - obs
+ obs - cobs
+
+ cobs * obs
+ obs * cobs
+
+ cobs / obs
+ obs / cobs
+
+
def test_reweighting():
my_obs = pe.Obs([np.random.rand(1000)], ['t'])
assert not my_obs.reweighted
@@ -591,6 +596,24 @@ def test_gamma_method_irregular():
assert((ae.e_tauint['a'] - 4 * ae.e_dtauint['a'] < ao.e_tauint['a']))
assert((ae.e_tauint['a'] + 4 * ae.e_dtauint['a'] > ao.e_tauint['a']))
+ a = pe.pseudo_Obs(1, .1, 'a', samples=10)
+ a.idl['a'] = range(4, 15)
+ b = pe.pseudo_Obs(1, .1, 'a', samples=151)
+ b.idl['a'] = range(4, 608, 4)
+ ol = [a, b]
+ o = (ol[0] - ol[1]) / (ol[1])
+
+
+def test_covariance_is_variance():
+ value = np.random.normal(5, 10)
+ dvalue = np.abs(np.random.normal(0, 1))
+ test_obs = pe.pseudo_Obs(value, dvalue, 't')
+ test_obs.gamma_method()
+ assert np.isclose(test_obs.dvalue ** 2, pe.covariance([test_obs, test_obs])[0, 1])
+ test_obs = test_obs + pe.pseudo_Obs(value, dvalue, 'q', 200)
+ test_obs.gamma_method()
+ assert np.isclose(test_obs.dvalue ** 2, pe.covariance([test_obs, test_obs])[0, 1])
+
def test_covariance_symmetry():
value1 = np.random.normal(5, 10)
@@ -601,9 +624,9 @@ def test_covariance_symmetry():
dvalue2 = np.abs(np.random.normal(0, 1))
test_obs2 = pe.pseudo_Obs(value2, dvalue2, 't')
test_obs2.gamma_method()
- cov_ab = pe.covariance(test_obs1, test_obs2)
- cov_ba = pe.covariance(test_obs2, test_obs1)
- assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps
+ cov_ab = pe.covariance([test_obs1, test_obs2])[0, 1]
+ cov_ba = pe.covariance([test_obs2, test_obs1])[0, 1]
+ assert np.isclose(cov_ab, cov_ba)
assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps)
N = 100
@@ -615,14 +638,82 @@ def test_covariance_symmetry():
idx = [i + 1 for i in range(len(configs)) if configs[i] == 1]
a = pe.Obs([zero_arr], ['t'], idl=[idx])
a.gamma_method()
- assert np.isclose(a.dvalue**2, pe.covariance(a, a), atol=100, rtol=1e-4)
+ assert np.isclose(a.dvalue ** 2, pe.covariance([a, a])[0, 1], atol=100, rtol=1e-4)
- cov_ab = pe.covariance(test_obs1, a)
- cov_ba = pe.covariance(a, test_obs1)
+ cov_ab = pe.covariance([test_obs1, a])[0, 1]
+ cov_ba = pe.covariance([a, test_obs1])[0, 1]
assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps
assert np.abs(cov_ab) < test_obs1.dvalue * a.dvalue * (1 + 10 * np.finfo(np.float64).eps)
+def test_covariance_sum():
+ length = 2
+ t_fac = 0.4
+ tt = pe.misc.gen_correlated_data(np.zeros(length), 0.99 * np.ones((length, length)) + 0.01 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=1000)
+ [o.gamma_method(S=0) for o in tt]
+
+ t_cov = pe.covariance(tt)
+
+ my_sum = tt[0] + tt[1]
+ my_sum.gamma_method(S=0)
+ e_cov = (my_sum.dvalue ** 2 - tt[0].dvalue ** 2 - tt[1].dvalue ** 2) / 2
+
+ assert np.isclose(e_cov, t_cov[0, 1])
+
+
+def test_covariance_positive_semidefinite():
+ length = 64
+ t_fac = 1.5
+ tt = pe.misc.gen_correlated_data(np.zeros(length), 0.99999 * np.ones((length, length)) + 0.00001 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=1000)
+ [o.gamma_method() for o in tt]
+ cov = pe.covariance(tt)
+ assert np.all(np.linalg.eigh(cov)[0] >= -1e-15)
+
+
+def test_covariance_factorizing():
+ length = 2
+ t_fac = 1.5
+
+ tt = pe.misc.gen_correlated_data(np.zeros(length), 0.75 * np.ones((length, length)) + 0.8 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=1000)
+ [o.gamma_method() for o in tt]
+
+ mt0 = -tt[0]
+ mt0.gamma_method()
+
+ assert np.isclose(pe.covariance([mt0, tt[1]])[0, 1], -pe.covariance(tt)[0, 1])
+
+
+def test_covariance_alternation():
+ length = 12
+ t_fac = 2.5
+
+ tt1 = pe.misc.gen_correlated_data(np.zeros(length), -0.00001 * np.ones((length, length)) + 0.002 * np.diag(np.ones(length)), 'test', tau=0.5 + t_fac * np.random.rand(length), samples=88)
+ tt2 = pe.misc.gen_correlated_data(np.zeros(length), 0.9999 * np.ones((length, length)) + 0.0001 * np.diag(np.ones(length)), 'another_test|r0', tau=0.7 + t_fac * np.random.rand(length), samples=73)
+ tt3 = pe.misc.gen_correlated_data(np.zeros(length), 0.9999 * np.ones((length, length)) + 0.0001 * np.diag(np.ones(length)), 'another_test|r1', tau=0.7 + t_fac * np.random.rand(length), samples=91)
+
+ tt = np.array(tt1) + (np.array(tt2) + np.array(tt3))
+ tt *= np.resize([1, -1], length)
+
+ [o.gamma_method() for o in tt]
+ cov = pe.covariance(tt, True)
+
+ assert np.all(np.linalg.eigh(cov)[0] > -1e-15)
+
+
+def test_covariance_correlation():
+ test_obs = pe.pseudo_Obs(-4, 0.8, 'test', samples=784)
+ assert np.allclose(pe.covariance([test_obs, test_obs, test_obs], correlation=True), np.ones((3, 3)))
+
+
+def test_covariance_rank_deficient():
+ obs = []
+ for i in range(5):
+ obs.append(pe.pseudo_Obs(1.0, 0.1, 'test', 5))
+
+ with pytest.warns(RuntimeWarning):
+ pe.covariance(obs)
+
+
def test_empty_obs():
o = pe.Obs([np.random.rand(100)], ['test'])
q = o + pe.Obs([], [])
@@ -653,3 +744,39 @@ def test_import_jackknife():
my_jacks = my_obs.export_jackknife()
reconstructed_obs = pe.import_jackknife(my_jacks, 'test')
assert my_obs == reconstructed_obs
+
+
+def test_reduce_deltas():
+ idx_old = range(1, 101)
+ deltas = [float(i) for i in idx_old]
+ idl = [
+ range(2, 26, 2),
+ range(1, 101),
+ np.arange(1, 101),
+ [1, 2, 3, 5, 6, 7, 9, 12],
+ [7],
+ ]
+ for idx_new in idl:
+ new = pe.obs._reduce_deltas(deltas, idx_old, idx_new)
+ print(new)
+ assert(np.alltrue([float(i) for i in idx_new] == new))
+
+
+def test_merge_idx():
+ idl = [list(np.arange(1, 14)) + list(range(16, 100, 4)), range(4, 604, 4), [2, 4, 5, 6, 8, 9, 12, 24], range(1, 20, 1), range(50, 789, 7)]
+ new_idx = pe.obs._merge_idx(idl)
+ assert(new_idx[-1] > new_idx[0])
+ for i in range(1, len(new_idx)):
+ assert(new_idx[i - 1] < new_idx[i])
+
+def test_cobs_array():
+ cobs = pe.Obs([np.random.normal(1.0, 0.1, 100)], ['t']) * (1 + 2j)
+ np.identity(4) + cobs
+ cobs + np.identity(4)
+ np.identity(4) - cobs
+ cobs - np.identity(4)
+ np.identity(4) * cobs
+ cobs * np.identity(4)
+ np.identity(4) / cobs
+ cobs / np.ones((4, 4))
+
diff --git a/tests/openQCD_in_test.py b/tests/openQCD_in_test.py
new file mode 100644
index 00000000..18750a07
--- /dev/null
+++ b/tests/openQCD_in_test.py
@@ -0,0 +1,99 @@
+import os
+import numpy as np
+import pyerrors as pe
+import pytest
+
+
+def test_rwms():
+ path = './tests//data/openqcd_test/'
+ prefix = 'sfqcd'
+ postfix = '.rwms'
+
+ # sfqcd-1.6: Trajectories instead of confignumbers are printed to file.
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix)
+ repname = list(rwfo[0].idl.keys())[0]
+ assert(rwfo[0].idl[repname] == range(1, 13))
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12])
+ assert(rwfo[0].idl[repname] == range(1, 13))
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[3], r_stop=[8])
+ assert(rwfo[0].idl[repname] == range(3, 9))
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[6])
+ assert(rwfo[0].idl[repname] == range(2, 7))
+ rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[1], r_stop=[12], r_step=2)
+ assert(rwfs[0].idl[repname] == range(1, 12, 2))
+ rwfs = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix, r_start=[2], r_stop=[12], r_step=2)
+ assert(rwfs[0].idl[repname] == range(2, 13, 2))
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='1.6', postfix=postfix)
+ assert((rwfo[0].r_values[repname] + rwfo[0].deltas[repname][1]) == (rwfs[0].r_values[repname] + rwfs[0].deltas[repname][0]))
+
+ o = pe.pseudo_Obs(1., .01, repname, samples=12)
+ pe.reweight(rwfo[0], [o])
+
+ o = pe.pseudo_Obs(1., .01, repname, samples=6)
+ pe.reweight(rwfo[0], [o])
+ o.idl[repname] = range(2, 13, 2)
+ pe.reweight(rwfo[0], [o])
+ pe.reweight(rwfs[0], [o])
+
+ files = ['openqcd2r1.ms1.dat']
+ names = ['openqcd2|r1']
+
+ # TM with 2 Hasenbusch factors and 2 sources each + RHMC with one source, openQCD 2.0
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names)
+ assert(len(rwfo) == 2)
+ assert(rwfo[0].value == 0.9999974970236312)
+ assert(rwfo[1].value == 1.184681251089919)
+ repname = list(rwfo[0].idl.keys())[0]
+ assert(rwfo[0].idl[repname] == range(1, 10))
+ rwfo = pe.input.openQCD.read_rwms(path, prefix, version='2.0', files=files, names=names, r_start=[1], r_stop=[8], print_err=True)
+ assert(rwfo[0].idl[repname] == range(1, 9))
+
+ # t0
+ prefix = 'openqcd'
+
+ t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4)
+ files = ['openqcd2r1.ms.dat']
+ names = ['openqcd2|r1']
+ t0 = pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2)
+ t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, r_start=[1])
+ repname = list(rwfo[0].idl.keys())[0]
+ assert(t0.idl[repname] == range(1, 10))
+ t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, r_start=[2], r_stop=[8])
+ repname = list(rwfo[0].idl.keys())[0]
+ assert(t0.idl[repname] == range(2, 9))
+ t0 = pe.input.openQCD.extract_t0(path, prefix, dtr_read=3, xmin=0, spatial_extent=4, fit_range=2, plaquette=True, assume_thermalization=True)
+
+ pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2, plot_fit=True)
+
+def test_Qtop():
+ path = './tests//data/openqcd_test/'
+ prefix = 'sfqcd'
+
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.3, version='sfqcd')
+ repname = list(qtop.idl.keys())[0]
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.3, version='sfqcd', Zeuthen_flow=True, L=4)
+ qi = pe.input.openQCD.read_qtop(path, prefix, c=0.3, version='sfqcd', integer_charge=True)
+ for conf in range(len(qi.idl[repname])):
+ assert(0 == qi.r_values[repname] + qi.deltas[repname][conf])
+
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.0, version='sfqcd')
+ assert (np.isclose(-4.572999e-02, qtop.r_values[repname] + qtop.deltas[repname][0]))
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.28, version='sfqcd')
+ assert (np.isclose(3.786893e-02, qtop.r_values[repname] + qtop.deltas[repname][0]))
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.08, version='sfqcd', Zeuthen_flow=True)
+ assert (np.isclose(3.653140e-02, qtop.r_values[repname] + qtop.deltas[repname][1]))
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.40, version='sfqcd', Zeuthen_flow=True)
+ assert (np.isclose(2.745865e-01, qtop.r_values[repname] + qtop.deltas[repname][1]))
+
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.40, version='sfqcd', Zeuthen_flow=True, r_start=[2])
+ assert(qtop.idl[repname] == range(2, 7))
+ assert (np.isclose(2.745865e-01, qtop.r_values[repname] + qtop.deltas[repname][0]))
+
+ qtop = pe.input.openQCD.read_qtop(path, prefix, c=0.40, version='sfqcd', Zeuthen_flow=True, r_stop=[5])
+ assert(qtop.idl[repname] == range(1, 6))
+
+ names = ['sfqcd|r1']
+ files = ['sfqcdr1.gfms.dat']
+ qs = pe.input.openQCD.read_qtop_sector(path, '', 0.3, target=0, Zeuthen_flow=True, version='sfqcd')
+
+ assert((pe.input.openQCD.qtop_projection(qi, target=0) - qs).is_zero())
diff --git a/tests/roots_test.py b/tests/roots_test.py
index dbb27bbe..b6e9bdb0 100644
--- a/tests/roots_test.py
+++ b/tests/roots_test.py
@@ -30,3 +30,15 @@ def test_root_linear_idl():
difference = my_obs - my_root
assert difference.is_zero()
+
+
+def test_root_no_autograd():
+
+ def root_function(x, d):
+ return x - np.log(np.exp(d))
+
+ value = np.random.normal(0, 100)
+ my_obs = pe.pseudo_Obs(value, 0.1, 't')
+
+ with pytest.raises(Exception):
+ my_root = pe.roots.find_root(my_obs, root_function)
diff --git a/tests/sfcf_in_test.py b/tests/sfcf_in_test.py
new file mode 100644
index 00000000..86ff6cd6
--- /dev/null
+++ b/tests/sfcf_in_test.py
@@ -0,0 +1,124 @@
+import os
+import sys
+import inspect
+import pyerrors as pe
+import pyerrors.input.sfcf as sfin
+import shutil
+
+current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+parent_dir = os.path.dirname(current_dir)
+sys.path.insert(0, parent_dir)
+
+
+def build_test_environment(env_type, cfgs, reps):
+ if env_type == "o":
+ for i in range(2,cfgs+1):
+ shutil.copytree("tests/data/sfcf_test/data_o/test_r0/cfg1","tests/data/sfcf_test/data_o/test_r0/cfg"+str(i))
+ for i in range(1,reps):
+ shutil.copytree("tests/data/sfcf_test/data_o/test_r0", "tests/data/sfcf_test/data_o/test_r"+str(i))
+ elif env_type == "c":
+ for i in range(2,cfgs+1):
+ shutil.copy("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i))
+ for i in range(1,reps):
+ os.mkdir("tests/data/sfcf_test/data_c/data_c_r"+str(i))
+ for j in range(1,cfgs+1):
+ shutil.copy("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n1","tests/data/sfcf_test/data_c/data_c_r"+str(i)+"/data_c_r"+str(i)+"_n"+str(j))
+
+
+
+def clean_test_environment(env_type, cfgs, reps):
+ if env_type == "o":
+ for i in range(1,reps):
+ shutil.rmtree("tests/data/sfcf_test/data_o/test_r"+str(i))
+ for i in range(2,cfgs+1):
+ shutil.rmtree("tests/data/sfcf_test/data_o/test_r0/cfg"+str(i))
+ elif env_type == "c":
+ for i in range(1,reps):
+ shutil.rmtree("tests/data/sfcf_test/data_c/data_c_r"+str(i))
+ for i in range(2,cfgs+1):
+ os.remove("tests/data/sfcf_test/data_c/data_c_r0/data_c_r0_n"+str(i))
+
+
+def test_o_bb():
+ build_test_environment("o",5,3)
+ f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_1",quarks="lquark lquark", wf = 0, wf2=0, version = "2.0", corr_type="bb")
+ print(f_1)
+ clean_test_environment("o",5,3)
+ assert len(f_1) == 1
+ assert f_1[0].value == 351.1941525454502
+
+def test_o_bi():
+ build_test_environment("o",5,3)
+ f_A = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "f_A",quarks="lquark lquark", wf = 0, version = "2.0")
+ print(f_A)
+ clean_test_environment("o",5,3)
+ assert len(f_A) == 3
+ assert f_A[0].value == 65.4711887279723
+ assert f_A[1].value == 1.0447210336915187
+ assert f_A[2].value == -41.025094911185185
+
+def test_o_bib():
+ build_test_environment("o",5,3)
+ f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_o", "test", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0", corr_type="bib")
+ print(f_V0)
+ clean_test_environment("o",5,3)
+ assert len(f_V0) == 3
+ assert f_V0[0] == 683.6776090085115
+ assert f_V0[1] == 661.3188585582334
+ assert f_V0[2] == 683.6776090081005
+
+def test_c_bb():
+ build_test_environment("c",5,3)
+ f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0c", corr_type="bb")
+ print(f_1)
+ clean_test_environment("c",5,3)
+ assert len(f_1) == 1
+ assert f_1[0].value == 351.1941525454502
+
+def test_c_bi():
+ build_test_environment("c",5,3)
+ f_A = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "f_A", quarks="lquark lquark", wf = 0, version = "2.0c")
+ print(f_A)
+ clean_test_environment("c",5,3)
+ assert len(f_A) == 3
+ assert f_A[0].value == 65.4711887279723
+ assert f_A[1].value == 1.0447210336915187
+ assert f_A[2].value == -41.025094911185185
+
+def test_c_bib():
+ build_test_environment("c",5,3)
+ f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_c", "data_c", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0c", corr_type="bib")
+ print(f_V0)
+ clean_test_environment("c",5,3)
+ assert len(f_V0) == 3
+ assert f_V0[0] == 683.6776090085115
+ assert f_V0[1] == 661.3188585582334
+ assert f_V0[2] == 683.6776090081005
+
+def test_a_bb():
+ build_test_environment("a",5,3)
+ f_1 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "f_1", quarks="lquark lquark", wf = 0, wf2=0, version = "2.0a", corr_type="bb")
+ print(f_1)
+ clean_test_environment("a",5,3)
+ assert len(f_1) == 1
+ assert f_1[0].value == 351.1941525454502
+
+def test_a_bi():
+ build_test_environment("a",5,3)
+ f_A = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "f_A", quarks="lquark lquark", wf = 0, version = "2.0a")
+ print(f_A)
+ clean_test_environment("a",5,3)
+ assert len(f_A) == 3
+ assert f_A[0].value == 65.4711887279723
+ assert f_A[1].value == 1.0447210336915187
+ assert f_A[2].value == -41.02509491118518
+
+def test_a_bib():
+ build_test_environment("a",5,3)
+ f_V0 = sfin.read_sfcf("tests/data/sfcf_test/data_a", "data_a", "F_V0",quarks="lquark lquark", wf = 0, wf2 = 0, version = "2.0a", corr_type="bib")
+ print(f_V0)
+ clean_test_environment("a",5,3)
+ assert len(f_V0) == 3
+ assert f_V0[0] == 683.6776090085115
+ assert f_V0[1] == 661.3188585582334
+ assert f_V0[2] == 683.6776090081005