diff --git a/benchmarks/.gitignore b/benchmarks/.gitignore
index b34cba189..ff7d75b05 100644
--- a/benchmarks/.gitignore
+++ b/benchmarks/.gitignore
@@ -1,3 +1,7 @@
+# ignore airspeed velocity output
+html/
+results/
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
diff --git a/benchmarks/asv.conf.json b/benchmarks/asv.conf.json
new file mode 100644
index 000000000..628c6b460
--- /dev/null
+++ b/benchmarks/asv.conf.json
@@ -0,0 +1,91 @@
+{
+ // The version of the config file format. Do not change, unless
+ // you know what you are doing.
+ "version": 1,
+
+ // The name of the project being benchmarked
+ "project": "eko",
+
+ // The project's homepage
+ "project_url": "https://n3pdf.github.io/eko/",
+
+ // The URL or local path of the source code repository for the
+ // project being benchmarked
+ "repo": "..",
+
+ // List of branches to benchmark. If not provided, defaults to "master"
+ // (for git) or "tip" (for mercurial).
+ "branches": ["HEAD"],
+
+ // The DVCS being used. If not set, it will be automatically
+ // determined from "repo" by looking at the protocol in the URL
+ // (if remote), or by looking for special directories, such as
+ // ".git" (if local).
+ "dvcs": "git",
+
+ // The tool to use to create environments. May be "conda",
+ // "virtualenv" or other value depending on the plugins in use.
+ // If missing or the empty string, the tool will be automatically
+ // determined by looking for tools on the PATH environment
+ // variable.
+ "environment_type": "virtualenv",
+
+ // the base URL to show a commit for the project.
+ "show_commit_url": "https://github.com/N3PDF/eko/commit/",
+
+ // The Pythons you'd like to test against. If not provided, defaults
+ // to the current version of Python used to run `asv`.
+ "pythons": ["3.8", "3.9", "3.10"],
+
+ // The matrix of dependencies to test. Each key is the name of a
+ // package (in PyPI) and the values are version numbers. An empty
+ // list indicates to just test against the default (latest)
+ //version.
+ "matrix": {
+ "poetry": []
+ },
+
+ // The directory (relative to the current directory) that benchmarks are
+ // stored in. If not provided, defaults to "benchmarks"
+ "benchmark_dir": "performance",
+
+ // The directory (relative to the current directory) to cache the Python
+ // environments in. If not provided, defaults to "env"
+ // "env_dir": "env",
+
+ // The directory (relative to the current directory) that raw benchmark
+ // results are stored in. If not provided, defaults to "results".
+ "results_dir": "results",
+
+ // The directory (relative to the current directory) that the html tree
+ // should be written to. If not provided, defaults to "html".
+ "html_dir": "html",
+
+ // The number of characters to retain in the commit hashes.
+ // "hash_length": 8,
+
+ // `asv` will cache wheels of the recent builds in each
+ // environment, making them faster to install next time. This is
+ // number of builds to keep, per environment.
+ "build_cache_size": 8,
+
+ // The commits after which the regression search in `asv publish`
+ // should start looking for regressions. Dictionary whose keys are
+ // regexps matching to benchmark names, and values corresponding to
+ // the commit (exclusive) after which to start looking for
+ // regressions. The default is to start from the first commit
+ // with results. If the commit is `null`, regression detection is
+ // skipped for the matching benchmark.
+ //
+ // "regressions_first_commits": {
+ // "some_benchmark": "352cdf", // Consider regressions only after this commit
+ // "another_benchmark": null, // Skip regression detection altogether
+ // }
+
+
+ "install_command": ["in-dir={env_dir} python -mpip install {wheel_file}[mark]"],
+
+ "build_command": [
+ "PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps -w {build_cache_dir} {build_dir}"
+ ]
+}
diff --git a/benchmarks/eko/benchmark_ad.py b/benchmarks/eko/benchmark_ad.py
index 1087db0e0..6ccd12547 100644
--- a/benchmarks/eko/benchmark_ad.py
+++ b/benchmarks/eko/benchmark_ad.py
@@ -4,7 +4,7 @@
import pytest
import eko.anomalous_dimensions.as2 as ad_as2
-import eko.anomalous_dimensions.harmonics as h
+import eko.harmonics as h
from eko.constants import CA, CF, TR
@@ -15,7 +15,7 @@ def benchmark_melling_g3_pegasus():
def check_melling_g3_pegasus(N):
- S1 = h.harmonic_S1(N)
+ S1 = h.S1(N)
N1 = N + 1.0
N2 = N + 2.0
N3 = N + 3.0
@@ -28,7 +28,7 @@ def check_melling_g3_pegasus(N):
S14 = S13 + 1.0 / N4
S15 = S14 + 1.0 / N5
S16 = S15 + 1.0 / N6
- zeta2 = h.zeta2
+ zeta2 = h.constants.zeta2
SPMOM = (
1.0000 * (zeta2 - S1 / N) / N
@@ -39,7 +39,7 @@ def check_melling_g3_pegasus(N):
- 0.3174 * (zeta2 - S15 / N5) / N5
+ 0.0699 * (zeta2 - S16 / N6) / N6
)
- np.testing.assert_allclose(h.mellin_g3(N), SPMOM)
+ np.testing.assert_allclose(h.g_functions.mellin_g3(N, S1), SPMOM)
@pytest.mark.isolated
@@ -52,12 +52,12 @@ def benchmark_gamma_ns_1_pegasus():
def check_gamma_1_pegasus(N, NF):
# Test against pegasus implementation
- ZETA2 = h.zeta2
- ZETA3 = h.zeta3
+ ZETA2 = h.constants.zeta2
+ ZETA3 = h.constants.zeta3
# N = np.random.rand(1) + np.random.rand(1) * 1j
- S1 = h.harmonic_S1(N)
- S2 = h.harmonic_S2(N)
+ S1 = h.S1(N)
+ S2 = h.S2(N)
N1 = N + 1.0
N2 = N + 2.0
@@ -87,16 +87,18 @@ def check_gamma_1_pegasus(N, NF):
)
SLC = -5.0 / 8.0 * ZETA3
SLV = (
- -ZETA2 / 2.0 * (h.cern_polygamma(N1 / 2, 0) - h.cern_polygamma(N / 2, 0))
+ -ZETA2
+ / 2.0
+ * (h.polygamma.cern_polygamma(N1 / 2, 0) - h.polygamma.cern_polygamma(N / 2, 0))
+ S1 / NS
+ SPMOM
)
SSCHLM = SLC - SLV
- SSTR2M = ZETA2 - h.cern_polygamma(N1 / 2, 1)
- SSTR3M = 0.5 * h.cern_polygamma(N1 / 2, 2) + ZETA3
+ SSTR2M = ZETA2 - h.polygamma.cern_polygamma(N1 / 2, 1)
+ SSTR3M = 0.5 * h.polygamma.cern_polygamma(N1 / 2, 2) + ZETA3
SSCHLP = SLC + SLV
- SSTR2P = ZETA2 - h.cern_polygamma(N2 / 2, 1)
- SSTR3P = 0.5 * h.cern_polygamma(N2 / 2, 2) + ZETA3
+ SSTR2P = ZETA2 - h.polygamma.cern_polygamma(N2 / 2, 1)
+ SSTR3P = 0.5 * h.polygamma.cern_polygamma(N2 / 2, 2) + ZETA3
PNMA = (
16.0 * S1 * (2.0 * N + 1.0) / (NS * N1S)
@@ -136,8 +138,9 @@ def check_gamma_1_pegasus(N, NF):
P1NSP = CF * ((CF - CA / 2.0) * PNPA + CA * PNSB + TR * NF * PNSC)
P1NSM = CF * ((CF - CA / 2.0) * PNMA + CA * PNSB + TR * NF * PNSC)
- np.testing.assert_allclose(ad_as2.gamma_nsp(N, NF), -P1NSP)
- np.testing.assert_allclose(ad_as2.gamma_nsm(N, NF), -P1NSM)
+ sx = h.sx(N, 2)
+ np.testing.assert_allclose(ad_as2.gamma_nsp(N, NF, sx), -P1NSP)
+ np.testing.assert_allclose(ad_as2.gamma_nsm(N, NF, sx), -P1NSM)
NS = N * N
NT = NS * N
@@ -254,7 +257,7 @@ def check_gamma_1_pegasus(N, NF):
P1Sgq = (CF * CF * PGQA + CF * CA * PGQB + TR * NF * CF * PGQC) * 4.0
P1Sgg = (CA * CA * PGGA + TR * NF * (CA * PGGB + CF * PGGC)) * 4.0
- gS1 = ad_as2.gamma_singlet(N, NF)
+ gS1 = ad_as2.gamma_singlet(N, NF, sx)
np.testing.assert_allclose(gS1[0, 0], -P1Sqq)
np.testing.assert_allclose(gS1[0, 1], -P1Sqg)
np.testing.assert_allclose(gS1[1, 0], -P1Sgq)
diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py
index b43ec8b2d..27573b721 100644
--- a/benchmarks/lha_paper_bench.py
+++ b/benchmarks/lha_paper_bench.py
@@ -224,12 +224,12 @@ def benchmark_sv(self, pto):
# obj = BenchmarkVFNS()
obj = BenchmarkFFNS()
- obj.benchmark_plain(0)
+ # obj.benchmark_plain(0)
# obj.benchmark_sv(2)
# # VFNS benchmarks with LHA settings
- # programs = ["LHA", "pegasus", "apfel"]
- # for p in programs:
- # obj = BenchmarkRunner(p)
- # # obj.benchmark_plain(2)
- # obj.benchmark_sv(2)
+ programs = ["LHA", "pegasus", "apfel"]
+ for p in programs:
+ obj = BenchmarkRunner(p)
+ # obj.benchmark_plain(2)
+ obj.benchmark_sv(2)
diff --git a/benchmarks/performance/__init__.py b/benchmarks/performance/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/benchmarks/performance/harmonics.py b/benchmarks/performance/harmonics.py
new file mode 100644
index 000000000..1d173ba15
--- /dev/null
+++ b/benchmarks/performance/harmonics.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+import numpy as np
+
+from eko import anomalous_dimensions as ad
+from eko.mellin import Path
+
+NF = 5
+
+
+class TimeSuite:
+ def setup(self):
+ ts = np.linspace(0.5, 1.0 - 1e-5, 100)
+ logx = 0.8
+ axis_offset = True
+ self.ns = []
+ for t in ts:
+ self.ns.append(Path(t, logx, axis_offset).n)
+
+ def time_as1_sing(self):
+ for n in self.ns:
+ ad.gamma_singlet(0, n, NF)
+
+ def time_as2_sing(self):
+ for n in self.ns:
+ ad.gamma_singlet(1, n, NF)
+
+ def time_as3_sing(self):
+ for n in self.ns:
+ ad.gamma_singlet(2, n, NF)
diff --git a/doc/source/theory/DGLAP.rst b/doc/source/theory/DGLAP.rst
index f7441977c..79d182686 100644
--- a/doc/source/theory/DGLAP.rst
+++ b/doc/source/theory/DGLAP.rst
@@ -284,7 +284,7 @@ And thus the |NLO| solution:
.. math::
\ln \tilde E^{(2)}_{ns}(a_s \leftarrow a_s^0) &= \ln \tilde E^{(1)}_{ns}(a_s \leftarrow a_s^0) + j^{(1,2)'}(a_s,a_s^0)(\gamma^{(1)} - b_1 \gamma^{(0)}) + j^{(2,2)}(a_s,a_s^0)(\gamma^{(2)} - b_2 \gamma^{(0)}) \\
- j^{(1,2)'}(a_s,a_s^0) &= \int\limits_{a_s^0}^{a_s}\!da_s'\,\frac{ \beta_2 a_s'^2}{\beta_0 + \beta_1 a_s' + \beta_2 a_s'^2 ) (\beta_0 + \beta_1 a_s')}
+ j^{(1,2)'}(a_s,a_s^0) &= \int\limits_{a_s^0}^{a_s}\!da_s'\,\frac{ \beta_2 a_s'^2}{( \beta_0 + \beta_1 a_s' + \beta_2 a_s'^2 ) (\beta_0 + \beta_1 a_s')}
In |NNLO| we provide different strategies to define the |EKO|:
diff --git a/doc/source/theory/Mellin.rst b/doc/source/theory/Mellin.rst
index 2c69e477a..083f3e9a9 100644
--- a/doc/source/theory/Mellin.rst
+++ b/doc/source/theory/Mellin.rst
@@ -107,38 +107,79 @@ are doing, are proportional to
Harmonic Sums
-------------
-In the computations of the anomalous dimensions (generalized) harmonic sums
+In the computations of the anomalous dimensions and matching conditions, (generalized) harmonic sums
:cite:`Ablinger:2013hcp` appear naturally:
.. math ::
S_{m}(N) &= \sum\limits_{j=1}^N \frac{(\text{sign}(m))^j}{j^{|m|}} \\
S_{m_0,m_1\ldots}(N) &= \sum\limits_{j=1}^N \frac{(\text{sign}(m_0))^j}{j^{|m_0|}} S_{m_1\ldots}(j)
+At |N3LO| the anomalous dimensions contains at maximum weight 7 harmonic sums.
We then need to find an analytical continuation of these sums into the complex plain to perform
the Mellin inverse.
- the sums :math:`S_{m}(N)` for :math:`m > 0` do have a straight continuation:
-.. math ::
+ .. math ::
S_m(N) = \sum\limits_{j=1}^N \frac 1 {j^m} = \frac{(-1)^{m-1}}{(m-1)!} \psi_{m-1}(N+1)+c_m \quad
- \text{with}\, c_m = \left\{\begin{array}{ll} \gamma_E, & m=1\\ \zeta(m), & m>1\end{array} \right.
+ \text{with},\quad c_m = \left\{\begin{array}{ll} \gamma_E, & m=1\\ \zeta(m), & m>1\end{array} \right.
-and where :math:`\psi_k(N)` is the :math:`k`-th polygamma function (implemented as :meth:`~eko.anomalous_dimensions.harmonics.cern_polygamma`)
-and :math:`\zeta` the Riemann zeta function (using :func:`scipy.special.zeta`).
+ where :math:`\psi_k(N)` is the :math:`k`-th polygamma function (implemented as :meth:`~eko.harmonics.polygamma.cern_polygamma`)
+ and :math:`\zeta` the Riemann zeta function (using :func:`scipy.special.zeta`).
-- for the sums :math:`S_{-m}(N)` and :math:`m > 0` we use :cite:`Gluck:1989ze`
+- for the sums :math:`S_{-m}(N)` and m > 0 we use :cite:`Gluck:1989ze`:
-.. math ::
- S_m'(N) = 2^{m-1}(S_m(N) + S_{-m}(N)) = \frac{1+\eta}{2} S_m(N/2) + \frac{1-\eta}{2}S_m((N-1)/2)
+ .. math ::
+ S_m'(N) = 2^{m-1}(S_m(N) + S_{-m}(N)) = \frac{1+\eta}{2} S_m\left(\frac{N}{2}\right) + \frac{1-\eta}{2} S_m\left(\frac{N-1}{2}\right)
-where formally :math:`\eta = (-1)^N` but in all singlet-like quantities it has to be analytically continued with 1
-and with -1 elsewise.
+ .. math ::
+ S_{-m}(N) = \frac{1}{2^{m-1}} \left [ \frac{1+\eta}{2} S_m\left(\frac{N}{2}\right) + \frac{1-\eta}{2}S_m\left(\frac{N-1}{2}\right)\right ] - S_m(N)
-- for the sums with greater depth we use the lists provided in :cite:`Gluck:1989ze,MuselliPhD,Blumlein:1998if`.
-- For :math:`S_{-2,1}(N)` we use the implementation of :cite:`Gluck:1989ze` (where it is called :math:`\tilde S`):
+ where formally :math:`\eta = (-1)^N` but in all singlet-like quantities it has to be analytically continued with 1
+ and with -1 elsewise. In case the symmetry condition is not given the formal definition of :math:`\eta` is used.
+ This relation is equivalent to the standard analytical continuation :cite:`Blumlein:2009ta,MuselliPhD`:
-.. math ::
- S_{-2,1}(N) &= - \frac 5 8 \zeta(3) + \zeta(2)\left(S_{-1}(N) - \frac{\eta}{N} + \log(2)\right) + \eta\left(\frac{S_{1}(N)}{N^2} + g_3(N)\right)\\
- g_3(N) &= \mathcal M \left[\frac{\text{Li}_2(x)}{1+x}\right](N)
+ .. math ::
+ S_{-m}(N) &= \frac{\eta}{2^m} \left[ S_m\left(\frac{N}{2}\right) - S_m\left(\frac{N-1}{2}\right) \right] - d_{m} \quad
+ \text{with},\quad d_m = \left\{\begin{array}{ll} \log(2), & m=1\\ \frac{2^{m-1}-1}{2^{m-1}}\zeta(m), & m>1\end{array} \right.\\
+
+ but it's faster for :math:`\eta = \pm 1`.
+
+- for the sums with greater depth we use the definitions provided in :cite:`Gluck:1989ze,MuselliPhD,Blumlein:1998if,Blumlein:2009ta`,
+ which express higher weight sums in terms of simple one :math:`S_{m}, S_{-m}` and some irreducible integrals.
+ The above prescription on the analytical continuation of :math:`\eta` is applied.
+
+The complete list of harmonics sums available in :mod:`eko.harmonics` is:
+
+ - weight 1:
+
+ .. math::
+ S_{1}, S_{-1}
+
+ - weight 2:
+
+ .. math::
+ S_{2}, S_{-2}
+
+ - weight 3:
+
+ .. math::
+ S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}
+
+ these sums relies on the integrals :mod:`eko.harmonics.g_functions` :cite:`MuselliPhD,Blumlein:1998if`
+
+ - weight 4:
+
+ .. math ::
+ S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}
+
+ these sums relies on the integrals :mod:`eko.harmonics.g_functions` :cite:`MuselliPhD,Blumlein:1998if`
+
+ - weight 5:
+
+ .. math ::
+ S_{5}, S_{4,1}, S_{3,1,1}, S_{2,3}, S_{2,2,1}, S_{2,1,1,1}, S_{2,1,-2}, S_{2,-3}, S_{-2,3}, S_{-2,2,1}, S_{-2,1,1,1}, S_{-5}
+
+ these sums relies on the integrals :mod:`eko.harmonics.f_functions` :cite:`Blumlein:2009ta`
-where for :math:`g_3(N)` we use the parametrization of :cite:`Vogt:2004ns` (implemented as :meth:`~eko.anomalous_dimensions.harmonics.mellin_g3`).
+We have also implemented a recursive computation of simple harmonics (single index), see :func:`eko.harmonics.polygamma.recursive_harmonic_sum`
diff --git a/poetry.lock b/poetry.lock
index fc0504481..adb51b5cd 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -24,7 +24,7 @@ python-versions = "*"
[[package]]
name = "appnope"
-version = "0.1.2"
+version = "0.1.3"
description = "Disable App Nap on macOS >= 10.9"
category = "main"
optional = true
@@ -32,7 +32,7 @@ python-versions = "*"
[[package]]
name = "astroid"
-version = "2.9.3"
+version = "2.11.2"
description = "An abstract syntax tree for Python with inference support."
category = "dev"
optional = false
@@ -41,7 +41,7 @@ python-versions = ">=3.6.2"
[package.dependencies]
lazy-object-proxy = ">=1.4.0"
typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""}
-wrapt = ">=1.11,<1.14"
+wrapt = ">=1.11,<2"
[[package]]
name = "asttokens"
@@ -57,6 +57,20 @@ six = "*"
[package.extras]
test = ["astroid", "pytest"]
+[[package]]
+name = "asv"
+version = "0.4.2"
+description = "Airspeed Velocity: A simple Python history benchmarking tool"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+six = ">=1.4"
+
+[package.extras]
+hg = ["python-hglib (>=1.5)"]
+
[[package]]
name = "atomicwrites"
version = "1.4.0"
@@ -100,7 +114,7 @@ python-versions = "*"
[[package]]
name = "banana-hep"
-version = "0.6.4"
+version = "0.6.5"
description = "Benchmark QCD physics"
category = "main"
optional = true
@@ -150,11 +164,11 @@ unicode_backport = ["unicodedata2"]
[[package]]
name = "click"
-version = "8.0.4"
+version = "8.1.2"
description = "Composable command line interface toolkit"
category = "main"
optional = true
-python-versions = ">=3.6"
+python-versions = ">=3.7"
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
@@ -208,6 +222,17 @@ category = "main"
optional = true
python-versions = ">=3.5"
+[[package]]
+name = "dill"
+version = "0.3.4"
+description = "serialize all of python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*"
+
+[package.extras]
+graph = ["objgraph (>=1.7.2)"]
+
[[package]]
name = "distlib"
version = "0.3.4"
@@ -258,7 +283,7 @@ testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-co
[[package]]
name = "fonttools"
-version = "4.29.1"
+version = "4.31.2"
description = "Tools to manipulate font files"
category = "main"
optional = true
@@ -290,7 +315,7 @@ docs = ["sphinx"]
[[package]]
name = "identify"
-version = "2.4.11"
+version = "2.4.12"
description = "File identification library for Python"
category = "dev"
optional = false
@@ -317,7 +342,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "importlib-metadata"
-version = "4.11.2"
+version = "4.11.3"
description = "Read metadata from Python packages"
category = "main"
optional = false
@@ -341,7 +366,7 @@ python-versions = "*"
[[package]]
name = "ipython"
-version = "8.1.1"
+version = "8.2.0"
description = "IPython: Productive Interactive Computing"
category = "main"
optional = true
@@ -362,7 +387,7 @@ stack-data = "*"
traitlets = ">=5"
[package.extras]
-all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "pytest", "testpath", "trio", "pytest-asyncio"]
+all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "trio"]
black = ["black"]
doc = ["Sphinx (>=1.3)"]
kernel = ["ipykernel"]
@@ -371,8 +396,8 @@ nbformat = ["nbformat"]
notebook = ["ipywidgets", "notebook"]
parallel = ["ipyparallel"]
qtconsole = ["qtconsole"]
-test = ["pytest", "pytest-asyncio", "testpath"]
-test_extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "pytest", "testpath", "trio"]
+test = ["pytest (<7.1)", "pytest-asyncio", "testpath"]
+test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"]
[[package]]
name = "isort"
@@ -405,11 +430,11 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"]
[[package]]
name = "jinja2"
-version = "3.0.3"
+version = "3.1.1"
description = "A very fast and expressive template engine."
category = "main"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
[package.dependencies]
MarkupSafe = ">=2.0"
@@ -419,7 +444,7 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "kiwisolver"
-version = "1.3.2"
+version = "1.4.2"
description = "A fast implementation of the Cassowary constraint solver"
category = "main"
optional = true
@@ -467,7 +492,7 @@ tests = ["pytest (!=3.3.0)", "psutil", "pytest-cov"]
[[package]]
name = "markupsafe"
-version = "2.1.0"
+version = "2.1.1"
description = "Safely add untrusted strings to HTML/XML markup."
category = "main"
optional = false
@@ -505,11 +530,11 @@ traitlets = "*"
[[package]]
name = "mccabe"
-version = "0.6.1"
+version = "0.7.0"
description = "McCabe checker, plugin for flake8"
category = "dev"
optional = false
-python-versions = "*"
+python-versions = ">=3.6"
[[package]]
name = "nodeenv"
@@ -552,7 +577,7 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
[[package]]
name = "pandas"
-version = "1.4.1"
+version = "1.4.2"
description = "Powerful data structures for data analysis, time series, and statistics"
category = "main"
optional = true
@@ -633,12 +658,16 @@ python-versions = "*"
[[package]]
name = "pillow"
-version = "9.0.1"
+version = "9.1.0"
description = "Python Imaging Library (Fork)"
category = "main"
optional = true
python-versions = ">=3.7"
+[package.extras]
+docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"]
+tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
+
[[package]]
name = "platformdirs"
version = "2.5.1"
@@ -665,11 +694,11 @@ testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "pre-commit"
-version = "2.17.0"
+version = "2.18.1"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
category = "dev"
optional = false
-python-versions = ">=3.6.1"
+python-versions = ">=3.7"
[package.dependencies]
cfgv = ">=2.0.0"
@@ -681,7 +710,7 @@ virtualenv = ">=20.0.8"
[[package]]
name = "prompt-toolkit"
-version = "3.0.28"
+version = "3.0.29"
description = "Library for building powerful interactive command lines in Python"
category = "main"
optional = true
@@ -755,21 +784,25 @@ python-versions = ">=3.5"
[[package]]
name = "pylint"
-version = "2.12.2"
+version = "2.13.4"
description = "python code static checker"
category = "dev"
optional = false
python-versions = ">=3.6.2"
[package.dependencies]
-astroid = ">=2.9.0,<2.10"
+astroid = ">=2.11.2,<=2.12.0-dev0"
colorama = {version = "*", markers = "sys_platform == \"win32\""}
+dill = ">=0.2"
isort = ">=4.2.5,<6"
-mccabe = ">=0.6,<0.7"
+mccabe = ">=0.6,<0.8"
platformdirs = ">=2.2.0"
-toml = ">=0.9.2"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
+[package.extras]
+testutil = ["gitpython (>3)"]
+
[[package]]
name = "pyparsing"
version = "3.0.7"
@@ -857,7 +890,7 @@ six = ">=1.5"
[[package]]
name = "pytz"
-version = "2021.3"
+version = "2022.1"
description = "World timezone definitions, modern and historical"
category = "main"
optional = false
@@ -958,7 +991,7 @@ python-versions = "*"
[[package]]
name = "sphinx"
-version = "4.4.0"
+version = "4.5.0"
description = "Python documentation generator"
category = "main"
optional = false
@@ -1090,7 +1123,7 @@ test = ["pytest"]
[[package]]
name = "sqlalchemy"
-version = "1.4.32"
+version = "1.4.34"
description = "Database Abstraction Library"
category = "main"
optional = true
@@ -1103,7 +1136,7 @@ greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platfo
aiomysql = ["greenlet (!=0.4.17)", "aiomysql"]
aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"]
asyncio = ["greenlet (!=0.4.17)"]
-asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3)"]
+asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"]
mariadb_connector = ["mariadb (>=1.0.1)"]
mssql = ["pyodbc"]
mssql_pymssql = ["pymssql"]
@@ -1173,20 +1206,20 @@ python-versions = ">=3.6"
[[package]]
name = "urllib3"
-version = "1.26.8"
+version = "1.26.9"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
[package.extras]
-brotli = ["brotlipy (>=0.6.0)"]
+brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "virtualenv"
-version = "20.13.3"
+version = "20.14.0"
description = "Virtual Python Environment builder"
category = "dev"
optional = false
@@ -1220,7 +1253,7 @@ python-versions = "*"
[[package]]
name = "wrapt"
-version = "1.13.3"
+version = "1.14.0"
description = "Module for decorators, wrappers and monkey patching."
category = "dev"
optional = false
@@ -1228,15 +1261,15 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
[[package]]
name = "zipp"
-version = "3.7.0"
+version = "3.8.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
category = "main"
optional = false
python-versions = ">=3.7"
[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
[extras]
box = ["banana-hep", "sqlalchemy", "pandas", "matplotlib"]
@@ -1246,7 +1279,7 @@ mark = ["banana-hep", "sqlalchemy", "pandas", "matplotlib"]
[metadata]
lock-version = "1.1"
python-versions = "^3.8,<3.11"
-content-hash = "59deb666ca547633026cedb1a6ef346c95da7e29168c026881b42da5cb0ea983"
+content-hash = "0e56ea9ff0b071e60f311f1997d5103f4c5537a020ae6b61f86feabca8a7f5e2"
[metadata.files]
a3b2bbc3ced97675ac3a71df45f55ba = [
@@ -1267,17 +1300,20 @@ appdirs = [
{file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
]
appnope = [
- {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
- {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
+ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"},
+ {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"},
]
astroid = [
- {file = "astroid-2.9.3-py3-none-any.whl", hash = "sha256:506daabe5edffb7e696ad82483ad0228245a9742ed7d2d8c9cdb31537decf9f6"},
- {file = "astroid-2.9.3.tar.gz", hash = "sha256:1efdf4e867d4d8ba4a9f6cf9ce07cd182c4c41de77f23814feb27ca93ca9d877"},
+ {file = "astroid-2.11.2-py3-none-any.whl", hash = "sha256:cc8cc0d2d916c42d0a7c476c57550a4557a083081976bf42a73414322a6411d9"},
+ {file = "astroid-2.11.2.tar.gz", hash = "sha256:8d0a30fe6481ce919f56690076eafbb2fb649142a89dc874f1ec0e7a011492d0"},
]
asttokens = [
{file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"},
{file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"},
]
+asv = [
+ {file = "asv-0.4.2.tar.gz", hash = "sha256:9134f56b7a2f465420f17b5bb0dee16047a70f01029c996b7ab3f197de2d0779"},
+]
atomicwrites = [
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
@@ -1295,8 +1331,8 @@ backcall = [
{file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
]
banana-hep = [
- {file = "banana-hep-0.6.4.tar.gz", hash = "sha256:e642946fad9545e1aec0a8108b0d31deb01b8f0d50411951f323123c4da75c2e"},
- {file = "banana_hep-0.6.4-py3-none-any.whl", hash = "sha256:9e02874b135e900244fe8c007d192844cccb1191eb07ed949c9e229524365b07"},
+ {file = "banana-hep-0.6.5.tar.gz", hash = "sha256:748923aae41d5be0e117516698e523935d5f68146b53a8565372c7489137b0f1"},
+ {file = "banana_hep-0.6.5-py3-none-any.whl", hash = "sha256:6a8da394b0492cdd11f454a73c81727aff1bc96b206f1ca109cecdd087b980cd"},
]
certifi = [
{file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
@@ -1311,8 +1347,8 @@ charset-normalizer = [
{file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"},
]
click = [
- {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"},
- {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"},
+ {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"},
+ {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"},
]
colorama = [
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
@@ -1373,6 +1409,10 @@ decorator = [
{file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
{file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
]
+dill = [
+ {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"},
+ {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"},
+]
distlib = [
{file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"},
{file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"},
@@ -1394,8 +1434,8 @@ filelock = [
{file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"},
]
fonttools = [
- {file = "fonttools-4.29.1-py3-none-any.whl", hash = "sha256:1933415e0fbdf068815cb1baaa1f159e17830215f7e8624e5731122761627557"},
- {file = "fonttools-4.29.1.zip", hash = "sha256:2b18a172120e32128a80efee04cff487d5d140fe7d817deb648b2eee023a40e4"},
+ {file = "fonttools-4.31.2-py3-none-any.whl", hash = "sha256:2df636a3f402ef14593c6811dac0609563b8c374bd7850e76919eb51ea205426"},
+ {file = "fonttools-4.31.2.zip", hash = "sha256:236b29aee6b113e8f7bee28779c1230a86ad2aac9a74a31b0aedf57e7dfb62a4"},
]
greenlet = [
{file = "greenlet-1.1.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6"},
@@ -1450,8 +1490,8 @@ greenlet = [
{file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a"},
]
identify = [
- {file = "identify-2.4.11-py2.py3-none-any.whl", hash = "sha256:fd906823ed1db23c7a48f9b176a1d71cb8abede1e21ebe614bac7bdd688d9213"},
- {file = "identify-2.4.11.tar.gz", hash = "sha256:2986942d3974c8f2e5019a190523b0b0e2a07cb8e89bf236727fb4b26f27f8fd"},
+ {file = "identify-2.4.12-py2.py3-none-any.whl", hash = "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"},
+ {file = "identify-2.4.12.tar.gz", hash = "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17"},
]
idna = [
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
@@ -1462,16 +1502,16 @@ imagesize = [
{file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"},
]
importlib-metadata = [
- {file = "importlib_metadata-4.11.2-py3-none-any.whl", hash = "sha256:d16e8c1deb60de41b8e8ed21c1a7b947b0bc62fab7e1d470bcdf331cea2e6735"},
- {file = "importlib_metadata-4.11.2.tar.gz", hash = "sha256:b36ffa925fe3139b2f6ff11d6925ffd4fa7bc47870165e3ac260ac7b4f91e6ac"},
+ {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"},
+ {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"},
]
iniconfig = [
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
]
ipython = [
- {file = "ipython-8.1.1-py3-none-any.whl", hash = "sha256:6f56bfaeaa3247aa3b9cd3b8cbab3a9c0abf7428392f97b21902d12b2f42a381"},
- {file = "ipython-8.1.1.tar.gz", hash = "sha256:8138762243c9b3a3ffcf70b37151a2a35c23d3a29f9743878c33624f4207be3d"},
+ {file = "ipython-8.2.0-py3-none-any.whl", hash = "sha256:1b672bfd7a48d87ab203d9af8727a3b0174a4566b4091e9447c22fb63ea32857"},
+ {file = "ipython-8.2.0.tar.gz", hash = "sha256:70e5eb132cac594a34b5f799bd252589009905f05104728aea6a403ec2519dc1"},
]
isort = [
{file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
@@ -1482,54 +1522,53 @@ jedi = [
{file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"},
]
jinja2 = [
- {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
- {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
+ {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"},
+ {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"},
]
kiwisolver = [
- {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6"},
- {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470"},
- {file = "kiwisolver-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298"},
- {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84"},
- {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb"},
- {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0"},
- {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402"},
- {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0"},
- {file = "kiwisolver-1.3.2-cp310-cp310-win32.whl", hash = "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977"},
- {file = "kiwisolver-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589"},
- {file = "kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8"},
- {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f"},
- {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84"},
- {file = "kiwisolver-1.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829"},
- {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af"},
- {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536"},
- {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76"},
- {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b"},
- {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28"},
- {file = "kiwisolver-1.3.2-cp38-cp38-win32.whl", hash = "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c"},
- {file = "kiwisolver-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031"},
- {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507"},
- {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f"},
- {file = "kiwisolver-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9"},
- {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009"},
- {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6"},
- {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8"},
- {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b"},
- {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439"},
- {file = "kiwisolver-1.3.2-cp39-cp39-win32.whl", hash = "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9"},
- {file = "kiwisolver-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386"},
- {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc"},
- {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f"},
- {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf"},
- {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223"},
- {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560"},
- {file = "kiwisolver-1.3.2.tar.gz", hash = "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"},
+ {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"},
+ {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"},
+ {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"},
+ {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"},
+ {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"},
+ {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"},
+ {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"},
+ {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"},
+ {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"},
]
latexcodec = [
{file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"},
@@ -1625,46 +1664,46 @@ lz4 = [
{file = "lz4-3.1.10.tar.gz", hash = "sha256:439e575ecfa9ecffcbd63cfed99baefbe422ab9645b1e82278024d8a21d9720b"},
]
markupsafe = [
- {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3028252424c72b2602a323f70fbf50aa80a5d3aa616ea6add4ba21ae9cc9da4c"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:290b02bab3c9e216da57c1d11d2ba73a9f73a614bbdcc027d299a60cdfabb11a"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e104c0c2b4cd765b4e83909cde7ec61a1e313f8a75775897db321450e928cce"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c3be29abb6b34052fd26fc7a8e0a49b1ee9d282e3665e8ad09a0a68faee5b3"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204730fd5fe2fe3b1e9ccadb2bd18ba8712b111dcabce185af0b3b5285a7c989"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3b64c65328cb4cd252c94f83e66e3d7acf8891e60ebf588d7b493a55a1dbf26"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:96de1932237abe0a13ba68b63e94113678c379dca45afa040a17b6e1ad7ed076"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75bb36f134883fdbe13d8e63b8675f5f12b80bb6627f7714c7d6c5becf22719f"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-win32.whl", hash = "sha256:4056f752015dfa9828dce3140dbadd543b555afb3252507348c493def166d454"},
- {file = "MarkupSafe-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d4e702eea4a2903441f2735799d217f4ac1b55f7d8ad96ab7d4e25417cb0827c"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f0eddfcabd6936558ec020130f932d479930581171368fd728efcfb6ef0dd357"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddea4c352a488b5e1069069f2f501006b1a4362cb906bee9a193ef1245a7a61"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09c86c9643cceb1d87ca08cdc30160d1b7ab49a8a21564868921959bd16441b8"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a0abef2ca47b33fb615b491ce31b055ef2430de52c5b3fb19a4042dbc5cadb"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:736895a020e31b428b3382a7887bfea96102c529530299f426bf2e636aacec9e"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:679cbb78914ab212c49c67ba2c7396dc599a8479de51b9a87b174700abd9ea49"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84ad5e29bf8bab3ad70fd707d3c05524862bddc54dc040982b0dbcff36481de7"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-win32.whl", hash = "sha256:8da5924cb1f9064589767b0f3fc39d03e3d0fb5aa29e0cb21d43106519bd624a"},
- {file = "MarkupSafe-2.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:454ffc1cbb75227d15667c09f164a0099159da0c1f3d2636aa648f12675491ad"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:142119fb14a1ef6d758912b25c4e803c3ff66920635c44078666fe7cc3f8f759"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2a5a856019d2833c56a3dcac1b80fe795c95f401818ea963594b345929dffa7"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d1fb9b2eec3c9714dd936860850300b51dbaa37404209c8d4cb66547884b7ed"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62c0285e91414f5c8f621a17b69fc0088394ccdaa961ef469e833dbff64bd5ea"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc3150f85e2dbcf99e65238c842d1cfe69d3e7649b19864c1cc043213d9cd730"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f02cf7221d5cd915d7fa58ab64f7ee6dd0f6cddbb48683debf5d04ae9b1c2cc1"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5653619b3eb5cbd35bfba3c12d575db2a74d15e0e1c08bf1db788069d410ce8"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d2f5d97fcbd004c03df8d8fe2b973fe2b14e7bfeb2cfa012eaa8759ce9a762f"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-win32.whl", hash = "sha256:3cace1837bc84e63b3fd2dfce37f08f8c18aeb81ef5cf6bb9b51f625cb4e6cd8"},
- {file = "MarkupSafe-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fabbe18087c3d33c5824cb145ffca52eccd053061df1d79d4b66dafa5ad2a5ea"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:023af8c54fe63530545f70dd2a2a7eed18d07a9a77b94e8bf1e2ff7f252db9a3"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d66624f04de4af8bbf1c7f21cc06649c1c69a7f84109179add573ce35e46d448"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c532d5ab79be0199fa2658e24a02fce8542df196e60665dd322409a03db6a52c"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ec74fada3841b8c5f4c4f197bea916025cb9aa3fe5abf7d52b655d042f956"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c653fde75a6e5eb814d2a0a89378f83d1d3f502ab710904ee585c38888816c"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:961eb86e5be7d0973789f30ebcf6caab60b844203f4396ece27310295a6082c7"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:598b65d74615c021423bd45c2bc5e9b59539c875a9bdb7e5f2a6b92dfcfc268d"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:599941da468f2cf22bf90a84f6e2a65524e87be2fce844f96f2dd9a6c9d1e635"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-win32.whl", hash = "sha256:e6f7f3f41faffaea6596da86ecc2389672fa949bd035251eab26dc6697451d05"},
- {file = "MarkupSafe-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:b8811d48078d1cf2a6863dafb896e68406c5f513048451cd2ded0473133473c7"},
- {file = "MarkupSafe-2.1.0.tar.gz", hash = "sha256:80beaf63ddfbc64a0452b841d8036ca0611e049650e20afcb882f5d3c266d65f"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
+ {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
]
matplotlib = [
{file = "matplotlib-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:456cc8334f6d1124e8ff856b42d2cc1c84335375a16448189999496549f7182b"},
@@ -1708,8 +1747,8 @@ matplotlib-inline = [
{file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"},
]
mccabe = [
- {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
- {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
]
nodeenv = [
{file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"},
@@ -1779,27 +1818,27 @@ packaging = [
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
]
pandas = [
- {file = "pandas-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3dfb32ed50122fe8c5e7f2b8d97387edd742cc78f9ec36f007ee126cd3720907"},
- {file = "pandas-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0259cd11e7e6125aaea3af823b80444f3adad6149ff4c97fef760093598b3e34"},
- {file = "pandas-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96e9ece5759f9b47ae43794b6359bbc54805d76e573b161ae770c1ea59393106"},
- {file = "pandas-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508c99debccd15790d526ce6b1624b97a5e1e4ca5b871319fb0ebfd46b8f4dad"},
- {file = "pandas-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6a7bbbb7950063bfc942f8794bc3e31697c020a14f1cd8905fc1d28ec674a01"},
- {file = "pandas-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:c614001129b2a5add5e3677c3a213a9e6fd376204cb8d17c04e84ff7dfc02a73"},
- {file = "pandas-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4e1176f45981c8ccc8161bc036916c004ca51037a7ed73f2d2a9857e6dbe654f"},
- {file = "pandas-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bbb15ad79050e8b8d39ec40dd96a30cd09b886a2ae8848d0df1abba4d5502a67"},
- {file = "pandas-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6d6ad1da00c7cc7d8dd1559a6ba59ba3973be6b15722d49738b2be0977eb8a0c"},
- {file = "pandas-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:358b0bc98a5ff067132d23bf7a2242ee95db9ea5b7bbc401cf79205f11502fd3"},
- {file = "pandas-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6105af6533f8b63a43ea9f08a2ede04e8f43e49daef0209ab0d30352bcf08bee"},
- {file = "pandas-1.4.1-cp38-cp38-win32.whl", hash = "sha256:04dd15d9db538470900c851498e532ef28d4e56bfe72c9523acb32042de43dfb"},
- {file = "pandas-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b384516dbb4e6aae30e3464c2e77c563da5980440fbdfbd0968e3942f8f9d70"},
- {file = "pandas-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f02e85e6d832be37d7f16cf6ac8bb26b519ace3e5f3235564a91c7f658ab2a43"},
- {file = "pandas-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0b1a13f647e4209ed7dbb5da3497891d0045da9785327530ab696417ef478f84"},
- {file = "pandas-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:19f7c632436b1b4f84615c3b127bbd7bc603db95e3d4332ed259dc815c9aaa26"},
- {file = "pandas-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ea47ba1d6f359680130bd29af497333be6110de8f4c35b9211eec5a5a9630fa"},
- {file = "pandas-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e5a7a1e0ecaac652326af627a3eca84886da9e667d68286866d4e33f6547caf"},
- {file = "pandas-1.4.1-cp39-cp39-win32.whl", hash = "sha256:1d85d5f6be66dfd6d1d8d13b9535e342a2214260f1852654b19fa4d7b8d1218b"},
- {file = "pandas-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3129a35d9dad1d80c234dd78f8f03141b914395d23f97cf92a366dcd19f8f8bf"},
- {file = "pandas-1.4.1.tar.gz", hash = "sha256:8db93ec98ac7cb5f8ac1420c10f5e3c43533153f253fe7fb6d891cf5aa2b80d2"},
+ {file = "pandas-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be67c782c4f1b1f24c2f16a157e12c2693fd510f8df18e3287c77f33d124ed07"},
+ {file = "pandas-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5a206afa84ed20e07603f50d22b5f0db3fb556486d8c2462d8bc364831a4b417"},
+ {file = "pandas-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0010771bd9223f7afe5f051eb47c4a49534345dfa144f2f5470b27189a4dd3b5"},
+ {file = "pandas-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3228198333dd13c90b6434ddf61aa6d57deaca98cf7b654f4ad68a2db84f8cfe"},
+ {file = "pandas-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b79af3a69e5175c6fa7b4e046b21a646c8b74e92c6581a9d825687d92071b51"},
+ {file = "pandas-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:5586cc95692564b441f4747c47c8a9746792e87b40a4680a2feb7794defb1ce3"},
+ {file = "pandas-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:061609334a8182ab500a90fe66d46f6f387de62d3a9cb9aa7e62e3146c712167"},
+ {file = "pandas-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b8134651258bce418cb79c71adeff0a44090c98d955f6953168ba16cc285d9f7"},
+ {file = "pandas-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df82739e00bb6daf4bba4479a40f38c718b598a84654cbd8bb498fd6b0aa8c16"},
+ {file = "pandas-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:385c52e85aaa8ea6a4c600a9b2821181a51f8be0aee3af6f2dcb41dafc4fc1d0"},
+ {file = "pandas-1.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295872bf1a09758aba199992c3ecde455f01caf32266d50abc1a073e828a7b9d"},
+ {file = "pandas-1.4.2-cp38-cp38-win32.whl", hash = "sha256:95c1e422ced0199cf4a34385ff124b69412c4bc912011ce895582bee620dfcaa"},
+ {file = "pandas-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:5c54ea4ef3823108cd4ec7fb27ccba4c3a775e0f83e39c5e17f5094cb17748bc"},
+ {file = "pandas-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c072c7f06b9242c855ed8021ff970c0e8f8b10b35e2640c657d2a541c5950f59"},
+ {file = "pandas-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f549097993744ff8c41b5e8f2f0d3cbfaabe89b4ae32c8c08ead6cc535b80139"},
+ {file = "pandas-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff08a14ef21d94cdf18eef7c569d66f2e24e0bc89350bcd7d243dd804e3b5eb2"},
+ {file = "pandas-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c5bf555b6b0075294b73965adaafb39cf71c312e38c5935c93d78f41c19828a"},
+ {file = "pandas-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51649ef604a945f781105a6d2ecf88db7da0f4868ac5d45c51cb66081c4d9c73"},
+ {file = "pandas-1.4.2-cp39-cp39-win32.whl", hash = "sha256:d0d4f13e4be7ce89d7057a786023c461dd9370040bdb5efa0a7fe76b556867a0"},
+ {file = "pandas-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:09d8be7dd9e1c4c98224c4dfe8abd60d145d934e9fc1f5f411266308ae683e6a"},
+ {file = "pandas-1.4.2.tar.gz", hash = "sha256:92bc1fc585f1463ca827b45535957815b7deb218c549b7c18402c322c7549a12"},
]
parso = [
{file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"},
@@ -1841,41 +1880,44 @@ pickleshare = [
{file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
]
pillow = [
- {file = "Pillow-9.0.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4"},
- {file = "Pillow-9.0.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976"},
- {file = "Pillow-9.0.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc"},
- {file = "Pillow-9.0.1-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd"},
- {file = "Pillow-9.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f"},
- {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a"},
- {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049"},
- {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a"},
- {file = "Pillow-9.0.1-cp310-cp310-win32.whl", hash = "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e"},
- {file = "Pillow-9.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b"},
- {file = "Pillow-9.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e"},
- {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360"},
- {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b"},
- {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030"},
- {file = "Pillow-9.0.1-cp37-cp37m-win32.whl", hash = "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669"},
- {file = "Pillow-9.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092"},
- {file = "Pillow-9.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204"},
- {file = "Pillow-9.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e"},
- {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c"},
- {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5"},
- {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae"},
- {file = "Pillow-9.0.1-cp38-cp38-win32.whl", hash = "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c"},
- {file = "Pillow-9.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00"},
- {file = "Pillow-9.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838"},
- {file = "Pillow-9.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28"},
- {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c"},
- {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b"},
- {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7"},
- {file = "Pillow-9.0.1-cp39-cp39-win32.whl", hash = "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7"},
- {file = "Pillow-9.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"},
- {file = "Pillow-9.0.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97"},
- {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56"},
- {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e"},
- {file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"},
- {file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"},
+ {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"},
+ {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"},
+ {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"},
+ {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"},
+ {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"},
+ {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"},
+ {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"},
+ {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"},
+ {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"},
+ {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"},
+ {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"},
+ {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"},
+ {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"},
+ {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"},
+ {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"},
+ {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"},
+ {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"},
+ {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"},
+ {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"},
+ {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"},
+ {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"},
+ {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"},
+ {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"},
+ {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"},
+ {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"},
+ {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"},
+ {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"},
+ {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"},
+ {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"},
+ {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"},
+ {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"},
+ {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"},
+ {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"},
+ {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"},
+ {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"},
+ {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"},
+ {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"},
+ {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"},
]
platformdirs = [
{file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"},
@@ -1886,12 +1928,12 @@ pluggy = [
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
]
pre-commit = [
- {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"},
- {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"},
+ {file = "pre_commit-2.18.1-py2.py3-none-any.whl", hash = "sha256:02226e69564ebca1a070bd1f046af866aa1c318dbc430027c50ab832ed2b73f2"},
+ {file = "pre_commit-2.18.1.tar.gz", hash = "sha256:5d445ee1fa8738d506881c5d84f83c62bb5be6b2838e32207433647e8e5ebe10"},
]
prompt-toolkit = [
- {file = "prompt_toolkit-3.0.28-py3-none-any.whl", hash = "sha256:30129d870dcb0b3b6a53efdc9d0a83ea96162ffd28ffe077e94215b233dc670c"},
- {file = "prompt_toolkit-3.0.28.tar.gz", hash = "sha256:9f1cd16b1e86c2968f2519d7fb31dd9d669916f515612c269d14e9ed52b51650"},
+ {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"},
+ {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"},
]
ptyprocess = [
{file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
@@ -1918,8 +1960,8 @@ pygments = [
{file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"},
]
pylint = [
- {file = "pylint-2.12.2-py3-none-any.whl", hash = "sha256:daabda3f7ed9d1c60f52d563b1b854632fd90035bcf01443e234d3dc794e3b74"},
- {file = "pylint-2.12.2.tar.gz", hash = "sha256:9d945a73640e1fec07ee34b42f5669b770c759acd536ec7b16d7e4b87a9c9ff9"},
+ {file = "pylint-2.13.4-py3-none-any.whl", hash = "sha256:8672cf7441b81410f5de7defdf56e2d559c956fd0579652f2e0a0a35bea2d546"},
+ {file = "pylint-2.13.4.tar.gz", hash = "sha256:7cc6d0c4f61dff440f9ed8b657f4ecd615dcfe35345953eb7b1dc74afe901d7a"},
]
pyparsing = [
{file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"},
@@ -1949,8 +1991,8 @@ python-dateutil = [
{file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
]
pytz = [
- {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
- {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
+ {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
+ {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"},
]
pytzdata = [
{file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"},
@@ -2037,8 +2079,8 @@ snowballstemmer = [
{file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
]
sphinx = [
- {file = "Sphinx-4.4.0-py3-none-any.whl", hash = "sha256:5da895959511473857b6d0200f56865ed62c31e8f82dd338063b84ec022701fe"},
- {file = "Sphinx-4.4.0.tar.gz", hash = "sha256:6caad9786055cb1fa22b4a365c1775816b876f91966481765d7d50e9f0dd35cc"},
+ {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"},
+ {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"},
]
sphinx-rtd-theme = [
{file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"},
@@ -2073,41 +2115,42 @@ sphinxcontrib-serializinghtml = [
{file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
]
sqlalchemy = [
- {file = "SQLAlchemy-1.4.32-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4b2bcab3a914715d332ca783e9bda13bc570d8b9ef087563210ba63082c18c16"},
- {file = "SQLAlchemy-1.4.32-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:159c2f69dd6efd28e894f261ffca1100690f28210f34cfcd70b895e0ea7a64f3"},
- {file = "SQLAlchemy-1.4.32-cp27-cp27m-win_amd64.whl", hash = "sha256:d7e483f4791fbda60e23926b098702340504f7684ce7e1fd2c1bf02029288423"},
- {file = "SQLAlchemy-1.4.32-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4aa96e957141006181ca58e792e900ee511085b8dae06c2d08c00f108280fb8a"},
- {file = "SQLAlchemy-1.4.32-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:576684771456d02e24078047c2567025f2011977aa342063468577d94e194b00"},
- {file = "SQLAlchemy-1.4.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff677fa4522dafb5a5e2c0cf909790d5d367326321aeabc0dffc9047cb235bd"},
- {file = "SQLAlchemy-1.4.32-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8679f9aba5ac22e7bce54ccd8a77641d3aea3e2d96e73e4356c887ebf8ff1082"},
- {file = "SQLAlchemy-1.4.32-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7046f7aa2db445daccc8424f50b47a66c4039c9f058246b43796aa818f8b751"},
- {file = "SQLAlchemy-1.4.32-cp310-cp310-win32.whl", hash = "sha256:bedd89c34ab62565d44745212814e4b57ef1c24ad4af9b29c504ce40f0dc6558"},
- {file = "SQLAlchemy-1.4.32-cp310-cp310-win_amd64.whl", hash = "sha256:199dc6d0068753b6a8c0bd3aceb86a3e782df118260ebc1fa981ea31ee054674"},
- {file = "SQLAlchemy-1.4.32-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:8e1e5d96b744a4f91163290b01045430f3f32579e46d87282449e5b14d27d4ac"},
- {file = "SQLAlchemy-1.4.32-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edfcf93fd92e2f9eef640b3a7a40db20fe3c1d7c2c74faa41424c63dead61b76"},
- {file = "SQLAlchemy-1.4.32-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04164e0063feb7aedd9d073db0fd496edb244be40d46ea1f0d8990815e4b8c34"},
- {file = "SQLAlchemy-1.4.32-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba59761c19b800bc2e1c9324da04d35ef51e4ee9621ff37534bc2290d258f71"},
- {file = "SQLAlchemy-1.4.32-cp36-cp36m-win32.whl", hash = "sha256:708973b5d9e1e441188124aaf13c121e5b03b6054c2df59b32219175a25aa13e"},
- {file = "SQLAlchemy-1.4.32-cp36-cp36m-win_amd64.whl", hash = "sha256:316270e5867566376e69a0ac738b863d41396e2b63274616817e1d34156dff0e"},
- {file = "SQLAlchemy-1.4.32-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:9a0195af6b9050c9322a97cf07514f66fe511968e623ca87b2df5e3cf6349615"},
- {file = "SQLAlchemy-1.4.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e4a3c0c3c596296b37f8427c467c8e4336dc8d50f8ed38042e8ba79507b2c9"},
- {file = "SQLAlchemy-1.4.32-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bca714d831e5b8860c3ab134c93aec63d1a4f493bed20084f54e3ce9f0a3bf99"},
- {file = "SQLAlchemy-1.4.32-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9a680d9665f88346ed339888781f5236347933906c5a56348abb8261282ec48"},
- {file = "SQLAlchemy-1.4.32-cp37-cp37m-win32.whl", hash = "sha256:9cb5698c896fa72f88e7ef04ef62572faf56809093180771d9be8d9f2e264a13"},
- {file = "SQLAlchemy-1.4.32-cp37-cp37m-win_amd64.whl", hash = "sha256:8b9a395122770a6f08ebfd0321546d7379f43505882c7419d7886856a07caa13"},
- {file = "SQLAlchemy-1.4.32-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:3f88a4ee192142eeed3fe173f673ea6ab1f5a863810a9d85dbf6c67a9bd08f97"},
- {file = "SQLAlchemy-1.4.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd93162615870c976dba43963a24bb418b28448fef584f30755990c134a06a55"},
- {file = "SQLAlchemy-1.4.32-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a2e73508f939175363d8a4be9dcdc84cf16a92578d7fa86e6e4ca0e6b3667b2"},
- {file = "SQLAlchemy-1.4.32-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfec934aac7f9fa95fc82147a4ba5db0a8bdc4ebf1e33b585ab8860beb10232f"},
- {file = "SQLAlchemy-1.4.32-cp38-cp38-win32.whl", hash = "sha256:bb42f9b259c33662c6a9b866012f6908a91731a419e69304e1261ba3ab87b8d1"},
- {file = "SQLAlchemy-1.4.32-cp38-cp38-win_amd64.whl", hash = "sha256:7ff72b3cc9242d1a1c9b84bd945907bf174d74fc2519efe6184d6390a8df478b"},
- {file = "SQLAlchemy-1.4.32-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5dc9801ae9884e822ba942ca493642fb50f049c06b6dbe3178691fce48ceb089"},
- {file = "SQLAlchemy-1.4.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4607d2d16330757818c9d6fba322c2e80b4b112ff24295d1343a80b876eb0ed"},
- {file = "SQLAlchemy-1.4.32-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:20e9eba7fd86ef52e0df25bea83b8b518dfdf0bce09b336cfe51671f52aaaa3f"},
- {file = "SQLAlchemy-1.4.32-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:290cbdf19129ae520d4bdce392648c6fcdbee763bc8f750b53a5ab51880cb9c9"},
- {file = "SQLAlchemy-1.4.32-cp39-cp39-win32.whl", hash = "sha256:1bbac3e8293b34c4403d297e21e8f10d2a57756b75cff101dc62186adec725f5"},
- {file = "SQLAlchemy-1.4.32-cp39-cp39-win_amd64.whl", hash = "sha256:b3f1d9b3aa09ab9adc7f8c4b40fc3e081eb903054c9a6f9ae1633fe15ae503b4"},
- {file = "SQLAlchemy-1.4.32.tar.gz", hash = "sha256:6fdd2dc5931daab778c2b65b03df6ae68376e028a3098eb624d0909d999885bc"},
+ {file = "SQLAlchemy-1.4.34-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c025d45318b73c0601cca451532556cbab532b2742839ebb8cb58f9ebf06811e"},
+ {file = "SQLAlchemy-1.4.34-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cd5cffd1dd753828f1069f33062f3896e51c990acd957c264f40e051b3e19887"},
+ {file = "SQLAlchemy-1.4.34-cp27-cp27m-win32.whl", hash = "sha256:a47bf6b7ca6c28e4f4e262fabcf5be6b907af81be36de77839c9eeda2cdf3bb3"},
+ {file = "SQLAlchemy-1.4.34-cp27-cp27m-win_amd64.whl", hash = "sha256:c9218e3519398129e364121e0d89823e6ba2a2b77c28bfc661face0829c41433"},
+ {file = "SQLAlchemy-1.4.34-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7ee14a7f9f76d1ef9d5e5b760c9252617c839b87eee04d1ce8325ac66ae155c4"},
+ {file = "SQLAlchemy-1.4.34-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:4414ace6e3a5e39523e55a5d9f3b215699b2ead4ff91fca98f1b659b7ab2d92a"},
+ {file = "SQLAlchemy-1.4.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a6cfd468f54d65324fd3847cfd0148b0610efa6a43e5f5fcc89f455696ae9e7"},
+ {file = "SQLAlchemy-1.4.34-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:27a42894a2751e438eaed12fc0dcfe741ff2f66c14760d081222c5adc5460064"},
+ {file = "SQLAlchemy-1.4.34-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:671f61c3db4595b0e86cc4b30f675a7c0206d9ce99f041b4f6761c7ddd1e0074"},
+ {file = "SQLAlchemy-1.4.34-cp310-cp310-win32.whl", hash = "sha256:3ebb97ed96f4506e2f212e1fcf0ec07a103bb194938627660a5acb4d9feae49c"},
+ {file = "SQLAlchemy-1.4.34-cp310-cp310-win_amd64.whl", hash = "sha256:d8efcaa709ea8e7c08c3d3e7639c39b36083f5a995f397f9e6eedf5f5e4e4946"},
+ {file = "SQLAlchemy-1.4.34-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a4fb5c6ee84a6bba4ff6f9f5379f0b3a0ffe9de7ba5a0945659b3da8d519709b"},
+ {file = "SQLAlchemy-1.4.34-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f4dab2deb6d34618a2ccfff3971a85923ad7c3a9a45401818870fc51d3f0cc"},
+ {file = "SQLAlchemy-1.4.34-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67c1c27c48875afc950bee5ee24582794f20b545e64e4f9ca94071a9b514d6ed"},
+ {file = "SQLAlchemy-1.4.34-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954ea8c527c4322afb6885944904714893af81fe9167e421273770991bf08a4a"},
+ {file = "SQLAlchemy-1.4.34-cp36-cp36m-win32.whl", hash = "sha256:2a3e4dc7c452ba3c0f3175ad5a8e0ba49c2b0570a8d07272cf50844c8d78e74f"},
+ {file = "SQLAlchemy-1.4.34-cp36-cp36m-win_amd64.whl", hash = "sha256:f47996b1810894f766c9ee689607077c6c0e0fd6761e04c12ba13efb56d50c1d"},
+ {file = "SQLAlchemy-1.4.34-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b34bbc683789559f1bc9bb685fc162e0956dbbdfbe2fbd6755a9f5982c113610"},
+ {file = "SQLAlchemy-1.4.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:804cf491437f3e4ce31247ab4b309b181f06ecc97d309b746d10f09439b4eb85"},
+ {file = "SQLAlchemy-1.4.34-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f197c66663ed0f9e1178d51141d864688fb244a83f6b17f667d521e482537b2e"},
+ {file = "SQLAlchemy-1.4.34-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08aaad905aba8940f27aeb9f1f851bf63f18ef97b0062ca41f64afc4b64e0e8c"},
+ {file = "SQLAlchemy-1.4.34-cp37-cp37m-win32.whl", hash = "sha256:345306707bb0e51e7cd6e7573adafbce018894ee5e3b9c31134545f704936db0"},
+ {file = "SQLAlchemy-1.4.34-cp37-cp37m-win_amd64.whl", hash = "sha256:50174e173d03209c34e07e7b57cca48d0082ac2390edf927aafc706c111da11e"},
+ {file = "SQLAlchemy-1.4.34-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:878c7beaafa365602762c19f638282e1885454fed1aed86f8fae038933c7c671"},
+ {file = "SQLAlchemy-1.4.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70048a83f0a1ece1fcd7189891c888e20af2c57fbd33eb760d8cece9843b896c"},
+ {file = "SQLAlchemy-1.4.34-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:621d3f6c0ba2407bb97e82b649be5ca7d5b6c201dcfb964ce13f517bf1cb6305"},
+ {file = "SQLAlchemy-1.4.34-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:045d6a26c262929af0b9cb25441aae675ac04db4ea8bd2446b355617cd6b6b7d"},
+ {file = "SQLAlchemy-1.4.34-cp38-cp38-win32.whl", hash = "sha256:e297a5cc625e3f1367a82deedf2d48ee4d2b2bd263b8b8d2efbaaf5608b5229e"},
+ {file = "SQLAlchemy-1.4.34-cp38-cp38-win_amd64.whl", hash = "sha256:36f08d94670315ca04c8139bd80b3e02b9dd9cc66fc11bcb96fd10ad51a051ab"},
+ {file = "SQLAlchemy-1.4.34-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:40b995d7aeeb6f88a1927ce6692c0f626b59d8effd3e1d597f125e141707b37c"},
+ {file = "SQLAlchemy-1.4.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb6558ba07409dafa18c793c34292b3265be455904966f0724c10198829477e3"},
+ {file = "SQLAlchemy-1.4.34-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e67278ceb63270cdac0a7b89fc3c29a56f7dac9616a7ee48e7ad6b52e3b631e5"},
+ {file = "SQLAlchemy-1.4.34-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50107d8183da3fbe5715957aa3954cd9d82aed555c5b4d3fd37fac861af422fa"},
+ {file = "SQLAlchemy-1.4.34-cp39-cp39-win32.whl", hash = "sha256:c3ad7f5b61ba014f5045912aea15b03c473bb02b1c07fd92c9d2c794fa183276"},
+ {file = "SQLAlchemy-1.4.34-cp39-cp39-win_amd64.whl", hash = "sha256:5e88912bf192e7b5739c446d2276e1cba74cfa6c1c93eea2b2534404f6be1dbd"},
+ {file = "SQLAlchemy-1.4.34.tar.gz", hash = "sha256:623bac2d6bdca3f3e61cf1e1c466c5fb9f5cf08735736ee1111187b7a4108891"},
]
stack-data = [
{file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"},
@@ -2130,12 +2173,12 @@ typing-extensions = [
{file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
]
urllib3 = [
- {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"},
- {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"},
+ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"},
+ {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"},
]
virtualenv = [
- {file = "virtualenv-20.13.3-py2.py3-none-any.whl", hash = "sha256:dd448d1ded9f14d1a4bfa6bfc0c5b96ae3be3f2d6c6c159b23ddcfd701baa021"},
- {file = "virtualenv-20.13.3.tar.gz", hash = "sha256:e9dd1a1359d70137559034c0f5433b34caf504af2dc756367be86a5a32967134"},
+ {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"},
+ {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"},
]
wcwidth = [
{file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
@@ -2145,59 +2188,72 @@ wmctrl = [
{file = "wmctrl-0.4.tar.gz", hash = "sha256:66cbff72b0ca06a22ec3883ac3a4d7c41078bdae4fb7310f52951769b10e14e0"},
]
wrapt = [
- {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"},
- {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"},
- {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"},
- {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"},
- {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"},
- {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"},
- {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"},
- {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"},
- {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"},
- {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"},
- {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"},
- {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"},
- {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"},
- {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"},
- {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"},
- {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"},
- {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"},
- {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"},
- {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"},
- {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"},
- {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"},
- {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"},
- {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"},
- {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"},
- {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"},
- {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"},
- {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"},
- {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"},
- {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"},
- {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"},
- {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"},
- {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"},
- {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"},
- {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"},
- {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"},
- {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"},
- {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"},
- {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"},
- {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"},
- {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"},
- {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"},
- {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"},
- {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"},
- {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"},
- {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"},
- {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"},
- {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"},
- {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"},
- {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"},
- {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"},
- {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"},
+ {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"},
+ {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"},
+ {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"},
+ {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"},
+ {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"},
+ {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"},
+ {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"},
+ {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"},
+ {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"},
+ {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"},
+ {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"},
+ {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"},
+ {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"},
+ {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"},
+ {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"},
+ {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"},
+ {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"},
+ {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"},
+ {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"},
+ {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"},
+ {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"},
+ {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"},
+ {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"},
+ {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"},
+ {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"},
+ {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"},
+ {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"},
+ {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"},
+ {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"},
+ {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"},
+ {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"},
+ {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"},
+ {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"},
+ {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"},
+ {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"},
+ {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"},
+ {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"},
+ {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"},
+ {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"},
+ {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"},
+ {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"},
+ {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"},
+ {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"},
+ {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"},
+ {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"},
+ {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"},
+ {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"},
+ {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"},
+ {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"},
+ {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"},
+ {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"},
+ {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"},
+ {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"},
+ {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"},
+ {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"},
+ {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"},
+ {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"},
+ {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"},
+ {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"},
+ {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"},
+ {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"},
+ {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"},
+ {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"},
+ {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"},
]
zipp = [
- {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"},
- {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"},
+ {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"},
+ {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"},
]
diff --git a/pyproject.toml b/pyproject.toml
index 054e83b27..d9ebb4482 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -53,6 +53,9 @@ pytest-cov = "^3.0.0"
pytest-env = "^0.6.2"
a3b2bbc3ced97675ac3a71df45f55ba = "^6.4.0" # = lhapdf
# benchmark
+asv = "^0.4.2"
+virtualenv = "^20.13.2"
+# docs
Sphinx = "^4.3.2"
sphinx-rtd-theme = "^1.0.0"
sphinxcontrib-bibtex = "^2.4.1"
@@ -92,6 +95,12 @@ docs-view = { "shell" = "cd doc; make view" }
docs-server = { "shell" = "cd doc; make server" }
docs-clean = { "shell" = "cd doc; make clean" }
docs-cleanall = { "shell" = "cd doc; make cleanall" }
+asv-run = "asv run --config benchmarks/asv.conf.json master..HEAD"
+asv-preview = "asv preview --config benchmarks/asv.conf.json"
+asv-publish = "asv publish --config benchmarks/asv.conf.json"
+asv-show = "asv show --config benchmarks/asv.conf.json"
+asv-clean = { "shell" = "rm -rf benchmarks/env benchmarks/html benchmarks/results" }
+asv = ["asv-run", "asv-publish", "asv-preview"]
[tool.pytest.ini_options]
testpaths = ['tests/', 'benchmarks/']
diff --git a/src/eko/anomalous_dimensions/__init__.py b/src/eko/anomalous_dimensions/__init__.py
index a02322360..f1e9edba8 100644
--- a/src/eko/anomalous_dimensions/__init__.py
+++ b/src/eko/anomalous_dimensions/__init__.py
@@ -20,7 +20,8 @@
import numba as nb
import numpy as np
-from . import as1, as2, as3, harmonics
+from .. import harmonics
+from . import as1, as2, as3
@nb.njit(cache=True)
@@ -102,25 +103,22 @@ def gamma_ns(order, mode, n, nf):
eko.anomalous_dimensions.as3.gamma_nsv : :math:`\gamma_{ns,v}^{(2)}(N)`
"""
# cache the s-es
- sx = np.full(1, harmonics.harmonic_S1(n))
+ sx = harmonics.sx(n, max_weight=order + 1)
# now combine
gamma_ns = np.zeros(order + 1, np.complex_)
gamma_ns[0] = as1.gamma_ns(n, sx[0])
# NLO and beyond
if order >= 1:
- # TODO: pass the necessary harmonics to nlo gammas
if mode == 10101:
- gamma_ns_1 = as2.gamma_nsp(n, nf)
+ gamma_ns_1 = as2.gamma_nsp(n, nf, sx)
# To fill the full valence vector in NNLO we need to add gamma_ns^1 explicitly here
elif mode in [10201, 10200]:
- gamma_ns_1 = as2.gamma_nsm(n, nf)
+ gamma_ns_1 = as2.gamma_nsm(n, nf, sx)
else:
raise NotImplementedError("Non-singlet sector is not implemented")
gamma_ns[1] = gamma_ns_1
# NNLO and beyond
if order >= 2:
- sx = np.append(sx, harmonics.harmonic_S2(n))
- sx = np.append(sx, harmonics.harmonic_S3(n))
if mode == 10101:
gamma_ns_2 = -as3.gamma_nsp(n, nf, sx)
elif mode == 10201:
@@ -157,16 +155,12 @@ def gamma_singlet(order, n, nf):
eko.anomalous_dimensions.as3.gamma_singlet : :math:`\gamma_{S}^{(2)}(N)`
"""
# cache the s-es
- sx = np.full(1, harmonics.harmonic_S1(n))
- if order >= 1:
- sx = np.append(sx, harmonics.harmonic_S2(n))
- sx = np.append(sx, harmonics.harmonic_S3(n))
-
+ sx = harmonics.sx(n, max_weight=order + 1)
gamma_s = np.zeros((order + 1, 2, 2), np.complex_)
gamma_s[0] = as1.gamma_singlet(n, sx[0], nf)
if order >= 1:
- gamma_s[1] = as2.gamma_singlet(n, nf)
+ gamma_s[1] = as2.gamma_singlet(n, nf, sx)
if order == 2:
- sx = np.append(sx, harmonics.harmonic_S4(n))
+ sx = np.append(sx, harmonics.S4(n))
gamma_s[2] = -as3.gamma_singlet(n, nf, sx)
return gamma_s
diff --git a/src/eko/anomalous_dimensions/as1.py b/src/eko/anomalous_dimensions/as1.py
index 0c94d61d3..a178a3f08 100644
--- a/src/eko/anomalous_dimensions/as1.py
+++ b/src/eko/anomalous_dimensions/as1.py
@@ -19,7 +19,7 @@ def gamma_ns(N, s1):
N : complex
Mellin moment
s1 : complex
- S1(N)
+ harmonic sum :math:`S_{1}`
Returns
-------
@@ -89,7 +89,7 @@ def gamma_gg(N, s1, nf):
N : complex
Mellin moment
s1 : complex
- S1(N)
+ harmonic sum :math:`S_{1}`
nf : int
Number of active flavors
@@ -119,7 +119,7 @@ def gamma_singlet(N, s1, nf):
N : complex
Mellin moment
s1 : complex
- S1(N)
+ harmonic sum :math:`S_{1}`
nf : int
Number of active flavors
diff --git a/src/eko/anomalous_dimensions/as2.py b/src/eko/anomalous_dimensions/as2.py
index 07249ef31..4dd6088c5 100644
--- a/src/eko/anomalous_dimensions/as2.py
+++ b/src/eko/anomalous_dimensions/as2.py
@@ -10,12 +10,12 @@
import numba as nb
import numpy as np
-from .. import constants
-from . import harmonics
+from .. import constants, harmonics
+from ..harmonics.constants import log2, zeta2, zeta3
@nb.njit(cache=True)
-def gamma_nsm(n, nf):
+def gamma_nsm(n, nf, sx):
"""
Computes the |NLO| valence-like non-singlet anomalous dimension.
@@ -27,6 +27,8 @@ def gamma_nsm(n, nf):
Mellin moment
nf : int
Number of active flavors
+ sx : numpy.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2}`
Returns
-------
@@ -34,19 +36,17 @@ def gamma_nsm(n, nf):
|NLO| valence-like non-singlet anomalous dimension
:math:`\\gamma_{ns,-}^{(1)}(N)`
"""
- S1 = harmonics.harmonic_S1(n)
- S2 = harmonics.harmonic_S2(n)
+ S1 = sx[0]
+ S2 = sx[1]
# Here, Sp refers to S' ("s-prime") (german: "s-strich" or in Pegasus language: SSTR)
# of :cite:`Gluck:1989ze` and NOT to the Spence function a.k.a. dilogarithm
- Sp1m = harmonics.harmonic_S1((n - 1) / 2)
- Sp2m = harmonics.harmonic_S2((n - 1) / 2)
- Sp3m = harmonics.harmonic_S3((n - 1) / 2)
- g3n = harmonics.mellin_g3(n)
- zeta2 = harmonics.zeta2
- zeta3 = harmonics.zeta3
+ Sp1m = harmonics.S1((n - 1) / 2)
+ Sp2m = harmonics.S2((n - 1) / 2)
+ Sp3m = harmonics.S3((n - 1) / 2)
+ g3n = harmonics.g_functions.mellin_g3(n, S1)
# fmt: off
- gqq1m_cfca = 16*g3n - (144 + n*(1 + n)*(156 + n*(340 + n*(655 + 51*n*(2 + n)))))/(18.*np.power(n,3)*np.power(1 + n,3)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2m)/(n + np.power(n,2)) + S1*(29.77777777777778 + 16/np.power(n,2) - 16*S2 + 8*Sp2m) + 2*Sp3m + 10*zeta3 + zeta2*(16*S1 - 16*Sp1m - (16*(1 + n*np.log(2)))/n) # pylint: disable=line-too-long
- gqq1m_cfcf = -32*g3n + (24 - n*(-32 + 3*n*(-8 + n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(-24/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2m) + (8*Sp2m)/(n + np.power(n,2)) - 4*Sp3m - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1m + 32*(1/n + np.log(2))) # pylint: disable=line-too-long
+ gqq1m_cfca = 16*g3n - (144 + n*(1 + n)*(156 + n*(340 + n*(655 + 51*n*(2 + n)))))/(18.*np.power(n,3)*np.power(1 + n,3)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2m)/(n + np.power(n,2)) + S1*(29.77777777777778 + 16/np.power(n,2) - 16*S2 + 8*Sp2m) + 2*Sp3m + 10*zeta3 + zeta2*(16*S1 - 16*Sp1m - (16*(1 + n*log2))/n) # pylint: disable=line-too-long
+ gqq1m_cfcf = -32*g3n + (24 - n*(-32 + 3*n*(-8 + n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(-24/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2m) + (8*Sp2m)/(n + np.power(n,2)) - 4*Sp3m - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1m + 32*(1/n + log2)) # pylint: disable=line-too-long
gqq1m_cfnf = (-12 + n*(20 + n*(47 + 3*n*(2 + n))))/(9.*np.power(n,2)*np.power(1 + n,2)) - (40*S1)/9. + (8*S2)/3. # pylint: disable=line-too-long
# fmt: on
result = constants.CF * (
@@ -58,7 +58,7 @@ def gamma_nsm(n, nf):
@nb.njit(cache=True)
-def gamma_nsp(n, nf):
+def gamma_nsp(n, nf, sx):
"""
Computes the |NLO| singlet-like non-singlet anomalous dimension.
@@ -70,6 +70,8 @@ def gamma_nsp(n, nf):
Mellin moment
nf : int
Number of active flavors
+ sx : numpy.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2}`
Returns
-------
@@ -77,17 +79,15 @@ def gamma_nsp(n, nf):
|NLO| singlet-like non-singlet anomalous dimension
:math:`\\gamma_{ns,+}^{(1)}(N)`
"""
- S1 = harmonics.harmonic_S1(n)
- S2 = harmonics.harmonic_S2(n)
- Sp1p = harmonics.harmonic_S1(n / 2)
- Sp2p = harmonics.harmonic_S2(n / 2)
- Sp3p = harmonics.harmonic_S3(n / 2)
- g3n = harmonics.mellin_g3(n)
- zeta2 = harmonics.zeta2
- zeta3 = harmonics.zeta3
+ S1 = sx[0]
+ S2 = sx[1]
+ Sp1p = harmonics.S1(n / 2)
+ Sp2p = harmonics.S2(n / 2)
+ Sp3p = harmonics.S3(n / 2)
+ g3n = harmonics.g_functions.mellin_g3(n, S1)
# fmt: off
- gqq1p_cfca = -16*g3n + (132 - n*(340 + n*(655 + 51*n*(2 + n))))/(18.*np.power(n,2)*np.power(1 + n,2)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2p)/(n + np.power(n,2)) + S1*(29.77777777777778 - 16/np.power(n,2) - 16*S2 + 8*Sp2p) + 2*Sp3p + 10*zeta3 + zeta2*(16*S1 - 16*Sp1p + 16*(1/n - np.log(2))) # pylint: disable=line-too-long
- gqq1p_cfcf = 32*g3n - (8 + n*(32 + n*(40 + 3*n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(40/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2p) + (8*Sp2p)/(n + np.power(n,2)) - 4*Sp3p - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1p + 32*(-(1/n) + np.log(2))) # pylint: disable=line-too-long
+ gqq1p_cfca = -16*g3n + (132 - n*(340 + n*(655 + 51*n*(2 + n))))/(18.*np.power(n,2)*np.power(1 + n,2)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2p)/(n + np.power(n,2)) + S1*(29.77777777777778 - 16/np.power(n,2) - 16*S2 + 8*Sp2p) + 2*Sp3p + 10*zeta3 + zeta2*(16*S1 - 16*Sp1p + 16*(1/n - log2)) # pylint: disable=line-too-long
+ gqq1p_cfcf = 32*g3n - (8 + n*(32 + n*(40 + 3*n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(40/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2p) + (8*Sp2p)/(n + np.power(n,2)) - 4*Sp3p - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1p + 32*(-(1/n) + log2)) # pylint: disable=line-too-long
gqq1p_cfnf = (-12 + n*(20 + n*(47 + 3*n*(2 + n))))/(9.*np.power(n,2)*np.power(1 + n,2)) - (40*S1)/9. + (8*S2)/3. # pylint: disable=line-too-long
# fmt: on
result = constants.CF * (
@@ -126,7 +126,7 @@ def gamma_ps(n, nf):
@nb.njit(cache=True)
-def gamma_qg(n, nf):
+def gamma_qg(n, nf, sx):
"""
Computes the |NLO| quark-gluon singlet anomalous dimension.
@@ -138,6 +138,8 @@ def gamma_qg(n, nf):
Mellin moment
nf : int
Number of active flavors
+ sx : numpy.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2}`
Returns
-------
@@ -145,9 +147,9 @@ def gamma_qg(n, nf):
|NLO| quark-gluon singlet anomalous dimension
:math:`\\gamma_{qg}^{(1)}(N)`
"""
- S1 = harmonics.harmonic_S1(n)
- S2 = harmonics.harmonic_S2(n)
- Sp2p = harmonics.harmonic_S2(n / 2)
+ S1 = sx[0]
+ S2 = sx[1]
+ Sp2p = harmonics.S2(n / 2)
# fmt: off
gqg1_nfca = (-4*(16 + n*(64 + n*(104 + n*(128 + n*(85 + n*(36 + n*(25 + n*(15 + n*(6 + n))))))))))/((-1 + n)*np.power(n,3)*np.power(1 + n,3)*np.power(2 + n,3)) - (16*(3 + 2*n)*S1)/np.power(2 + 3*n + np.power(n,2),2) + (4*(2 + n + np.power(n,2))*np.power(S1,2))/(n*(2 + 3*n + np.power(n,2))) - (4*(2 + n + np.power(n,2))*S2)/(n*(2 + 3*n + np.power(n,2))) + (4*(2 + n + np.power(n,2))*Sp2p)/(n*(2 + 3*n + np.power(n,2))) # pylint: disable=line-too-long
gqg1_nfcf = (-2*(4 + n*(8 + n*(1 + n)*(25 + n*(26 + 5*n*(2 + n))))))/(np.power(n,3)*np.power(1 + n,3)*(2 + n)) + (8*S1)/np.power(n,2) - (4*(2 + n + np.power(n,2))*np.power(S1,2))/(n*(2 + 3*n + np.power(n,2))) + (4*(2 + n + np.power(n,2))*S2)/(n*(2 + 3*n + np.power(n,2))) # pylint: disable=line-too-long
@@ -159,7 +161,7 @@ def gamma_qg(n, nf):
@nb.njit(cache=True)
-def gamma_gq(n, nf):
+def gamma_gq(n, nf, sx):
"""
Computes the |NLO| gluon-quark singlet anomalous dimension.
@@ -171,6 +173,8 @@ def gamma_gq(n, nf):
Mellin moment
nf : int
Number of active flavors
+ sx : numpy.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2}`
Returns
-------
@@ -178,9 +182,9 @@ def gamma_gq(n, nf):
|NLO| gluon-quark singlet anomalous dimension
:math:`\\gamma_{gq}^{(1)}(N)`
"""
- S1 = harmonics.harmonic_S1(n)
- S2 = harmonics.harmonic_S2(n)
- Sp2p = harmonics.harmonic_S2(n / 2)
+ S1 = sx[0]
+ S2 = sx[1]
+ Sp2p = harmonics.S2(n / 2)
# fmt: off
ggq1_cfcf = (-8 + 2*n*(-12 + n*(-1 + n*(28 + n*(43 + 6*n*(5 + 2*n))))))/((-1 + n)*np.power(n,3)*np.power(1 + n,3)) - (4*(10 + n*(17 + n*(8 + 5*n)))*S1)/((-1 + n)*n*np.power(1 + n,2)) + (4*(2 + n + np.power(n,2))*np.power(S1,2))/(n*(-1 + np.power(n,2))) + (4*(2 + n + np.power(n,2))*S2)/(n*(-1 + np.power(n,2))) # pylint: disable=line-too-long
ggq1_cfca = (-4*(144 + n*(432 + n*(-152 + n*(-1304 + n*(-1031 + n*(695 + n*(1678 + n*(1400 + n*(621 + 109*n))))))))))/(9.*np.power(n,3)*np.power(1 + n,3)*np.power(-2 + n + np.power(n,2),2)) + (4*(-12 + n*(-22 + 41*n + 17*np.power(n,3)))*S1)/(3.*np.power(-1 + n,2)*np.power(n,2)*(1 + n)) + ((8 + 4*n + 4*np.power(n,2))*np.power(S1,2))/(n - np.power(n,3)) + ((8 + 4*n + 4*np.power(n,2))*S2)/(n - np.power(n,3)) + (4*(2 + n + np.power(n,2))*Sp2p)/(n*(-1 + np.power(n,2))) # pylint: disable=line-too-long
@@ -195,7 +199,7 @@ def gamma_gq(n, nf):
@nb.njit(cache=True)
-def gamma_gg(n, nf):
+def gamma_gg(n, nf, sx):
"""
Computes the |NLO| gluon-gluon singlet anomalous dimension.
@@ -207,6 +211,8 @@ def gamma_gg(n, nf):
Mellin moment
nf : int
Number of active flavors
+ sx : numpy.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2}`
Returns
-------
@@ -214,15 +220,13 @@ def gamma_gg(n, nf):
|NLO| gluon-gluon singlet anomalous dimension
:math:`\\gamma_{gg}^{(1)}(N)`
"""
- S1 = harmonics.harmonic_S1(n)
- Sp1p = harmonics.harmonic_S1(n / 2)
- Sp2p = harmonics.harmonic_S2(n / 2)
- Sp3p = harmonics.harmonic_S3(n / 2)
- g3n = harmonics.mellin_g3(n)
- zeta2 = harmonics.zeta2
- zeta3 = harmonics.zeta3
+ S1 = sx[0]
+ Sp1p = harmonics.S1(n / 2)
+ Sp2p = harmonics.S2(n / 2)
+ Sp3p = harmonics.S3(n / 2)
+ g3n = harmonics.g_functions.mellin_g3(n, S1)
# fmt: off
- ggg1_caca = 16*g3n - (2*(576 + n*(1488 + n*(560 + n*(-1248 + n*(-1384 + n*(1663 + n*(4514 + n*(4744 + n*(3030 + n*(1225 + 48*n*(7 + n))))))))))))/(9.*np.power(-1 + n,2)*np.power(n,3)*np.power(1 + n,3)*np.power(2 + n,3)) + S1*(29.77777777777778 + 16/np.power(-1 + n,2) + 16/np.power(1 + n,2) - 16/np.power(2 + n,2) - 8*Sp2p) + (16*(1 + n + np.power(n,2))*Sp2p)/(n*(1 + n)*(-2 + n + np.power(n,2))) - 2*Sp3p - 10*zeta3 + zeta2*(-16*S1 + 16*Sp1p + 16*(-(1/n) + np.log(2))) # pylint: disable=line-too-long
+ ggg1_caca = 16*g3n - (2*(576 + n*(1488 + n*(560 + n*(-1248 + n*(-1384 + n*(1663 + n*(4514 + n*(4744 + n*(3030 + n*(1225 + 48*n*(7 + n))))))))))))/(9.*np.power(-1 + n,2)*np.power(n,3)*np.power(1 + n,3)*np.power(2 + n,3)) + S1*(29.77777777777778 + 16/np.power(-1 + n,2) + 16/np.power(1 + n,2) - 16/np.power(2 + n,2) - 8*Sp2p) + (16*(1 + n + np.power(n,2))*Sp2p)/(n*(1 + n)*(-2 + n + np.power(n,2))) - 2*Sp3p - 10*zeta3 + zeta2*(-16*S1 + 16*Sp1p + 16*(-(1/n) + log2)) # pylint: disable=line-too-long
ggg1_canf = (8*(6 + n*(1 + n)*(28 + n*(1 + n)*(13 + 3*n*(1 + n)))))/(9.*np.power(n,2)*np.power(1 + n,2)*(-2 + n + np.power(n,2))) - (40*S1)/9. # pylint: disable=line-too-long
ggg1_cfnf = (2*(-8 + n*(-8 + n*(-10 + n*(-22 + n*(-3 + n*(6 + n*(8 + n*(4 + n)))))))))/(np.power(n,3)*np.power(1 + n,3)*(-2 + n + np.power(n,2))) # pylint: disable=line-too-long
# fmt: on
@@ -233,7 +237,7 @@ def gamma_gg(n, nf):
@nb.njit(cache=True)
-def gamma_singlet(N, nf):
+def gamma_singlet(n, nf, sx):
r"""
Computes the next-leading-order singlet anomalous dimension matrix
@@ -247,6 +251,8 @@ def gamma_singlet(N, nf):
----------
N : complex
Mellin moment
+ sx : numpy.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2}`
nf : int
Number of active flavors
@@ -263,8 +269,9 @@ def gamma_singlet(N, nf):
gamma_gq : :math:`\gamma_{gq}^{(1)}`
gamma_gg : :math:`\gamma_{gg}^{(1)}`
"""
- gamma_qq = gamma_nsp(N, nf) + gamma_ps(N, nf)
+ gamma_qq = gamma_nsp(n, nf, sx) + gamma_ps(n, nf)
gamma_S_0 = np.array(
- [[gamma_qq, gamma_qg(N, nf)], [gamma_gq(N, nf), gamma_gg(N, nf)]], np.complex_
+ [[gamma_qq, gamma_qg(n, nf, sx)], [gamma_gq(n, nf, sx), gamma_gg(n, nf, sx)]],
+ np.complex_,
)
return gamma_S_0
diff --git a/src/eko/anomalous_dimensions/as3.py b/src/eko/anomalous_dimensions/as3.py
index 1868a7604..49fe1cc0f 100644
--- a/src/eko/anomalous_dimensions/as3.py
+++ b/src/eko/anomalous_dimensions/as3.py
@@ -9,11 +9,7 @@
import numba as nb
import numpy as np
-from . import harmonics
-
-# Global variables
-zeta2 = harmonics.zeta2
-zeta3 = harmonics.zeta3
+from ..harmonics.constants import zeta2, zeta3
@nb.njit(cache=True)
@@ -29,8 +25,8 @@ def gamma_nsm(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -106,8 +102,8 @@ def gamma_nsp(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -183,8 +179,8 @@ def gamma_nsv(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -238,8 +234,8 @@ def gamma_ps(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -310,8 +306,8 @@ def gamma_qg(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -384,8 +380,8 @@ def gamma_gq(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -474,8 +470,8 @@ def gamma_gg(n, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
-------
@@ -566,8 +562,8 @@ def gamma_singlet(N, nf, sx):
Mellin moment
nf : int
Number of active flavors
- sx : np array
- List of harmonic sums
+ sx : np.ndarray
+ List of harmonic sums: :math:`S_{1},S_{2},S_{3}`
Returns
diff --git a/src/eko/anomalous_dimensions/harmonics.py b/src/eko/anomalous_dimensions/harmonics.py
deleted file mode 100644
index ac50d4e9a..000000000
--- a/src/eko/anomalous_dimensions/harmonics.py
+++ /dev/null
@@ -1,305 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Implements higher mathematical functions.
-
-The functions are described in :doc:`Mellin space `.
-"""
-
-import numba as nb
-import numpy as np
-import scipy.special
-
-# compute constants only once
-zeta2 = scipy.special.zeta(2)
-zeta3 = scipy.special.zeta(3)
-zeta4 = scipy.special.zeta(4)
-zeta5 = scipy.special.zeta(5)
-
-
-@nb.njit(cache=True)
-def cern_polygamma(Z, K): # pylint: disable=all
- """
- Computes the polygamma functions :math:`\\psi_k(z)`.
-
- Reimplementation of ``WPSIPG`` (C317) in `CERNlib `_
- :cite:`KOLBIG1972221`.
-
- Note that the SciPy implementation :data:`scipy.special.digamma`
- does not allow for complex inputs.
-
- Parameters
- ----------
- Z : complex
- argument of polygamma function
- K : int
- order of polygamma function
-
- Returns
- -------
- H : complex
- k-th polygamma function :math:`\\psi_k(z)`
- """
- # fmt: off
- DELTA = 5e-13
- R1 = 1
- HF = R1/2
- C1 = np.pi**2
- C2 = 2*np.pi**3
- C3 = 2*np.pi**4
- C4 = 8*np.pi**5
-
- # SGN is originally indexed 0:4 -> no shift
- SGN = [-1,+1,-1,+1,-1]
- # FCT is originally indexed -1:4 -> shift +1
- FCT = [0,1,1,2,6,24]
-
- # C is originally indexed 1:6 x 0:4 -> swap indices and shift new last -1
- C = nb.typed.List()
- C.append([
- 8.33333333333333333e-2,
- -8.33333333333333333e-3,
- 3.96825396825396825e-3,
- -4.16666666666666667e-3,
- 7.57575757575757576e-3,
- -2.10927960927960928e-2])
- C.append([
- 1.66666666666666667e-1,
- -3.33333333333333333e-2,
- 2.38095238095238095e-2,
- -3.33333333333333333e-2,
- 7.57575757575757576e-2,
- -2.53113553113553114e-1])
- C.append([
- 5.00000000000000000e-1,
- -1.66666666666666667e-1,
- 1.66666666666666667e-1,
- -3.00000000000000000e-1,
- 8.33333333333333333e-1,
- -3.29047619047619048e+0])
- C.append([
- 2.00000000000000000e+0,
- -1.00000000000000000e+0,
- 1.33333333333333333e+0,
- -3.00000000000000000e+0,
- 1.00000000000000000e+1,
- -4.60666666666666667e+1])
- C.append([10., -7., 12., -33., 130., -691.])
- U=Z
- X=np.real(U)
- A=np.abs(X)
- if K < 0 or K > 4:
- raise NotImplementedError("Order K has to be in [0:4]")
- if np.abs(np.imag(U)) < DELTA and np.abs(X+int(A)) < DELTA:
- raise ValueError("Argument Z equals non-positive integer")
- K1=K+1
- if X < 0:
- U=-U
- V=U
- H=0
- if A < 15:
- H=1/V**K1
- for I in range(1,14-int(A)+1):
- V=V+1
- H=H+1/V**K1
- V=V+1
- R=1/V**2
- P=R*C[K][6-1]
- for I in range(5,1-1,-1):
- P=R*(C[K][I-1]+P)
- H=SGN[K]*(FCT[K+1]*H+(V*(FCT[K-1+1]+P)+HF*FCT[K+1])/V**K1)
- if K == 0:
- H=H+np.log(V)
- if X < 0:
- V=np.pi*U
- X=np.real(V)
- Y=np.imag(V)
- A=np.sin(X)
- B=np.cos(X)
- T=np.tanh(Y)
- P=complex(B,-A*T)/complex(A,B*T)
- if K == 0:
- H=H+1/U+np.pi*P
- elif K == 1:
- H=-H+1/U**2+C1*(P**2+1)
- elif K == 2:
- H=H+2/U**3+C2*P*(P**2+1)
- elif K == 3:
- R=P**2
- H=-H+6/U**4+C3*((3*R+4)*R+1)
- elif K == 4:
- R=P**2
- H=H+24/U**5+C4*P*((3*R+5)*R+2)
- return H
- # fmt: on
-
-
-@nb.njit(cache=True)
-def harmonic_S1(N):
- r"""
- Computes the harmonic sum :math:`S_1(N)`.
-
- .. math::
- S_1(N) = \sum\limits_{j=1}^N \frac 1 j = \psi_0(N+1)+\gamma_E
-
- with :math:`\psi_0(N)` the digamma function and :math:`\gamma_E` the
- Euler-Mascheroni constant.
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- S_1 : complex
- (simple) Harmonic sum :math:`S_1(N)`
-
- See Also
- --------
- cern_polygamma : :math:`\psi_k(N)`
- """
- return cern_polygamma(N + 1.0, 0) + np.euler_gamma
-
-
-@nb.njit(cache=True)
-def harmonic_S2(N):
- r"""
- Computes the harmonic sum :math:`S_2(N)`.
-
- .. math::
- S_2(N) = \sum\limits_{j=1}^N \frac 1 {j^2} = -\psi_1(N+1)+\zeta(2)
-
- with :math:`\psi_1(N)` the trigamma function and :math:`\zeta` the
- Riemann zeta function.
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- S_2 : complex
- Harmonic sum :math:`S_2(N)`
-
- See Also
- --------
- cern_polygamma : :math:`\psi_k(N)`
- """
- return -cern_polygamma(N + 1.0, 1) + zeta2
-
-
-@nb.njit(cache=True)
-def harmonic_S3(N):
- r"""
- Computes the harmonic sum :math:`S_3(N)`.
-
- .. math::
- S_3(N) = \sum\limits_{j=1}^N \frac 1 {j^3} = \frac 1 2 \psi_2(N+1)+\zeta(3)
-
- with :math:`\psi_2(N)` the 2nd-polygamma function and :math:`\zeta` the
- Riemann zeta function.
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- S_3 : complex
- Harmonic sum :math:`S_3(N)`
-
- See Also
- --------
- cern_polygamma : :math:`\psi_k(N)`
- """
- return 0.5 * cern_polygamma(N + 1.0, 2) + zeta3
-
-
-@nb.njit(cache=True)
-def harmonic_S4(N):
- r"""
- Computes the harmonic sum :math:`S_4(N)`.
-
- .. math::
- S_4(N) = \sum\limits_{j=1}^N \frac 1 {j^4} = - \frac 1 6 \psi_3(N+1)+\zeta(4)
-
- with :math:`\psi_3(N)` the 3rd-polygamma function and :math:`\zeta` the
- Riemann zeta function.
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- S_4 : complex
- Harmonic sum :math:`S_4(N)`
-
- See Also
- --------
- cern_polygamma : :math:`\psi_k(N)`
- """
- return zeta4 - 1.0 / 6.0 * cern_polygamma(N + 1.0, 3)
-
-
-@nb.njit(cache=True)
-def harmonic_S5(N):
- r"""
- Computes the harmonic sum :math:`S_5(N)`.
-
- .. math::
- S_5(N) = \sum\limits_{j=1}^N \frac 1 {j^5} = \frac 1 24 \psi_4(N+1)+\zeta(5)
-
- with :math:`\psi_4(N)` the 4th-polygamma function and :math:`\zeta` the
- Riemann zeta function.
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- S_5 : complex
- Harmonic sum :math:`S_5(N)`
-
- See Also
- --------
- cern_polygamma : :math:`\psi_k(N)`
- """
- return zeta5 + 1.0 / 24.0 * cern_polygamma(N + 1.0, 4)
-
-
-@nb.njit(cache=True)
-def mellin_g3(N):
- r"""
- Computes the Mellin transform of :math:`\text{Li}_2(x)/(1+x)`.
-
- This function appears in the analytic continuation of the harmonic sum
- :math:`S_{-2,1}(N)` which in turn appears in the |NLO| anomalous dimension
- (see :ref:`theory/mellin:harmonic sums`).
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- mellin_g3 : complex
- approximate Mellin transform :math:`\mathcal{M}[\text{Li}_2(x)/(1+x)](N)`
-
- Note
- ----
- We use the name from :cite:`MuselliPhD`, but not his implementation - rather we use the
- Pegasus :cite:`Vogt:2004ns` implementation.
- """
- cs = [1.0000e0, -0.9992e0, 0.9851e0, -0.9005e0, 0.6621e0, -0.3174e0, 0.0699e0]
- g3 = 0
- for j, c in enumerate(cs):
- Nj = N + j
- g3 += c * (zeta2 - harmonic_S1(Nj) / Nj) / Nj
- return g3
diff --git a/src/eko/beta.py b/src/eko/beta.py
index 2254cad86..6a466727d 100644
--- a/src/eko/beta.py
+++ b/src/eko/beta.py
@@ -8,7 +8,7 @@
import numba as nb
from . import constants
-from .anomalous_dimensions.harmonics import zeta3
+from .harmonics.constants import zeta3
@nb.njit(cache=True)
diff --git a/src/eko/evolution_operator/__init__.py b/src/eko/evolution_operator/__init__.py
index 0fadfbedc..69087526a 100644
--- a/src/eko/evolution_operator/__init__.py
+++ b/src/eko/evolution_operator/__init__.py
@@ -367,7 +367,7 @@ def initialize_op_members(self):
zero = OpMember(*[np.zeros((self.grid_size, self.grid_size))] * 2)
for n in self.full_labels:
if n in self.labels:
- # non singlet evolution and diagonal op are identities
+ # non-singlet evolution and diagonal op are identities
if n in br.non_singlet_labels or n[0] == n[1]:
self.op_members[n] = eye.copy()
else:
diff --git a/src/eko/gamma.py b/src/eko/gamma.py
index a9379d83d..6e539562c 100644
--- a/src/eko/gamma.py
+++ b/src/eko/gamma.py
@@ -6,7 +6,7 @@
"""
import numba as nb
-from .anomalous_dimensions.harmonics import zeta3, zeta4, zeta5
+from .harmonics.constants import zeta3, zeta4, zeta5
@nb.njit(cache=True)
diff --git a/src/eko/harmonics/__init__.py b/src/eko/harmonics/__init__.py
new file mode 100644
index 000000000..087ea60f0
--- /dev/null
+++ b/src/eko/harmonics/__init__.py
@@ -0,0 +1,177 @@
+# -*- coding: utf-8 -*-
+"""
+This module contains some harmonics sum.
+Defintion are coming from :cite:`MuselliPhD,Bl_mlein_2000,Blumlein:2009ta`
+"""
+import numba as nb
+import numpy as np
+
+from .w1 import S1, Sm1
+from .w2 import S2, Sm2
+from .w3 import S3, S21, S2m1, Sm2m1, Sm3, Sm21
+from .w4 import S4, S31, S211, Sm4, Sm22, Sm31, Sm211
+from .w5 import S5, S23, S41, S221, S311, S2111, S2m3, S21m2, Sm5, Sm23, Sm221, Sm2111
+
+
+@nb.njit(cache=True)
+def base_harmonics_cache(n, is_singlet, max_weight=5, n_max_sums_weight=7):
+ r"""
+ Get the harmonics sums S basic cache.
+ Only single index harmonics are computed and stored
+ in the first (:math:`S_{n}`) or in the last column (:math:`S_{-n}`)
+
+ Multi indices harmonics sums can be stored in the middle columns.
+
+ Parameters
+ ----------
+ n : complex
+ Mellin moment
+ is_singlet: bool
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+ max_weight : int
+ max harmonics weight, max value 5 (default)
+ n_max_sums_weight : int
+ max number of harmonics sums for a given weight
+
+ Returns
+ -------
+ h_cache : np.ndarray
+ list of harmonics sums: (weights, n_max_sums_weight)
+ """
+ h_cache = np.zeros((max_weight, n_max_sums_weight), dtype=np.complex_)
+ h_cache[:, 0] = sx(n, max_weight)
+ if n_max_sums_weight > 1:
+ h_cache[:, -1] = smx(n, h_cache[:, 0], is_singlet)
+ return h_cache
+
+
+@nb.njit(cache=True)
+def sx(n, max_weight=5):
+ """
+ Get the harmonics sums S cache
+
+ Parameters
+ ----------
+ n : complex
+ Mellin moment
+ max_weight : int
+ max harmonics weight, max value 5 (default)
+
+ Returns
+ -------
+ sx : np.ndarray
+ list of harmonics sums (:math:`S_{1,..,w}`)
+ """
+ sx = np.zeros(max_weight, dtype=np.complex_)
+ if max_weight >= 1:
+ sx[0] = S1(n)
+ if max_weight >= 2:
+ sx[1] = S2(n)
+ if max_weight >= 3:
+ sx[2] = S3(n)
+ if max_weight >= 4:
+ sx[3] = S4(n)
+ if max_weight >= 5:
+ sx[4] = S5(n)
+ return sx
+
+
+@nb.njit(cache=True)
+def smx(n, sx, is_singlet):
+ r"""
+ Get the harmonics S-minus cache
+
+ Parameters
+ ----------
+ n : complex
+ Mellin moment
+ sx : numpy.ndarray
+ List of harmonics sums: :math:`S_{1},\dots,S_{w}`
+ is_singlet: bool
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+ Returns
+ -------
+ smx : np.ndarray
+ list of harmonics sums (:math:`S_{-1,..,-w}`)
+ """
+ max_weight = sx.size
+ smx = np.zeros(max_weight, dtype=np.complex_)
+ if max_weight >= 1:
+ smx[0] = Sm1(n, sx[0], is_singlet)
+ if max_weight >= 2:
+ smx[1] = Sm2(n, sx[1], is_singlet)
+ if max_weight >= 3:
+ smx[2] = Sm3(n, sx[2], is_singlet)
+ if max_weight >= 4:
+ smx[3] = Sm4(n, sx[3], is_singlet)
+ if max_weight >= 5:
+ smx[4] = Sm5(n, sx[4], is_singlet)
+ return smx
+
+
+@nb.njit(cache=True)
+def s3x(n, sx, smx, is_singlet):
+ r"""
+ Compute the weight 3 multi indices harmonics sums cache
+
+ Parameters
+ ----------
+ n: complex
+ Mellin moment
+ sx : list
+ List of harmonics sums: :math:`S_{1},S_{2}`
+ smx : list
+ List of harmonics sums: :math:`S_{-1},S_{-2}`
+ is_singlet: bool
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ s3x: np.ndarray
+ list containing: :math:`S_{2,1},S_{2,-1},S_{-2,1},S_{-2,-1}`
+ """
+ return np.array(
+ [
+ S21(n, sx[0], sx[1]),
+ S2m1(n, sx[1], smx[0], smx[1], is_singlet),
+ Sm21(n, sx[0], smx[0], is_singlet),
+ Sm2m1(n, sx[0], sx[1], smx[1]),
+ ]
+ )
+
+
+@nb.njit(cache=True)
+def s4x(n, sx, smx, is_singlet):
+ r"""
+ Compute the weight 4 multi indices harmonics sums cache
+
+ Parameters
+ ----------
+ n: complex
+ Mellin moment
+ sx : list
+ List of harmonics sums: :math:`S_{1},S_{2},S_{3},S_{4}`
+ smx : list
+ List of harmonics sums: :math:`S_{-1},S_{-2}`
+ is_singlet: bool
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ s4x: np.ndarray
+ list containing: :math:`S_{3,1},S_{2,1,1},S_{-2,2},S_{-2,1,1},S_{-3,1}`
+ """
+ sm31 = Sm31(n, sx[0], smx[0], smx[1], is_singlet)
+ return np.array(
+ [
+ S31(n, sx[0], sx[1], sx[2], sx[3]),
+ S211(n, sx[0], sx[1], sx[2]),
+ Sm22(n, sx[0], sx[1], smx[1], sm31, is_singlet),
+ Sm211(n, sx[0], sx[1], smx[0], is_singlet),
+ sm31,
+ ]
+ )
diff --git a/src/eko/harmonics/constants.py b/src/eko/harmonics/constants.py
new file mode 100644
index 000000000..e11e8b97a
--- /dev/null
+++ b/src/eko/harmonics/constants.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+"""
+Zeta function and other constants.
+"""
+import numpy as np
+from scipy.special import zeta
+
+zeta2 = zeta(2)
+r""":math:`\zeta(2)`"""
+
+zeta3 = zeta(3)
+r""":math:`\zeta(3)`"""
+
+zeta4 = zeta(4)
+r""":math:`\zeta(4)`"""
+
+zeta5 = zeta(5)
+r""":math:`\zeta(5)`"""
+
+
+log2 = np.log(2)
+r""":math:`\ln(2)`"""
+
+li4half = 0.517479
+""":math:`Li_{4}(1/2)`"""
diff --git a/src/eko/matching_conditions/as3/f_functions/__init__.py b/src/eko/harmonics/f_functions/__init__.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/__init__.py
rename to src/eko/harmonics/f_functions/__init__.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f11.py b/src/eko/harmonics/f_functions/f11.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f11.py
rename to src/eko/harmonics/f_functions/f11.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f13.py b/src/eko/harmonics/f_functions/f13.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f13.py
rename to src/eko/harmonics/f_functions/f13.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f14_f12.py b/src/eko/harmonics/f_functions/f14_f12.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f14_f12.py
rename to src/eko/harmonics/f_functions/f14_f12.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f16.py b/src/eko/harmonics/f_functions/f16.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f16.py
rename to src/eko/harmonics/f_functions/f16.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f17.py b/src/eko/harmonics/f_functions/f17.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f17.py
rename to src/eko/harmonics/f_functions/f17.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f18.py b/src/eko/harmonics/f_functions/f18.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f18.py
rename to src/eko/harmonics/f_functions/f18.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f19.py b/src/eko/harmonics/f_functions/f19.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f19.py
rename to src/eko/harmonics/f_functions/f19.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f20.py b/src/eko/harmonics/f_functions/f20.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f20.py
rename to src/eko/harmonics/f_functions/f20.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f21.py b/src/eko/harmonics/f_functions/f21.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f21.py
rename to src/eko/harmonics/f_functions/f21.py
diff --git a/src/eko/matching_conditions/as3/f_functions/f9.py b/src/eko/harmonics/f_functions/f9.py
similarity index 100%
rename from src/eko/matching_conditions/as3/f_functions/f9.py
rename to src/eko/harmonics/f_functions/f9.py
diff --git a/src/eko/matching_conditions/as3/g_functions.py b/src/eko/harmonics/g_functions.py
similarity index 61%
rename from src/eko/matching_conditions/as3/g_functions.py
rename to src/eko/harmonics/g_functions.py
index aff3b8a9f..220dc95ed 100644
--- a/src/eko/matching_conditions/as3/g_functions.py
+++ b/src/eko/harmonics/g_functions.py
@@ -1,15 +1,14 @@
# -*- coding: utf-8 -*-
+"""
+Implemtations of some mellin transformations :cite:`MuselliPhD`
+appearing in the analytic continuation of harmonics sums of weight = 3,4.
+"""
import numba as nb
import numpy as np
-from ...anomalous_dimensions.harmonics import (
- cern_polygamma,
- harmonic_S1,
- harmonic_S2,
- harmonic_S3,
- zeta2,
- zeta3,
-)
+from . import w1
+from .constants import log2, zeta2, zeta3
+from .polygamma import recursive_harmonic_sum as s
a1 = np.array(
[
@@ -63,12 +62,46 @@
p31 = np.array([205.0 / 144.0, -25.0 / 12.0, 23.0 / 24.0, -13.0 / 36.0, 1.0 / 16])
+@nb.njit(cache=True)
+def mellin_g3(N, S1):
+ r"""
+ Computes the Mellin transform of :math:`\text{Li}_2(x)/(1+x)`.
+
+ This function appears in the analytic continuation of the harmonic sum
+ :math:`S_{-2,1}(N)` which in turn appears in the |NLO| anomalous dimension
+ (see :ref:`theory/mellin:harmonic sums`).
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+
+ Returns
+ -------
+ mellin_g3 : complex
+ approximate Mellin transform :math:`\mathcal{M}[\text{Li}_2(x)/(1+x)](N)`
+
+ Note
+ ----
+ We use the name from :cite:`MuselliPhD`, but not his implementation - rather we use the
+ Pegasus :cite:`Vogt:2004ns` implementation.
+ """
+ cs = [1.0000e0, -0.9992e0, 0.9851e0, -0.9005e0, 0.6621e0, -0.3174e0, 0.0699e0]
+ g3 = 0
+ for j, c in enumerate(cs):
+ Nj = N + j
+ g3 += c * (zeta2 - s(S1, N, j, 1) / Nj) / Nj
+ return g3
+
+
@nb.njit(cache=True)
def mellin_g4(N):
r"""
Computes the Mellin transform of :math:`\text{Li}_2(-x)/(1+x)`.
- Implementation and defition in B.5.25 of :cite:`MuselliPhD` or
+ Implementation and definition in B.5.25 of :cite:`MuselliPhD` or
in eq 61 of :cite:`Bl_mlein_2000`, but none of them is fully correct.
@@ -82,26 +115,30 @@ def mellin_g4(N):
mellin_g4 : complex
Mellin transform :math:`\mathcal{M}[\text{Li}_2(-x)/(1+x)](N)`
"""
- g4 = -1 / 2 * zeta2 * np.log(2)
+ g4 = -1 / 2 * zeta2 * log2
for k, ak in enumerate(a1):
Nk = N + k + 1
- beta = 1 / 2 * (harmonic_S1((Nk) / 2) - harmonic_S1((Nk - 1) / 2))
- g4 += ak * (N / Nk * zeta2 / 2 + (k + 1) / Nk**2 * (np.log(2) - beta))
+ beta = 1 / 2 * (w1.S1((Nk) / 2) - w1.S1((Nk - 1) / 2))
+ g4 += ak * (N / Nk * zeta2 / 2 + (k + 1) / Nk**2 * (log2 - beta))
return g4
@nb.njit(cache=True)
-def mellin_g5(N):
+def mellin_g5(N, S1, S2):
r"""
Computes the Mellin transform of :math:`(\text{Li}_2(x)ln(x))/(1+x)`.
- Implementation and defition in B.5.26 of :cite:`MuselliPhD` or
+ Implementation and definition in B.5.26 of :cite:`MuselliPhD` or
in eq 62 of :cite:`Bl_mlein_2000`, but none of them is fully correct.
Parameters
----------
N : complex
Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
Returns
-------
@@ -111,26 +148,25 @@ def mellin_g5(N):
g5 = 0.0
for k, ak in enumerate(a1):
Nk = N + k + 1
- g5 -= ak * (
- (k + 1)
- / Nk**2
- * (zeta2 + cern_polygamma(Nk + 1, 1) - 2 * harmonic_S1(Nk) / Nk)
- )
+ poly1nk = -s(S2, N, k + 1, 2) + zeta2
+ g5 -= ak * ((k + 1) / Nk**2 * (zeta2 + poly1nk - 2 * s(S1, N, k + 1, 1) / Nk))
return g5
@nb.njit(cache=True)
-def mellin_g6(N):
+def mellin_g6(N, S1):
r"""
Computes the Mellin transform of :math:`\text{Li}_3(x)/(1+x)`.
- Implementation and defition in B.5.27 of :cite:`MuselliPhD` or
+ Implementation and definition in B.5.27 of :cite:`MuselliPhD` or
in eq 63 of :cite:`Bl_mlein_2000`, but none of them is fully correct.
Parameters
----------
N : complex
Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
Returns
-------
@@ -139,37 +175,43 @@ def mellin_g6(N):
"""
- g6 = zeta3 * np.log(2)
+ g6 = zeta3 * log2
for k, ak in enumerate(a1):
Nk = N + k + 1
- g6 -= ak * (N / Nk * zeta3 + (k + 1) / Nk**2 * (zeta2 - harmonic_S1(Nk) / Nk))
+ g6 -= ak * (
+ N / Nk * zeta3 + (k + 1) / Nk**2 * (zeta2 - s(S1, N, k + 1, 1) / Nk)
+ )
return g6
@nb.njit(cache=True)
-def mellin_g8(N):
+def mellin_g8(N, S1, S2):
r"""
Computes the Mellin transform of :math:`S_{1,2}(x)/(1+x)`.
- Implementation and defition in B.5.29 of :cite:`MuselliPhD` or
+ Implementation and definition in B.5.29 of :cite:`MuselliPhD` or
in eq 65 of :cite:`Bl_mlein_2000`, but none of them is fully correct.
Parameters
----------
N : complex
Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
Returns
-------
mellin_g8 : complex
Mellin transform :math:`\mathcal{M}[S_{1,2}(x)/(1+x)](N)`
"""
- g8 = zeta3 * np.log(2)
+ g8 = zeta3 * log2
for k, ak in enumerate(a1):
Nk = N + k + 1
g8 -= ak * (
N / Nk * zeta3
- + (k + 1) / Nk**2 * 1 / 2 * (harmonic_S1(Nk) ** 2 + harmonic_S2(Nk))
+ + (k + 1) / Nk**2 * 1 / 2 * (s(S1, N, k + 1, 1) ** 2 + s(S2, N, k + 1, 2))
)
return g8
@@ -179,7 +221,7 @@ def mellin_g18(N, S1, S2):
r"""
Computes the Mellin transform of :math:`-(\text{Li}_2(x) - \zeta_2)/(1-x)`.
- Implementation and defition in eq 124 of :cite:`Bl_mlein_2000`
+ Implementation and definition in eq 124 of :cite:`Bl_mlein_2000`
Note: comparing to :cite:`Bl_mlein_2000`, we believe :cite:`MuselliPhD`
was not changing the notations of :math:`P^{(1)}_{2}` to :math:`P^{(1)}_{1}`.
@@ -191,9 +233,9 @@ def mellin_g18(N, S1, S2):
N : complex
Mellin moment
S1 : complex
- harmonics.harmonic_S1(N)
+ Harmonic sum :math:`S_{1}(N)`
S2 : complex
- harmonics.harmonic_S2(N)
+ Harmonic sum :math:`S_{2}(N)`
Returns
-------
mellin_g18 : complex
@@ -202,10 +244,10 @@ def mellin_g18(N, S1, S2):
g18 = (S1**2 + S2) / (N) - zeta2 * S1
for k, ck in enumerate(c1):
Nk = N + k
- g18 += ck * (N) / (Nk) * harmonic_S1(Nk)
+ g18 += ck * (N) / (Nk) * s(S1, N, k, 1)
for k, p11k in enumerate(p11):
Nk = N + k
- g18 -= p11k * (N) / (Nk) * (harmonic_S1(Nk) ** 2 + harmonic_S2(Nk))
+ g18 -= p11k * (N) / (Nk) * (s(S1, N, k, 1) ** 2 + s(S2, N, k, 2))
return g18
@@ -214,7 +256,7 @@ def mellin_g19(N, S1):
r"""
Computes the Mellin transform of :math:`-(\text{Li}_2(-x) + \zeta_2/2)/(1-x)`.
- Implementation and defition in B.5.40 of :cite:`MuselliPhD` or in 125 of
+ Implementation and definition in B.5.40 of :cite:`MuselliPhD` or in 125 of
:cite:`Bl_mlein_2000`, but none of them is fully correct.
Parameters
@@ -222,7 +264,7 @@ def mellin_g19(N, S1):
N : complex
Mellin moment
S1 : complex
- harmonics.harmonic_S1(N)
+ Harmonic sum :math:`S_{1}(N)`
Returns
-------
@@ -231,8 +273,7 @@ def mellin_g19(N, S1):
"""
g19 = 1 / 2 * zeta2 * S1
for k, ak in enumerate(a1):
- Nk = N + k
- g19 -= ak / (k + 1) * harmonic_S1(Nk + 1)
+ g19 -= ak / (k + 1) * s(S1, N, k + 1, 1)
return g19
@@ -241,7 +282,7 @@ def mellin_g21(N, S1, S2, S3):
r"""
Computes the Mellin transform of :math:`-(S_{1,2}(x) - \zeta_3)/(1-x)`.
- Implementation and defition in B.5.42 of :cite:`MuselliPhD`
+ Implementation and definition in B.5.42 of :cite:`MuselliPhD`
Note: comparing to :cite:`Bl_mlein_2000`, we believe :cite:`MuselliPhD`
was not changing the notations of :math:`P^{(3)}_{2}` to :math:`P^{(3)}_{1}`
@@ -254,11 +295,11 @@ def mellin_g21(N, S1, S2, S3):
N : complex
Mellin moment
S1 : complex
- harmonics.harmonic_S1(N)
+ Harmonic sum :math:`S_{1}(N)`
S2 : complex
- harmonics.harmonic_S2(N)
+ Harmonic sum :math:`S_{2}(N)`
S3 : complex
- harmonics.harmonic_S3(N)
+ Harmonic sum :math:`S_{3}(N)`
Returns
-------
@@ -268,31 +309,29 @@ def mellin_g21(N, S1, S2, S3):
g21 = -zeta3 * S1 + (S1**3 + 3 * S1 * S2 + 2 * S3) / (2 * N)
for k, ck in enumerate(c3):
Nk = N + k
- g21 += ck * N / Nk * harmonic_S1(Nk)
+ g21 += ck * N / Nk * s(S1, N, k, 1)
for k in range(0, 5):
Nk = N + k
+ S1nk = s(S1, N, k, 1)
+ S2nk = s(S2, N, k, 2)
+ S3nk = s(S3, N, k, 3)
g21 += (
N
/ Nk
* (
- p32[k]
- * (
- harmonic_S1(Nk) ** 3
- + 3 * harmonic_S1(Nk) * harmonic_S2(Nk)
- + 2 * harmonic_S3(Nk)
- )
- - p31[k] * (harmonic_S1(Nk) ** 2 + harmonic_S2(Nk))
+ p32[k] * (S1nk**3 + 3 * S1nk * S2nk + 2 * S3nk)
+ - p31[k] * (S1nk**2 + S2nk)
)
)
return g21
@nb.njit(cache=True)
-def mellin_g22(N):
+def mellin_g22(N, S1, S2, S3):
r"""
Computes the Mellin transform of :math:`-(\text{Li}_2(x) ln(x))/(1-x)`.
- Implementation and defition in B.5.43 of :cite:`MuselliPhD`
+ Implementation and definition in B.5.43 of :cite:`MuselliPhD`
Note: comparing to :cite:`Bl_mlein_2000`, we believe :cite:`MuselliPhD`
was not changing the notations of :math:`P^{(1)}_{2}` to :math:`P^{(1)}_{1}`
@@ -303,6 +342,12 @@ def mellin_g22(N):
----------
N : complex
Mellin moment
+ S1 : complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2 : complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3 : complex
+ Harmonic sum :math:`S_{3}(N)`
Returns
-------
@@ -311,12 +356,11 @@ def mellin_g22(N):
"""
g22 = 0.0
for k, ck in enumerate(c1):
- Nk = N + k
- g22 += ck * cern_polygamma(Nk + 1, 1)
+ poly1nk = -s(S2, N, k, 2) + zeta2
+ g22 += ck * poly1nk
for k, p11k in enumerate(p11):
- Nk = N + k
- g22 -= p11k * (
- harmonic_S1(Nk) * cern_polygamma(Nk + 1, 1)
- - 1 / 2 * cern_polygamma(Nk + 1, 2)
- )
+ S1nk = s(S1, N, k, 1)
+ poly1nk = -s(S2, N, k, 2) + zeta2
+ poly2nk = 2 * s(S3, N, k, 3) + zeta3
+ g22 -= p11k * (S1nk * poly1nk - 1 / 2 * poly2nk)
return g22
diff --git a/src/eko/harmonics/polygamma.py b/src/eko/harmonics/polygamma.py
new file mode 100644
index 000000000..b63ce5846
--- /dev/null
+++ b/src/eko/harmonics/polygamma.py
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*-
+"""
+Implements higher mathematical functions.
+
+The functions are described in :doc:`Mellin space `.
+"""
+
+import numba as nb
+import numpy as np
+
+
+@nb.njit(cache=True)
+def cern_polygamma(Z, K): # pylint: disable=all
+ """
+ Computes the polygamma functions :math:`\\psi_k(z)`.
+
+ Reimplementation of ``WPSIPG`` (C317) in `CERNlib `_
+ :cite:`KOLBIG1972221`.
+
+ Note that the SciPy implementation :data:`scipy.special.digamma`
+ does not allow for complex inputs.
+
+ Parameters
+ ----------
+ Z : complex
+ argument of polygamma function
+ K : int
+ order of polygamma function
+
+ Returns
+ -------
+ H : complex
+ k-th polygamma function :math:`\\psi_k(z)`
+ """
+ # fmt: off
+ DELTA = 5e-13
+ R1 = 1
+ HF = R1/2
+ C1 = np.pi**2
+ C2 = 2*np.pi**3
+ C3 = 2*np.pi**4
+ C4 = 8*np.pi**5
+
+ # SGN is originally indexed 0:4 -> no shift
+ SGN = [-1,+1,-1,+1,-1]
+ # FCT is originally indexed -1:4 -> shift +1
+ FCT = [0,1,1,2,6,24]
+
+ # C is originally indexed 1:6 x 0:4 -> swap indices and shift new last -1
+ C = nb.typed.List()
+ C.append([
+ 8.33333333333333333e-2,
+ -8.33333333333333333e-3,
+ 3.96825396825396825e-3,
+ -4.16666666666666667e-3,
+ 7.57575757575757576e-3,
+ -2.10927960927960928e-2])
+ C.append([
+ 1.66666666666666667e-1,
+ -3.33333333333333333e-2,
+ 2.38095238095238095e-2,
+ -3.33333333333333333e-2,
+ 7.57575757575757576e-2,
+ -2.53113553113553114e-1])
+ C.append([
+ 5.00000000000000000e-1,
+ -1.66666666666666667e-1,
+ 1.66666666666666667e-1,
+ -3.00000000000000000e-1,
+ 8.33333333333333333e-1,
+ -3.29047619047619048e+0])
+ C.append([
+ 2.00000000000000000e+0,
+ -1.00000000000000000e+0,
+ 1.33333333333333333e+0,
+ -3.00000000000000000e+0,
+ 1.00000000000000000e+1,
+ -4.60666666666666667e+1])
+ C.append([10., -7., 12., -33., 130., -691.])
+ U=Z
+ X=np.real(U)
+ A=np.abs(X)
+ if K < 0 or K > 4:
+ raise NotImplementedError("Order K has to be in [0:4]")
+ if np.abs(np.imag(U)) < DELTA and np.abs(X+int(A)) < DELTA:
+ raise ValueError("Argument Z equals non-positive integer")
+ K1=K+1
+ if X < 0:
+ U=-U
+ V=U
+ H=0
+ if A < 15:
+ H=1/V**K1
+ for I in range(1,14-int(A)+1):
+ V=V+1
+ H=H+1/V**K1
+ V=V+1
+ R=1/V**2
+ P=R*C[K][6-1]
+ for I in range(5,1-1,-1):
+ P=R*(C[K][I-1]+P)
+ H=SGN[K]*(FCT[K+1]*H+(V*(FCT[K-1+1]+P)+HF*FCT[K+1])/V**K1)
+ if K == 0:
+ H=H+np.log(V)
+ if X < 0:
+ V=np.pi*U
+ X=np.real(V)
+ Y=np.imag(V)
+ A=np.sin(X)
+ B=np.cos(X)
+ T=np.tanh(Y)
+ P=complex(B,-A*T)/complex(A,B*T)
+ if K == 0:
+ H=H+1/U+np.pi*P
+ elif K == 1:
+ H=-H+1/U**2+C1*(P**2+1)
+ elif K == 2:
+ H=H+2/U**3+C2*P*(P**2+1)
+ elif K == 3:
+ R=P**2
+ H=-H+6/U**4+C3*((3*R+4)*R+1)
+ elif K == 4:
+ R=P**2
+ H=H+24/U**5+C4*P*((3*R+5)*R+2)
+ return H
+ # fmt: on
+
+
+@nb.njit(cache=True)
+def recursive_harmonic_sum(base_value, n, iterations, weight):
+ """
+ Compute the harmonic sum :math:`S_{w}(N+k)` stating from the value
+ :math:`S_{w}(N)` via the recurrence relations.
+
+ Parameters
+ ----------
+ base_value: complex
+ starting value :math:`S_{w}(N)`
+ n: complex
+ starting point
+ iterations: int
+ number of iterations
+ weight: int
+ harmonic sum weight
+
+ Returns
+ -------
+ sni : complex
+ :math:`S_{w}(N+k)`
+ """
+ fact = 0.0
+ for i in range(1, iterations + 1):
+ fact += 1.0 / (n + i) ** weight
+ return base_value + fact
+
+
+@nb.njit(cache=True)
+def symmetry_factor(N, is_singlet=None):
+ """
+ Compute the analytical continuation of :math:`(-1)^N`
+
+ Parameters
+ ----------
+ N: complex
+ Mellin moment
+ is_singlet: bool, None
+ True for singlet like quantities
+ False for non-singlet like quantities
+ None for generic complex N value
+
+ Returns
+ -------
+ eta: complex
+ 1 for singlet like quantities,
+ -1 for non-singlet like quantities,
+ :math:`(-1)^N` elsewise
+ """
+ if is_singlet is None:
+ return (-1) ** N
+ if is_singlet:
+ return 1
+ return -1
diff --git a/src/eko/harmonics/w1.py b/src/eko/harmonics/w1.py
new file mode 100644
index 000000000..27255d652
--- /dev/null
+++ b/src/eko/harmonics/w1.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+"""
+Weight 1 harmonic sums.
+"""
+import numba as nb
+import numpy as np
+
+from .polygamma import cern_polygamma
+
+
+@nb.njit(cache=True)
+def S1(N):
+ r"""
+ Computes the harmonic sum :math:`S_1(N)`.
+
+ .. math::
+ S_1(N) = \sum\limits_{j=1}^N \frac 1 j = \psi_0(N+1)+\gamma_E
+
+ with :math:`\psi_0(N)` the digamma function and :math:`\gamma_E` the
+ Euler-Mascheroni constant.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+
+ Returns
+ -------
+ S_1 : complex
+ (simple) Harmonic sum :math:`S_1(N)`
+
+ See Also
+ --------
+ eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)`
+ """
+ return cern_polygamma(N + 1.0, 0) + np.euler_gamma
+
+
+@nb.njit(cache=True)
+def Sm1(N, hS1, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-1}(N)`.
+
+ .. math::
+ S_{-1}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} j
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ hS1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+ Returns
+ -------
+ Sm1 : complex
+ Harmonic sum :math:`S_{-1}(N)`
+
+ See Also
+ --------
+ eko.anomalous_dimension.w1.S1 : :math:`S_1(N)`
+ """
+ if is_singlet is None:
+ return (
+ (1 - (-1) ** N) / 2 * S1((N - 1) / 2)
+ + ((-1) ** N + 1) / 2 * S1(N / 2)
+ - hS1
+ )
+ if is_singlet:
+ return S1(N / 2) - hS1
+ return S1((N - 1) / 2) - hS1
diff --git a/src/eko/harmonics/w2.py b/src/eko/harmonics/w2.py
new file mode 100644
index 000000000..9fcd6218d
--- /dev/null
+++ b/src/eko/harmonics/w2.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+"""
+Weight 2 harmonic sums.
+"""
+import numba as nb
+
+from .constants import zeta2
+from .polygamma import cern_polygamma
+
+
+@nb.njit(cache=True)
+def S2(N):
+ r"""
+ Computes the harmonic sum :math:`S_2(N)`.
+
+ .. math::
+ S_2(N) = \sum\limits_{j=1}^N \frac 1 {j^2} = -\psi_1(N+1)+\zeta(2)
+
+ with :math:`\psi_1(N)` the trigamma function and :math:`\zeta` the
+ Riemann zeta function.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+
+ Returns
+ -------
+ S_2 : complex
+ Harmonic sum :math:`S_2(N)`
+
+ See Also
+ --------
+ eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)`
+ """
+ return -cern_polygamma(N + 1.0, 1) + zeta2
+
+
+@nb.njit(cache=True)
+def Sm2(N, hS2, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2}(N)`.
+
+ .. math::
+ S_{-2}(N) = \sum\limits_{j=1}^N \frac {(-1)^j}{j^2}
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ hS2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm2 : complex
+ Harmonic sum :math:`S_{-2}(N)`
+
+ See Also
+ --------
+ eko.anomalous_dimension.w2.S2 : :math:`S_2(N)`
+ """
+ if is_singlet is None:
+ return (
+ 1
+ / 2
+ * ((1 - (-1) ** N) / 2 * S2((N - 1) / 2) + ((-1) ** N + 1) / 2 * S2(N / 2))
+ - hS2
+ )
+ if is_singlet:
+ return 1 / 2 * S2(N / 2) - hS2
+ return 1 / 2 * S2((N - 1) / 2) - hS2
diff --git a/src/eko/harmonics/w3.py b/src/eko/harmonics/w3.py
new file mode 100644
index 000000000..ad12aedb1
--- /dev/null
+++ b/src/eko/harmonics/w3.py
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+"""
+Weight 3 harmonic sums.
+"""
+import numba as nb
+
+from . import g_functions as gf
+from .constants import log2, zeta2, zeta3
+from .polygamma import cern_polygamma, symmetry_factor
+
+
+@nb.njit(cache=True)
+def S3(N):
+ r"""
+ Computes the harmonic sum :math:`S_3(N)`.
+
+ .. math::
+ S_3(N) = \sum\limits_{j=1}^N \frac 1 {j^3} = \frac 1 2 \psi_2(N+1)+\zeta(3)
+
+ with :math:`\psi_2(N)` the 2nd-polygamma function and :math:`\zeta` the
+ Riemann zeta function.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+
+ Returns
+ -------
+ S_3 : complex
+ Harmonic sum :math:`S_3(N)`
+
+ See Also
+ --------
+ eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)`
+ """
+ return 0.5 * cern_polygamma(N + 1.0, 2) + zeta3
+
+
+@nb.njit(cache=True)
+def Sm3(N, hS3, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-3}(N)`.
+
+ .. math::
+ S_{-3}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} {j^3}
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ hS3: complex
+ Harmonic sum :math:`S_{3}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm3 : complex
+ Harmonic sum :math:`S_{-3}(N)`
+
+ See Also
+ --------
+ eko.harmonics.w3.S3 : :math:`S_3(N)`
+ """
+ if is_singlet is None:
+ return (
+ 1
+ / 2**2
+ * ((1 - (-1) ** N) / 2 * S3((N - 1) / 2) + ((-1) ** N + 1) / 2 * S3(N / 2))
+ - hS3
+ )
+ if is_singlet:
+ return 1 / 2**2 * S3(N / 2) - hS3
+ return 1 / 2**2 * S3((N - 1) / 2) - hS3
+
+
+@nb.njit(cache=True)
+def S21(N, S1, S2):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,1}(N)`
+ as implemented in eq B.5.77 of :cite:`MuselliPhD` and eq 37 of :cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+
+ Returns
+ -------
+ S21 : complex
+ Harmonic sum :math:`S_{2,1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g18 : :math:`g_18(N)`
+ """
+ return -gf.mellin_g18(N, S1, S2) + 2 * zeta3
+
+
+@nb.njit(cache=True)
+def Sm21(N, S1, Sm1, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,1}(N)`
+ as implemented in eq B.5.75 of :cite:`MuselliPhD` and eq 22 of :cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm21 : complex
+ Harmonic sum :math:`S_{-2,1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions : :math:`g_3(N)`
+ """
+ # Note mellin g3 was integrated following x^(N-1) convention.
+ eta = symmetry_factor(N, is_singlet)
+ return (
+ -eta * gf.mellin_g3(N + 1, S1 + 1 / (N + 1))
+ + zeta2 * Sm1
+ - 5 / 8 * zeta3
+ + zeta2 * log2
+ )
+
+
+@nb.njit(cache=True)
+def S2m1(N, S2, Sm1, Sm2, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,-1}(N)`
+ as implemented in eq B.5.76 of :cite:`MuselliPhD` and eq 23 of :cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ S2m1 : complex
+ Harmonic sum :math:`S_{2,-1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g4 : :math:`g_4(N)`
+ """
+ eta = symmetry_factor(N, is_singlet)
+ return (
+ -eta * gf.mellin_g4(N)
+ - log2 * (S2 - Sm2)
+ - 1 / 2 * zeta2 * Sm1
+ + 1 / 4 * zeta3
+ - 1 / 2 * zeta2 * log2
+ )
+
+
+@nb.njit(cache=True)
+def Sm2m1(N, S1, S2, Sm2):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,-1}(N)`
+ as implemented in eq B.5.74 of :cite:`MuselliPhD` and eq 38 of :cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+
+ Returns
+ -------
+ Sm2m1 : complex
+ Harmonic sum :math:`S_{-2,-1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g19 : :math:`g_19(N)`
+ """
+ return -gf.mellin_g19(N, S1) + log2 * (S2 - Sm2) - 5 / 8 * zeta3
diff --git a/src/eko/harmonics/w4.py b/src/eko/harmonics/w4.py
new file mode 100644
index 000000000..2c46266dc
--- /dev/null
+++ b/src/eko/harmonics/w4.py
@@ -0,0 +1,261 @@
+# -*- coding: utf-8 -*-
+"""
+Weight 4 harmonic sums.
+"""
+import numba as nb
+
+from . import g_functions as gf
+from .constants import li4half, log2, zeta2, zeta3, zeta4
+from .polygamma import cern_polygamma, symmetry_factor
+
+
+@nb.njit(cache=True)
+def S4(N):
+ r"""
+ Computes the harmonic sum :math:`S_4(N)`.
+
+ .. math::
+ S_4(N) = \sum\limits_{j=1}^N \frac 1 {j^4} = - \frac 1 6 \psi_3(N+1)+\zeta(4)
+
+ with :math:`\psi_3(N)` the 3rd-polygamma function and :math:`\zeta` the
+ Riemann zeta function.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+
+ Returns
+ -------
+ S_4 : complex
+ Harmonic sum :math:`S_4(N)`
+
+ See Also
+ --------
+ eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)`
+ """
+ return zeta4 - 1.0 / 6.0 * cern_polygamma(N + 1.0, 3)
+
+
+@nb.njit(cache=True)
+def Sm4(N, hS4, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-4}(N)`.
+
+ .. math::
+ S_{-4}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} {j^4}
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ hS4: complex
+ Harmonic sum :math:`S_{4}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm4 : complex
+ Harmonic sum :math:`S_{-4}(N)`
+
+ See Also
+ --------
+ eko.anomalous_dimension.w4.S4 : :math:`S_4(N)`
+ """
+ if is_singlet is None:
+ return (
+ 1
+ / 2**3
+ * ((1 - (-1) ** N) / 2 * S4((N - 1) / 2) + ((-1) ** N + 1) / 2 * S4(N / 2))
+ - hS4
+ )
+ if is_singlet:
+ return 1 / 2**3 * S4(N / 2) - hS4
+ return 1 / 2**3 * S4((N - 1) / 2) - hS4
+
+
+@nb.njit(cache=True)
+def Sm31(N, S1, Sm1, Sm2, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-3,1}(N)`
+ as implemented in eq B.5.93 of :cite:`MuselliPhD` and eq 25 of cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm31 : complex
+ Harmonic sum :math:`S_{-3,1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g6 : :math:`g_6(N)`
+ """
+ eta = symmetry_factor(N, is_singlet)
+ return (
+ eta * gf.mellin_g6(N, S1)
+ + zeta2 * Sm2
+ - zeta3 * Sm1
+ - 3 / 5 * zeta2**2
+ + 2 * li4half
+ + 3 / 4 * zeta3 * log2
+ - 1 / 2 * zeta2 * log2**2
+ + 1 / 12 * log2**4
+ )
+
+
+@nb.njit(cache=True)
+def Sm22(N, S1, S2, Sm2, Sm31, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,2}(N)`
+ as implemented in eq B.5.94 of :cite:`MuselliPhD` and eq 24 of cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+ Sm31: complex
+ Harmonic sum :math:`S_{-3,1}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+ Returns
+ -------
+ Sm22 : complex
+ Harmonic sum :math:`S_{-2,2}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g5 : :math:`g_5(N)`
+ """
+ eta = symmetry_factor(N, is_singlet)
+ return (
+ eta * gf.mellin_g5(N, S1, S2) - 2 * Sm31 + 2 * zeta2 * Sm2 + 3 / 40 * zeta2**2
+ )
+
+
+@nb.njit(cache=True)
+def Sm211(N, S1, S2, Sm1, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,1,1}(N)`
+ as implemented in eq B.5.104 of :cite:`MuselliPhD` and eq 27 of cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm221 : complex
+ Harmonic sum :math:`S_{-2,1,1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g8 : :math:`g_8(N)`
+ """
+ eta = symmetry_factor(N, is_singlet)
+ return (
+ -eta * gf.mellin_g8(N, S1, S2)
+ + zeta3 * Sm1
+ - li4half
+ + 1 / 8 * zeta2**2
+ + 1 / 8 * zeta3 * log2
+ + 1 / 4 * zeta2 * log2**2
+ - 1 / 24 * log2**4
+ )
+
+
+@nb.njit(cache=True)
+def S211(N, S1, S2, S3):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,1,1}(N)`
+ as implemented in eq B.5.115 of :cite:`MuselliPhD` and eq 40 of cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3: complex
+ Harmonic sum :math:`S_{3}(N)`
+
+ Returns
+ -------
+ S211 : complex
+ Harmonic sum :math:`S_{2,1,1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g21 : :math:`g_21(N)`
+ """
+ return -gf.mellin_g21(N, S1, S2, S3) + 6 / 5 * zeta2**2
+
+
+@nb.njit(cache=True)
+def S31(N, S1, S2, S3, S4):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{3,1}(N)`
+ as implemented in eq B.5.99 of :cite:`MuselliPhD` and eq 41 of cite:`Bl_mlein_2000`.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3: complex
+ Harmonic sum :math:`S_{3}(N)`
+ S4: complex
+ Harmonic sum :math:`S_{4}(N)`
+
+ Returns
+ -------
+ S31 : complex
+ Harmonic sum :math:`S_{3,1}(N)`
+
+ See Also
+ --------
+ eko.harmonics.g_functions.mellin_g22 : :math:`g_22(N)`
+ """
+ return (
+ 1 / 2 * gf.mellin_g22(N, S1, S2, S3)
+ - 1 / 4 * S4
+ - 1 / 4 * S2**2
+ + zeta2 * S2
+ - 3 / 20 * zeta2**2
+ )
diff --git a/src/eko/harmonics/w5.py b/src/eko/harmonics/w5.py
new file mode 100644
index 000000000..c55a842b2
--- /dev/null
+++ b/src/eko/harmonics/w5.py
@@ -0,0 +1,444 @@
+# -*- coding: utf-8 -*-
+"""
+Weight 5 harmonic sums.
+"""
+import numba as nb
+
+from . import f_functions as f
+from .constants import log2, zeta2, zeta3, zeta4, zeta5
+from .polygamma import cern_polygamma, symmetry_factor
+
+
+@nb.njit(cache=True)
+def S5(N):
+ r"""
+ Computes the harmonic sum :math:`S_5(N)`.
+
+ .. math::
+ S_5(N) = \sum\limits_{j=1}^N \frac 1 {j^5} = \frac 1 24 \psi_4(N+1)+\zeta(5)
+
+ with :math:`\psi_4(N)` the 4th-polygamma function and :math:`\zeta` the
+ Riemann zeta function.
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+
+ Returns
+ -------
+ S_5 : complex
+ Harmonic sum :math:`S_5(N)`
+
+ See Also
+ --------
+ eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)`
+ """
+ return zeta5 + 1.0 / 24.0 * cern_polygamma(N + 1.0, 4)
+
+
+@nb.njit(cache=True)
+def Sm5(N, hS5, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-5}(N)`.
+
+ .. math::
+ S_{-5}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} {j^5}
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ hS5: complex
+ Harmonic sum :math:`S_{5}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm5 : complex
+ Harmonic sum :math:`S_{-5}(N)`
+
+ See Also
+ --------
+ eko.harmonic.w5.S5 : :math:`S_5(N)`
+ """
+ if is_singlet is None:
+ return (
+ 1
+ / 2**4
+ * ((1 - (-1) ** N) / 2 * S5((N - 1) / 2) + ((-1) ** N + 1) / 2 * S5(N / 2))
+ - hS5
+ )
+ if is_singlet:
+ return 1 / 2**4 * S5(N / 2) - hS5
+ return 1 / 2**4 * S5((N - 1) / 2) - hS5
+
+
+@nb.njit(cache=True)
+def S41(N, S1, S2, S3):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{4,1}(N)`
+ as implemented in eq 9.1 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3: complex
+ Harmonic sum :math:`S_{3}(N)`
+
+ Returns
+ -------
+ S41 : complex
+ Harmonic sum :math:`S_{4,1}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F9 :
+ :math:`\mathcal{M}[(\text{Li}_4(x)/(x-1))_{+}](N)`
+ """
+ return -f.F9(N, S1) + S1 * zeta4 - S2 * zeta3 + S3 * zeta2
+
+
+@nb.njit(cache=True)
+def S311(N, S1, S2):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{3,1,1}(N)`
+ as implemented in eq 9.21 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+
+ Returns
+ -------
+ S311 : complex
+ Harmonic sum :math:`S_{3,1,1}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F11 :
+ :math:`\mathcal{M}[(\text{S}_{2,2}(x)/(x-1))_{+}](N)`
+ """
+ return f.F11(N, S1, S2) + zeta3 * S2 - zeta4 / 4 * S1
+
+
+@nb.njit(cache=True)
+def S221(N, S1, S2, S21):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,2,1}(N)`
+ as implemented in eq 9.23 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S21: complex
+ Harmonic sum :math:`S_{2,1}(N)`
+
+ Returns
+ -------
+ S221 : complex
+ Harmonic sum :math:`S_{2,2,1}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F11 :
+ :math:`\mathcal{M}[(\text{S}_{2,2}(x)/(x-1))_{+}](N)`
+ eko.harmonic.f_functions.F13 :
+ :math:`\mathcal{M}[(\text{Li}_{2}^2(x)/(x-1))_{+}](N)`
+ """
+ return (
+ -2 * f.F11(N, S1, S2)
+ + 1 / 2 * f.F13(N, S1, S2)
+ + zeta2 * S21
+ - 3 / 10 * zeta2**2 * S1
+ )
+
+
+@nb.njit(cache=True)
+def Sm221(N, S1, Sm1, S21, Sm21):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,2,1}(N)`
+ as implemented in eq 9.25 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ S21: complex
+ Harmonic sum :math:`S_{2,1}(N)`
+ Sm21: complex
+ Harmonic sum :math:`S_{-2,1}(N)`
+
+ Returns
+ -------
+ Sm221 : complex
+ Harmonic sum :math:`S_{-2,2,1}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F14F12 :
+ :math:`\mathcal{M}[(2 \text{S}_{2,2}(x) - 1/2 \text{Li}_{2}^2(x))/(x+1)](N)`
+ """
+ return (
+ (-1) ** (N + 1) * (f.F14F12(N, S1, S21))
+ + zeta2 * Sm21
+ - 3 / 10 * zeta2**2 * Sm1
+ - 0.119102
+ + 0.0251709
+ )
+
+
+@nb.njit(cache=True)
+def S21m2(N, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,1,-2}(N)`
+ as implemented in eq 9.26 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+ Sm3: complex
+ Harmonic sum :math:`S_{-3}(N)`
+ S21: complex
+ Harmonic sum :math:`S_{2,1}(N)`
+ Sm21: complex
+ Harmonic sum :math:`S_{-2,1}(N)`
+ S2m1: complex
+ Harmonic sum :math:`S_{2,-1}(N)`
+
+ Returns
+ -------
+ S21m2 : complex
+ Harmonic sum :math:`S_{2,1,-2}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F14F12 :
+ :math:`\mathcal{M}[
+ (\text{ln}(x) \text{S}_{1,2}(−x) − \text{Li}_2^2(−x)/2)/(x+1)
+ ](N)`
+ """
+ return (
+ (-1) ** (N) * f.F16(N, S1, Sm1, Sm2, Sm3, Sm21)
+ - 1 / 2 * zeta2 * (S21 - S2m1)
+ - (1 / 8 * zeta3 - 1 / 2 * zeta2 * log2) * (S2 - Sm2)
+ + 1 / 8 * zeta2**2 * Sm1
+ + 0.0854806
+ )
+
+
+@nb.njit(cache=True)
+def S2111(N, S1, S2, S3):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,1,1,1}(N)`
+ as implemented in eq 9.33 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3: complex
+ Harmonic sum :math:`S_{3}(N)`
+
+ Returns
+ -------
+ S2111 : complex
+ Harmonic sum :math:`S_{2,1,1,1}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F17 :
+ :math:`\mathcal{M}[(\text{S}_{1,3}(x)/(x-1))_{+}](N)`
+ """
+ return -f.F17(N, S1, S2, S3) + zeta4 * S1
+
+
+@nb.njit(cache=True)
+def Sm2111(N, S1, S2, S3, Sm1):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,1,1,1}(N)`
+ as implemented in eq 9.34 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3: complex
+ Harmonic sum :math:`S_{3}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+
+ Returns
+ -------
+ Sm2111 : complex
+ Harmonic sum :math:`S_{-2,1,1,1}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F18 :
+ :math:`\mathcal{M}[\text{S}_{1,3}(x)/(x+1)](N)`
+ """
+ return (
+ (-1) ** (N + 1) * f.F18(N, S1, S2, S3)
+ + zeta4 * Sm1
+ - 0.706186
+ + 0.693147 * zeta4
+ )
+
+
+@nb.njit(cache=True)
+def S23(N, S1, S2, S3):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,3}(N)`
+ as implemented in eq 9.3 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S1: complex
+ Harmonic sum :math:`S_{1}(N)`
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ S3: complex
+ Harmonic sum :math:`S_{3}(N)`
+
+ Returns
+ -------
+ S23 : complex
+ Harmonic sum :math:`S_{2,3}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F19 :
+ :math:`\mathcal{M}[
+ ((
+ \text{ln}(x)[\text{S}_{1,2}(1-x) - \zeta_3]
+ +3 [\text{S}_{1,3}(1-x) - \zeta_4]
+ /(x-1))_{+}](N)`
+ """
+ return f.F19(N, S1, S2, S3) + 3 * zeta4 * S1
+
+
+@nb.njit(cache=True)
+def Sm23(N, Sm1, Sm2, Sm3, is_singlet=None):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{-2,3}(N)`
+ as implemented in eq 9.4 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+ Sm3: complex
+ Harmonic sum :math:`S_{-3}(N)`
+ is_singlet: bool, None
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
+
+ Returns
+ -------
+ Sm23 : complex
+ Harmonic sum :math:`S_{-2,3}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F19 :
+ :math:`\mathcal{M}[
+ (
+ \text{ln}(x)[\text{S}_{1,2}(1-x) - \zeta_3]
+ +3 [\text{S}_{1,3}(1-x) - \zeta_4]
+ /(x+1)](N)`
+ """
+ eta = symmetry_factor(N, is_singlet)
+ return (
+ eta * f.F20(N, Sm1, Sm2, Sm3)
+ + 3 * zeta4 * Sm1
+ + 21 / 32 * zeta5
+ + 3 * zeta4 * log2
+ - 3 / 4 * zeta2 * zeta3
+ )
+
+
+@nb.njit(cache=True)
+def S2m3(N, S2, Sm1, Sm2, Sm3):
+ r"""
+ Analytic continuation of harmonic sum :math:`S_{2,-3}(N)`
+ as implemented in eq 9.5 of :cite:`Blumlein:2009ta`
+
+ Parameters
+ ----------
+ N : complex
+ Mellin moment
+ S2: complex
+ Harmonic sum :math:`S_{2}(N)`
+ Sm1: complex
+ Harmonic sum :math:`S_{-1}(N)`
+ Sm2: complex
+ Harmonic sum :math:`S_{-2}(N)`
+ Sm3: complex
+ Harmonic sum :math:`S_{-3}(N)`
+
+ Returns
+ -------
+ S2m3 : complex
+ Harmonic sum :math:`S_{2,-3}(N)`
+
+ See Also
+ --------
+ eko.harmonic.f_functions.F19 :
+ :math:`\mathcal{M}[
+ ((
+ 1/2 \text{ln}^2(x) \text{Li}_2(-x)
+ -2 \text{ln}(x) \text{Li}_3(-x)
+ +3 \text{Li}_4(-x)
+ )/(x-1)](N)`
+ """
+ return (
+ (-1) ** (N + 1) * f.F21(N, Sm1, Sm2, Sm3)
+ + 3 / 4 * zeta3 * (Sm2 - S2)
+ - 21 / 8 * zeta4 * Sm1
+ - 1.32056
+ )
diff --git a/src/eko/matching_conditions/as1.py b/src/eko/matching_conditions/as1.py
index ee31f565c..cbd9a0baf 100644
--- a/src/eko/matching_conditions/as1.py
+++ b/src/eko/matching_conditions/as1.py
@@ -23,8 +23,8 @@ def A_hh(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -33,8 +33,8 @@ def A_hh(n, sx, L):
A_hh : complex
|NLO| heavy-heavy |OME| :math:`A_{HH}^{(1)}`
"""
- S1m = sx[0] - 1 / n # harmonics.harmonic_S1(n - 1)
- S2m = sx[1] - 1 / n**2 # harmonics.harmonic_S2(n - 1)
+ S1m = sx[0][0] - 1 / n # harmonics.S1(n - 1)
+ S2m = sx[1][0] - 1 / n**2 # harmonics.S2(n - 1)
ahh_l = (2 + n - 3 * n**2) / (n * (1 + n)) + 4 * S1m
ahh = 2 * (
2
@@ -131,6 +131,8 @@ def A_singlet(n, sx, L):
----------
n : complex
Mellin moment
+ sx : list
+ harmonic sums cache containing: [[:math:`S_1`][:math:`S_2`]]
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -172,8 +174,8 @@ def A_ns(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache containing: [[:math:`S_1`][:math:`S_2`]]
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
Returns
diff --git a/src/eko/matching_conditions/as2.py b/src/eko/matching_conditions/as2.py
index 421b40844..a6e18953d 100644
--- a/src/eko/matching_conditions/as2.py
+++ b/src/eko/matching_conditions/as2.py
@@ -13,14 +13,10 @@
import numpy as np
from .. import constants
-from ..anomalous_dimensions import harmonics
+from ..harmonics.constants import zeta2, zeta3
from .as1 import A_gg as A_gg_1
from .as1 import A_hg as A_hg_1
-# Global variables
-zeta2 = harmonics.zeta2
-zeta3 = harmonics.zeta3
-
@nb.njit(cache=True)
def A_qq_ns(n, sx, L):
@@ -32,8 +28,8 @@ def A_qq_ns(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -42,9 +38,9 @@ def A_qq_ns(n, sx, L):
A_qq_ns : complex
|NNLO| light-light non-singlet |OME| :math:`A_{qq,H}^{NS,(2)}`
"""
- S1 = sx[0]
- S2 = sx[1]
- S3 = sx[2]
+ S1 = sx[0][0]
+ S2 = sx[1][0]
+ S3 = sx[2][0]
S1m = S1 - 1 / n # harmonic_S1(n - 1)
S2m = S2 - 1 / n**2 # harmonic_S2(n - 1)
@@ -87,8 +83,8 @@ def A_hq_ps(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -97,7 +93,7 @@ def A_hq_ps(n, sx, L):
A_hq_ps : complex
|NNLO| heavy-light pure-singlet |OME| :math:`A_{Hq}^{PS,(2)}`
"""
- S2 = sx[1]
+ S2 = sx[1][0]
F1M = 1.0 / (n - 1.0) * (zeta2 - (S2 - 1.0 / n**2))
F11 = 1.0 / (n + 1.0) * (zeta2 - (S2 + 1.0 / (n + 1.0) ** 2))
@@ -151,8 +147,8 @@ def A_hg(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -161,22 +157,14 @@ def A_hg(n, sx, L):
A_hg : complex
|NNLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(2)}`
"""
- S1 = sx[0]
- S2 = sx[1]
- S3 = sx[2]
+ S1 = sx[0][0]
+ S2, Sm2 = sx[1]
+ if len(sx[2]) == 3:
+ S3, Sm21, Sm3 = sx[2]
+ else:
+ S3, _, _, Sm21, _, Sm3 = sx[2]
S1m = S1 - 1 / n
S2m = S2 - 1 / n**2
- Sp2m = harmonics.harmonic_S2((n - 1) / 2)
- Sp2p = harmonics.harmonic_S2(n / 2)
- Sm1 = -S1 + harmonics.harmonic_S1(n / 2)
- Sm2 = -S2 + 1 / 2 * Sp2p
- Sm3 = -S3 + 1 / 4 * harmonics.harmonic_S3(n / 2)
- Sm21 = (
- -5 / 8 * harmonics.zeta3
- + harmonics.zeta2 * (Sm1 - 1 / n + np.log(2))
- + S1 / n**2
- + harmonics.mellin_g3(n)
- )
a_hg_l0 = (
-(
@@ -271,7 +259,7 @@ def A_hg(n, sx, L):
* (n + 1)
* (n + 2)
* (2 + n + n**2)
- * (10 * S1m**2 - 9 * Sp2m + 26 * S2m + 9 * Sp2p)
+ * (10 * S1m**2 + 18 * (2 * Sm2 + zeta2) + 26 * S2m)
)
)
/ (3 * (n * (n + 1) * (n + 2)) ** 3 * (n - 1))
@@ -298,8 +286,8 @@ def A_gq(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -308,8 +296,8 @@ def A_gq(n, sx, L):
A_gq : complex
|NNLO| gluon-quark |OME| :math:`A_{gq,H}^{S,(2)}`
"""
- S1 = sx[0]
- S2 = sx[1]
+ S1 = sx[0][0]
+ S2 = sx[1][0]
S1m = S1 - 1 / n # harmonic_S1(n - 1)
B2M = ((S1 - 1.0 / n) ** 2 + S2 - 1.0 / n**2) / (n - 1.0)
@@ -348,8 +336,8 @@ def A_gg(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
@@ -358,7 +346,7 @@ def A_gg(n, sx, L):
A_gg : complex
|NNLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(2)}`
"""
- S1 = sx[0]
+ S1 = sx[0][0]
S1m = S1 - 1 / n # harmonic_S1(n - 1)
D1 = -1.0 / n**2
@@ -441,8 +429,9 @@ def A_singlet(n, sx, L, is_msbar=False):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache containing:
+ [[:math:`S_1,S_{-1}`],[:math:`S_2,S_{-2}`],[:math:`S_3,S_{-2,1},S_{-3}`]]
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
is_msbar: bool
@@ -490,8 +479,9 @@ def A_ns(n, sx, L):
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache containing:
+ [[:math:`S_1,S_{-1}`],[:math:`S_2,S_{-2}`],[:math:`S_3,S_{-2,1},S_{-3}`]]
L : float
:math:`\ln(\mu_F^2 / m_h^2)`
diff --git a/src/eko/matching_conditions/as3/__init__.py b/src/eko/matching_conditions/as3/__init__.py
index e8e5c2f66..0653e64b7 100644
--- a/src/eko/matching_conditions/as3/__init__.py
+++ b/src/eko/matching_conditions/as3/__init__.py
@@ -37,7 +37,7 @@
@nb.njit(cache=True)
-def A_singlet(n, sx_all, nf, L):
+def A_singlet(n, sx_singlet, sx_non_singlet, nf, L):
r"""
Computes the |N3LO| singlet |OME|.
@@ -49,15 +49,23 @@ def A_singlet(n, sx_all, nf, L):
\end{array}\right)
When using the code, please cite the complete list of references
- available at the top of this module :mod:`eko.matching_conditions.n3lo`.
+ available at the top of this module :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx_all : numpy.ndarray
- List of harmonic sums containing:
- [S1 ... S5, Sm1 ... Sm5, S21, S2m1, Sm21, Sm2m1, S31, S221, Sm22, Sm211, Sm31]
+ sx_singlet : list
+ singlet like harmonic sums cache containing:
+
+ .. math ::
+ [[S_1,S_{-1}],
+ [S_2,S_{-2}],
+ [S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}],
+ [S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}],]
+
+ sx_non_singlet: list
+ same as sx_singlet but now for non-singlet like harmonics
nf : int
number of active flavor below the threshold
L : float
@@ -68,19 +76,15 @@ def A_singlet(n, sx_all, nf, L):
A_S : numpy.ndarray
|NNLO| singlet |OME| :math:`A^{S,(3)}(N)`
"""
- sx = sx_all[:5]
- smx = sx_all[5:10]
- s3x = sx_all[10:14]
- s4x = sx_all[14:]
- A_hq_3 = A_Hq(n, sx, smx, s3x, s4x, nf, L)
- A_hg_3 = A_Hg(n, sx, smx, s3x, s4x, nf, L)
+ A_hq_3 = A_Hq(n, sx_singlet, nf, L)
+ A_hg_3 = A_Hg(n, sx_singlet, nf, L)
- A_gq_3 = A_gq(n, sx, smx, s3x, s4x, nf, L)
- A_gg_3 = A_gg(n, sx, smx, s3x, s4x, nf, L)
+ A_gq_3 = A_gq(n, sx_singlet, nf, L)
+ A_gg_3 = A_gg(n, sx_singlet, nf, L)
- A_qq_ps_3 = A_qqPS(n, sx, nf, L)
- A_qq_ns_3 = A_qqNS(n, sx, smx, s3x, s4x, nf, L)
- A_qg_3 = A_qg(n, sx, smx, s3x, s4x, nf, L)
+ A_qq_ps_3 = A_qqPS(n, sx_singlet, nf, L)
+ A_qq_ns_3 = A_qqNS(n, sx_non_singlet, nf, L)
+ A_qg_3 = A_qg(n, sx_singlet, nf, L)
A_S = np.array(
[
@@ -105,15 +109,21 @@ def A_ns(n, sx_all, nf, L):
\end{array}\right)
When using the code, please cite the complete list of references
- available at the top of this module :mod:`eko.matching_conditions.n3lo`.
+ available at the top of this module :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx_all : numpy.ndarray
- List of harmonic sums containing:
- [S1 ... S5, Sm1 ... Sm5, S21, S2m1, Sm21, Sm2m1, S31, S221, Sm22, Sm211, Sm31]
+ sx_all : list
+ harmonic sums cache containing:
+
+ .. math ::
+ [[S_1,S_{-1}],
+ [S_2,S_{-2}],
+ [S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}],
+ [S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}],]
+
nf : int
number of active flavor below the threshold
L : float
@@ -128,10 +138,4 @@ def A_ns(n, sx_all, nf, L):
--------
A_qqNS_3 : :math:`A_{qq,H}^{NS,(3))}`
"""
- sx = sx_all[:5]
- smx = sx_all[5:10]
- s3x = sx_all[10:14]
- s4x = sx_all[14:]
- return np.array(
- [[A_qqNS(n, sx, smx, s3x, s4x, nf, L), 0.0], [0 + 0j, 0 + 0j]], np.complex_
- )
+ return np.array([[A_qqNS(n, sx_all, nf, L), 0.0], [0 + 0j, 0 + 0j]], np.complex_)
diff --git a/src/eko/matching_conditions/as3/aHg.py b/src/eko/matching_conditions/as3/aHg.py
index a95bb60c4..af1c76052 100644
--- a/src/eko/matching_conditions/as3/aHg.py
+++ b/src/eko/matching_conditions/as3/aHg.py
@@ -7,26 +7,20 @@
@nb.njit(cache=True)
-def A_Hg(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
+def A_Hg(n, sx, nf, L): # pylint: disable=too-many-locals
r"""
Computes the |N3LO| singlet |OME| :math:`A_{Hg}^{S,(3)}(N)`.
The experssion is presented in :cite:`Bierenbaum:2009mv`.
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- smx : numpy.ndarray
- list Sm1 ... Sm5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
- s4x : numpy.ndarray
- list S31, S221, Sm22, Sm211, Sm31
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -38,15 +32,15 @@ def A_Hg(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
:math:`A_{Hg}^{S,(3)}(N)`
See Also
--------
- A_Hgstfac: eko.matching_conditions.n3lo.aHgstfac.A_Hgstfac
+ A_Hgstfac: eko.matching_conditions.as3.aHgstfac.A_Hgstfac
Incomplete part of the |OME|.
"""
- S1, S2, S3, S4 = sx[0], sx[1], sx[2], sx[3]
- Sm2, Sm3, Sm4 = smx[1], smx[2], smx[3]
- S21, Sm21 = s3x[0], s3x[2]
- S31, S211, Sm22, Sm211, Sm31 = s4x[0], s4x[1], s4x[2], s4x[3], s4x[4]
+ S1, _ = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, _, Sm21, _, Sm3 = sx[2]
+ S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3]
a_Hg_l0 = (
- A_Hgstfac(n, sx, smx, s3x, s4x, nf)
+ A_Hgstfac(n, sx, nf)
+ (1.0684950250307503 * (2.0 + n + np.power(n, 2)))
/ (n * (1.0 + n) * (2.0 + n))
+ 0.3333333333333333
diff --git a/src/eko/matching_conditions/as3/aHgstfac.py b/src/eko/matching_conditions/as3/aHgstfac.py
index 8c4b2f05b..eb057262b 100644
--- a/src/eko/matching_conditions/as3/aHgstfac.py
+++ b/src/eko/matching_conditions/as3/aHgstfac.py
@@ -4,32 +4,30 @@
@nb.njit(cache=True)
-def A_Hgstfac(n, sx, smx, s3x, s4x, nf):
+def A_Hgstfac(n, sx, nf):
r"""
Computes the approximate incomplete part of :math:`A_{Hg}^{S,(3)}(N)`
proportional to various color factors.
The experssion is presented in cite:`ablinger2017heavy` (eq 3.1).
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
+ sx : list
+ harmonic sums cache
Returns
-------
A_ggTF2 : complex
"""
- S1, S2, S3, S4 = sx[0], sx[1], sx[2], sx[3]
- Sm2, Sm3, Sm4 = smx[1], smx[2], smx[3]
- S21, Sm21 = s3x[0], s3x[2]
- S31, S211, Sm22, Sm211, Sm31 = s4x[0], s4x[1], s4x[2], s4x[3], s4x[4]
+ S1, _ = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, _, Sm21, _, Sm3 = sx[2]
+ S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3]
return (
(-1.0684950250307503 * (2.0 + n + np.power(n, 2))) / (n * (1.0 + n) * (2.0 + n))
+ 1.3333333333333333
diff --git a/src/eko/matching_conditions/as3/aHq.py b/src/eko/matching_conditions/as3/aHq.py
index 675e4ab53..09702bdb2 100644
--- a/src/eko/matching_conditions/as3/aHq.py
+++ b/src/eko/matching_conditions/as3/aHq.py
@@ -5,27 +5,21 @@
@nb.njit(cache=True)
-def A_Hq(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
+def A_Hq(n, sx, nf, L): # pylint: disable=too-many-locals
r"""
Computes the |N3LO| singlet |OME| :math:`A_{Hq}^{S,(3)}(N)`.
The experssion is presented in :cite:`Ablinger_2015` (eq 5.1)
and :cite:`Blumlein:2017wxd` (eq 3.1).
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- smx : numpy.ndarray
- list Sm1 ... Sm5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
- s4x : numpy.ndarray
- list S31, S221, Sm22, Sm211, Sm31
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -36,10 +30,11 @@ def A_Hq(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
A_Hq : complex
:math:`A_{Hq}^{S,(3)}(N)`
"""
- S1, S2, S3, S4, S5 = sx[0], sx[1], sx[2], sx[3], sx[4]
- Sm2, Sm3, Sm4 = smx[1], smx[2], smx[3]
- S21, Sm21 = s3x[0], s3x[2]
- S31, S211, Sm22, Sm211, Sm31 = s4x[0], s4x[1], s4x[2], s4x[3], s4x[4]
+ S1, _ = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, _, Sm21, _, Sm3 = sx[2]
+ S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3]
+ S5, _ = sx[4]
# fit of:
# 2^-N * ( H1 + 8.41439832211716)
diff --git a/src/eko/matching_conditions/as3/agg.py b/src/eko/matching_conditions/as3/agg.py
index 1f537e0fc..862c04f68 100644
--- a/src/eko/matching_conditions/as3/agg.py
+++ b/src/eko/matching_conditions/as3/agg.py
@@ -7,26 +7,20 @@
@nb.njit(cache=True)
-def A_gg(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
+def A_gg(n, sx, nf, L): # pylint: disable=too-many-locals
r"""
Computes the |N3LO| singlet |OME| :math:`A_{gg}^{S,(3)}(N)`.
The experssion is presented in :cite:`Bierenbaum:2009mv`.
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- smx : numpy.ndarray
- list Sm1 ... Sm5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
- s4x : numpy.ndarray
- list S31, S221, Sm22, Sm211, Sm31
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -39,16 +33,16 @@ def A_gg(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
See Also
--------
- A_ggTF2: eko.matching_conditions.n3lo.aggTF2.A_ggTF2
+ A_ggTF2: eko.matching_conditions.as3.aggTF2.A_ggTF2
Incomplete part proportional to :math:`T_{F}^2`.
"""
- S1, S2, S3, S4 = sx[0], sx[1], sx[2], sx[3]
- Sm2, Sm3, Sm4 = smx[1], smx[2], smx[3]
- S21, Sm21 = s3x[0], s3x[2]
- S31, S211, Sm22, Sm211, Sm31 = s4x[0], s4x[1], s4x[2], s4x[3], s4x[4]
+ S1, _ = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, _, Sm21, _, Sm3 = sx[2]
+ S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3]
a_gg_l0 = (
-0.35616500834358344
- + A_ggTF2(n, sx, s3x)
+ + A_ggTF2(n, sx)
+ 0.75
* (
(-19.945240467240673 * (1.0 + n + np.power(n, 2)))
diff --git a/src/eko/matching_conditions/as3/aggTF2.py b/src/eko/matching_conditions/as3/aggTF2.py
index f2eb5ed75..707e14443 100644
--- a/src/eko/matching_conditions/as3/aggTF2.py
+++ b/src/eko/matching_conditions/as3/aggTF2.py
@@ -4,7 +4,7 @@
@nb.njit(cache=True)
-def A_ggTF2(n, sx, s3x):
+def A_ggTF2(n, sx):
r"""
Computes the approximate incomplete part of :math:`A_{gg}^{S,(3)}(N)`
proportional to :math:`T_{F}^2`.
@@ -12,24 +12,24 @@ def A_ggTF2(n, sx, s3x):
It contains a binomial factor which is given approximated.
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
+ sx : list
+ harmonic sums cache
Returns
-------
A_ggTF2 : complex
:math:`A_{gg,T_{F}^2}^{S,(3)}(N)`
"""
- S1, S2, S3 = sx[0], sx[1], sx[2]
- S21 = s3x[0]
+ S1 = sx[0][0]
+ S2 = sx[1][0]
+ S3 = sx[2][0]
+ S21 = sx[2][1]
# here we use an approximation at large N
# for binomial(2 * n, n) / np.power(4, n)
# faster than the exact result
diff --git a/src/eko/matching_conditions/as3/agq.py b/src/eko/matching_conditions/as3/agq.py
index d7d668faa..472389d55 100644
--- a/src/eko/matching_conditions/as3/agq.py
+++ b/src/eko/matching_conditions/as3/agq.py
@@ -4,26 +4,20 @@
@nb.njit(cache=True)
-def A_gq(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
+def A_gq(n, sx, nf, L): # pylint: disable=too-many-locals
r"""
Computes the |N3LO| singlet |OME| :math:`A_{gq}^{S,(3)}(N)`.
The experssion is presented in :cite:`Ablinger_2014` (eq 6.3).
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- smx : numpy.ndarray
- list Sm1 ... Sm5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
- s4x : numpy.ndarray
- list S31, S221, Sm22, Sm211, Sm31
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -34,10 +28,10 @@ def A_gq(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
A_gq : complex
:math:`A_{gq}^{S,(3)}(N)`
"""
- S1, S2, S3, S4 = sx[0], sx[1], sx[2], sx[3]
- Sm1, Sm2, Sm3, Sm4 = smx[0], smx[1], smx[2], smx[3]
- S21, S2m1, Sm21, Sm2m1 = s3x[0], s3x[1], s3x[2], s3x[3]
- S31, S211, Sm22, Sm211, Sm31 = s4x[0], s4x[1], s4x[2], s4x[3], s4x[4]
+ S1, Sm1 = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, S2m1, Sm21, Sm2m1, Sm3 = sx[2]
+ S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3]
a_gq_l0 = (
0.3333333333333333
* (
diff --git a/src/eko/matching_conditions/as3/aqg.py b/src/eko/matching_conditions/as3/aqg.py
index 577396c08..5f6bd89ac 100644
--- a/src/eko/matching_conditions/as3/aqg.py
+++ b/src/eko/matching_conditions/as3/aqg.py
@@ -4,26 +4,20 @@
@nb.njit(cache=True)
-def A_qg(n, sx, smx, s3x, s4x, nf, L):
+def A_qg(n, sx, nf, L):
r"""
Computes the |N3LO| singlet |OME| :math:`A_{qg}^{S,(3)}(N)`.
The expression is presented in :cite:`Bierenbaum:2009mv`.
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- smx : numpy.ndarray
- list Sm1 ... Sm5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
- s4x : numpy.ndarray
- list S31, S221, Sm22, Sm211, Sm31
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -34,10 +28,10 @@ def A_qg(n, sx, smx, s3x, s4x, nf, L):
A_qg : complex
:math:`A_{qg}^{S,(3)}(N)`
"""
- S1, S2, S3, S4 = sx[0], sx[1], sx[2], sx[3]
- Sm2, Sm3, Sm4 = smx[1], smx[2], smx[3]
- S21 = s3x[0]
- S31, S211 = s4x[0], s4x[1]
+ S1, _ = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, _, _, _, Sm3 = sx[2]
+ S4, S31, S211, _, _, _, Sm4 = sx[3]
a_qg_l0 = 0.3333333333333333 * nf * (
(
-8.547960200246003
diff --git a/src/eko/matching_conditions/as3/aqqNS.py b/src/eko/matching_conditions/as3/aqqNS.py
index fa8079cb8..114949bd3 100644
--- a/src/eko/matching_conditions/as3/aqqNS.py
+++ b/src/eko/matching_conditions/as3/aqqNS.py
@@ -2,31 +2,25 @@
import numba as nb
import numpy as np
-from . import s_functions as sf
+from ... import harmonics as sf
@nb.njit(cache=True)
-def A_qqNS(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
+def A_qqNS(n, sx, nf, L): # pylint: disable=too-many-locals
r"""
Computes the |N3LO| singlet |OME| :math:`A_{qq}^{NS,(3)}(N)`.
The experssion is presented in :cite:`Bierenbaum:2009mv` and
:cite:`Ablinger:2014vwa`. It contains some weight 5 harmonics sums.
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
- smx : numpy.ndarray
- list Sm1 ... Sm5
- s3x : numpy.ndarray
- list S21, S2m1, Sm21, Sm2m1
- s4x : numpy.ndarray
- list S31, S221, Sm22, Sm211, Sm31
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -37,20 +31,21 @@ def A_qqNS(n, sx, smx, s3x, s4x, nf, L): # pylint: disable=too-many-locals
A_qqNS : complex
:math:`A_{qq}^{NS,(3)}(N)`
"""
- S1, S2, S3, S4, S5 = sx[0], sx[1], sx[2], sx[3], sx[4]
- Sm1, Sm2, Sm3, Sm4, Sm5 = smx[0], smx[1], smx[2], smx[3], smx[4]
- S21, S2m1, Sm21 = s3x[0], s3x[1], s3x[2]
- S31, S211, Sm22, Sm211 = s4x[0], s4x[1], s4x[2], s4x[3]
- S41 = sf.harmonic_S41(n, S1, S2, S3)
- S311 = sf.harmonic_S311(n, S1, S2)
- S221 = sf.harmonic_S221(n, S1, S2, S21)
- Sm221 = sf.harmonic_Sm221(n, S1, Sm1, S21, Sm21)
- S21m2 = sf.harmonic_S21m2(n, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1)
- S2111 = sf.harmonic_S2111(n, S1, S2, S3)
- Sm2111 = sf.harmonic_Sm2111(n, S1, S2, S3, Sm1)
- S23 = sf.harmonic_S23(n, S1, S2, S3)
- Sm23 = sf.harmonic_Sm23(n, Sm1, Sm2, Sm3)
- S2m3 = sf.harmonic_S2m3(n, S2, Sm1, Sm2, Sm3)
+ S1, Sm1 = sx[0]
+ S2, Sm2 = sx[1]
+ S3, S21, S2m1, Sm21, _, Sm3 = sx[2]
+ S4, S31, S211, Sm22, Sm211, _, Sm4 = sx[3]
+ S5, Sm5 = sx[4]
+ S41 = sf.S41(n, S1, S2, S3)
+ S311 = sf.S311(n, S1, S2)
+ S221 = sf.S221(n, S1, S2, S21)
+ Sm221 = sf.Sm221(n, S1, Sm1, S21, Sm21)
+ S21m2 = sf.S21m2(n, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1)
+ S2111 = sf.S2111(n, S1, S2, S3)
+ Sm2111 = sf.Sm2111(n, S1, S2, S3, Sm1)
+ S23 = sf.S23(n, S1, S2, S3)
+ Sm23 = sf.Sm23(n, Sm1, Sm2, Sm3, False)
+ S2m3 = sf.S2m3(n, S2, Sm1, Sm2, Sm3)
a_qqNS_l0 = (
0.3333333333333333
* nf
diff --git a/src/eko/matching_conditions/as3/aqqPS.py b/src/eko/matching_conditions/as3/aqqPS.py
index 7846c0111..df845cbf1 100644
--- a/src/eko/matching_conditions/as3/aqqPS.py
+++ b/src/eko/matching_conditions/as3/aqqPS.py
@@ -10,14 +10,14 @@ def A_qqPS(n, sx, nf, L):
The expression is presented in :cite:`Bierenbaum:2009mv`.
When using the code, please cite the complete list of references
- available in :mod:`eko.matching_conditions.n3lo`.
+ available in :mod:`eko.matching_conditions.as3`.
Parameters
----------
n : complex
Mellin moment
- sx : numpy.ndarray
- list S1 ... S5
+ sx : list
+ harmonic sums cache
nf : int
number of active flavor below the threshold
L : float
@@ -28,7 +28,10 @@ def A_qqPS(n, sx, nf, L):
A_qqPS : complex
:math:`A_{qq}^{PS,(3)}(N)`
"""
- S1, S2, S3 = sx[0], sx[1], sx[2]
+ S1 = sx[0][0]
+ S2 = sx[1][0]
+ S3 = sx[2][0]
+
a_qqPS_l0 = (
0.3333333333333333
* nf
diff --git a/src/eko/matching_conditions/as3/s_functions.py b/src/eko/matching_conditions/as3/s_functions.py
deleted file mode 100644
index bf243742c..000000000
--- a/src/eko/matching_conditions/as3/s_functions.py
+++ /dev/null
@@ -1,801 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-This module contains some additional harmonics sum.
-Defintion are coming from :cite:`MuselliPhD,Bl_mlein_2000,Blumlein:2009ta`
-"""
-import numba as nb
-import numpy as np
-
-from eko.anomalous_dimensions import harmonics
-
-from . import f_functions as f
-from . import g_functions as gf
-
-zeta2 = harmonics.zeta2
-zeta3 = harmonics.zeta3
-zeta4 = harmonics.zeta4
-zeta5 = harmonics.zeta5
-
-li4half = 0.517479
-log2 = np.log(2)
-
-
-@nb.njit(cache=True)
-def harmonic_Sm1(N):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-1}(N)`.
-
- .. math::
- S_{-1}(N) = \sum\limits_{j=1}^N \frac (-1)^j j
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- Sm1 : complex
- Harmonic sum :math:`S_{-1}(N)`
-
- See Also
- --------
- eko.anomalous_dimension.harmonics.harmonic_S1 : :math:`S_1(N)`
- """
- return (-1) ** N / 2 * (
- harmonics.harmonic_S1(N / 2) - harmonics.harmonic_S1((N - 1) / 2)
- ) - log2
-
-
-@nb.njit(cache=True)
-def harmonic_Sm2(N):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2}(N)`.
-
- .. math::
- S_{-2}(N) = \sum\limits_{j=1}^N \frac (-1)^j j^2
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- Sm2 : complex
- Harmonic sum :math:`S_{-2}(N)`
-
- See Also
- --------
- eko.anomalous_dimension.harmonics.harmonic_S2 : :math:`S_2(N)`
- """
- return (-1) ** N / 4 * (
- harmonics.harmonic_S2(N / 2) - harmonics.harmonic_S2((N - 1) / 2)
- ) - zeta2 / 2
-
-
-@nb.njit(cache=True)
-def harmonic_Sm3(N):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-3}(N)`.
-
- .. math::
- S_{-3}(N) = \sum\limits_{j=1}^N \frac (-1)^j j^3
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- Sm3 : complex
- Harmonic sum :math:`S_{-3}(N)`
-
- See Also
- --------
- eko.anomalous_dimension.harmonics.harmonic_S3 : :math:`S_3(N)`
- """
- return (-1) ** N / 8 * (
- harmonics.harmonic_S3(N / 2) - harmonics.harmonic_S3((N - 1) / 2)
- ) - 3 / 4 * zeta3
-
-
-@nb.njit(cache=True)
-def harmonic_Sm4(N):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-4}(N)`.
-
- .. math::
- S_{-4}(N) = \sum\limits_{j=1}^N \frac (-1)^j j^4
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- Sm4 : complex
- Harmonic sum :math:`S_{-4}(N)`
-
- See Also
- --------
- eko.anomalous_dimension.harmonics.harmonic_S4 : :math:`S_4(N)`
- """
- return (-1) ** N / 16 * (
- harmonics.harmonic_S4(N / 2) - harmonics.harmonic_S4((N - 1) / 2)
- ) - 7 / 8 * zeta4
-
-
-@nb.njit(cache=True)
-def harmonic_Sm5(N):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-5}(N)`.
-
- .. math::
- S_{-5}(N) = \sum\limits_{j=1}^N \frac (-1)^j j^5
-
- Parameters
- ----------
- N : complex
- Mellin moment
-
- Returns
- -------
- Sm5 : complex
- Harmonic sum :math:`S_{-5}(N)`
-
- See Also
- --------
- eko.anomalous_dimension.harmonics.harmonic_S5 : :math:`S_5(N)`
- """
- return (-1) ** N / 32 * (
- harmonics.harmonic_S5(N / 2) - harmonics.harmonic_S5((N - 1) / 2)
- ) - 15 / 16 * zeta5
-
-
-@nb.njit(cache=True)
-def harmonic_S21(N, S1, S2):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,1}(N)`
- as implemented in eq B.5.77 of :cite:`MuselliPhD` and eq 37 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
-
- Returns
- -------
- S21 : complex
- Harmonic sum :math:`S_{2,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g18 : :math:`g_18(N)`
- """
- return -gf.mellin_g18(N, S1, S2) + 2 * zeta3
-
-
-@nb.njit(cache=True)
-def harmonic_Sm21(N, Sm1):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,1}(N)`
- as implemented in eq B.5.75 of :cite:`MuselliPhD` and eq 22 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
-
- Returns
- -------
- Sm21 : complex
- Harmonic sum :math:`S_{-2,1}(N)`
-
- See Also
- --------
- eko.anomalous_dimension.harmonics.melling_g3 : :math:`g_3(N)`
- """
- # Note mellin g3 was integrated following x^(N-1) convention.
- return (
- -((-1) ** N) * harmonics.mellin_g3(N + 1)
- + zeta2 * Sm1
- - 5 / 8 * zeta3
- + zeta2 * log2
- )
-
-
-@nb.njit(cache=True)
-def harmonic_S2m1(N, S2, Sm1, Sm2):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,-1}(N)`
- as implemented in eq B.5.76 of :cite:`MuselliPhD` and eq 23 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
- Sm2: complex
- Hamrmonic sum :math:`S_{-2}(N)`
-
- Returns
- -------
- S2m1 : complex
- Harmonic sum :math:`S_{2,-1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g4 : :math:`g_4(N)`
- """
- return (
- -((-1) ** N) * gf.mellin_g4(N)
- - np.log(2) * (S2 - Sm2)
- - 1 / 2 * zeta2 * Sm1
- + 1 / 4 * zeta3
- - 1 / 2 * zeta2 * log2
- )
-
-
-@nb.njit(cache=True)
-def harmonic_Sm31(N, Sm1, Sm2):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-3,1}(N)`
- as implemented in eq B.5.93 of :cite:`MuselliPhD` and eq 25 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
- Sm2: complex
- Hamrmonic sum :math:`S_{-2}(N)`
-
- Returns
- -------
- Sm31 : complex
- Harmonic sum :math:`S_{-3,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g6 : :math:`g_6(N)`
- """
- return (
- (-1) ** N * gf.mellin_g6(N)
- + zeta2 * Sm2
- - zeta3 * Sm1
- - 3 / 5 * zeta2**2
- + 2 * li4half
- + 3 / 4 * zeta3 * log2
- - 1 / 2 * zeta2 * log2**2
- + 1 / 12 * log2**4
- )
-
-
-@nb.njit(cache=True)
-def harmonic_Sm22(N, Sm31):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,2}(N)`
- as implemented in eq B.5.94 of :cite:`MuselliPhD` and eq 24 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- Sm31: complex
- Hamrmonic sum :math:`S_{-3,1}(N)`
- Returns
- -------
- Sm22 : complex
- Harmonic sum :math:`S_{-2,2}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g5 : :math:`g_5(N)`
- """
- return (
- (-1) ** N * gf.mellin_g5(N)
- - 2 * Sm31
- + 2 * zeta2 * harmonic_Sm2(N)
- + 3 / 40 * zeta2**2
- )
-
-
-@nb.njit(cache=True)
-def harmonic_Sm211(N, Sm1):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,1,1}(N)`
- as implemented in eq B.5.104 of :cite:`MuselliPhD` and eq 27 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
-
- Returns
- -------
- Sm31 : complex
- Harmonic sum :math:`S_{-2,1,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g8 : :math:`g_8(N)`
- """
- return (
- -((-1) ** N) * gf.mellin_g8(N)
- + zeta3 * Sm1
- - li4half
- + 1 / 8 * zeta2**2
- + 1 / 8 * zeta3 * log2
- + 1 / 4 * zeta2 * log2**2
- - 1 / 24 * log2**4
- )
-
-
-@nb.njit(cache=True)
-def harmonic_Sm2m1(N, S1, S2, Sm2):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,-1}(N)`
- as implemented in eq B.5.74 of :cite:`MuselliPhD` and eq 38 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- Sm2: complex
- Hamrmonic sum :math:`S_{-2}(N)`
-
- Returns
- -------
- Sm2m1 : complex
- Harmonic sum :math:`S_{-2,-1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g19 : :math:`g_19(N)`
- """
- return -gf.mellin_g19(N, S1) + log2 * (S2 - Sm2) - 5 / 8 * zeta3
-
-
-@nb.njit(cache=True)
-def harmonic_S211(N, S1, S2, S3):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,1,1}(N)`
- as implemented in eq B.5.115 of :cite:`MuselliPhD` and eq 40 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S3: complex
- Hamrmonic sum :math:`S_{3}(N)`
-
- Returns
- -------
- S211 : complex
- Harmonic sum :math:`S_{2,1,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g21 : :math:`g_21(N)`
- """
- return -gf.mellin_g21(N, S1, S2, S3) + 6 / 5 * zeta2**2
-
-
-@nb.njit(cache=True)
-def harmonic_S31(N, S2, S4):
- r"""
- Analytic continuation of harmonic sum :math:`S_{3,1}(N)`
- as implemented in eq B.5.99 of :cite:`MuselliPhD` and eq 41 of cite:`Bl_mlein_2000`.
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S4: complex
- Hamrmonic sum :math:`S_{4}(N)`
-
- Returns
- -------
- S31 : complex
- Harmonic sum :math:`S_{3,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.g_functions.mellin_g22 : :math:`g_22(N)`
- """
- return (
- 1 / 2 * gf.mellin_g22(N)
- - 1 / 4 * S4
- - 1 / 4 * S2**2
- + zeta2 * S2
- - 3 / 20 * zeta2**2
- )
-
-
-@nb.njit(cache=True)
-def harmonic_S41(N, S1, S2, S3):
- r"""
- Analytic continuation of harmonic sum :math:`S_{4,1}(N)`
- as implemented in eq 9.1 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S3: complex
- Hamrmonic sum :math:`S_{3}(N)`
-
- Returns
- -------
- S41 : complex
- Harmonic sum :math:`S_{4,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F9 :
- :math:`\mathcal{M}[(\text{Li}_4(x)/(x-1))_{+}](N)`
- """
- return -f.F9(N, S1) + S1 * zeta4 - S2 * zeta3 + S3 * zeta2
-
-
-@nb.njit(cache=True)
-def harmonic_S311(N, S1, S2):
- r"""
- Analytic continuation of harmonic sum :math:`S_{3,1,1}(N)`
- as implemented in eq 9.21 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
-
- Returns
- -------
- S311 : complex
- Harmonic sum :math:`S_{3,1,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F11 :
- :math:`\mathcal{M}[(\text{S}_{2,2}(x)/(x-1))_{+}](N)`
- """
- return f.F11(N, S1, S2) + zeta3 * S2 - zeta4 / 4 * S1
-
-
-@nb.njit(cache=True)
-def harmonic_S221(N, S1, S2, S21):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,2,1}(N)`
- as implemented in eq 9.23 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S21: complex
- Hamrmonic sum :math:`S_{2,1}(N)`
-
- Returns
- -------
- S221 : complex
- Harmonic sum :math:`S_{2,2,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F11 :
- :math:`\mathcal{M}[(\text{S}_{2,2}(x)/(x-1))_{+}](N)`
- eko.matching_conditions.n3lo.f_functions.F13 :
- :math:`\mathcal{M}[(\text{Li}_{2}^2(x)/(x-1))_{+}](N)`
- """
- return (
- -2 * f.F11(N, S1, S2)
- + 1 / 2 * f.F13(N, S1, S2)
- + zeta2 * S21
- - 3 / 10 * zeta2**2 * S1
- )
-
-
-@nb.njit(cache=True)
-def harmonic_Sm221(N, S1, Sm1, S21, Sm21):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,2,1}(N)`
- as implemented in eq 9.25 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
- S21: complex
- Hamrmonic sum :math:`S_{2,1}(N)`
- Sm21: complex
- Hamrmonic sum :math:`S_{-2,1}(N)`
-
- Returns
- -------
- Sm221 : complex
- Harmonic sum :math:`S_{-2,2,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F14F12 :
- :math:`\mathcal{M}[(2 \text{S}_{2,2}(x) - 1/2 \text{Li}_{2}^2(x))/(x+1)](N)`
- """
- return (
- (-1) ** (N + 1) * (f.F14F12(N, S1, S21))
- + zeta2 * Sm21
- - 3 / 10 * zeta2**2 * Sm1
- - 0.119102
- + 0.0251709
- )
-
-
-@nb.njit(cache=True)
-def harmonic_S21m2(N, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,1,-2}(N)`
- as implemented in eq 9.26 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
- Sm2: complex
- Hamrmonic sum :math:`S_{-2}(N)`
- Sm3: complex
- Hamrmonic sum :math:`S_{-3}(N)`
- S21: complex
- Hamrmonic sum :math:`S_{2,1}(N)`
- Sm21: complex
- Hamrmonic sum :math:`S_{-2,1}(N)`
- S2m1: complex
- Hamrmonic sum :math:`S_{2,-1}(N)`
-
- Returns
- -------
- S21m2 : complex
- Harmonic sum :math:`S_{2,1,-2}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F14F12 :
- :math:`\mathcal{M}[
- (\text{ln}(x) \text{S}_{1,2}(−x) − \text{Li}_2^2(−x)/2)/(x+1)
- ](N)`
- """
- return (
- (-1) ** (N) * f.F16(N, S1, Sm1, Sm2, Sm3, Sm21)
- - 1 / 2 * zeta2 * (S21 - S2m1)
- - (1 / 8 * zeta3 - 1 / 2 * zeta2 * log2) * (S2 - Sm2)
- + 1 / 8 * zeta2**2 * Sm1
- + 0.0854806
- )
-
-
-@nb.njit(cache=True)
-def harmonic_S2111(N, S1, S2, S3):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,1,1,1}(N)`
- as implemented in eq 9.33 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S3: complex
- Hamrmonic sum :math:`S_{3}(N)`
-
- Returns
- -------
- S2111 : complex
- Harmonic sum :math:`S_{2,1,1,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F17 :
- :math:`\mathcal{M}[(\text{S}_{1,3}(x)/(x-1))_{+}](N)`
- """
- return -f.F17(N, S1, S2, S3) + zeta4 * S1
-
-
-@nb.njit(cache=True)
-def harmonic_Sm2111(N, S1, S2, S3, Sm1):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,1,1,1}(N)`
- as implemented in eq 9.34 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S3: complex
- Hamrmonic sum :math:`S_{3}(N)`
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
-
- Returns
- -------
- Sm2111 : complex
- Harmonic sum :math:`S_{-2,1,1,1}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F18 :
- :math:`\mathcal{M}[\text{S}_{1,3}(x)/(x+1)](N)`
- """
- return (
- (-1) ** (N + 1) * f.F18(N, S1, S2, S3)
- + zeta4 * Sm1
- - 0.706186
- + 0.693147 * zeta4
- )
-
-
-@nb.njit(cache=True)
-def harmonic_S23(N, S1, S2, S3):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,3}(N)`
- as implemented in eq 9.3 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S1: complex
- Hamrmonic sum :math:`S_{1}(N)`
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- S3: complex
- Hamrmonic sum :math:`S_{3}(N)`
-
- Returns
- -------
- S23 : complex
- Harmonic sum :math:`S_{2,3}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F19 :
- :math:`\mathcal{M}[
- ((
- \text{ln}(x)[\text{S}_{1,2}(1-x) - \zeta_3]
- +3 [\text{S}_{1,3}(1-x) - \zeta_4]
- /(x-1))_{+}](N)`
- """
- return f.F19(N, S1, S2, S3) + 3 * zeta4 * S1
-
-
-@nb.njit(cache=True)
-def harmonic_Sm23(N, Sm1, Sm2, Sm3):
- r"""
- Analytic continuation of harmonic sum :math:`S_{-2,3}(N)`
- as implemented in eq 9.4 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
- Sm2: complex
- Hamrmonic sum :math:`S_{-2}(N)`
- Sm3: complex
- Hamrmonic sum :math:`S_{-3}(N)`
-
- Returns
- -------
- Sm23 : complex
- Harmonic sum :math:`S_{-2,3}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F19 :
- :math:`\mathcal{M}[
- (
- \text{ln}(x)[\text{S}_{1,2}(1-x) - \zeta_3]
- +3 [\text{S}_{1,3}(1-x) - \zeta_4]
- /(x+1)](N)`
- """
- return (
- (-1) ** N * f.F20(N, Sm1, Sm2, Sm3)
- + 3 * zeta4 * Sm1
- + 21 / 32 * zeta5
- + 3 * zeta4 * log2
- - 3 / 4 * zeta2 * zeta3
- )
-
-
-@nb.njit(cache=True)
-def harmonic_S2m3(N, S2, Sm1, Sm2, Sm3):
- r"""
- Analytic continuation of harmonic sum :math:`S_{2,-3}(N)`
- as implemented in eq 9.5 of cite:` Bl_mlein_2009`
-
- Parameters
- ----------
- N : complex
- Mellin moment
- S2: complex
- Hamrmonic sum :math:`S_{2}(N)`
- Sm1: complex
- Hamrmonic sum :math:`S_{-1}(N)`
- Sm2: complex
- Hamrmonic sum :math:`S_{-2}(N)`
- Sm3: complex
- Hamrmonic sum :math:`S_{-3}(N)`
-
- Returns
- -------
- S2m3 : complex
- Harmonic sum :math:`S_{2,-3}(N)`
-
- See Also
- --------
- eko.matching_conditions.n3lo.f_functions.F19 :
- :math:`\mathcal{M}[
- ((
- 1/2 \text{ln}^2(x) \text{Li}_2(-x)
- -2 \text{ln}(x) \text{Li}_3(-x)
- +3 \text{Li}_4(-x)
- )/(x-1)](N)`
- """
- return (
- (-1) ** (N + 1) * f.F21(N, Sm1, Sm2, Sm3)
- + 3 / 4 * zeta3 * (Sm2 - S2)
- - 21 / 8 * zeta4 * Sm1
- - 1.32056
- )
diff --git a/src/eko/matching_conditions/operator_matrix_element.py b/src/eko/matching_conditions/operator_matrix_element.py
index 2ec0fae4c..8b6df8784 100644
--- a/src/eko/matching_conditions/operator_matrix_element.py
+++ b/src/eko/matching_conditions/operator_matrix_element.py
@@ -11,58 +11,60 @@
import numpy as np
from .. import basis_rotation as br
-from ..anomalous_dimensions import harmonics
+from .. import harmonics
from ..evolution_operator import Operator, QuadKerBase
from . import as1, as2, as3
-from .as3 import s_functions
logger = logging.getLogger(__name__)
@nb.njit(cache=True)
-def get_smx(n):
- """Get the S-minus cache"""
- return np.array(
- [
- s_functions.harmonic_Sm1(n),
- s_functions.harmonic_Sm2(n),
- s_functions.harmonic_Sm3(n),
- s_functions.harmonic_Sm4(n),
- s_functions.harmonic_Sm5(n),
- ]
- )
+def compute_harmonics_cache(n, order, is_singlet):
+ r"""
+ Get the harmonics sums cache
+ Parameters
+ ----------
+ n: complex
+ Mellin moment
+ order: int
+ perturbative order
+ is_singlet: bool
+ symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`),
+ False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`)
-@nb.njit(cache=True)
-def get_s3x(n, sx, smx):
- """Get the S-w3 cache"""
- return np.array(
- [
- s_functions.harmonic_S21(n, sx[0], sx[1]),
- s_functions.harmonic_S2m1(n, sx[1], smx[0], smx[1]),
- s_functions.harmonic_Sm21(n, smx[0]),
- s_functions.harmonic_Sm2m1(n, sx[0], sx[1], smx[1]),
- ]
- )
+ Returns
+ -------
+ sx: list
+ harmonic sums cache. At |N3LO| it contains:
+ .. math ::
+ [[S_1,S_{-1}],
+ [S_2,S_{-2}],
+ [S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}],
+ [S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}],]
-@nb.njit(cache=True)
-def get_s4x(n, sx, smx):
- """Get the S-w4 cache"""
- Sm31 = s_functions.harmonic_Sm31(n, smx[0], smx[1])
- return np.array(
- [
- s_functions.harmonic_S31(n, sx[1], sx[3]),
- s_functions.harmonic_S211(n, sx[0], sx[1], sx[2]),
- s_functions.harmonic_Sm22(n, Sm31),
- s_functions.harmonic_Sm211(n, smx[0]),
- s_functions.harmonic_Sm31(n, smx[0], smx[1]),
- ]
+ """
+ # max harmonics sum weight for each qcd order
+ max_weight = {1: 2, 2: 3, 3: 5}
+ # max number of harmonics sum of a given weight for each qcd order
+ n_max_sums_weight = {1: 1, 2: 3, 3: 7}
+ sx = harmonics.base_harmonics_cache(
+ n, is_singlet, max_weight[order], n_max_sums_weight[order]
)
+ if order == 2:
+ # Add Sm21 to cache
+ sx[2, 1] = harmonics.Sm21(n, sx[0, 0], sx[0, -1], is_singlet)
+ if order == 3:
+ # Add weight 3 and 4 to cache
+ sx[2, 1:-2] = harmonics.s3x(n, sx[:, 0], sx[:, -1], is_singlet)
+ sx[3, 1:-1] = harmonics.s4x(n, sx[:, 0], sx[:, -1], is_singlet)
+ # return list of list keeping the non zero values
+ return [[el for el in sx_list if el != 0] for sx_list in sx]
@nb.njit(cache=True)
-def A_singlet(order, n, sx, nf, L, is_msbar):
+def A_singlet(order, n, sx, nf, L, is_msbar, sx_ns=None):
r"""
Computes the tower of the singlet |OME|.
@@ -72,14 +74,16 @@ def A_singlet(order, n, sx, nf, L, is_msbar):
perturbative order
n : complex
Mellin variable
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ singlet like harmonic sums cache
nf: int
number of active flavor below threshold
L : float
:math:`log(q^2/m_h^2)`
is_msbar: bool
add the |MSbar| contribution
+ sx_ns : list
+ non-singlet like harmonic sums cache
Returns
-------
@@ -93,15 +97,13 @@ def A_singlet(order, n, sx, nf, L, is_msbar):
eko.matching_conditions.nlo.A_gh_1 : :math:`A_{gH}^{(1)}(N)`
eko.matching_conditions.nnlo.A_singlet_2 : :math:`A_{S,(2)}(N)`
"""
- if order == 0:
- return np.zeros((1, 3, 3), np.complex_)
A_s = np.zeros((order, 3, 3), np.complex_)
if order >= 1:
A_s[0] = as1.A_singlet(n, sx, L)
if order >= 2:
A_s[1] = as2.A_singlet(n, sx, L, is_msbar)
if order >= 3:
- A_s[2] = as3.A_singlet(n, sx, nf, L)
+ A_s[2] = as3.A_singlet(n, sx, sx_ns, nf, L)
return A_s
@@ -116,8 +118,8 @@ def A_non_singlet(order, n, sx, nf, L):
perturbative order
n : complex
Mellin variable
- sx : numpy.ndarray
- List of harmonic sums
+ sx : list
+ harmonic sums cache
nf: int
number of active flavor below threshold
L : float
@@ -133,8 +135,6 @@ def A_non_singlet(order, n, sx, nf, L):
eko.matching_conditions.nlo.A_hh_1 : :math:`A_{HH}^{(1)}(N)`
eko.matching_conditions.nnlo.A_ns_2 : :math:`A_{qq,H}^{NS,(2)}`
"""
- if order == 0:
- return np.zeros((1, 2, 2), np.complex_)
A_ns = np.zeros((order, 2, 2), np.complex_)
if order >= 1:
A_ns[0] = as1.A_ns(n, sx, L)
@@ -240,25 +240,31 @@ def quad_ker(
if integrand == 0.0:
return 0.0
- # compute the harmonics
- sx = np.zeros(3, np.complex_)
- if order >= 1:
- sx = np.array(
- [harmonics.harmonic_S1(ker_base.n), harmonics.harmonic_S2(ker_base.n)]
+ sx = compute_harmonics_cache(ker_base.n, order, ker_base.is_singlet)
+ sx_ns = None
+ if order == 3 and (
+ (backward_method != "" and ker_base.is_singlet)
+ or (mode0 == 100 and mode0 == 100)
+ ):
+ # At N3LO for A_qq singlet or backward you need to compute
+ # both the singlet and non-singlet like harmonics
+ # avoiding recomputing all of them ...
+ sx_ns = sx.copy()
+ smx_ns = harmonics.smx(ker_base.n, np.array([s[0] for s in sx]), False)
+ for w, sm in enumerate(smx_ns):
+ sx_ns[w][-1] = sm
+ sx_ns[2][2] = harmonics.S2m1(ker_base.n, sx[0][1], smx_ns[0], smx_ns[1], False)
+ sx_ns[2][3] = harmonics.Sm21(ker_base.n, sx[0][0], smx_ns[0], False)
+ sx_ns[3][5] = harmonics.Sm31(ker_base.n, sx[0][0], smx_ns[0], smx_ns[1], False)
+ sx_ns[3][4] = harmonics.Sm211(ker_base.n, sx[0][0], sx[0][1], smx_ns[0], False)
+ sx_ns[3][3] = harmonics.Sm22(
+ ker_base.n, sx[0][0], sx[0][1], smx_ns[1], sx_ns[3][5], False
)
- if order >= 2:
- sx = np.append(sx, harmonics.harmonic_S3(ker_base.n))
- if order >= 3:
- sx = np.append(sx, harmonics.harmonic_S4(ker_base.n))
- sx = np.append(sx, harmonics.harmonic_S5(ker_base.n))
- smx = get_smx(ker_base.n)
- sx = np.append(sx, smx)
- sx = np.append(sx, get_s3x(ker_base.n, sx, smx))
- sx = np.append(sx, get_s4x(ker_base.n, sx, smx))
+
# compute the ome
if ker_base.is_singlet:
indices = {21: 0, 100: 1, 90: 2}
- A = A_singlet(order, ker_base.n, sx, nf, L, is_msbar)
+ A = A_singlet(order, ker_base.n, sx, nf, L, is_msbar, sx_ns)
else:
indices = {200: 0, 91: 1}
A = A_non_singlet(order, ker_base.n, sx, nf, L)
@@ -334,7 +340,7 @@ def labels(self):
"""
labels = []
- # non singlet labels
+ # non-singlet labels
if self.config["debug_skip_non_singlet"]:
logger.warning("%s: skipping non-singlet sector", self.log_label)
else:
diff --git a/src/eko/scale_variations/expanded.py b/src/eko/scale_variations/expanded.py
index a739df5c0..179e511aa 100644
--- a/src/eko/scale_variations/expanded.py
+++ b/src/eko/scale_variations/expanded.py
@@ -91,7 +91,7 @@ def gamma_3_variation(gamma, L, beta0, beta1, g0e2, g0e3, g1g0):
@nb.njit(cache=True)
def non_singlet_variation(gamma, a_s, order, nf, L):
"""
- Scale Variation non singlet dispatcher
+ Scale Variation non-singlet dispatcher
Parameters
----------
diff --git a/tests/eko/conftest.py b/tests/eko/conftest.py
deleted file mode 100644
index 68729098b..000000000
--- a/tests/eko/conftest.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-import numpy as np
-import pytest
-
-from eko.anomalous_dimensions import harmonics
-
-
-@pytest.fixture
-def get_sx():
- def wrapped(N):
- """Collect the S-cache"""
- sx = np.array(
- [
- harmonics.harmonic_S1(N),
- harmonics.harmonic_S2(N),
- harmonics.harmonic_S3(N),
- harmonics.harmonic_S4(N),
- harmonics.harmonic_S5(N),
- ]
- )
- return sx
-
- return wrapped
diff --git a/tests/eko/test_ad.py b/tests/eko/test_ad.py
index 2627decd5..45947406f 100644
--- a/tests/eko/test_ad.py
+++ b/tests/eko/test_ad.py
@@ -13,7 +13,7 @@
def test_eigensystem_gamma_singlet_0_values():
n = 3
- s1 = harmonics.harmonic_S1(n)
+ s1 = harmonics.S1(n)
gamma_S_0 = ad_as1.gamma_singlet(3, s1, NF)
res = ad.exp_singlet(gamma_S_0)
lambda_p = complex(12.273612971466964, 0)
diff --git a/tests/eko/test_ad_lo.py b/tests/eko/test_ad_lo.py
index d08e79e32..52779123a 100644
--- a/tests/eko/test_ad_lo.py
+++ b/tests/eko/test_ad_lo.py
@@ -4,7 +4,7 @@
import eko.anomalous_dimensions.aem1 as ad_aem1
import eko.anomalous_dimensions.as1 as ad_as1
-from eko.anomalous_dimensions import harmonics
+from eko import harmonics
NF = 5
@@ -12,14 +12,14 @@
def test_number_conservation():
# number
N = complex(1.0, 0.0)
- s1 = harmonics.harmonic_S1(N)
+ s1 = harmonics.S1(N)
np.testing.assert_almost_equal(ad_as1.gamma_ns(N, s1), 0)
def test_quark_momentum_conservation():
# quark momentum
N = complex(2.0, 0.0)
- s1 = harmonics.harmonic_S1(N)
+ s1 = harmonics.S1(N)
np.testing.assert_almost_equal(
ad_as1.gamma_ns(N, s1) + ad_as1.gamma_gq(N),
0,
@@ -33,7 +33,7 @@ def test_quark_momentum_conservation():
def test_gluon_momentum_conservation():
# gluon momentum
N = complex(2.0, 0.0)
- s1 = harmonics.harmonic_S1(N)
+ s1 = harmonics.S1(N)
np.testing.assert_almost_equal(
ad_as1.gamma_qg(N, NF) + ad_as1.gamma_gg(N, s1, NF), 0
)
@@ -59,7 +59,7 @@ def test_gamma_gq_0():
def test_gamma_gg_0():
N = complex(0.0, 1.0)
- s1 = harmonics.harmonic_S1(N)
+ s1 = harmonics.S1(N)
res = complex(5.195725159621, 10.52008856962)
np.testing.assert_almost_equal(ad_as1.gamma_gg(N, s1, NF), res)
diff --git a/tests/eko/test_ad_nlo.py b/tests/eko/test_ad_nlo.py
index 23a541fae..617b7cd48 100644
--- a/tests/eko/test_ad_nlo.py
+++ b/tests/eko/test_ad_nlo.py
@@ -3,7 +3,7 @@
import numpy as np
import eko.anomalous_dimensions.as2 as ad_as2
-import eko.anomalous_dimensions.harmonics as h
+import eko.harmonics as h
from eko import constants as const
NF = 5
@@ -11,9 +11,11 @@
def test_gamma_1():
# number conservation
- np.testing.assert_allclose(ad_as2.gamma_nsm(1, NF), 0.0, atol=2e-6)
+ sx_n1 = h.sx(1, 2)
+ np.testing.assert_allclose(ad_as2.gamma_nsm(1, NF, sx_n1), 0.0, atol=2e-6)
- gS1 = ad_as2.gamma_singlet(2, NF)
+ sx_n2 = h.sx(2, 2)
+ gS1 = ad_as2.gamma_singlet(2, NF, sx_n2)
# gluon momentum conservation
# the CA*NF term seems to be tough to compute, so raise the constraint ...
np.testing.assert_allclose(gS1[0, 1] + gS1[1, 1], 0.0, atol=4e-5)
@@ -23,9 +25,9 @@ def test_gamma_1():
assert gS1.shape == (2, 2)
# reference values are obtained from MMa
- # Non singlet sector
+ # non-singlet sector
np.testing.assert_allclose(
- ad_as2.gamma_nsp(2, NF),
+ ad_as2.gamma_nsp(2, NF, sx_n2),
(-112.0 * const.CF + 376.0 * const.CA - 64.0 * NF) * const.CF / 27.0,
)
# singlet sector
@@ -39,25 +41,31 @@ def test_gamma_1():
# add additional point at (analytical) continuation point
np.testing.assert_allclose(
- ad_as2.gamma_nsm(2, NF),
+ ad_as2.gamma_nsm(2, NF, sx_n2),
(
- (34.0 / 27.0 * (-47.0 + 6 * np.pi**2) - 16.0 * h.zeta3) * const.CF
- + (373.0 / 9.0 - 34.0 * np.pi**2 / 9.0 + 8.0 * h.zeta3) * const.CA
+ (34.0 / 27.0 * (-47.0 + 6 * np.pi**2) - 16.0 * h.constants.zeta3)
+ * const.CF
+ + (373.0 / 9.0 - 34.0 * np.pi**2 / 9.0 + 8.0 * h.constants.zeta3)
+ * const.CA
- 64.0 * NF / 27.0
)
* const.CF,
)
+ sx_n3 = h.sx(3, 2)
+ sx_n4 = h.sx(4, 2)
np.testing.assert_allclose(
- ad_as2.gamma_nsp(3, NF),
+ ad_as2.gamma_nsp(3, NF, sx_n3),
(
- (-34487.0 / 432.0 + 86.0 * np.pi**2 / 9.0 - 16.0 * h.zeta3) * const.CF
- + (459.0 / 8.0 - 43.0 * np.pi**2 / 9.0 + 8.0 * h.zeta3) * const.CA
+ (-34487.0 / 432.0 + 86.0 * np.pi**2 / 9.0 - 16.0 * h.constants.zeta3)
+ * const.CF
+ + (459.0 / 8.0 - 43.0 * np.pi**2 / 9.0 + 8.0 * h.constants.zeta3)
+ * const.CA
- 415.0 * NF / 108.0
)
* const.CF,
)
np.testing.assert_allclose(ad_as2.gamma_ps(3, NF), -1391.0 * const.CF * NF / 5400.0)
- gS1 = ad_as2.gamma_singlet(3, NF)
+ gS1 = ad_as2.gamma_singlet(3, NF, sx_n3)
np.testing.assert_allclose(
gS1[1, 0],
(
@@ -70,14 +78,14 @@ def test_gamma_1():
np.testing.assert_allclose(
gS1[1, 1],
(
- (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.zeta3)
+ (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.constants.zeta3)
* const.CA**2
- 967.0 / 270.0 * const.CA * NF
+ 541.0 / 216.0 * const.CF * NF
),
rtol=6e-7,
) # gg
- gS1 = ad_as2.gamma_singlet(4, NF)
+ gS1 = ad_as2.gamma_singlet(4, NF, sx_n4)
np.testing.assert_allclose(
gS1[0, 1], (-56317.0 / 18000.0 * const.CF + 16387.0 / 9000.0 * const.CA) * NF
) # qg
@@ -85,7 +93,7 @@ def test_gamma_1():
const.update_colors(4)
np.testing.assert_allclose(const.CA, 4.0)
- gS1 = ad_as2.gamma_singlet(3, NF)
+ gS1 = ad_as2.gamma_singlet(3, NF, sx_n3)
np.testing.assert_allclose(
gS1[1, 0],
(
@@ -98,14 +106,14 @@ def test_gamma_1():
np.testing.assert_allclose(
gS1[1, 1],
(
- (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.zeta3)
+ (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.constants.zeta3)
* const.CA**2
- 967.0 / 270.0 * const.CA * NF
+ 541.0 / 216.0 * const.CF * NF
),
rtol=6e-7,
) # gg
- gS1 = ad_as2.gamma_singlet(4, NF)
+ gS1 = ad_as2.gamma_singlet(4, NF, sx_n4)
np.testing.assert_allclose(
gS1[0, 1], (-56317.0 / 18000.0 * const.CF + 16387.0 / 9000.0 * const.CA) * NF
) # qg
diff --git a/tests/eko/test_ad_nnlo.py b/tests/eko/test_ad_nnlo.py
index 58381478a..8348712fa 100644
--- a/tests/eko/test_ad_nnlo.py
+++ b/tests/eko/test_ad_nnlo.py
@@ -3,36 +3,23 @@
import numpy as np
import eko.anomalous_dimensions.as3 as ad_as3
-from eko.anomalous_dimensions import harmonics
+from eko import harmonics as h
NF = 5
-def get_sx(N):
- """Collect the S-cache"""
- sx = np.array(
- [
- harmonics.harmonic_S1(N),
- harmonics.harmonic_S2(N),
- harmonics.harmonic_S3(N),
- harmonics.harmonic_S4(N),
- ]
- )
- return sx
-
-
# Reference numbers coming from Mathematica
def test_gamma_2():
# number conservation - each is 0 on its own, see :cite:`Moch:2004pa`
N = 1
- sx = get_sx(N)
- np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx), 0.000960586, rtol=3e-7)
- np.testing.assert_allclose(ad_as3.gamma_nsm(N, NF, sx), -0.000594225, rtol=6e-7)
+ sx_n1 = h.sx(N, max_weight=3)
+ np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx_n1), 0.000960586, rtol=3e-7)
+ np.testing.assert_allclose(ad_as3.gamma_nsm(N, NF, sx_n1), -0.000594225, rtol=6e-7)
# get singlet sector
N = 2
- sx = get_sx(N)
- gS2 = ad_as3.gamma_singlet(N, NF, sx)
+ sx_n2 = h.sx(N, max_weight=4)
+ gS2 = ad_as3.gamma_singlet(N, NF, sx_n2)
# gluon momentum conservation
np.testing.assert_allclose(gS2[0, 1] + gS2[1, 1], 0.00388726, rtol=2e-6)
@@ -42,4 +29,4 @@ def test_gamma_2():
assert gS2.shape == (2, 2)
# test nsv_2 equal to referece value
- np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx), -188.325593, rtol=3e-7)
+ np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx_n2), -188.325593, rtol=3e-7)
diff --git a/tests/eko/test_beta.py b/tests/eko/test_beta.py
index b6c61c167..45d9bd37f 100644
--- a/tests/eko/test_beta.py
+++ b/tests/eko/test_beta.py
@@ -7,7 +7,7 @@
import pytest
from eko import beta
-from eko.anomalous_dimensions.harmonics import zeta3
+from eko.harmonics.constants import zeta3
def _flav_test(function):
diff --git a/tests/eko/test_ev_operator.py b/tests/eko/test_ev_operator.py
index ba7cfc807..a085442d3 100644
--- a/tests/eko/test_ev_operator.py
+++ b/tests/eko/test_ev_operator.py
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
+import copy
import os
import numpy as np
@@ -124,6 +125,44 @@ def test_quad_ker(monkeypatch):
np.testing.assert_allclose(res_ns, 0.0)
+theory_card = {
+ "alphas": 0.35,
+ "PTO": 0,
+ "ModEv": "TRN",
+ "fact_to_ren_scale_ratio": 1.0,
+ "Qref": np.sqrt(2),
+ "nfref": None,
+ "Q0": np.sqrt(2),
+ "nf0": 3,
+ "FNS": "FFNS",
+ "NfFF": 3,
+ "IC": 0,
+ "IB": 0,
+ "mc": 1.0,
+ "mb": 4.75,
+ "mt": 173.0,
+ "kcThr": np.inf,
+ "kbThr": np.inf,
+ "ktThr": np.inf,
+ "MaxNfPdf": 6,
+ "MaxNfAs": 6,
+ "HQ": "POLE",
+ "ModSV": None,
+}
+operators_card = {
+ "Q2grid": [1, 10],
+ "interpolation_xgrid": [0.1, 1.0],
+ "interpolation_polynomial_degree": 1,
+ "interpolation_is_log": True,
+ "debug_skip_singlet": False,
+ "debug_skip_non_singlet": False,
+ "ev_op_max_order": 1,
+ "ev_op_iterations": 1,
+ "backward_inversion": "exact",
+ "n_integration_cores": 1,
+}
+
+
class TestOperator:
def test_labels(self):
o = Operator(
@@ -168,58 +207,28 @@ def test_n_pools(self):
)
assert o.n_pools == os.cpu_count() - excluded_cores
- def test_compute(self, monkeypatch):
- # setup objs
- theory_card = {
- "alphas": 0.35,
- "PTO": 0,
- "ModEv": "TRN",
- "fact_to_ren_scale_ratio": 1.0,
- "Qref": np.sqrt(2),
- "nfref": None,
- "Q0": np.sqrt(2),
- "nf0": 3,
- "FNS": "FFNS",
- "NfFF": 3,
- "IC": 0,
- "IB": 0,
- "mc": 1.0,
- "mb": 4.75,
- "mt": 173.0,
- "kcThr": np.inf,
- "kbThr": np.inf,
- "ktThr": np.inf,
- "MaxNfPdf": 6,
- "MaxNfAs": 6,
- "HQ": "POLE",
- "ModSV": None,
- }
- operators_card = {
- "Q2grid": [1, 10],
- "interpolation_xgrid": [0.1, 1.0],
- "interpolation_polynomial_degree": 1,
- "interpolation_is_log": True,
- "debug_skip_singlet": False,
- "debug_skip_non_singlet": False,
- "ev_op_max_order": 1,
- "ev_op_iterations": 1,
- "backward_inversion": "exact",
- "n_integration_cores": 1,
- }
+ def test_compute_parallel(self, monkeypatch):
+ tcard = copy.deepcopy(theory_card)
+ ocard = copy.deepcopy(operators_card)
+ ocard["n_integration_cores"] = 2
g = OperatorGrid.from_dict(
- theory_card,
- operators_card,
- ThresholdsAtlas.from_dict(theory_card),
- StrongCoupling.from_dict(theory_card),
- InterpolatorDispatcher.from_dict(operators_card),
+ tcard,
+ ocard,
+ ThresholdsAtlas.from_dict(tcard),
+ StrongCoupling.from_dict(tcard),
+ InterpolatorDispatcher.from_dict(ocard),
)
- o = Operator(g.config, g.managers, 3, 2, 10)
+ # setup objs
+ o = Operator(g.config, g.managers, 3, 2.0, 10.0)
# fake quad
monkeypatch.setattr(
scipy.integrate, "quad", lambda *args, **kwargs: np.random.rand(2)
)
# LO
o.compute()
+ self.check_lo(o)
+
+ def check_lo(self, o):
assert (br.non_singlet_pids_map["ns-"], 0) in o.op_members
np.testing.assert_allclose(
o.op_members[(br.non_singlet_pids_map["ns-"], 0)].value,
@@ -229,6 +238,26 @@ def test_compute(self, monkeypatch):
o.op_members[(br.non_singlet_pids_map["nsV"], 0)].value,
o.op_members[(br.non_singlet_pids_map["ns+"], 0)].value,
)
+
+ def test_compute(self, monkeypatch):
+ tcard = copy.deepcopy(theory_card)
+ ocard = copy.deepcopy(operators_card)
+ g = OperatorGrid.from_dict(
+ tcard,
+ ocard,
+ ThresholdsAtlas.from_dict(tcard),
+ StrongCoupling.from_dict(tcard),
+ InterpolatorDispatcher.from_dict(ocard),
+ )
+ # setup objs
+ o = Operator(g.config, g.managers, 3, 2.0, 10.0)
+ # fake quad
+ monkeypatch.setattr(
+ scipy.integrate, "quad", lambda *args, **kwargs: np.random.rand(2)
+ )
+ # LO
+ o.compute()
+ self.check_lo(o)
# NLO
o.config["order"] = 1
o.compute()
@@ -243,7 +272,7 @@ def test_compute(self, monkeypatch):
# unity operators
for n in range(0, 2 + 1):
- o1 = Operator(g.config, g.managers, 3, 2, 2)
+ o1 = Operator(g.config, g.managers, 3, 2.0, 2.0)
o1.config["order"] = n
o1.compute()
for k in br.non_singlet_labels:
diff --git a/tests/eko/test_f_functions.py b/tests/eko/test_f_functions.py
index 8485f9bd0..b7ee8e14c 100644
--- a/tests/eko/test_f_functions.py
+++ b/tests/eko/test_f_functions.py
@@ -3,13 +3,12 @@
import numpy as np
-import eko.matching_conditions.as3.s_functions as sf
-from eko.anomalous_dimensions import harmonics
+from eko import harmonics
-zeta2 = harmonics.zeta2
-zeta3 = harmonics.zeta3
-zeta4 = harmonics.zeta4
-zeta5 = harmonics.zeta5
+zeta2 = harmonics.constants.zeta2
+zeta3 = harmonics.constants.zeta3
+zeta4 = harmonics.constants.zeta4
+zeta5 = harmonics.constants.zeta5
log2 = np.log(2)
# reference values coming fom mathematica
@@ -58,101 +57,107 @@
# F19, F20,F21 are not present in that paper.
def test_F9():
for N, vals in zip(testN, refvals["S41"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S3 = harmonics.harmonic_S3(N)
- S41 = sf.harmonic_S41(N, S1, S2, S3)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ S41 = harmonics.S41(N, S1, S2, S3)
np.testing.assert_allclose(S41, vals, atol=1e-05)
def test_F11():
for N, vals in zip(testN, refvals["S311"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S311 = sf.harmonic_S311(N, S1, S2)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S311 = harmonics.S311(N, S1, S2)
np.testing.assert_allclose(S311, vals, atol=1e-05)
def test_F13():
for N, vals in zip(testN, refvals["S221"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S21 = sf.harmonic_S21(N, S1, S2)
- S221 = sf.harmonic_S221(N, S1, S2, S21)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S21 = harmonics.S21(N, S1, S2)
+ S221 = harmonics.S221(N, S1, S2, S21)
np.testing.assert_allclose(S221, vals, atol=1e-05)
def test_F12_F14():
# here there is a typo in eq (9.25) of Bl_mlein_2009
for N, vals in zip(testN, refvals["Sm221"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- Sm1 = sf.harmonic_Sm1(N)
- S21 = sf.harmonic_S21(N, S1, S2)
- Sm21 = sf.harmonic_Sm21(N, Sm1)
- Sm221 = sf.harmonic_Sm221(N, S1, Sm1, S21, Sm21)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ Sm1 = harmonics.Sm1(N, S1)
+ S21 = harmonics.S21(N, S1, S2)
+ Sm21 = harmonics.Sm21(N, S1, Sm1)
+ Sm221 = harmonics.Sm221(N, S1, Sm1, S21, Sm21)
np.testing.assert_allclose(Sm221, vals, atol=1e-05)
def test_F16():
for N, vals in zip(testN, refvals["S21m2"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- Sm1 = sf.harmonic_Sm1(N)
- Sm2 = sf.harmonic_Sm2(N)
- Sm3 = sf.harmonic_Sm3(N)
- S21 = sf.harmonic_S21(N, S1, S2)
- S2m1 = sf.harmonic_S2m1(N, S2, Sm1, Sm2)
- Sm21 = sf.harmonic_Sm21(N, Sm1)
- S21m2 = sf.harmonic_S21m2(N, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ Sm1 = harmonics.Sm1(N, S1)
+ Sm2 = harmonics.Sm2(N, S2)
+ Sm3 = harmonics.Sm3(N, S3)
+ S21 = harmonics.S21(N, S1, S2)
+ S2m1 = harmonics.S2m1(N, S2, Sm1, Sm2)
+ Sm21 = harmonics.Sm21(N, S1, Sm1)
+ S21m2 = harmonics.S21m2(N, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1)
np.testing.assert_allclose(S21m2, vals, atol=1e-04)
def test_F17():
for N, vals in zip(testN, refvals["S2111"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S3 = harmonics.harmonic_S3(N)
- S2111 = sf.harmonic_S2111(N, S1, S2, S3)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ S2111 = harmonics.S2111(N, S1, S2, S3)
np.testing.assert_allclose(S2111, vals, atol=1e-05)
def test_F18():
for N, vals in zip(testN, refvals["Sm2111"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S3 = harmonics.harmonic_S3(N)
- Sm1 = sf.harmonic_Sm1(N)
- Sm2111 = sf.harmonic_Sm2111(N, S1, S2, S3, Sm1)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ Sm1 = harmonics.Sm1(N, S1)
+ Sm2111 = harmonics.Sm2111(N, S1, S2, S3, Sm1)
np.testing.assert_allclose(Sm2111, vals, atol=1e-05)
# different parametrization, less accurate
def test_F19():
for N, vals in zip(testN, refvals["S23"]):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S3 = harmonics.harmonic_S3(N)
- S23 = sf.harmonic_S23(N, S1, S2, S3)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ S23 = harmonics.S23(N, S1, S2, S3)
np.testing.assert_allclose(S23, vals, rtol=2e-03)
# different parametrization, less accurate
def test_F20():
for N, vals in zip(testN, refvals["Sm23"]):
- Sm3 = sf.harmonic_Sm3(N)
- Sm2 = sf.harmonic_Sm2(N)
- Sm1 = sf.harmonic_Sm1(N)
- Sm23 = sf.harmonic_Sm23(N, Sm1, Sm2, Sm3)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ Sm3 = harmonics.Sm3(N, S3)
+ Sm2 = harmonics.Sm2(N, S2)
+ Sm1 = harmonics.Sm1(N, S1)
+ Sm23 = harmonics.Sm23(N, Sm1, Sm2, Sm3)
np.testing.assert_allclose(Sm23, vals, rtol=1e-03)
# different parametrization, less accurate
def test_F21():
for N, vals in zip(testN, refvals["S2m3"]):
- Sm3 = sf.harmonic_Sm3(N)
- Sm2 = sf.harmonic_Sm2(N)
- Sm1 = sf.harmonic_Sm1(N)
- S2 = harmonics.harmonic_S2(N)
- S2m3 = sf.harmonic_S2m3(N, S2, Sm1, Sm2, Sm3)
+ S1 = harmonics.S1(N)
+ S2 = harmonics.S2(N)
+ S3 = harmonics.S3(N)
+ Sm3 = harmonics.Sm3(N, S3)
+ Sm2 = harmonics.Sm2(N, S2)
+ Sm1 = harmonics.Sm1(N, S1)
+ S2m3 = harmonics.S2m3(N, S2, Sm1, Sm2, Sm3)
np.testing.assert_allclose(S2m3, vals, rtol=1e-03)
diff --git a/tests/eko/test_g_functions.py b/tests/eko/test_g_functions.py
index ce9a4ccff..2dc30729f 100644
--- a/tests/eko/test_g_functions.py
+++ b/tests/eko/test_g_functions.py
@@ -3,51 +3,69 @@
import numpy as np
-import eko.matching_conditions.as3.s_functions as sf
-from eko.anomalous_dimensions import harmonics
+from eko.anomalous_dimensions import harmonics as h
-zeta3 = harmonics.zeta3
-log2 = np.log(2)
+zeta3 = h.constants.zeta3
+log2 = h.constants.log2
testN = [1, 10, 100]
-
# compare the exact values of some harmonics with Muselli parametrization
+def test_g3():
+ ns = [1.0, 2.0, 1 + 1j]
+ # NIntegrate[x^({1, 2, 1 + I} - 1) PolyLog[2, x]/(1 + x), {x, 0, 1}]
+ mma_ref_values = [0.3888958462, 0.2560382207, 0.3049381491 - 0.1589060625j]
+ for n, r in zip(ns, mma_ref_values):
+ S1 = h.S1(n)
+ np.testing.assert_almost_equal(h.g_functions.mellin_g3(n, S1), r, decimal=6)
+
+
def test_g4():
refvals = [-1, -1.34359, -1.40286]
for N, vals in zip(testN, refvals):
- S2 = harmonics.harmonic_S2(N)
- Sm1 = sf.harmonic_Sm1(N)
- Sm2 = sf.harmonic_Sm2(N)
- S2m1 = sf.harmonic_S2m1(N, S2, Sm1, Sm2)
+ is_singlet = (-1) ** N == 1
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ Sm1 = h.Sm1(N, S1, is_singlet)
+ Sm2 = h.Sm2(N, S2, is_singlet)
+ S2m1 = h.S2m1(N, S2, Sm1, Sm2, is_singlet)
np.testing.assert_allclose(S2m1, vals, atol=1e-05)
def test_g6():
refvals = [-1, -0.857976, -0.859245]
for N, vals in zip(testN, refvals):
- Sm1 = sf.harmonic_Sm1(N)
- Sm2 = sf.harmonic_Sm2(N)
- Sm31 = sf.harmonic_Sm31(N, Sm1, Sm2)
+ is_singlet = (-1) ** N == 1
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ Sm1 = h.Sm1(N, S1, is_singlet)
+ Sm2 = h.Sm2(N, S2, is_singlet)
+ Sm31 = h.Sm31(N, S1, Sm1, Sm2, is_singlet)
np.testing.assert_allclose(Sm31, vals, atol=1e-05)
def test_g5():
refvals = [-1, -0.777375, -0.784297]
for N, vals in zip(testN, refvals):
- Sm1 = sf.harmonic_Sm1(N)
- Sm2 = sf.harmonic_Sm2(N)
- Sm31 = sf.harmonic_Sm31(N, Sm1, Sm2)
- Sm22 = sf.harmonic_Sm22(N, Sm31)
+ is_singlet = (-1) ** N == 1
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ Sm1 = h.Sm1(N, S1, is_singlet)
+ Sm2 = h.Sm2(N, S2, is_singlet)
+ Sm31 = h.Sm31(N, S1, Sm1, Sm2, is_singlet)
+ Sm22 = h.Sm22(N, S1, S2, Sm2, Sm31, is_singlet)
np.testing.assert_allclose(Sm22, vals, atol=1e-05)
def test_g8():
refvals = [-1, -0.696836, -0.719637]
for N, vals in zip(testN, refvals):
- Sm1 = sf.harmonic_Sm1(N)
- Sm211 = sf.harmonic_Sm211(N, Sm1)
+ is_singlet = (-1) ** N == 1
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ Sm1 = h.Sm1(N, S1, is_singlet)
+ Sm211 = h.Sm211(N, S1, S2, Sm1, is_singlet)
np.testing.assert_allclose(Sm211, vals, atol=1e-05)
@@ -55,19 +73,20 @@ def test_g18():
testN = [1, 2, 3, 10, 100]
refvals = [1, 1.375, 1.5787, 2.0279, 2.34252]
for N, vals in zip(testN, refvals):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S21 = sf.harmonic_S21(N, S1, S2)
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ S21 = h.S21(N, S1, S2)
np.testing.assert_allclose(S21, vals, atol=1e-05)
def test_g19():
refvals = [1, 0.953673, 0.958928]
for N, vals in zip(testN, refvals):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- Sm2 = sf.harmonic_Sm2(N)
- Sm2m1 = sf.harmonic_Sm2m1(N, S1, S2, Sm2)
+ is_singlet = (-1) ** N == 1
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ Sm2 = h.Sm2(N, S2, is_singlet)
+ Sm2m1 = h.Sm2m1(N, S1, S2, Sm2)
np.testing.assert_allclose(Sm2m1, vals, atol=1e-05)
@@ -75,10 +94,10 @@ def test_g21():
testN = [1, 2, 3, 10, 100]
refvals = [1, 1.4375, 1.69985, 2.38081, 3.04323]
for N, vals in zip(testN, refvals):
- S1 = harmonics.harmonic_S1(N)
- S2 = harmonics.harmonic_S2(N)
- S3 = harmonics.harmonic_S3(N)
- S211 = sf.harmonic_S211(N, S1, S2, S3)
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ S3 = h.S3(N)
+ S211 = h.S211(N, S1, S2, S3)
np.testing.assert_allclose(S211, vals, atol=1e-05)
@@ -86,7 +105,9 @@ def test_g22():
testN = [1, 2, 3, 10, 100]
refvals = [1, 1.1875, 1.2554, 1.33724, 1.35262]
for N, vals in zip(testN, refvals):
- S2 = harmonics.harmonic_S2(N)
- S4 = harmonics.harmonic_S4(N)
- S31 = sf.harmonic_S31(N, S2, S4)
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ S3 = h.S3(N)
+ S4 = h.S4(N)
+ S31 = h.S31(N, S1, S2, S3, S4)
np.testing.assert_allclose(S31, vals, atol=1e-05)
diff --git a/tests/eko/test_harmonics.py b/tests/eko/test_harmonics.py
new file mode 100644
index 000000000..46ddbe320
--- /dev/null
+++ b/tests/eko/test_harmonics.py
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+import numpy as np
+
+from eko import harmonics as h
+
+
+def test_spm1():
+ for k in range(1, 5 + 1):
+ f = np.sum([1.0 / j for j in range(1, k + 1)])
+ S1 = h.S1(k)
+ np.testing.assert_allclose(f, S1)
+ g = np.sum([(-1.0) ** j / j for j in range(1, k + 1)])
+ np.testing.assert_allclose(g, h.Sm1(k, S1, (-1) ** k == 1))
+
+
+def test_spm2():
+ for k in range(1, 5 + 1):
+ f = np.sum([1.0 / j**2 for j in range(1, k + 1)])
+ S2 = h.S2(k)
+ np.testing.assert_allclose(f, S2)
+ g = np.sum([(-1.0) ** j / j**2 for j in range(1, k + 1)])
+ np.testing.assert_allclose(g, h.Sm2(k, S2, (-1) ** k == 1))
+
+
+def test_harmonics_cache():
+ N = np.random.randint(100)
+ is_singlet = (-1) ** N == 1
+ S1 = h.S1(N)
+ S2 = h.S2(N)
+ S3 = h.S3(N)
+ S4 = h.S4(N)
+ S5 = h.S5(N)
+ Sm1 = h.Sm1(N, S1, is_singlet)
+ Sm2 = h.Sm2(N, S2, is_singlet)
+ sx = np.array([S1, S2, S3, S4, S5])
+ smx_test = np.array(
+ [
+ Sm1,
+ Sm2,
+ h.Sm3(N, S3, is_singlet),
+ h.Sm4(N, S4, is_singlet),
+ h.Sm5(N, S5, is_singlet),
+ ]
+ )
+ np.testing.assert_allclose(h.smx(N, sx, is_singlet), smx_test)
+ s3x_test = np.array(
+ [
+ h.S21(N, S1, S2),
+ h.S2m1(N, S2, Sm1, Sm2, is_singlet),
+ h.Sm21(N, S1, Sm1, is_singlet),
+ h.Sm2m1(N, S1, S2, Sm2),
+ ]
+ )
+ np.testing.assert_allclose(h.s3x(N, sx, smx_test, is_singlet), s3x_test)
+ Sm31 = h.Sm31(N, S1, Sm1, Sm2, is_singlet)
+ s4x_test = np.array(
+ [
+ h.S31(N, S1, S2, S3, S4),
+ h.S211(N, S1, S2, S3),
+ h.Sm22(N, S1, S2, Sm2, Sm31, is_singlet),
+ h.Sm211(N, S1, S2, Sm1, is_singlet),
+ Sm31,
+ ]
+ )
+ np.testing.assert_allclose(h.s4x(N, sx, smx_test, is_singlet), s4x_test)
+
+
+# reference values coming fom mathematica
+# and are computed doing an inverse mellin
+# transformation
+testN = [1, 2, 2 + 2j, 10 + 5j, 100]
+refvals = {
+ "Sm1": [-1.0, -0.5, -0.692917 - 0.000175788j, -0.693147 - 2.77406e-9j, -0.688172],
+ "Sm2": [
+ -1.0,
+ -0.75,
+ -0.822442 - 0.0000853585j,
+ -0.822467 - 4.29516e-10j,
+ -0.822418,
+ ],
+ "Sm3": [
+ -1.0,
+ -0.875,
+ -0.901551 - 0.0000255879j,
+ -0.901543 - 4.61382e-11j,
+ -0.901542,
+ ],
+ "Sm4": [
+ -1.0,
+ -0.9375,
+ -0.947039 - 4.84597e-6j,
+ -0.947033 - 3.99567e-12j,
+ -0.947033,
+ ],
+ "Sm5": [-1.0, -0.96875, -0.972122 - 1.13162e-7j, -0.97212 - 2.81097e-13j, -0.97212],
+ "Sm21": [
+ -1.0,
+ -0.625,
+ -0.751192 - 0.000147181j,
+ -0.751286 - 1.17067e-9j,
+ -0.751029,
+ ],
+}
+
+
+def test_Sm21():
+ for N, vals in zip(testN, refvals["Sm21"]):
+ S1 = h.S1(N)
+ Sm1 = h.Sm1(N, S1)
+ np.testing.assert_allclose(h.Sm21(N, S1, Sm1), vals, atol=1e-06)
+
+
+def test_Smx():
+ for j, N in enumerate(testN):
+ sx = h.sx(N)
+ smx = [
+ h.Sm1(N, sx[0]),
+ h.Sm2(N, sx[1]),
+ h.Sm3(N, sx[2]),
+ h.Sm4(N, sx[3]),
+ h.Sm5(N, sx[4]),
+ ]
+ for i, sm in enumerate(smx):
+ np.testing.assert_allclose(sm, refvals[f"Sm{i+1}"][j], atol=1e-06)
+
+
+def test_smx_continuation():
+ # test s_{-m} against a different analytic continuation
+ N = np.random.rand() + 1j * np.random.rand()
+ sx = h.sx(N)
+
+ def dm(m):
+ zeta_list = [
+ h.constants.zeta2,
+ h.constants.zeta3,
+ h.constants.zeta4,
+ h.constants.zeta5,
+ ]
+ if m == 1:
+ return h.constants.log2
+ return (2 ** (m - 1) - 1) / (2 ** (m - 1)) * zeta_list[m - 2]
+
+ def sm_complex(m, N):
+ return ((-1) ** N) / 2**m * (s(m, N / 2) - s(m, (N - 1) / 2)) - dm(m)
+
+ def s(m, N):
+ if m == 1:
+ return h.S1(N)
+ if m == 2:
+ return h.S2(N)
+ if m == 3:
+ return h.S3(N)
+ if m == 4:
+ return h.S4(N)
+ return h.S5(N)
+
+ def sm(m, N, hs):
+ if m == 1:
+ return h.Sm1(N, hs)
+ if m == 2:
+ return h.Sm2(N, hs)
+ if m == 3:
+ return h.Sm3(N, hs)
+ if m == 4:
+ return h.Sm4(N, hs)
+ return h.Sm5(N, hs)
+
+ for j, hs in enumerate(sx):
+ np.testing.assert_allclose(sm_complex(j + 1, N), sm(j + 1, N, hs))
diff --git a/tests/eko/test_matching_n3lo.py b/tests/eko/test_matching_n3lo.py
index 562820764..753d52ebc 100644
--- a/tests/eko/test_matching_n3lo.py
+++ b/tests/eko/test_matching_n3lo.py
@@ -4,20 +4,17 @@
from eko.matching_conditions import as3
from eko.matching_conditions.as3 import A_ns, A_qqNS, A_singlet
-from eko.matching_conditions.operator_matrix_element import get_s3x, get_s4x, get_smx
+from eko.matching_conditions.operator_matrix_element import compute_harmonics_cache
-def test_A_3(get_sx):
+def test_A_3():
logs = [0, 10]
nf = 3
for L in logs:
N = 1.0
- sx = get_sx(N)
- smx = get_smx(N)
- s3x = get_s3x(N, sx, smx)
- s4x = get_s4x(N, sx, smx)
- aNSqq3 = A_qqNS(N, sx, smx, s3x, s4x, nf, L)
+ sx_cache = compute_harmonics_cache(N, 3, False)
+ aNSqq3 = A_qqNS(N, sx_cache, nf, L)
# quark number conservation
# the accuracy of this test depends directly on the precision of the
# F functions, thus is dominated by F19,F20,F21 accuracy are the worst ones
@@ -25,54 +22,37 @@ def test_A_3(get_sx):
np.testing.assert_allclose(aNSqq3, 0.0, atol=5e-3)
N = 2.0
- sx = get_sx(N)
- smx = get_smx(N)
- s3x = get_s3x(N, sx, smx)
- s4x = get_s4x(N, sx, smx)
+ sx_cache = compute_harmonics_cache(N, 3, True)
# reference value comes form Mathematica, gg is not fullycomplete
# thus the reference value is not 0.0
# Here the accuracy of this test depends on the approximation of AggTF2
np.testing.assert_allclose(
- as3.A_gg(N, sx, smx, s3x, s4x, nf, L)
- + as3.A_qg(N, sx, smx, s3x, s4x, nf, L)
- + as3.A_Hg(N, sx, smx, s3x, s4x, nf, L),
+ as3.A_gg(N, sx_cache, nf, L)
+ + as3.A_qg(N, sx_cache, nf, L)
+ + as3.A_Hg(N, sx_cache, nf, L),
145.148,
rtol=32e-3,
)
- # here you get division by 0 as in Mathematica
- # np.testing.assert_allclose(
- # n3lo.A_gq(N, sx, smx, s3x, s4x, nf,L)
- # + n3lo.A_qqNS(N, sx, smx, s3x, s4x, nf,L)
- # + n3lo.A_qqPS(N, sx, nf,L)
- # + n3lo.A_Hq(N, sx, smx, s3x, s4x, nf,L),
- # 0.0,
- # atol=2e-6,
- # )
-
- # here you get division by 0 as in Mathematica
- # sx_all = get_sx(N)
- # sx_all = np.append(sx_all, get_smx(N))
- # sx_all = np.append(sx_all, get_s3x(N, get_sx(N),get_smx(N)))
- # sx_all = np.append(sx_all, get_s4x(N, get_sx(N),get_smx(N)))
- # aS3 = A_singlet(N, sx_all, nf, L)
- # gluon momentum conservation
- # np.testing.assert_allclose(aS3[0, 0] + aS3[1, 0] + aS3[2, 0], 0.0, atol=2e-6)
- # quark momentum conservation
- # np.testing.assert_allclose(aS3[0, 1] + aS3[1, 1] + aS3[2, 1], 0.0, atol=1e-11)
+ # here you can't test the quark momentum conservation
+ # since you get division by 0 as in Mathematica
+ # due to a factor 1/(N-2) which should cancel when
+ # doing a proper limit.
N = 3 + 2j
- sx_all = np.random.rand(19) + 1j * np.random.rand(19)
- aS3 = A_singlet(N, sx_all, nf, L)
- aNS3 = A_ns(N, sx_all, nf, L)
+ sx_cache = compute_harmonics_cache(np.random.rand(), 3, True)
+ ns_sx_cache = compute_harmonics_cache(np.random.rand(), 3, False)
+ aS3 = A_singlet(N, sx_cache, ns_sx_cache, nf, L)
+ aNS3 = A_ns(N, ns_sx_cache, nf, L)
assert aNS3.shape == (2, 2)
assert aS3.shape == (3, 3)
np.testing.assert_allclose(aS3[:, 2], np.zeros(3))
np.testing.assert_allclose(aNS3[1, 1], 0)
+ np.testing.assert_allclose(aNS3[0, 0], as3.A_qqNS(N, ns_sx_cache, nf, L))
-def test_Blumlein_3(get_sx):
+def test_Blumlein_3():
# Test against Blumlein OME implementation :cite:`Bierenbaum:2009mv`.
# For singlet OME only even moments are available in that code.
# Note there is a minus sign in the definition of L.
@@ -134,8 +114,8 @@ def test_Blumlein_3(get_sx):
10: [-74.4038, -1347.17, -1278.72, -1080.31, -291.084],
}
ref_val_qqNS = {
- 0: [-37.0244, -40.1562, -36.0358, -28.3506, 6.83759],
- 10: [-7574.85, -14130.3, -17928.6, -22768.0, -45425.9],
+ 0: [-36.5531, -40.1257, -36.0358, -28.3555, 6.83735],
+ 10: [-7562.97, -14129.7, -17928.6, -22768.1, -45326.9],
}
ref_val_qqPS = {
0: [-8.65731, -0.766936, -0.0365199, 0.147675, 0.0155598],
@@ -145,11 +125,9 @@ def test_Blumlein_3(get_sx):
for i, N in enumerate([4.0, 6.0, 10.0, 100.0]):
idx = i + 1
for L in [0, 10]:
- sx_all = get_sx(N)
- sx_all = np.append(sx_all, get_smx(N))
- sx_all = np.append(sx_all, get_s3x(N, get_sx(N), get_smx(N)))
- sx_all = np.append(sx_all, get_s4x(N, get_sx(N), get_smx(N)))
- aS3 = A_singlet(N, sx_all, nf, L)
+ sx_cache = compute_harmonics_cache(N, 3, True)
+ ns_sx_cache = compute_harmonics_cache(N, 3, False)
+ aS3 = A_singlet(N, sx_cache, ns_sx_cache, nf, L)
# here we have a different approximation for AggTF2,
# some terms are neglected
@@ -170,28 +148,25 @@ def test_Blumlein_3(get_sx):
# here we have a different convention for (-1)^N,
# for even values qqNS is analytically continued
- # as non singlet. The accuracy is worst for large N
+ # as non-singlet. The accuracy is worst for large N
# due to the approximations of F functions.
np.testing.assert_allclose(
- aS3[1, 1], ref_val_qqNS[L][idx] + ref_val_qqPS[L][idx], rtol=3e-2
+ aS3[1, 1], ref_val_qqNS[L][idx] + ref_val_qqPS[L][idx], rtol=8e-2
)
# Here we test the critical parts
nf = 3
ref_ggTF_app = [-28.9075, -180.659, -229.537, -281.337, -467.164]
for idx, N in enumerate([2.0, 4.0, 6.0, 10.0, 100.0]):
- sx = get_sx(N)
- smx = get_smx(N)
- s3x = get_s3x(N, sx, smx)
- s4x = get_s4x(N, sx, smx)
- Aggtf2 = as3.aggTF2.A_ggTF2(N, sx, s3x)
+ sx_cache = compute_harmonics_cache(N, 3, True)
+ Aggtf2 = as3.aggTF2.A_ggTF2(N, sx_cache)
if N != 100:
# Limited in the small N region
np.testing.assert_allclose(Aggtf2, ref_val_ggTF2[0][idx], rtol=15e-2)
np.testing.assert_allclose(Aggtf2, ref_ggTF_app[idx], rtol=2e-4)
np.testing.assert_allclose(
- as3.agg.A_gg(N, sx, smx, s3x, s4x, nf, L=0) - Aggtf2,
+ as3.agg.A_gg(N, sx_cache, nf, L=0) - Aggtf2,
ref_val_gg[0][idx],
rtol=3e-6,
)
@@ -199,21 +174,23 @@ def test_Blumlein_3(get_sx):
# odd numbers of qqNS
# Limited accuracy due to F functions
ref_qqNS_odd = [-40.94998646588999, -21.598793547423504, 6.966325573931755]
- for N, ref in zip([3.0, 15.0, 101.0], ref_qqNS_odd):
- sx = get_sx(N)
- smx = get_smx(N)
- s3x = get_s3x(N, sx, smx)
- s4x = get_s4x(N, sx, smx)
+ rtols = [4e-4, 3e-3, 2.1e-2]
+ for N, ref, rtol in zip([3.0, 15.0, 101.0], ref_qqNS_odd, rtols):
+ sx_cache = compute_harmonics_cache(N, 3, False)
np.testing.assert_allclose(
- as3.aqqNS.A_qqNS(N, sx, smx, s3x, s4x, nf, L=0), ref, rtol=3e-2
+ as3.aqqNS.A_qqNS(N, sx_cache, nf, L=0), ref, rtol=rtol
)
-def test_AHq_asymptotic(get_sx):
+def test_AHq_asymptotic():
+ # Odd moments can't be not tested, since in the
+ # reference values coming from mathematica, some
+ # harmonics still contains some (-1)**N factors which
+ # should be continued with 1, but this is not doable.
refs = [
- -1.06712,
+ # -1.06712,
0.476901,
- -0.771605,
+ # -0.771605,
0.388789,
0.228768,
0.114067,
@@ -229,9 +206,9 @@ def test_AHq_asymptotic(get_sx):
-0.000560666,
]
Ns = [
- 11.0,
+ # 11.0,
12.0,
- 13.0,
+ # 13.0,
14.0,
20.0,
30.0,
@@ -253,10 +230,7 @@ def test_AHq_asymptotic(get_sx):
# Ns = [31.,32.,33.,34.,35.,36.,37.,38.,39.]
nf = 3
for N, r in zip(Ns, refs):
- sx = get_sx(N)
- smx = get_smx(N)
- s3x = get_s3x(N, sx, smx)
- s4x = get_s4x(N, sx, smx)
+ sx_cache = compute_harmonics_cache(N, 3, True)
np.testing.assert_allclose(
- as3.aHq.A_Hq(N, sx, smx, s3x, s4x, nf, L=0), r, rtol=1e-5, atol=1e-5
+ as3.aHq.A_Hq(N, sx_cache, nf, L=0), r, rtol=1e-5, atol=1e-5
)
diff --git a/tests/eko/test_matching_nlo.py b/tests/eko/test_matching_nlo.py
index 124c6bec8..bf99faf3f 100644
--- a/tests/eko/test_matching_nlo.py
+++ b/tests/eko/test_matching_nlo.py
@@ -3,13 +3,14 @@
import numpy as np
from eko.matching_conditions.as1 import A_ns, A_singlet
+from eko.matching_conditions.operator_matrix_element import compute_harmonics_cache
-def test_A_1_intrinsic(get_sx):
+def test_A_1_intrinsic():
L = 100.0
N = 2
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 1, True)
aS1 = A_singlet(N, sx, L)
# heavy quark momentum conservation
np.testing.assert_allclose(aS1[0, 2] + aS1[1, 2] + aS1[2, 2], 0.0, atol=1e-10)
@@ -18,22 +19,22 @@ def test_A_1_intrinsic(get_sx):
np.testing.assert_allclose(aS1[0, 0] + aS1[1, 0] + aS1[2, 0], 0.0)
-def test_A_1_shape(get_sx):
+def test_A_1_shape():
N = 2
L = 3.0
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 1, (-1) ** N == 1)
aNS1i = A_ns(N, sx, L)
aS1i = A_singlet(N, sx, L)
assert aNS1i.shape == (2, 2)
assert aS1i.shape == (3, 3)
- # check intrisic hh is the same
+ # check intrinsic hh is the same
assert aNS1i[1, 1] == aS1i[2, 2]
-def test_Blumlein_1(get_sx):
+def test_Blumlein_1():
# Test against Blumlein OME implementation :cite:`Bierenbaum:2009mv`.
# Only even moments are available in that code.
# Note there is a minus sign in the definition of L.
@@ -46,7 +47,7 @@ def test_Blumlein_1(get_sx):
for n in range(N_vals):
N = 2 * n + 2
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 1, True)
for L, ref_gg in ref_val_gg.items():
aS1 = A_singlet(N, sx, L)
np.testing.assert_allclose(aS1[0, 0], ref_gg[n], rtol=1e-6)
diff --git a/tests/eko/test_matching_nnlo.py b/tests/eko/test_matching_nnlo.py
index ce1dcfda0..90e373ae7 100644
--- a/tests/eko/test_matching_nnlo.py
+++ b/tests/eko/test_matching_nnlo.py
@@ -3,22 +3,23 @@
import numpy as np
-from eko.anomalous_dimensions import harmonics
+from eko.harmonics import constants
from eko.matching_conditions.as2 import A_ns, A_qq_ns, A_singlet
+from eko.matching_conditions.operator_matrix_element import compute_harmonics_cache
-def test_A_2(get_sx):
+def test_A_2():
logs = [0, 100]
for L in logs:
N = 1
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 2, False)
aNSqq2 = A_qq_ns(N, sx, L)
# quark number conservation
np.testing.assert_allclose(aNSqq2, 0.0, atol=2e-11)
N = 2
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 2, True)
aS2 = A_singlet(N, sx, L)
# gluon momentum conservation
@@ -36,9 +37,9 @@ def test_A_2(get_sx):
def test_A_2_shape():
- N = 2
+ N = np.random.rand()
L = 3
- sx = np.zeros(3, np.complex_)
+ sx = compute_harmonics_cache(N, 2, (-1) ** N == 1)
aNS2 = A_ns(N, sx, L)
aS2 = A_singlet(N, sx, L)
@@ -50,18 +51,18 @@ def test_A_2_shape():
assert aNS2[0].all() == aNS2[1].all()
-def test_pegasus_sign(get_sx):
+def test_pegasus_sign():
# reference value come from Pegasus code transalted Mathematica
ref_val = -21133.9
N = 2
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 2, True)
L = 100.0
aS2 = A_singlet(N, sx, L)
np.testing.assert_allclose(aS2[0, 0], ref_val, rtol=4e-5)
-def test_Blumlein_2(get_sx):
+def test_Blumlein_2():
# Test against Blumlein OME implementation :cite:`Bierenbaum:2009zt`.
# For singlet OME only even moments are available in that code.
# Note there is a minus sign in the definition of L.
@@ -119,7 +120,7 @@ def test_Blumlein_2(get_sx):
}
for N in range(2, 11):
for L, ref_Hg in ref_val_Hg.items():
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 2, True)
aS2 = A_singlet(N, sx, L)
if N % 2 == 0:
idx = int(N / 2 - 1)
@@ -130,21 +131,21 @@ def test_Blumlein_2(get_sx):
np.testing.assert_allclose(aS2[1, 1], ref_val_qq[L][N - 2], rtol=4e-6)
-def test_Hg2_pegasus(get_sx):
+def test_Hg2_pegasus():
# Test against the parametrized expression for A_Hg
# coming from Pegasus code
# This parametrization is less accurate.
L = 0
for N in range(3, 20):
- sx = get_sx(N)
- S1 = sx[0]
- S2 = sx[1]
- S3 = sx[2]
+ sx = compute_harmonics_cache(N, 2, True)
+ S1 = sx[0][0]
+ S2 = sx[1][0]
+ S3 = sx[2][0]
aS2 = A_singlet(N, sx, L)
E2 = (
- 2.0 / N * (harmonics.zeta3 - S3 + 1.0 / N * (harmonics.zeta2 - S2 - S1 / N))
+ 2.0 / N * (constants.zeta3 - S3 + 1.0 / N * (constants.zeta2 - S2 - S1 / N))
)
a_hg_param = (
@@ -164,12 +165,12 @@ def test_Hg2_pegasus(get_sx):
np.testing.assert_allclose(aS2[2, 0], a_hg_param, rtol=7e-4)
-def test_msbar_matching(get_sx):
+def test_msbar_matching():
logs = [0, 100]
for L in logs:
N = 2
- sx = get_sx(N)
+ sx = compute_harmonics_cache(N, 2, True)
aS2 = A_singlet(N, sx, L, True)
# gluon momentum conservation
np.testing.assert_allclose(aS2[0, 0] + aS2[1, 0] + aS2[2, 0], 0.0, atol=2e-6)
diff --git a/tests/eko/test_ome.py b/tests/eko/test_ome.py
index dc14e08e0..593bed230 100644
--- a/tests/eko/test_ome.py
+++ b/tests/eko/test_ome.py
@@ -6,84 +6,35 @@
from eko import basis_rotation as br
from eko import interpolation, mellin
-from eko.anomalous_dimensions.harmonics import (
- harmonic_S1,
- harmonic_S2,
- harmonic_S3,
- harmonic_S4,
- harmonic_S5,
-)
from eko.evolution_operator.grid import OperatorGrid
from eko.interpolation import InterpolatorDispatcher
-from eko.matching_conditions.as3 import s_functions as sf
from eko.matching_conditions.operator_matrix_element import (
A_non_singlet,
A_singlet,
OperatorMatrixElement,
build_ome,
- get_s3x,
- get_s4x,
- get_smx,
+ compute_harmonics_cache,
quad_ker,
)
from eko.strong_coupling import StrongCoupling
from eko.thresholds import ThresholdsAtlas
-def test_HarmonicsCache():
- N = np.random.rand() + 1.0j * np.random.rand()
- Sm1 = sf.harmonic_Sm1(N)
- Sm2 = sf.harmonic_Sm2(N)
- S1 = harmonic_S1(N)
- S2 = harmonic_S2(N)
- S3 = harmonic_S3(N)
- S4 = harmonic_S4(N)
- sx = np.array([S1, S2, S3, S4, harmonic_S5(N)])
- smx_test = np.array(
- [
- Sm1,
- Sm2,
- sf.harmonic_Sm3(N),
- sf.harmonic_Sm4(N),
- sf.harmonic_Sm5(N),
- ]
- )
- np.testing.assert_allclose(get_smx(N), smx_test)
- s3x_test = np.array(
- [
- sf.harmonic_S21(N, S1, S2),
- sf.harmonic_S2m1(N, S2, Sm1, Sm2),
- sf.harmonic_Sm21(N, Sm1),
- sf.harmonic_Sm2m1(N, S1, S2, Sm2),
- ]
- )
- np.testing.assert_allclose(get_s3x(N, sx, smx_test), s3x_test)
- Sm31 = sf.harmonic_Sm31(N, Sm1, Sm2)
- s4x_test = np.array(
- [
- sf.harmonic_S31(N, S2, S4),
- sf.harmonic_S211(N, S1, S2, S3),
- sf.harmonic_Sm22(N, Sm31),
- sf.harmonic_Sm211(N, Sm1),
- Sm31,
- ]
- )
- np.testing.assert_allclose(get_s4x(N, sx, smx_test), s4x_test)
-
-
def test_build_ome_as():
# test that if as = 0 ome is and identity
- N = 2
+ N = complex(2.123)
L = 0.0
a_s = 0.0
- sx = np.random.rand(19) + 1j * np.random.rand(19)
nf = 3
is_msbar = False
- for o in [0, 1, 2, 3]:
+ for o in [1, 2, 3]:
+ sx_singlet = compute_harmonics_cache(N, o, True)
+ sx_ns = sx_singlet
if o == 3:
- N = complex(2.123)
- aNS = A_non_singlet(o, N, sx, nf, L)
- aS = A_singlet(o, N, sx, nf, L, is_msbar)
+ sx_ns = compute_harmonics_cache(N, o, False)
+
+ aNS = A_non_singlet(o, N, sx_ns, nf, L)
+ aS = A_singlet(o, N, sx_singlet, nf, L, is_msbar, sx_ns)
for a in [aNS, aS]:
for method in ["", "expanded", "exact"]:
@@ -103,7 +54,7 @@ def test_build_ome_nlo():
a_s = 20
is_msbar = False
- sx = np.array([1, 1, 1], np.complex_)
+ sx = [[1], [1], [1]]
nf = 4
aNSi = A_non_singlet(1, N, sx, nf, L)
aSi = A_singlet(1, N, sx, nf, L, is_msbar)
diff --git a/tests/eko/test_ad_harmonics.py b/tests/eko/test_polygamma.py
similarity index 75%
rename from tests/eko/test_ad_harmonics.py
rename to tests/eko/test_polygamma.py
index 34ef73401..1db9a8fd4 100644
--- a/tests/eko/test_ad_harmonics.py
+++ b/tests/eko/test_polygamma.py
@@ -2,7 +2,7 @@
import numpy as np
import pytest
-from eko.anomalous_dimensions import harmonics
+from eko import harmonics
# until https://github.com/numba/numba/pull/5660 is confirmed
# we need to deactivate numba prior running
@@ -70,37 +70,27 @@ def test_cern_polygamma():
]
for nk, k in enumerate(ks):
for nz, z in enumerate(zs):
- me = harmonics.cern_polygamma(z, k)
+ me = harmonics.polygamma.cern_polygamma(z, k)
ref = fortran_ref[nk][nz]
np.testing.assert_almost_equal(me, ref)
# errors
with pytest.raises(NotImplementedError):
- _ = harmonics.cern_polygamma(1, 5)
+ _ = harmonics.polygamma.cern_polygamma(1, 5)
with pytest.raises(ValueError):
- _ = harmonics.cern_polygamma(0, 0)
+ _ = harmonics.polygamma.cern_polygamma(0, 0)
-def test_harmonic_Sx():
- """test harmonic sums S_x on real axis"""
- # test on real axis
- def sx(n, m):
- return np.sum([1 / k**m for k in range(1, n + 1)])
+def test_recursive_harmonic_sum():
- ls = [
- harmonics.harmonic_S1,
- harmonics.harmonic_S2,
- harmonics.harmonic_S3,
- harmonics.harmonic_S4,
- harmonics.harmonic_S5,
- ]
- for k in range(1, 5 + 1):
- for n in range(1, 4 + 1):
- np.testing.assert_almost_equal(ls[k - 1](n), sx(n, k))
+ n = np.random.rand()
+ iterations = 1
+ sx_base = harmonics.sx(n)
+ sx_test = harmonics.sx(n + iterations)
+ sx_final = []
+ for w in range(1, 6):
+ sx_final.append(
+ harmonics.polygamma.recursive_harmonic_sum(sx_base[w - 1], n, iterations, w)
+ )
-def test_melling_g3():
- ns = [1.0, 2.0, 1 + 1j]
- # NIntegrate[x^({1, 2, 1 + I} - 1) PolyLog[2, x]/(1 + x), {x, 0, 1}]
- mma_ref_values = [0.3888958462, 0.2560382207, 0.3049381491 - 0.1589060625j]
- for n, r in zip(ns, mma_ref_values):
- np.testing.assert_almost_equal(harmonics.mellin_g3(n), r, decimal=6)
+ np.testing.assert_allclose(sx_final, sx_test)
diff --git a/tests/eko/test_s_functions.py b/tests/eko/test_s_functions.py
deleted file mode 100644
index 2358757b6..000000000
--- a/tests/eko/test_s_functions.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-# Test some harmonics
-
-import numpy as np
-
-import eko.matching_conditions.as3.s_functions as sf
-
-# reference values coming fom mathematica
-testN = [1, 2, 2 + 2j, 10 + 5j, 100]
-refvals = {
- "Sm1": [-1.0, -0.5, -0.692917 - 0.000175788j, -0.693147 - 2.77406e-9j, -0.688172],
- "Sm2": [
- -1.0,
- -0.75,
- -0.822442 - 0.0000853585j,
- -0.822467 - 4.29516e-10j,
- -0.822418,
- ],
- "Sm3": [
- -1.0,
- -0.875,
- -0.901551 - 0.0000255879j,
- -0.901543 - 4.61382e-11j,
- -0.901542,
- ],
- "Sm4": [
- -1.0,
- -0.9375,
- -0.947039 - 4.84597e-6j,
- -0.947033 - 3.99567e-12j,
- -0.947033,
- ],
- "Sm5": [-1.0, -0.96875, -0.972122 - 1.13162e-7j, -0.97212 - 2.81097e-13j, -0.97212],
- "Sm21": [
- -1.0,
- -0.625,
- -0.751192 - 0.000147181j,
- -0.751286 - 1.17067e-9j,
- -0.751029,
- ],
-}
-
-
-def test_Sm21():
- for N, vals in zip(testN, refvals["Sm21"]):
- Sm1 = sf.harmonic_Sm1(N)
- np.testing.assert_allclose(sf.harmonic_Sm21(N, Sm1), vals, atol=1e-06)
-
-
-def test_Smx():
- for j, N in enumerate(testN):
- smx = [
- sf.harmonic_Sm1(N),
- sf.harmonic_Sm2(N),
- sf.harmonic_Sm3(N),
- sf.harmonic_Sm4(N),
- sf.harmonic_Sm5(N),
- ]
- for i, sm in enumerate(smx):
- np.testing.assert_allclose(sm, refvals[f"Sm{i+1}"][j], atol=1e-06)
diff --git a/tests/eko/test_sv_expanded.py b/tests/eko/test_sv_expanded.py
index 592df331b..f0828f6f9 100644
--- a/tests/eko/test_sv_expanded.py
+++ b/tests/eko/test_sv_expanded.py
@@ -80,7 +80,7 @@ def scheme_diff(g, k, pto, is_singlet):
for L in [np.log(0.5), np.log(2)]:
for order in [1, 2]:
- # Non singlet kernels
+ # non-singlet kernels
gns = gamma_ns(order, br.non_singlet_pids_map["ns+"], n, nf)
ker = non_singlet.dispatcher(
order, method, gns, a1, a0, nf, ev_op_iterations=1