From 9d242910083c479d202f28034965c3f282a827c6 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Fri, 9 Jun 2023 11:15:08 +0100 Subject: [PATCH 001/165] produce new theory cards if fns=fonll --- src/pineko/check.py | 29 ++++++++++++++---- src/pineko/parser.py | 1 - src/pineko/theory.py | 71 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 79 insertions(+), 22 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index 5f893a3f..77714565 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -116,6 +116,28 @@ def check_grid_and_eko_compatible(pineappl_grid, operators, xif, max_as, max_al) raise ValueError("x grid in pineappl grid and eko operator are NOT compatible!") +def is_dis(lumi): + """Check if the fktable we are computing is a DIS fktable. + + Parameters + ---------- + lumi : list(list(tuple)) + luminosity info + + Returns + ------- + bool + true if the fktable is a DIS fktable + """ + for lists in lumi: + for el in lists: + if (not islepton(el[0])) and (not islepton(el[1])): + # If neither of the incoming particles is a lepton we are sure + # it is not DIS + return False + return True + + def is_fonll_b(fns, lumi): """Check if the fktable we are computing is a DIS FONLL-B fktable. @@ -131,12 +153,7 @@ def is_fonll_b(fns, lumi): bool true if the fktable is a FONLL-B DIS fktable """ - for lists in lumi: - for el in lists: - if (not islepton(el[0])) and (not islepton(el[1])): - # in this case we are sure it is not DIS so for sure it is not FONLL-B - return False - if fns == "FONLL-B": + if is_dis(lumi) and fns == "FONLL-B": return True return False diff --git a/src/pineko/parser.py b/src/pineko/parser.py index a24737eb..43cb8e84 100644 --- a/src/pineko/parser.py +++ b/src/pineko/parser.py @@ -57,7 +57,6 @@ def get_yaml_information(yaml_file, grids_folder): List (of lists) with all the grids that will need to be loaded """ yaml_content = _load_yaml(yaml_file) - # Turn the operands and the members into paths (and check all of them exist) ret = [] for operand in yaml_content["operands"]: diff --git a/src/pineko/theory.py b/src/pineko/theory.py index acfb9f5b..f79fe949 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -7,6 +7,7 @@ """ import logging import time +from pathlib import Path import eko import eko.io.legacy @@ -224,22 +225,62 @@ def opcard(self, name, grid, tcard): tcard : dict theory card """ - opcard_path = self.operator_cards_path / f"{name}.yaml" - if opcard_path.exists(): - if not self.overwrite: - rich.print(f"Skipping existing operator card {opcard_path}") - return - _x_grid, q2_grid = evolve.write_operator_card_from_file( - grid, - self.operator_cards_path - / configs.configs["paths"]["operator_card_template_name"], - opcard_path, - tcard, - ) - if opcard_path.exists(): - rich.print( - f"[green]Success:[/] Wrote card with {len(q2_grid)} Q2 points to {opcard_path}" + # First check if the fktable is for a DIS observable in an FONLL scheme + # because in this case multiple opcards need to be produced for the + # different components of the FONLL prescription. + # TODO: make sure this correctly produces the components we want (what about nf0 and nfref) + # TODO: extend for observables where we need 5 operator cards due to bottom (heracomb_b) + # TODO: correct pto for FONLL-B + pineapplgrid = pineappl.grid.Grid.read(grid) + if ( + "yadism_version" in pineapplgrid.raw.key_values() + and "FONLL" in tcard["FNS"] + ): + opcard_paths = [ + Path(str(self.operator_cards_path) + i) / f"{name}.yaml" for i in "123" + ] + theoryid = str(self.theory_id) + if tcard["FNS"] == "FONLL-B": + tcards = [ + {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3}, + {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3}, + {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4}, + ] + else: + tcards = [ + {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3}, + {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3}, + {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4}, + ] + else: + tcards = [tcard] + opcard_paths = [self.operator_cards_path / f"{name}.yaml"] + + for opcard_path, f_tcard in zip(opcard_paths, tcards): + if opcard_path.exists(): + if not self.overwrite: + rich.print(f"Skipping existing operator card {opcard_path}") + return + _x_grid, q2_grid = evolve.write_operator_card_from_file( + grid, + self.operator_cards_path + / configs.configs["paths"]["operator_card_template_name"], + opcard_path, + f_tcard, ) + if opcard_path.exists(): + rich.print( + f"[green]Success:[/] Wrote card with {len(q2_grid)} Q2 points to {opcard_path}" + ) + if "FONLL" in tcard["FNS"]: + f_tcard_path = ( + configs.configs["paths"]["theory_cards"] / f'{f_tcard["ID"]}.yaml' + ) + with open(f_tcard_path, "w") as f: + yaml.dump(f_tcard, f) + rich.print( + f"Wrote new theory card with {f_tcard['FNS']} and {f_tcard['NfFF']} to {f_tcard_path}" + ) def opcards(self): """Write operator cards.""" From 24cf4582443b8c3ebb12fcfff59837ab39681b81 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Mon, 12 Jun 2023 16:45:12 +0100 Subject: [PATCH 002/165] first draft for merging of fonll grids --- src/pineko/cli/__init__.py | 12 +++- src/pineko/cli/combine_fonll.py | 29 ++++++++ src/pineko/fonll.py | 116 ++++++++++++++++++++++++++++++++ src/pineko/theory.py | 22 +++--- 4 files changed, 170 insertions(+), 9 deletions(-) create mode 100644 src/pineko/cli/combine_fonll.py create mode 100644 src/pineko/fonll.py diff --git a/src/pineko/cli/__init__.py b/src/pineko/cli/__init__.py index bdd7ebe8..c4453133 100644 --- a/src/pineko/cli/__init__.py +++ b/src/pineko/cli/__init__.py @@ -1,3 +1,13 @@ """CLI entry point.""" -from . import check, compare, convolute, gen_sv, kfactor, opcard, scaffold, theory_ +from . import ( + check, + combine_fonll, + compare, + convolute, + gen_sv, + kfactor, + opcard, + scaffold, + theory_, +) from ._base import command diff --git a/src/pineko/cli/combine_fonll.py b/src/pineko/cli/combine_fonll.py new file mode 100644 index 00000000..317b9472 --- /dev/null +++ b/src/pineko/cli/combine_fonll.py @@ -0,0 +1,29 @@ +"""CLI entry point to FONLL.""" +import click + +from .. import fonll +from ._base import command + + +class InconsistentInputsError(Exception): + """Raised if the inputs are not consistent with FONLL accounting for + only charm mass, or both charm and bottom masses""" + + pass + + +@command.command("fonll") +@click.argument("FFNS3", type=click.Path(exists=True)) +@click.argument("FFN03", type=click.Path(exists=True)) +@click.argument("FFNS4", type=click.Path(exists=True)) +@click.argument("theoryID", type=int) +@click.option("--FFN04", type=click.Path(exists=True)) +@click.option("--FFNS5", type=click.Path(exists=True)) +def subcommand(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): + """ """ + if ffn04 == None and ffns5 != None or ffn04 != None and ffns5 == None: + raise InconsistentInputsError( + """To account for bottom mass effects in FONLL fktables in both + FFN04 and FFNS5 schemes are required. Currently only one is provided.""" + ) + fonll.produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py new file mode 100644 index 00000000..16141a2d --- /dev/null +++ b/src/pineko/fonll.py @@ -0,0 +1,116 @@ +import json +import tempfile +from pathlib import Path + +import numpy as np +import pineappl +import yaml + +from . import configs + + +class FONLLInfo: + def __init__(self, ffns3, ffn03, ffns4, ffn04, ffns5) -> None: + self.ffns3 = ffns3 + self.ffn03 = ffn03 + self.ffns4 = ffns4 + self.ffn04 = ffn04 + self.ffns5 = ffns5 + + @property + def fk_paths(self): + always_needed = [self.ffns3, self.ffn03, self.ffns4] + if self.ffn04 and self.ffns5: + paths = always_needed + [self.ffn04, self.ffns5] + else: + paths = always_needed + return [Path(p) for p in paths] + + @property + def fks(self): + return [pineappl.grid.Grid.read(fk_path) for fk_path in self.fk_paths] + + @property + def dataset_name(self): + if len({p.name for p in self.fk_paths}) == 1: + return self.fk_paths[0].name + else: + raise ValueError("not all fktables have the same name") + + @property + def theorycard_no_fns_pto(self): + theorycards = [json.loads(fk.key_values()["theory"]) for fk in self.fks] + # Only these should differ + for card in theorycards: + del card["FNS"] + del card["PTO"] + del card["NfFF"] + del card["ID"] + if not all([theorycards[0] == card in theorycards[1:]]): + raise ValueError("theorycards not the same") + return theorycards[0] + + @property + def Q2grid(self): + aa = json.loads(self.fks[0].raw.key_values()["runcard"])["observables"] + bb = list(aa.values())[ + 0 + ] # there is only a single obseravble because it's a dis fktable + cc = np.array([i["Q2"] for i in bb]) + return cc + + +def produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): + fonll_info = FONLLInfo(ffns3, ffn03, ffns4, ffn04, ffns5) + + theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto + if theorycard_constituent_fks["DAMP"] == 0: + # then there is no damping, not even Heaviside only + combined_fk = fonll_info.fks[0] + for fk_path in fonll_info.fk_paths[1:]: + combined_fk.merge_from_file(fk_path) + else: + # TODO do also bottom + mc = theorycard_constituent_fks["mc"] + q2grid = fonll_info.Q2grid + step_function = mc**2 < q2grid + damping_factor = (1 - q2grid / mc) ** theorycard_constituent_fks["DAMP"] + damping_factor *= step_function + for i, fk in enumerate(fonll_info.fks[:-1]): # we don't want to damp the last + if i % 2 == 0: + fk.scale_by_bin(damping_factor) + else: + fk.scale_by_bin( + -damping_factor + ) # asy terms should be subtracted, therefore the sign + # pineappl does not support operating with two grids in memory: + # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 + with tempfile.TemporaryDirectory() as tmpdirname: + combined_fk = fonll_info.fks[0] + for i, fk in enumerate(fonll_info.fks[1:]): + tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" + fk.write_lz4(tmpfile_path) + combined_fk.merge_from_file(tmpfile_path) + + # update theorycard entries for the combined fktable by reading the yamldb of the original theory + input_theorycard_path = ( + Path(configs.load(configs.detect())["paths"]["theory_cards"]) + / f"{theoryid}.yaml" + ) + with open(input_theorycard_path) as f: + final_theorycard = yaml.safe_load(f) + theorycard = json.loads(combined_fk.key_values()["theory"]) + theorycard["FNS"] = final_theorycard["FNS"] + theorycard["PTO"] = final_theorycard["PTO"] + theorycard["NfFF"] = final_theorycard["NfFF"] + theorycard["ID"] = final_theorycard["ID"] + # Update the theorycard with the entries set above + combined_fk.set_key_value("theory", str(theorycard)) + + # save final "fonll" fktable + fk_folder = Path(configs.load(configs.detect())["paths"]["fktables"]) / str( + theoryid + ) + fk_folder.mkdir(exist_ok=True) + output_path_fk = fk_folder / fonll_info.dataset_name + combined_fk.write_lz4(output_path_fk) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index f79fe949..06013d2c 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -240,17 +240,23 @@ def opcard(self, name, grid, tcard): Path(str(self.operator_cards_path) + i) / f"{name}.yaml" for i in "123" ] theoryid = str(self.theory_id) - if tcard["FNS"] == "FONLL-B": + if tcard["FNS"] == "FONLL-A": tcards = [ - {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3}, - {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3}, - {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4}, + {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3, "PTO": 1}, + {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3, "PTO": 1}, + {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4, "PTO": 1}, + ] + elif tcard["FNS"] == "FONLL-B": + tcards = [ + {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3, "PTO": 2}, + {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3, "PTO": 2}, + {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4, "PTO": 1}, ] else: tcards = [ - {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3}, - {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3}, - {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4}, + {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3, "PTO": 2}, + {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3, "PTO": 2}, + {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4, "PTO": 2}, ] else: tcards = [tcard] @@ -279,7 +285,7 @@ def opcard(self, name, grid, tcard): with open(f_tcard_path, "w") as f: yaml.dump(f_tcard, f) rich.print( - f"Wrote new theory card with {f_tcard['FNS']} and {f_tcard['NfFF']} to {f_tcard_path}" + f"Wrote new theory card with FNS={f_tcard['FNS']} and NfFF={f_tcard['NfFF']} to {f_tcard_path}" ) def opcards(self): From a3a4e76f22d67250cdb18ba548fd0b1aea6c5ddf Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 27 Jul 2023 17:14:19 +0200 Subject: [PATCH 003/165] First draft on cli producing theory cards for pinefarm --- src/pineko/cli/__init__.py | 2 +- src/pineko/cli/{combine_fonll.py => fonll.py} | 25 +++++++-- src/pineko/fonll.py | 53 +++++++++++++++++++ 3 files changed, 76 insertions(+), 4 deletions(-) rename src/pineko/cli/{combine_fonll.py => fonll.py} (55%) diff --git a/src/pineko/cli/__init__.py b/src/pineko/cli/__init__.py index c4453133..6b04f67a 100644 --- a/src/pineko/cli/__init__.py +++ b/src/pineko/cli/__init__.py @@ -1,9 +1,9 @@ """CLI entry point.""" from . import ( check, - combine_fonll, compare, convolute, + fonll, gen_sv, kfactor, opcard, diff --git a/src/pineko/cli/combine_fonll.py b/src/pineko/cli/fonll.py similarity index 55% rename from src/pineko/cli/combine_fonll.py rename to src/pineko/cli/fonll.py index 317b9472..d1fbeff6 100644 --- a/src/pineko/cli/combine_fonll.py +++ b/src/pineko/cli/fonll.py @@ -1,10 +1,17 @@ """CLI entry point to FONLL.""" import click -from .. import fonll +from .. import configs, fonll, theory_card from ._base import command +class TheoryCardError(Exception): + """Raised when asked for FONLL theory cards with an original tcard as input + that is not asking for FONLL""" + + pass + + class InconsistentInputsError(Exception): """Raised if the inputs are not consistent with FONLL accounting for only charm mass, or both charm and bottom masses""" @@ -12,7 +19,7 @@ class InconsistentInputsError(Exception): pass -@command.command("fonll") +@command.command("combine_fonll") @click.argument("FFNS3", type=click.Path(exists=True)) @click.argument("FFN03", type=click.Path(exists=True)) @click.argument("FFNS4", type=click.Path(exists=True)) @@ -20,10 +27,22 @@ class InconsistentInputsError(Exception): @click.option("--FFN04", type=click.Path(exists=True)) @click.option("--FFNS5", type=click.Path(exists=True)) def subcommand(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): - """ """ + """Combines the different FKs needed to produce the FONLL prescription.""" if ffn04 == None and ffns5 != None or ffn04 != None and ffns5 == None: raise InconsistentInputsError( """To account for bottom mass effects in FONLL fktables in both FFN04 and FFNS5 schemes are required. Currently only one is provided.""" ) fonll.produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid) + + +@command.command("fonll_tcards") +@click.argument("theoryID", type=int) +def fonll_tcards(theoryid): + """Produce the FONLL tcards starting from the original tcard given by the theoryID""" + configs.configs = configs.defaults(configs.load()) + tcard = theory_card.load(theoryid) + tcard_parent_path = theory_card.path(theoryid).parent + if "FONLL" not in tcard["FNS"]: + raise TheoryCardError + fonll.produce_fonll_tcards(tcard, tcard_parent_path) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 16141a2d..c255de27 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -1,3 +1,4 @@ +import copy import json import tempfile from pathlib import Path @@ -114,3 +115,55 @@ def produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): fk_folder.mkdir(exist_ok=True) output_path_fk = fk_folder / fonll_info.dataset_name combined_fk.write_lz4(output_path_fk) + + +# nf3, nf30, nf4til, nf4bar, nf40, nf5til, nf5bar +# 2,2,1,2,2,1,2 +def produce_fonll_recipe(fns): + """nf3, nf30, nf4til, nf4bar, nf40, nf5til, nf5bar + 2,2,1,2,2,1,2.""" + fonll_recipe = [] + if fns == "FONLL-A": + pto = [1 for _ in range(7)] + elif fns == "FONLL-C": + pto = [2 for _ in range(7)] + elif fns == "FONLL-B": + pto = [2, 2, 1, 2, 2, 1, 2] + FNS_list = [ + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFNS", + ] + NfFF_list = [3, 3, 4, 4, 4, 5, 5, 5] + massiveonly_list = [False, False, False, True, False, False, True] + masslessonly_list = [False, False, True, False, False, True, False] + for fns, nfff, po, massiveonly, masslessonly in zip( + FNS_list, NfFF_list, pto, massiveonly_list, masslessonly_list + ): + fonll_recipe.append( + { + "FNS": fns, + "NfFF": nfff, + "PTO": po, + "massiveonly": massiveonly, + "masslessonly": masslessonly, + } + ) + return fonll_recipe + + +def produce_fonll_tcards(tcard, tcard_parent_path): + """Produce the six fonll tcards from an original tcard and dump them in tcard_parent_path + with names from '1000.yaml' to '1005.yaml'""" + theorycards = [copy.deepcopy(tcard) for _ in range(7)] + fonll_recipe = produce_fonll_recipe(tcard["FNS"]) + for theorycard, recipe in zip(theorycards, fonll_recipe): + theorycard.update(recipe) + paths_list = [tcard_parent_path / f"100{num}.yaml" for num in range(7)] + for newtcard, path in zip(theorycards, paths_list): + with open(path, "w", encoding="UTF-8") as f: + yaml.safe_dump(newtcard, f) From 715f23184e77113aa722b9d087f46849303815b0 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 27 Jul 2023 17:50:26 +0200 Subject: [PATCH 004/165] Add fonll-parts key --- src/pineko/fonll.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index c255de27..28d952f1 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -139,18 +139,16 @@ def produce_fonll_recipe(fns): "FONLL-FFNS", ] NfFF_list = [3, 3, 4, 4, 4, 5, 5, 5] - massiveonly_list = [False, False, False, True, False, False, True] - masslessonly_list = [False, False, True, False, False, True, False] - for fns, nfff, po, massiveonly, masslessonly in zip( - FNS_list, NfFF_list, pto, massiveonly_list, masslessonly_list + parts_list = ["full", "full", "massless", "massive", "full", "massless", "massive"] + for fns, nfff, po, part in zip( + FNS_list, NfFF_list, pto, parts_list ): fonll_recipe.append( { "FNS": fns, "NfFF": nfff, "PTO": po, - "massiveonly": massiveonly, - "masslessonly": masslessonly, + "fonll-parts": part, } ) return fonll_recipe From 3df831173f7375469fd1a6f77c94c790569b7416 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 27 Jul 2023 17:50:34 +0200 Subject: [PATCH 005/165] Add fonll-parts key --- src/pineko/fonll.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 28d952f1..e856d586 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -140,9 +140,7 @@ def produce_fonll_recipe(fns): ] NfFF_list = [3, 3, 4, 4, 4, 5, 5, 5] parts_list = ["full", "full", "massless", "massive", "full", "massless", "massive"] - for fns, nfff, po, part in zip( - FNS_list, NfFF_list, pto, parts_list - ): + for fns, nfff, po, part in zip(FNS_list, NfFF_list, pto, parts_list): fonll_recipe.append( { "FNS": fns, From 73f4b813954d608a78a241a55c1731420f4d75e3 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 10:51:33 +0200 Subject: [PATCH 006/165] First draft of full implementation --- src/pineko/cli/fonll.py | 32 +++++++++-------- src/pineko/evolve.py | 12 +++++-- src/pineko/fonll.py | 80 +++++++++++++++++++++++++++-------------- src/pineko/theory.py | 78 +++++++++------------------------------- 4 files changed, 96 insertions(+), 106 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index d1fbeff6..8cbb9a4a 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -6,15 +6,13 @@ class TheoryCardError(Exception): - """Raised when asked for FONLL theory cards with an original tcard as input - that is not asking for FONLL""" + """Raised when asked for FONLL theory cards with an original tcard as input that is not asking for FONLL.""" pass class InconsistentInputsError(Exception): - """Raised if the inputs are not consistent with FONLL accounting for - only charm mass, or both charm and bottom masses""" + """Raised if the inputs are not consistent with FONLL accounting for only charm mass, or both charm and bottom masses.""" pass @@ -22,24 +20,30 @@ class InconsistentInputsError(Exception): @command.command("combine_fonll") @click.argument("FFNS3", type=click.Path(exists=True)) @click.argument("FFN03", type=click.Path(exists=True)) -@click.argument("FFNS4", type=click.Path(exists=True)) +@click.argument("FFNS4til", type=click.Path(exists=True)) @click.argument("theoryID", type=int) +@click.option("--FFNS4bar", type=click.Path(exists=True)) @click.option("--FFN04", type=click.Path(exists=True)) -@click.option("--FFNS5", type=click.Path(exists=True)) -def subcommand(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): - """Combines the different FKs needed to produce the FONLL prescription.""" - if ffn04 == None and ffns5 != None or ffn04 != None and ffns5 == None: - raise InconsistentInputsError( - """To account for bottom mass effects in FONLL fktables in both - FFN04 and FFNS5 schemes are required. Currently only one is provided.""" +@click.option("--FFNS5til", type=click.Path(exists=True)) +@click.option("--FFNS5bar", type=click.Path(exists=True)) +def subcommand(ffns3, ffn03, ffns4til, theoryid, ffns4bar, ffn04, ffns5til, ffns5bar): + """Combine the different FKs needed to produce the FONLL prescription.""" + if (ffn04 is None and ffns5til is not None) or ( + ffn04 is not None and ffns5til is None + ): + print( + "One between ffn04 and ffns5til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) - fonll.produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid) + raise InconsistentInputsError + fonll.produce_combined_fk( + ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar, theoryid + ) @command.command("fonll_tcards") @click.argument("theoryID", type=int) def fonll_tcards(theoryid): - """Produce the FONLL tcards starting from the original tcard given by the theoryID""" + """Produce the FONLL tcards starting from the original tcard given by the theoryID.""" configs.configs = configs.defaults(configs.load()) tcard = theory_card.load(theoryid) tcard_parent_path = theory_card.path(theoryid).parent diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 86adac06..0b00226d 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -106,6 +106,7 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): """ # Add a +1 to the orders for the difference in convention between nnpdf and pineappl is_fns = int(check.is_fonll_b(tcard["FNS"], pineappl_grid.lumi())) + # NB: This would not happen for simFONLL max_as = 1 + tcard["PTO"] + is_fns max_al = 1 + tcard["QED"] # ... in order to create a mask ... @@ -128,9 +129,14 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): matching_scales=heavy_quarks.MatchingScales(masses * thresholds_ratios), origin=(tcard["Q0"] ** 2, tcard["nf0"]), ) - operators_card["mugrid"] = [ - (float(np.sqrt(q2)), int(nf_default(q2, atlas))) for q2 in q2_grid - ] + # If we are producing simFONLL FKs we need to look to NfFF... + if issimFONLL(tcard["FNS"]): + nfff = tcard["NfFF"] + operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nfff)) for q2 in q2_grid] + else: + operators_card["mugrid"] = [ + (float(np.sqrt(q2)), int(nf_default(q2, atlas))) for q2 in q2_grid + ] if "integrability_version" in pineappl_grid.key_values(): x_grid = evol_info.x1 x_grid = np.append(x_grid, 1.0) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index e856d586..3ab65f44 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -1,3 +1,5 @@ +"""Module to manage FONLL predictions.""" + import copy import json import tempfile @@ -11,28 +13,40 @@ class FONLLInfo: - def __init__(self, ffns3, ffn03, ffns4, ffn04, ffns5) -> None: + """Class containing all the information for FONLL predictions.""" + + def __init__( + self, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar + ) -> None: self.ffns3 = ffns3 self.ffn03 = ffn03 - self.ffns4 = ffns4 + self.ffns4til = ffns4til + self.ffns4bar = ffns4bar self.ffn04 = ffn04 - self.ffns5 = ffns5 + self.ffns5til = ffns5til + self.ffns5bar = ffns5bar @property def fk_paths(self): - always_needed = [self.ffns3, self.ffn03, self.ffns4] - if self.ffn04 and self.ffns5: - paths = always_needed + [self.ffn04, self.ffns5] - else: - paths = always_needed + """Returns the list of the fk paths needed to produce FONLL predictions.""" + always_needed = [self.ffns3, self.ffn03, self.ffns4til] + if self.ffns4bar: + paths = always_needed + [self.ffns4bar] + if self.ffn04 and self.ffns5til: + paths = paths + [self.ffn04, self.ffns5til] + # It does not make sense to have ffns5bar without ffns5til + if self.ffns5bar: + paths = paths + [self.self.ffns5bar] return [Path(p) for p in paths] @property def fks(self): + """Returns the pineappl.Grid objects reading the paths provided by self.fk_paths.""" return [pineappl.grid.Grid.read(fk_path) for fk_path in self.fk_paths] @property def dataset_name(self): + """Return the name of the dataset given by the fktables name, if all the fktables have the same name.""" if len({p.name for p in self.fk_paths}) == 1: return self.fk_paths[0].name else: @@ -40,6 +54,7 @@ def dataset_name(self): @property def theorycard_no_fns_pto(self): + """Return the common theory info between the different FONLL FKs.""" theorycards = [json.loads(fk.key_values()["theory"]) for fk in self.fks] # Only these should differ for card in theorycards: @@ -47,12 +62,14 @@ def theorycard_no_fns_pto(self): del card["PTO"] del card["NfFF"] del card["ID"] + del card["fonll-parts"] if not all([theorycards[0] == card in theorycards[1:]]): raise ValueError("theorycards not the same") return theorycards[0] @property def Q2grid(self): + """Return the Q2grid of the fktables given by self.fks .""" aa = json.loads(self.fks[0].raw.key_values()["runcard"])["observables"] bb = list(aa.values())[ 0 @@ -61,29 +78,42 @@ def Q2grid(self): return cc -def produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): - fonll_info = FONLLInfo(ffns3, ffn03, ffns4, ffn04, ffns5) +# TODO: check if I want to damp the top mass corrections in 'mc' (i.e. 6) +FK_TO_DAMP = {"mc": [1, 2, 4, 5], "mb": [4, 5]} +FK_WITH_MINUS = [1, 4] # asy terms should be subtracted, therefore the sign + + +def produce_combined_fk( + ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar, theoryid +): + """Combine the FONLL FKs to produce one single final FONLL FK.""" + fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto if theorycard_constituent_fks["DAMP"] == 0: # then there is no damping, not even Heaviside only + # TODO: Add the possibility of doing only step function without damp combined_fk = fonll_info.fks[0] for fk_path in fonll_info.fk_paths[1:]: combined_fk.merge_from_file(fk_path) else: - # TODO do also bottom mc = theorycard_constituent_fks["mc"] + mb = theorycard_constituent_fks["mb"] q2grid = fonll_info.Q2grid - step_function = mc**2 < q2grid - damping_factor = (1 - q2grid / mc) ** theorycard_constituent_fks["DAMP"] - damping_factor *= step_function - for i, fk in enumerate(fonll_info.fks[:-1]): # we don't want to damp the last - if i % 2 == 0: - fk.scale_by_bin(damping_factor) - else: - fk.scale_by_bin( - -damping_factor - ) # asy terms should be subtracted, therefore the sign + step_function_charm = mc**2 < q2grid + step_function_bottom = mb**2 < q2grid + damping_factor_charm = (1 - q2grid / mc) ** theorycard_constituent_fks["DAMP"] + damping_factor_bottom = (1 - q2grid / mb) ** theorycard_constituent_fks["DAMP"] + damping_factor_charm *= step_function_charm + damping_factor_bottom *= step_function_bottom + dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} + for i, fk in enumerate(fonll_info.fks): + sign = 1 + if i in FK_WITH_MINUS: + sign = -1 + for mass in FK_TO_DAMP: + if i in FK_TO_DAMP[mass]: + fk.scale_by_bin(sign * dampings[mass]) # pineappl does not support operating with two grids in memory: # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 with tempfile.TemporaryDirectory() as tmpdirname: @@ -117,11 +147,8 @@ def produce_combined_fk(ffns3, ffn03, ffns4, ffn04, ffns5, theoryid): combined_fk.write_lz4(output_path_fk) -# nf3, nf30, nf4til, nf4bar, nf40, nf5til, nf5bar -# 2,2,1,2,2,1,2 def produce_fonll_recipe(fns): - """nf3, nf30, nf4til, nf4bar, nf40, nf5til, nf5bar - 2,2,1,2,2,1,2.""" + """Produce the different theory cards according to which FONLL is asked for.""" fonll_recipe = [] if fns == "FONLL-A": pto = [1 for _ in range(7)] @@ -153,8 +180,7 @@ def produce_fonll_recipe(fns): def produce_fonll_tcards(tcard, tcard_parent_path): - """Produce the six fonll tcards from an original tcard and dump them in tcard_parent_path - with names from '1000.yaml' to '1005.yaml'""" + """Produce the seven fonll tcards from an original tcard and dump them in tcard_parent_path with names from '1000.yaml' to '1006.yaml'.""" theorycards = [copy.deepcopy(tcard) for _ in range(7)] fonll_recipe = produce_fonll_recipe(tcard["FNS"]) for theorycard, recipe in zip(theorycards, fonll_recipe): diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 06013d2c..8d85be43 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -7,7 +7,6 @@ """ import logging import time -from pathlib import Path import eko import eko.io.legacy @@ -225,68 +224,22 @@ def opcard(self, name, grid, tcard): tcard : dict theory card """ - # First check if the fktable is for a DIS observable in an FONLL scheme - # because in this case multiple opcards need to be produced for the - # different components of the FONLL prescription. - # TODO: make sure this correctly produces the components we want (what about nf0 and nfref) - # TODO: extend for observables where we need 5 operator cards due to bottom (heracomb_b) - # TODO: correct pto for FONLL-B - pineapplgrid = pineappl.grid.Grid.read(grid) - if ( - "yadism_version" in pineapplgrid.raw.key_values() - and "FONLL" in tcard["FNS"] - ): - opcard_paths = [ - Path(str(self.operator_cards_path) + i) / f"{name}.yaml" for i in "123" - ] - theoryid = str(self.theory_id) - if tcard["FNS"] == "FONLL-A": - tcards = [ - {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3, "PTO": 1}, - {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3, "PTO": 1}, - {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4, "PTO": 1}, - ] - elif tcard["FNS"] == "FONLL-B": - tcards = [ - {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3, "PTO": 2}, - {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3, "PTO": 2}, - {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4, "PTO": 1}, - ] - else: - tcards = [ - {**tcard, "ID": theoryid + "1", "FNS": "FFNS", "NfFF": 3, "PTO": 2}, - {**tcard, "ID": theoryid + "2", "FNS": "FFN0", "NfFF": 3, "PTO": 2}, - {**tcard, "ID": theoryid + "3", "FNS": "FFNS", "NfFF": 4, "PTO": 2}, - ] - else: - tcards = [tcard] - opcard_paths = [self.operator_cards_path / f"{name}.yaml"] - - for opcard_path, f_tcard in zip(opcard_paths, tcards): - if opcard_path.exists(): - if not self.overwrite: - rich.print(f"Skipping existing operator card {opcard_path}") - return - _x_grid, q2_grid = evolve.write_operator_card_from_file( - grid, - self.operator_cards_path - / configs.configs["paths"]["operator_card_template_name"], - opcard_path, - f_tcard, + opcard_path = self.operator_cards_path / f"{name}.yaml" + if opcard_path.exists(): + if not self.overwrite: + rich.print(f"Skipping existing operator card {opcard_path}") + return + _x_grid, q2_grid = evolve.write_operator_card_from_file( + grid, + self.operator_cards_path + / configs.configs["paths"]["operator_card_template_name"], + opcard_path, + tcard, + ) + if opcard_path.exists(): + rich.print( + f"[green]Success:[/] Wrote card with {len(q2_grid)} Q2 points to {opcard_path}" ) - if opcard_path.exists(): - rich.print( - f"[green]Success:[/] Wrote card with {len(q2_grid)} Q2 points to {opcard_path}" - ) - if "FONLL" in tcard["FNS"]: - f_tcard_path = ( - configs.configs["paths"]["theory_cards"] / f'{f_tcard["ID"]}.yaml' - ) - with open(f_tcard_path, "w") as f: - yaml.dump(f_tcard, f) - rich.print( - f"Wrote new theory card with FNS={f_tcard['FNS']} and NfFF={f_tcard['NfFF']} to {f_tcard_path}" - ) def opcards(self): """Write operator cards.""" @@ -435,6 +388,7 @@ def fk(self, name, grid_path, tcard, pdf): grid.lumi(), ): max_as += 1 + # NB: This would not happen for simFONLL max_al = 0 # check for sv if not np.isclose(xir, 1.0): From cbd6abea0cb156f39ee332f3fef26a2fb097638e Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 11:46:54 +0200 Subject: [PATCH 007/165] Add possibility of doing the combination only with step func --- src/pineko/fonll.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 3ab65f44..7ff934bd 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -90,9 +90,8 @@ def produce_combined_fk( fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto - if theorycard_constituent_fks["DAMP"] == 0: + if theorycard_constituent_fks["DAMP"] == "False": # then there is no damping, not even Heaviside only - # TODO: Add the possibility of doing only step function without damp combined_fk = fonll_info.fks[0] for fk_path in fonll_info.fk_paths[1:]: combined_fk.merge_from_file(fk_path) From 3ca875cd48f5b0e72befed2991924f1d45ac0b78 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 12:29:37 +0200 Subject: [PATCH 008/165] Use DAMPPOWER key --- src/pineko/fonll.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 7ff934bd..1a77d666 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -90,7 +90,7 @@ def produce_combined_fk( fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto - if theorycard_constituent_fks["DAMP"] == "False": + if theorycard_constituent_fks["DAMP"] == 0: # then there is no damping, not even Heaviside only combined_fk = fonll_info.fks[0] for fk_path in fonll_info.fk_paths[1:]: @@ -101,8 +101,12 @@ def produce_combined_fk( q2grid = fonll_info.Q2grid step_function_charm = mc**2 < q2grid step_function_bottom = mb**2 < q2grid - damping_factor_charm = (1 - q2grid / mc) ** theorycard_constituent_fks["DAMP"] - damping_factor_bottom = (1 - q2grid / mb) ** theorycard_constituent_fks["DAMP"] + damping_factor_charm = (1 - q2grid / mc) ** theorycard_constituent_fks[ + "DAMPPOWER" + ] + damping_factor_bottom = (1 - q2grid / mb) ** theorycard_constituent_fks[ + "DAMPPOWER" + ] damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} From b47308ece2494c04e90f830187ef23a144d154fc Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 12:34:27 +0200 Subject: [PATCH 009/165] Add issimFONLL func --- src/pineko/check.py | 7 +++++++ src/pineko/evolve.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index 77714565..c62c523c 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -158,6 +158,13 @@ def is_fonll_b(fns, lumi): return False +def issimFONLL(FNS): + """Check if the FNS is a simFONLL FNS.""" + if FNS in ["FONLL-FFNS", "FONLL-FFN0"]: + return True + return False + + def orders(grid, max_as, max_al) -> list: """Select the relevant orders. diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 0b00226d..775e99af 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -130,7 +130,7 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): origin=(tcard["Q0"] ** 2, tcard["nf0"]), ) # If we are producing simFONLL FKs we need to look to NfFF... - if issimFONLL(tcard["FNS"]): + if check.issimFONLL(tcard["FNS"]): nfff = tcard["NfFF"] operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nfff)) for q2 in q2_grid] else: From 462004662de9233189f1f139afe3bf266805d2ca Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 12:35:10 +0200 Subject: [PATCH 010/165] Remove wrong .self --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 1a77d666..80969cb2 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -36,7 +36,7 @@ def fk_paths(self): paths = paths + [self.ffn04, self.ffns5til] # It does not make sense to have ffns5bar without ffns5til if self.ffns5bar: - paths = paths + [self.self.ffns5bar] + paths = paths + [self.ffns5bar] return [Path(p) for p in paths] @property From 9cc79dc5ab2695d3a6f372de49298b8a5ab2ff40 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 12:48:19 +0200 Subject: [PATCH 011/165] Add test on is_dis --- src/pineko/fonll.py | 2 +- tests/test_check.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 80969cb2..e2726261 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -78,7 +78,7 @@ def Q2grid(self): return cc -# TODO: check if I want to damp the top mass corrections in 'mc' (i.e. 6) +# Notice we rely on the order defined by the FONLLInfo class FK_TO_DAMP = {"mc": [1, 2, 4, 5], "mb": [4, 5]} FK_WITH_MINUS = [1, 4] # asy terms should be subtracted, therefore the sign diff --git a/tests/test_check.py b/tests/test_check.py index fc6181a9..6e063a26 100644 --- a/tests/test_check.py +++ b/tests/test_check.py @@ -20,6 +20,13 @@ def test_in1d(): assert checked == np.array([True]) +def test_is_dis(): + dis_fake_lumi = [[(1, -13, 1.0), (11, 2, 2.0)]] + nondis_fake_lumi = [[(1, 2, 1.5), (2, 1, 3.0)]] + assert pineko.check.is_dis(dis_fake_lumi) is True + assert pineko.check.is_dis(nondis_fake_lumi) is False + + def test_is_fonll_b(): fns = "FONLL-B" lumi_first = [[(-12, 1, 2.0), (-13, 1, 5.0)]] From 80595d0a6ef2c1cb8984542a7eabc0475b01772b Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 12:56:53 +0200 Subject: [PATCH 012/165] Add test on issimFONLL --- tests/test_check.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_check.py b/tests/test_check.py index 6e063a26..4a63f40d 100644 --- a/tests/test_check.py +++ b/tests/test_check.py @@ -41,6 +41,13 @@ def test_is_fonll_b(): assert pineko.check.is_fonll_b(fns, lumi_crazy) is False +def test_issimFONLL(): + simFONLL_FNS = "FONLL-FFN0" + nonsimFONLL_FNS = "FONLL-B" + assert pineko.check.issimFONLL(simFONLL_FNS) is True + assert pineko.check.issimFONLL(nonsimFONLL_FNS) is False + + class Fake_grid: def __init__(self, order_list): self.orderlist = order_list From 34638e0ce34f183f8f1cfe8648807ab2b8f5655a Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 13:19:44 +0200 Subject: [PATCH 013/165] Add test for produce_fonll_tcards --- benchmarks/bench_fonll.py | 25 +++++++++++++++++++++++++ src/pineko/fonll.py | 38 ++++++++++++++++++++------------------ 2 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 benchmarks/bench_fonll.py diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py new file mode 100644 index 00000000..77ae1ee2 --- /dev/null +++ b/benchmarks/bench_fonll.py @@ -0,0 +1,25 @@ +import pytest +import yaml + +import pineko + + +def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs): + tcard = pineko.theory_card.load(400) + pineko.fonll.produce_fonll_tcards(tcard, tmp_path) + # Check they are correct + theorycards = [] + for num in range(7): + with open(tmp_path / f"100{num}.yaml", encoding="UTF-8") as f: + theorycards.append(yaml.safe_load(f)) + for simFONLL_tcard, fns, nfff, po, part in zip( + theorycards, + pineko.fonll.FNS_LIST, + pineko.fonll.NFFF_LIST, + pineko.fonll.PTOS_DICT[tcard["FNS"]], + pineko.fonll.PARTS_LIST, + ): + assert simFONLL_tcard["FNS"] == fns + assert simFONLL_tcard["NfFF"] == nfff + assert simFONLL_tcard["PTO"] == po + assert simFONLL_tcard["fonll-parts"] == part diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index e2726261..4ae737c7 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -150,27 +150,29 @@ def produce_combined_fk( combined_fk.write_lz4(output_path_fk) +FNS_LIST = [ + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFNS", +] + +NFFF_LIST = [3, 3, 4, 4, 4, 5, 5, 5] +PARTS_LIST = ["full", "full", "massless", "massive", "full", "massless", "massive"] +PTOS_DICT = { + "FONLL-A": [1 for _ in range(7)], + "FONLL-B": [2, 2, 1, 2, 2, 1, 2], + "FONLL-C": [2 for _ in range(7)], +} + + def produce_fonll_recipe(fns): """Produce the different theory cards according to which FONLL is asked for.""" fonll_recipe = [] - if fns == "FONLL-A": - pto = [1 for _ in range(7)] - elif fns == "FONLL-C": - pto = [2 for _ in range(7)] - elif fns == "FONLL-B": - pto = [2, 2, 1, 2, 2, 1, 2] - FNS_list = [ - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFNS", - ] - NfFF_list = [3, 3, 4, 4, 4, 5, 5, 5] - parts_list = ["full", "full", "massless", "massive", "full", "massless", "massive"] - for fns, nfff, po, part in zip(FNS_list, NfFF_list, pto, parts_list): + for fns, nfff, po, part in zip(FNS_LIST, NFFF_LIST, PTOS_DICT[fns], PARTS_LIST): fonll_recipe.append( { "FNS": fns, From 761bdbca6b7833e06d2c74026eb2ca57da5ee523 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 13:24:10 +0200 Subject: [PATCH 014/165] Add test also for FONLL-B --- benchmarks/bench_fonll.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 77ae1ee2..99adbe98 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -4,8 +4,9 @@ import pineko -def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs): - tcard = pineko.theory_card.load(400) +@pytest.mark.parametrize("theoryid", [400, 208]) +def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid): + tcard = pineko.theory_card.load(theoryid) pineko.fonll.produce_fonll_tcards(tcard, tmp_path) # Check they are correct theorycards = [] From a0201bb1ddfba525e8b9b69169b4e5e4d81bb41e Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 13:35:38 +0200 Subject: [PATCH 015/165] Change naming conventions for theorycards --- benchmarks/bench_fonll.py | 4 ++-- src/pineko/cli/fonll.py | 2 +- src/pineko/fonll.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 99adbe98..4b9aa8ca 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -7,11 +7,11 @@ @pytest.mark.parametrize("theoryid", [400, 208]) def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid): tcard = pineko.theory_card.load(theoryid) - pineko.fonll.produce_fonll_tcards(tcard, tmp_path) + pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) # Check they are correct theorycards = [] for num in range(7): - with open(tmp_path / f"100{num}.yaml", encoding="UTF-8") as f: + with open(tmp_path / f"{theoryid}0{num}.yaml", encoding="UTF-8") as f: theorycards.append(yaml.safe_load(f)) for simFONLL_tcard, fns, nfff, po, part in zip( theorycards, diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 8cbb9a4a..94f5c82d 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -49,4 +49,4 @@ def fonll_tcards(theoryid): tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: raise TheoryCardError - fonll.produce_fonll_tcards(tcard, tcard_parent_path) + fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 4ae737c7..e28c1258 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -184,13 +184,13 @@ def produce_fonll_recipe(fns): return fonll_recipe -def produce_fonll_tcards(tcard, tcard_parent_path): - """Produce the seven fonll tcards from an original tcard and dump them in tcard_parent_path with names from '1000.yaml' to '1006.yaml'.""" +def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): + """Produce the seven fonll tcards from an original tcard and dump them in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'.""" theorycards = [copy.deepcopy(tcard) for _ in range(7)] fonll_recipe = produce_fonll_recipe(tcard["FNS"]) for theorycard, recipe in zip(theorycards, fonll_recipe): theorycard.update(recipe) - paths_list = [tcard_parent_path / f"100{num}.yaml" for num in range(7)] + paths_list = [tcard_parent_path / f"{theoryid}0{num}.yaml" for num in range(7)] for newtcard, path in zip(theorycards, paths_list): with open(path, "w", encoding="UTF-8") as f: yaml.safe_dump(newtcard, f) From db431041b18ba9068067546b44bf46e79d2c4bc2 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 14:01:26 +0200 Subject: [PATCH 016/165] Add test for operator cards production --- benchmarks/bench_evolve.py | 29 +++++++++++++++++++++++++++++ benchmarks/bench_fonll.py | 6 +++--- src/pineko/cli/fonll.py | 2 +- src/pineko/fonll.py | 1 + 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index c95122e9..6798fd6c 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -13,6 +13,35 @@ import pineko.theory_card +@pytest.mark.parametrize("theoryid", [400, 208]) +def benchmark_write_operator_card_from_file_simFONLL( + tmp_path, test_files, test_configs, theoryid +): + tcard = pineko.theory_card.load(theoryid) + tcards_path_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) + pine_path = ( + test_files + / "data" + / "grids" + / "400" + / "HERA_NC_225GEV_EP_SIGMARED.pineappl.lz4" + ) + default_path = test_files / "data" / "operator_cards" / "400" / "_template.yaml" + targets_path_list = [tmp_path / f"test_opcard_{num}.yaml" for num in range(7)] + for target_path, tcard_path in zip(targets_path_list, tcards_path_list): + with open(tcard_path, encoding="utf-8") as f: + tcard = yaml.safe_load(f) + x_grid, _q2_grid = pineko.evolve.write_operator_card_from_file( + pine_path, default_path, target_path, tcard + ) + # Check if the opcards are ok + for opcard_path, nfff in zip(targets_path_list, pineko.fonll.NFFF_LIST): + with open(opcard_path, encoding="utf-8") as f: + ocard = yaml.safe_load(f) + for entry in ocard["mugrid"]: + assert entry[1] == nfff + + def benchmark_write_operator_card_from_file(tmp_path, test_files, test_configs): pine_path = test_files / "data/grids/400/HERA_NC_225GEV_EP_SIGMARED.pineappl.lz4" default_path = test_files / "data/operator_cards/400/_template.yaml" diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 4b9aa8ca..b8264741 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -7,11 +7,11 @@ @pytest.mark.parametrize("theoryid", [400, 208]) def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid): tcard = pineko.theory_card.load(theoryid) - pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) + tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) # Check they are correct theorycards = [] - for num in range(7): - with open(tmp_path / f"{theoryid}0{num}.yaml", encoding="UTF-8") as f: + for path in tcard_paths_list: + with open(path, encoding="UTF-8") as f: theorycards.append(yaml.safe_load(f)) for simFONLL_tcard, fns, nfff, po, part in zip( theorycards, diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 94f5c82d..023d940a 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -49,4 +49,4 @@ def fonll_tcards(theoryid): tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: raise TheoryCardError - fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) + _ = fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index e28c1258..53ebe49a 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -194,3 +194,4 @@ def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): for newtcard, path in zip(theorycards, paths_list): with open(path, "w", encoding="UTF-8") as f: yaml.safe_dump(newtcard, f) + return paths_list From a189ff737438938b1002cda91920a9573ec5caa7 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 14:23:30 +0200 Subject: [PATCH 017/165] Add tests for FONLLInfo --- src/pineko/fonll.py | 4 ++-- tests/test_fonll.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/test_fonll.py diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 53ebe49a..22cb6c76 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -29,9 +29,9 @@ def __init__( @property def fk_paths(self): """Returns the list of the fk paths needed to produce FONLL predictions.""" - always_needed = [self.ffns3, self.ffn03, self.ffns4til] + paths = [self.ffns3, self.ffn03, self.ffns4til] if self.ffns4bar: - paths = always_needed + [self.ffns4bar] + paths = paths + [self.ffns4bar] if self.ffn04 and self.ffns5til: paths = paths + [self.ffn04, self.ffns5til] # It does not make sense to have ffns5bar without ffns5til diff --git a/tests/test_fonll.py b/tests/test_fonll.py new file mode 100644 index 00000000..93fd93f8 --- /dev/null +++ b/tests/test_fonll.py @@ -0,0 +1,28 @@ +import pathlib + +import pytest + +import pineko + + +def test_FONLLInfo(): + full_list = [ + "ffns3.pineappl.lz4", + "ffn03.pineappl.lz4", + "ffns4til.pineappl.lz4", + "ffns4bar.pineappl.lz4", + "ffn04.pineappl.lz4", + "ffns5til.pineappl.lz4", + "ffns5bar.pineappl.lz4", + ] + fullfonll_fake_info = pineko.fonll.FONLLInfo(*full_list) + wrongfonll_fake_info = pineko.fonll.FONLLInfo( + full_list[0], full_list[1], full_list[2], full_list[3], None, None, full_list[6] + ) + partialfonll_fake_info = pineko.fonll.FONLLInfo( + full_list[0], full_list[1], full_list[2], None, None, None, None + ) + assert fullfonll_fake_info.fk_paths == [pathlib.Path(fk) for fk in full_list] + # In this case it ignores the ffns5bar fk + assert wrongfonll_fake_info.fk_paths == [pathlib.Path(fk) for fk in full_list[:4]] + assert partialfonll_fake_info.fk_paths == [pathlib.Path(fk) for fk in full_list[:3]] From bf985eb52583dcf8ab636892c7c27be562ecbfb6 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Mon, 31 Jul 2023 14:54:16 +0200 Subject: [PATCH 018/165] Update pineappl --- poetry.lock | 557 +++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 280 insertions(+), 279 deletions(-) diff --git a/poetry.lock b/poetry.lock index 59ee0bb7..9652dabb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -26,14 +26,14 @@ files = [ [[package]] name = "astroid" -version = "2.15.5" +version = "2.15.6" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false python-versions = ">=3.7.2" files = [ - {file = "astroid-2.15.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, - {file = "astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, + {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, + {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, ] [package.dependencies] @@ -91,111 +91,111 @@ files = [ [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.6" description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, ] [package.dependencies] @@ -318,14 +318,14 @@ files = [ [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" +version = "0.3.7" +description = "serialize all of Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] [package.extras] @@ -368,14 +368,14 @@ mark = ["banana-hep (>=0.6.9,<0.7.0)", "matplotlib (>=3.5.1,<4.0.0)", "pandas (> [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.2" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, ] [package.extras] @@ -438,14 +438,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.6.0" +version = "6.8.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -454,7 +454,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "iniconfig" @@ -528,22 +528,22 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] @@ -627,36 +627,36 @@ files = [ [[package]] name = "llvmlite" -version = "0.40.0" +version = "0.40.1" description = "lightweight wrapper around basic LLVM functionality" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "llvmlite-0.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a46db1ed219d93ef05245ec17cf243074ec2b2687209cb310a803a2c2510dc"}, - {file = "llvmlite-0.40.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9d742b66023298532d0e7beddd3d9f04334c046df7a02a1ec2ba8b4046a978c"}, - {file = "llvmlite-0.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ff38c309dc758b996d556e599e00647e6b8dbd21125c06b2d0584a9984a2288"}, - {file = "llvmlite-0.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ecb8cdee35bbbdad9b331f446641977645de1973f6270bf4194307a1753666"}, - {file = "llvmlite-0.40.0-cp310-cp310-win32.whl", hash = "sha256:83dd5148f6ddd4d35585b69ebaa50605fdf8011a5b7259a0463afd4aefc62414"}, - {file = "llvmlite-0.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:f72d6ccbfd9cc7da43098fcef23ffbe173ce2d986215072dbb2e7929412f9ff8"}, - {file = "llvmlite-0.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbf19077144e159406ef222348d5330d5061177fb79d3f7f82abf2cf29b77c0b"}, - {file = "llvmlite-0.40.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4732d6c981f658f014dd2ab2b682ac631cd12a6695e77c2d460cc68dc767868"}, - {file = "llvmlite-0.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2754c4d2b6f027ab45425abd94dee4cbd228b598531b1e9e1fc15f3298265d88"}, - {file = "llvmlite-0.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb79b992bdc2e62c5f5f86263d5546b5298d498e7c1a9d64b3a6f0d31f46ba5b"}, - {file = "llvmlite-0.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:be0ff5b68a86e47a7ec6cd5389bb17b4b8f020b981628c9e714dc2cfdbe89c86"}, - {file = "llvmlite-0.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f5d4445eccd9c9c5639b35cb6279231f97cbd77a1c49fb41c05081ff96e041db"}, - {file = "llvmlite-0.40.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:060f00611d8e65d6db80cabba17fbefde9ebefbfb6937fe5677f06cd3e7bbe3c"}, - {file = "llvmlite-0.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58f5ba5febb2372418a3d37bd76d51bb987276a6fd979c2f2772b60b9061e575"}, - {file = "llvmlite-0.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d1622237e6ce543ac185751f782c7e10cabe45abf2de802cd5dca8023805a5c"}, - {file = "llvmlite-0.40.0-cp38-cp38-win32.whl", hash = "sha256:06803a1a38f911576bbe63a4082334d6661c59f2080e4681de1c66ec4924b0ac"}, - {file = "llvmlite-0.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:87c2114567f95c715ae35b03d82caa0df66a978c93a1ff752964949e9ce596d5"}, - {file = "llvmlite-0.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a3382d81fcda57f5502f45a9ca62e0c9103fabd5f817c9820c7e61b9375f3d7"}, - {file = "llvmlite-0.40.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:260b0241c17a1ec585020e1df58ed30b9975c3573c619fa1724ceb4cd53cbe42"}, - {file = "llvmlite-0.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f980992b6c9dfee20a1608c5a4d875f8a52d76353ca02470550a85be6e5d3680"}, - {file = "llvmlite-0.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52eee9e245ef6eb911d6c2a3a1a66378745a40c637284386031b0915754f457e"}, - {file = "llvmlite-0.40.0-cp39-cp39-win32.whl", hash = "sha256:d27c2ec699b820296659dfd36ead1c527eb190c6d5cb3de24bfbee1024bdc20a"}, - {file = "llvmlite-0.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:6cf84141d1793c69285b88acf4216370cb831eab99778546a2a9002fadac932d"}, - {file = "llvmlite-0.40.0.tar.gz", hash = "sha256:c910b8fbfd67b8e9d0b10ebc012b23cd67cbecef1b96f00d391ddd298d71671c"}, + {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, + {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, + {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, + {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, + {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, + {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, + {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, + {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, + {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, + {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, + {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, + {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, + {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, + {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, + {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, + {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, + {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, + {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, + {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, + {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, + {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, + {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, + {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, + {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, ] [[package]] @@ -798,36 +798,36 @@ files = [ [[package]] name = "numba" -version = "0.57.0" +version = "0.57.1" description = "compiling Python code using LLVM" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "numba-0.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e2c14c411545e80bf0f1a33232fb0bd6aa3368f86e56eeffc7f6d3ac16ea3fd"}, - {file = "numba-0.57.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b3382c56d805ffcdc7b46eb69a906be733dd35b84be14abba8e5fd27d7916b2"}, - {file = "numba-0.57.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:133cba9b5002bf67f6f73d9b3050d919c1be91326bbdcccfdf3259bcfb1cec0e"}, - {file = "numba-0.57.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d92a17ee849574665c5d94e9c9b862e469e1231d3dbb9e58e58b30b4bb0cbce9"}, - {file = "numba-0.57.0-cp310-cp310-win32.whl", hash = "sha256:abc90c3d303a67ae5194770a6f0d0a83edf076683b8a426349a27b91d98e00d1"}, - {file = "numba-0.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:430f43c96f866ca4fe6008d8aa28bb608911d908ff94f879e0dbad7768ef9869"}, - {file = "numba-0.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:069f7d8fddad4c0eb1d7534c2a18098fe50473dc77832b409176002e9011b96f"}, - {file = "numba-0.57.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:79daa130fc9e4ebd1eea0a594d1de86d8a4366989f5fab93c482246b502520db"}, - {file = "numba-0.57.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:274f4db4814ebd5ec81697acfc36df04a865b86610d7714905185b753f3f9baf"}, - {file = "numba-0.57.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0106ee441e3f69cc6f17cb470c4fcccd592e0606567d43245635d72b071ab88e"}, - {file = "numba-0.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5d31b4d95000d86ffa9652ab5bcfa0ea30e6c3fc40e610147d4f2f00116703d"}, - {file = "numba-0.57.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e0b8de39bf17519435937b53276dfb02e2eb8bc27cd211c8eeb01ffed1cab6b"}, - {file = "numba-0.57.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:18d90fa6fcd5b796999392a8ea67f2fbccecf8dabcea726e2e721c79f40566a6"}, - {file = "numba-0.57.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4f62528c7c8c5f97e9689fd788e420b68c67ee0a1a9a7715a57fd584b7aef1e"}, - {file = "numba-0.57.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fd12cf0b431676c08057685e229ea5daaa1ec8efba2506c38671734ace49c2d7"}, - {file = "numba-0.57.0-cp38-cp38-win32.whl", hash = "sha256:e5f11b1d435fb4d1d1b68fa68ff456d632dc4bfd40b18825ff80d6081d1afb26"}, - {file = "numba-0.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:5810ed2d6d22eb3c48bedfac2187fc44bb90e05f02d47fd31059e69207ae4106"}, - {file = "numba-0.57.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eddba74493d4003a42cd61ff7feca4928a94a45553d1fddac77a5cc339f6f4f9"}, - {file = "numba-0.57.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:110be5e1213d0a3d5fc691e921a000779500620196d99cee9908fce83d1e48df"}, - {file = "numba-0.57.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f949018ab9c467d38f14fe17db4df0d4a1c664be802189e2d6c5a434d9ffd4f6"}, - {file = "numba-0.57.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9fc0cd4ec93a1e3877985e10ed5837ed2991c83aa4b7ca574caae5c8b448cc4b"}, - {file = "numba-0.57.0-cp39-cp39-win32.whl", hash = "sha256:83d4f21c98eed3001e9896a43a1ce9c825999c03f7eb39ddd1c2d07a76708392"}, - {file = "numba-0.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:9173d00c6753212b68e4fd319cfa96c21b2263949452c97b034e78ce09539dee"}, - {file = "numba-0.57.0.tar.gz", hash = "sha256:2af6d81067a5bdc13960c6d2519dbabbf4d5d597cf75d640c5aeaefd48c6420a"}, + {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, + {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, + {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, + {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, + {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, + {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, + {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, + {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, + {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, + {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, + {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, + {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, + {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, + {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, + {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, + {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, + {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, + {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, + {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, + {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, + {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, + {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, + {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, + {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, ] [package.dependencies] @@ -837,40 +837,40 @@ numpy = ">=1.21,<1.25" [[package]] name = "numpy" -version = "1.24.3" +version = "1.24.4" description = "Fundamental package for array computing in Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, ] [[package]] @@ -1000,32 +1000,33 @@ files = [ [[package]] name = "pineappl" -version = "0.6.0" +version = "0.6.1" description = "Python bindings to PineAPPL" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pineappl-0.6.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:049a60fa592643a46f2996b9060431c158346182a62f722aa27c757669ab1084"}, - {file = "pineappl-0.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93bec98a5e1aa7f71ef989942bb4ac6b38f8e4e9b401b995dd849e7815bf6e6"}, - {file = "pineappl-0.6.0-cp310-none-win_amd64.whl", hash = "sha256:763247fe12efefa21ef2e0b2cde218000b5d2ff79475305f01d2faed4836e247"}, - {file = "pineappl-0.6.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:551630d57f5121a7f90f475466e0a5ad78474ee4ac8aa404980e385e9699b804"}, - {file = "pineappl-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62f2ac014feadf865cf3edf15c9c7f86d6e1c0e18b449b8c93a27826b4d3650d"}, - {file = "pineappl-0.6.0-cp311-none-win_amd64.whl", hash = "sha256:0da3e35b6fecede4781008c49a246c0697f55b50f9eb4247a037b26b54c87b73"}, - {file = "pineappl-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccaee7324742fd57688a9cad4f9ae49e20a3061d739a112fd1a78baddfebe40b"}, - {file = "pineappl-0.6.0-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:2aaa9bec8e91ab8ee34d6499953dbcb67511ec1b842cba478c1343e1e381af25"}, - {file = "pineappl-0.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4702293331e7bdf951c643e666f81997999223867f1de3d098a9c0336359c274"}, - {file = "pineappl-0.6.0-cp37-none-win_amd64.whl", hash = "sha256:8fb26ef7413a0604edc93bbb189186b8da4d8b56a82961263fc6f3e69f61c840"}, - {file = "pineappl-0.6.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5c6c9d374ae2341a7a6a0e8962706eb6074a41f5cf257f327529ffa8cb0bd791"}, - {file = "pineappl-0.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6515bcab21806891eea8b9cdcc52a590fd4f300a0248ba185b8c60194ff60a3f"}, - {file = "pineappl-0.6.0-cp38-none-win_amd64.whl", hash = "sha256:be24039e1e268fd483578db4f9bf2e5a5342610964c0d940b56cae88bbcc8573"}, - {file = "pineappl-0.6.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:1fd1264b6ffe30940e45f544824af920b196c5e380d8c6e212400413bdedc52e"}, - {file = "pineappl-0.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ea7910324d3df8569ff186a654061f8a1d968efc400cbde5ace4b6429406841"}, - {file = "pineappl-0.6.0-cp39-none-win_amd64.whl", hash = "sha256:2fdf3d5cd541c7f18494838ad7b36f03a59306c1d00355d013cb65131a98766e"}, - {file = "pineappl-0.6.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f0c6250617ac9b5c95a1835347beb869268322a5e69ed980524f1e955c677b3"}, - {file = "pineappl-0.6.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3791bf8b9ccdda7689399718d496224b1e57410c4dd1a76dea0c9466a2bb6b49"}, - {file = "pineappl-0.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a84660efeec80fb2dae39011e1adc2b330dc5ef0bcc5483211802aaabddd2d66"}, - {file = "pineappl-0.6.0.tar.gz", hash = "sha256:0907396637a75932642980a2256fe411d7961a37a7ac70dcd8a91872e61af60f"}, + {file = "pineappl-0.6.1-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:2b142d0c99e4d67203504cb2cb0bc95aae30f8c9d26c55a343b361808bf359de"}, + {file = "pineappl-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ee10887fd8b3d8258c591fc04aa80f3e4112c671da5e55b708b71d5a3cfc4d0"}, + {file = "pineappl-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:28c1a4f47044165cf3b43fc827cb54cab648f2672293c013306d04df75d0d674"}, + {file = "pineappl-0.6.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:fe92b05db1e56e0e41d8c4567af97f6c5177711c367a7cf19ecb1a25a0754a5d"}, + {file = "pineappl-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e0500fe863ccb08c2f74653ac0178872565867eb48473614cd1fd438fe6f8d5"}, + {file = "pineappl-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:777daf79978b2c162dd767bbde5db39986b1865160404129c85018f7475e72c7"}, + {file = "pineappl-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7538c34dc802911c065197b235a36a2a080b74a8ce5294ec6aecc9578a94120d"}, + {file = "pineappl-0.6.1-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:238b9b1e257121d82aff927263b60d198360414d52ee74457ca39c18015ed715"}, + {file = "pineappl-0.6.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8ae16cbedfd6bfcbf64350e98ad7c5a644393207933537f25891eb02a26d6a"}, + {file = "pineappl-0.6.1-cp37-none-win_amd64.whl", hash = "sha256:8d6a775c46203b2499c77dbe914797c8def67e1efc6419ccdcb6e0c903cc8412"}, + {file = "pineappl-0.6.1-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:7b1f8d0b79b33b0f3d23fb52f592e56c691a8bd72e446103f9af4083fa194563"}, + {file = "pineappl-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd091d6562d9fa4b723a2da5076a53883369d3dde92cc6700a78406b7b809781"}, + {file = "pineappl-0.6.1-cp38-none-win_amd64.whl", hash = "sha256:c3f92353399de49f9c66868b909d07c2db995a47640abf49c18789675f3dd922"}, + {file = "pineappl-0.6.1-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:52517ea8842d1d358c662160a2270cbc52c719998f56d04df6883480f60c6b1b"}, + {file = "pineappl-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1b3a7bfa831f41fcb52e0040e7fac63e731d6bb8a9411dcd7b57ad5a65ad40"}, + {file = "pineappl-0.6.1-cp39-none-win_amd64.whl", hash = "sha256:6d76b11827de14019669f6bf569945b703251afd7f168c6581ce933149443ec6"}, + {file = "pineappl-0.6.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a00144fb25c6349953a58b1c7541e2c0eb0aaba67ec4692b4a524339d40e452"}, + {file = "pineappl-0.6.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb3b103dc3d98109f98097ccb929b1dbcc364a156f093b3ad2df3cb6152a7087"}, + {file = "pineappl-0.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760b82fe2968ea1f366c1114c7bb2542474f8bbdc1c18d3108f76808a0149b09"}, + {file = "pineappl-0.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:853da0089ea88e65d257de29be0d57b337c79721f7248defe349d10e6b98a6ae"}, + {file = "pineappl-0.6.1.tar.gz", hash = "sha256:b5b205efb39e2df8d20992b0c59f741e230715bd0697e394ea1dad972ab19c2e"}, ] [package.dependencies] @@ -1037,30 +1038,30 @@ test = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "3.5.3" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.5.3-py3-none-any.whl", hash = "sha256:0ade98a4895e87dc51d47151f7d2ec290365a585151d97b4d8d6312ed6132fed"}, - {file = "platformdirs-3.5.3.tar.gz", hash = "sha256:e48fabd87db8f3a7df7150a4a5ea22c546ee8bc39bc2473244730d4b56d2cc4e"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -1069,14 +1070,14 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] [package.dependencies] @@ -1162,18 +1163,18 @@ plugins = ["importlib-metadata"] [[package]] name = "pylint" -version = "2.17.4" +version = "2.17.5" description = "python code static checker" category = "dev" optional = false python-versions = ">=3.7.2" files = [ - {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, - {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, + {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, + {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, ] [package.dependencies] -astroid = ">=2.15.4,<=2.17.0-dev0" +astroid = ">=2.15.6,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -1214,14 +1215,14 @@ files = [ [[package]] name = "pytest" -version = "7.3.2" +version = "7.4.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, - {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] @@ -1297,52 +1298,52 @@ files = [ [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] @@ -1669,14 +1670,14 @@ files = [ [[package]] name = "tomlkit" -version = "0.11.8" +version = "0.12.1" description = "Style preserving TOML library" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, - {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, ] [[package]] @@ -1697,26 +1698,26 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "typing-extensions" -version = "4.6.3" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, - {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "urllib3" -version = "2.0.3" +version = "2.0.4" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, - {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, ] [package.extras] @@ -1835,19 +1836,19 @@ files = [ [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] docs = [] @@ -1855,4 +1856,4 @@ docs = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "41dcdfabfc5baa02bfa1dbce7e9c342ccadf7c00e646c5b2f36002807021ad28" +content-hash = "f26211576227c79b6a688df57e50b2c7a4db411cae48efd23d412ea7b218ffe2" diff --git a/pyproject.toml b/pyproject.toml index 9eb1a07a..3bddf266 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ packages = [{ include = "pineko", from = "src" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" eko = "^0.13.2" -pineappl = { version = "^0.6.0a17", allow-prereleases = true } +pineappl = "^0.6.0" PyYAML = "^6.0" numpy = "^1.21.0" pandas = "^1.4.1" From 986cf465c87d17f7a4e057996fff821629b2a615 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 14:57:56 +0200 Subject: [PATCH 019/165] Change fonll-parts to FONLLParts --- benchmarks/bench_fonll.py | 2 +- src/pineko/fonll.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index b8264741..f0f8e576 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -23,4 +23,4 @@ def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid) assert simFONLL_tcard["FNS"] == fns assert simFONLL_tcard["NfFF"] == nfff assert simFONLL_tcard["PTO"] == po - assert simFONLL_tcard["fonll-parts"] == part + assert simFONLL_tcard["FONLLParts"] == part diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 22cb6c76..8a9c02ba 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -62,7 +62,7 @@ def theorycard_no_fns_pto(self): del card["PTO"] del card["NfFF"] del card["ID"] - del card["fonll-parts"] + del card["FONLLParts"] if not all([theorycards[0] == card in theorycards[1:]]): raise ValueError("theorycards not the same") return theorycards[0] @@ -178,7 +178,7 @@ def produce_fonll_recipe(fns): "FNS": fns, "NfFF": nfff, "PTO": po, - "fonll-parts": part, + "FONLLParts": part, } ) return fonll_recipe From 4b16a92e9329c04a2eb3bb3818c86313def4f32c Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 17:49:11 +0200 Subject: [PATCH 020/165] Fix case without damping --- src/pineko/fonll.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 8a9c02ba..93da9af1 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -93,8 +93,13 @@ def produce_combined_fk( if theorycard_constituent_fks["DAMP"] == 0: # then there is no damping, not even Heaviside only combined_fk = fonll_info.fks[0] - for fk_path in fonll_info.fk_paths[1:]: - combined_fk.merge_from_file(fk_path) + with tempfile.TemporaryDirectory() as tmpdirname: + for i, fk in enumerate(fonll_info.fks[1:]): + tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" + sign = -1 if i + 1 in FK_WITH_MINUS else 1 + fk.scale_by_bin(sign) + fk.write_lz4(tmpfile_path) + combined_fk.merge_from_file(tmpfile_path) else: mc = theorycard_constituent_fks["mc"] mb = theorycard_constituent_fks["mb"] From 099523ad64f8c6c03be2b093f7d9c9d1cfcc0dcf Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 17:53:35 +0200 Subject: [PATCH 021/165] Use function scale instead of scale by bin --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 93da9af1..78b9b46e 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -97,7 +97,7 @@ def produce_combined_fk( for i, fk in enumerate(fonll_info.fks[1:]): tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" sign = -1 if i + 1 in FK_WITH_MINUS else 1 - fk.scale_by_bin(sign) + fk.scale(sign) fk.write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) else: From aecf0cd903ee98fb17e3b98bf67ae7a9e58fa41f Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 18:13:38 +0200 Subject: [PATCH 022/165] Avoid counting the minus sign twice --- src/pineko/fonll.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 78b9b46e..3c2e3ba9 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -116,18 +116,19 @@ def produce_combined_fk( damping_factor_bottom *= step_function_bottom dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} for i, fk in enumerate(fonll_info.fks): - sign = 1 - if i in FK_WITH_MINUS: - sign = -1 for mass in FK_TO_DAMP: if i in FK_TO_DAMP[mass]: - fk.scale_by_bin(sign * dampings[mass]) + fk.scale_by_bin(dampings[mass]) # pineappl does not support operating with two grids in memory: # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 with tempfile.TemporaryDirectory() as tmpdirname: combined_fk = fonll_info.fks[0] for i, fk in enumerate(fonll_info.fks[1:]): tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" + sign = ( + -1 if i + 1 in FK_WITH_MINUS else 1 + ) # The i+1 is there because the first fk is not included in the loop + fk.scale(sign) fk.write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) From 0399a59db8a5b2afe0920c466f137af505878a53 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 18:24:31 +0200 Subject: [PATCH 023/165] Fix damping --- src/pineko/fonll.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 3c2e3ba9..a1d90aee 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -115,10 +115,6 @@ def produce_combined_fk( damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} - for i, fk in enumerate(fonll_info.fks): - for mass in FK_TO_DAMP: - if i in FK_TO_DAMP[mass]: - fk.scale_by_bin(dampings[mass]) # pineappl does not support operating with two grids in memory: # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 with tempfile.TemporaryDirectory() as tmpdirname: @@ -129,6 +125,9 @@ def produce_combined_fk( -1 if i + 1 in FK_WITH_MINUS else 1 ) # The i+1 is there because the first fk is not included in the loop fk.scale(sign) + for mass in FK_TO_DAMP: + if i + 1 in FK_TO_DAMP[mass]: + fk.scale_by_bin(dampings[mass]) fk.write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) From 499f8578d0ae11969708e5d7c7789d93d05dc635 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 18:31:27 +0200 Subject: [PATCH 024/165] Make damping setting depend on theory card --- src/pineko/cli/fonll.py | 18 ++++++++++++++++-- src/pineko/fonll.py | 21 ++++++++++++--------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 023d940a..91854c58 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -12,7 +12,7 @@ class TheoryCardError(Exception): class InconsistentInputsError(Exception): - """Raised if the inputs are not consistent with FONLL accounting for only charm mass, or both charm and bottom masses.""" + """Raised if the inputs are not consistent with FONLL.""" pass @@ -35,8 +35,22 @@ def subcommand(ffns3, ffn03, ffns4til, theoryid, ffns4bar, ffn04, ffns5til, ffns "One between ffn04 and ffns5til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) raise InconsistentInputsError + configs.configs = configs.defaults(configs.load()) + tcard = theory_card.load(theoryid) + if not "DAMPPOWER" in tcard: + if tcard["DAMP"] != 0: + raise InconsistentInputsError + tcard["DAMPPOWER"] = None fonll.produce_combined_fk( - ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar, theoryid + ffns3, + ffn03, + ffns4til, + ffns4bar, + ffn04, + ffns5til, + ffns5bar, + theoryid, + damp=(tcard["DAMP"], tcard["DAMPPOWER"]), ) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index a1d90aee..8e307a1a 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -84,13 +84,20 @@ def Q2grid(self): def produce_combined_fk( - ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar, theoryid + ffns3, + ffn03, + ffns4til, + ffns4bar, + ffn04, + ffns5til, + ffns5bar, + theoryid, + damp=(0, None), ): """Combine the FONLL FKs to produce one single final FONLL FK.""" fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) - theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto - if theorycard_constituent_fks["DAMP"] == 0: + if damp[0] == 0: # then there is no damping, not even Heaviside only combined_fk = fonll_info.fks[0] with tempfile.TemporaryDirectory() as tmpdirname: @@ -106,12 +113,8 @@ def produce_combined_fk( q2grid = fonll_info.Q2grid step_function_charm = mc**2 < q2grid step_function_bottom = mb**2 < q2grid - damping_factor_charm = (1 - q2grid / mc) ** theorycard_constituent_fks[ - "DAMPPOWER" - ] - damping_factor_bottom = (1 - q2grid / mb) ** theorycard_constituent_fks[ - "DAMPPOWER" - ] + damping_factor_charm = (1 - q2grid / mc) ** damp[1] + damping_factor_bottom = (1 - q2grid / mb) ** damp[1] damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} From 48c83d4275984af0c17b4fd1451a6d19c021c2e4 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 31 Jul 2023 18:47:00 +0200 Subject: [PATCH 025/165] Doing the damp correctly despite the paper... --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 8e307a1a..5bdef42c 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -113,8 +113,8 @@ def produce_combined_fk( q2grid = fonll_info.Q2grid step_function_charm = mc**2 < q2grid step_function_bottom = mb**2 < q2grid - damping_factor_charm = (1 - q2grid / mc) ** damp[1] - damping_factor_bottom = (1 - q2grid / mb) ** damp[1] + damping_factor_charm = (1 - mc / q2grid) ** damp[1] + damping_factor_bottom = (1 - mb / q2grid) ** damp[1] damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} From b4ca9b7ecc959d7850ce54ef01a8a293b01c7640 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 11:44:07 +0200 Subject: [PATCH 026/165] Change fonll paths --- src/pineko/fonll.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 5bdef42c..fef633cc 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -32,11 +32,10 @@ def fk_paths(self): paths = [self.ffns3, self.ffn03, self.ffns4til] if self.ffns4bar: paths = paths + [self.ffns4bar] - if self.ffn04 and self.ffns5til: - paths = paths + [self.ffn04, self.ffns5til] - # It does not make sense to have ffns5bar without ffns5til - if self.ffns5bar: - paths = paths + [self.ffns5bar] + if self.ffn04 and self.ffns5til: + paths = paths + [self.ffn04, self.ffns5til] + if self.ffns5bar: + paths = paths + [self.ffns5bar] return [Path(p) for p in paths] @property From b474004ac39a7a2651a62695a318660b5542380d Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 13:22:07 +0200 Subject: [PATCH 027/165] Make all the fktables to be merged optional --- src/pineko/cli/fonll.py | 16 ++++++++--- src/pineko/fonll.py | 64 ++++++++++++++++++++++------------------- tests/test_fonll.py | 27 ++++++++++++++--- 3 files changed, 70 insertions(+), 37 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 91854c58..1376006b 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -18,15 +18,15 @@ class InconsistentInputsError(Exception): @command.command("combine_fonll") -@click.argument("FFNS3", type=click.Path(exists=True)) -@click.argument("FFN03", type=click.Path(exists=True)) -@click.argument("FFNS4til", type=click.Path(exists=True)) @click.argument("theoryID", type=int) +@click.option("--FFNS3", type=click.Path(exists=True)) +@click.option("--FFN03", type=click.Path(exists=True)) +@click.option("--FFNS4til", type=click.Path(exists=True)) @click.option("--FFNS4bar", type=click.Path(exists=True)) @click.option("--FFN04", type=click.Path(exists=True)) @click.option("--FFNS5til", type=click.Path(exists=True)) @click.option("--FFNS5bar", type=click.Path(exists=True)) -def subcommand(ffns3, ffn03, ffns4til, theoryid, ffns4bar, ffn04, ffns5til, ffns5bar): +def subcommand(theoryid, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar): """Combine the different FKs needed to produce the FONLL prescription.""" if (ffn04 is None and ffns5til is not None) or ( ffn04 is not None and ffns5til is None @@ -35,6 +35,14 @@ def subcommand(ffns3, ffn03, ffns4til, theoryid, ffns4bar, ffn04, ffns5til, ffns "One between ffn04 and ffns5til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) raise InconsistentInputsError + if (ffn03 is None and ffns4til is not None) or ( + ffn03 is not None and ffns4til is None + ): + print( + "One between ffn03 and ffns4til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." + ) + raise InconsistentInputsError + configs.configs = configs.defaults(configs.load()) tcard = theory_card.load(theoryid) if not "DAMPPOWER" in tcard: diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index fef633cc..88975184 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -29,32 +29,34 @@ def __init__( @property def fk_paths(self): """Returns the list of the fk paths needed to produce FONLL predictions.""" - paths = [self.ffns3, self.ffn03, self.ffns4til] - if self.ffns4bar: - paths = paths + [self.ffns4bar] - if self.ffn04 and self.ffns5til: - paths = paths + [self.ffn04, self.ffns5til] - if self.ffns5bar: - paths = paths + [self.ffns5bar] - return [Path(p) for p in paths] + paths = { + "ffns3": self.ffns3, + "ffn03": self.ffn03, + "ffns4til": self.ffns4til, + "ffns4bar": self.ffns4bar, + "ffn04": self.ffn04, + "ffns5til": self.ffns5til, + "ffns5bar": self.ffns5bar, + } + return {p: Path(paths[p]) for p in paths if paths[p] is not None} @property def fks(self): """Returns the pineappl.Grid objects reading the paths provided by self.fk_paths.""" - return [pineappl.grid.Grid.read(fk_path) for fk_path in self.fk_paths] + return {fk: pineappl.grid.Grid.read(self.fk_paths[fk]) for fk in self.fk_paths} @property def dataset_name(self): """Return the name of the dataset given by the fktables name, if all the fktables have the same name.""" - if len({p.name for p in self.fk_paths}) == 1: - return self.fk_paths[0].name + if len({self.fks[p].name for p in self.fks}) == 1: + return self.fks[list(self.fks)[0]].name else: raise ValueError("not all fktables have the same name") @property def theorycard_no_fns_pto(self): """Return the common theory info between the different FONLL FKs.""" - theorycards = [json.loads(fk.key_values()["theory"]) for fk in self.fks] + theorycards = [json.loads(self.fks[p].key_values()["theory"]) for p in self.fks] # Only these should differ for card in theorycards: del card["FNS"] @@ -69,7 +71,9 @@ def theorycard_no_fns_pto(self): @property def Q2grid(self): """Return the Q2grid of the fktables given by self.fks .""" - aa = json.loads(self.fks[0].raw.key_values()["runcard"])["observables"] + aa = json.loads(self.fks[list(self.fks)[0]].key_values()["runcard"])[ + "observables" + ] bb = list(aa.values())[ 0 ] # there is only a single obseravble because it's a dis fktable @@ -78,8 +82,11 @@ def Q2grid(self): # Notice we rely on the order defined by the FONLLInfo class -FK_TO_DAMP = {"mc": [1, 2, 4, 5], "mb": [4, 5]} -FK_WITH_MINUS = [1, 4] # asy terms should be subtracted, therefore the sign +FK_TO_DAMP = { + "mc": ["ffn03", "ffns4til", "ffn04", "ffns5til"], + "mb": ["ffn04", "ffns5til"], +} +FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign def produce_combined_fk( @@ -96,15 +103,16 @@ def produce_combined_fk( """Combine the FONLL FKs to produce one single final FONLL FK.""" fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto + fk_dict = fonll_info.fks if damp[0] == 0: # then there is no damping, not even Heaviside only - combined_fk = fonll_info.fks[0] + combined_fk = fk_dict[list(fk_dict)[0]] with tempfile.TemporaryDirectory() as tmpdirname: - for i, fk in enumerate(fonll_info.fks[1:]): + for fk in list(fk_dict)[1:]: tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" - sign = -1 if i + 1 in FK_WITH_MINUS else 1 - fk.scale(sign) - fk.write_lz4(tmpfile_path) + sign = -1 if fk in FK_WITH_MINUS else 1 + fk_dict[fk].scale(sign) + fk_dict[fk].write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) else: mc = theorycard_constituent_fks["mc"] @@ -120,17 +128,15 @@ def produce_combined_fk( # pineappl does not support operating with two grids in memory: # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 with tempfile.TemporaryDirectory() as tmpdirname: - combined_fk = fonll_info.fks[0] - for i, fk in enumerate(fonll_info.fks[1:]): + combined_fk = fk_dict[list(fk_dict)[0]] + for fk in list(fk_dict)[1:]: tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" - sign = ( - -1 if i + 1 in FK_WITH_MINUS else 1 - ) # The i+1 is there because the first fk is not included in the loop - fk.scale(sign) + sign = -1 if fk in FK_WITH_MINUS else 1 + fk_dict[fk].scale(sign) for mass in FK_TO_DAMP: - if i + 1 in FK_TO_DAMP[mass]: - fk.scale_by_bin(dampings[mass]) - fk.write_lz4(tmpfile_path) + if fk in FK_TO_DAMP[mass]: + fk_dict[fk].scale_by_bin(dampings[mass]) + fk_dict[fk].write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) # update theorycard entries for the combined fktable by reading the yamldb of the original theory diff --git a/tests/test_fonll.py b/tests/test_fonll.py index 93fd93f8..38bfddb0 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -22,7 +22,26 @@ def test_FONLLInfo(): partialfonll_fake_info = pineko.fonll.FONLLInfo( full_list[0], full_list[1], full_list[2], None, None, None, None ) - assert fullfonll_fake_info.fk_paths == [pathlib.Path(fk) for fk in full_list] - # In this case it ignores the ffns5bar fk - assert wrongfonll_fake_info.fk_paths == [pathlib.Path(fk) for fk in full_list[:4]] - assert partialfonll_fake_info.fk_paths == [pathlib.Path(fk) for fk in full_list[:3]] + name_list = [ + "ffns3", + "ffn03", + "ffns4til", + "ffns4bar", + "ffn04", + "ffns5til", + "ffns5bar", + ] + assert fullfonll_fake_info.fk_paths == { + name: pathlib.Path(fk) for name, fk in zip(name_list, full_list) + } + assert wrongfonll_fake_info.fk_paths == { + name: pathlib.Path(fk) + for name, fk in zip( + name_list[:4] + [name_list[-1]], full_list[:4] + [full_list[-1]] + ) + } + assert partialfonll_fake_info.fk_paths == { + name: pathlib.Path(fk) + for name, fk in zip(name_list[:3], full_list[:3]) + if fk is not None + } From 8b453568af4bf6ebd85a2c42257445fa72515624 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 13:27:58 +0200 Subject: [PATCH 028/165] Correct small bug --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 88975184..03096fd2 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -109,7 +109,7 @@ def produce_combined_fk( combined_fk = fk_dict[list(fk_dict)[0]] with tempfile.TemporaryDirectory() as tmpdirname: for fk in list(fk_dict)[1:]: - tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" + tmpfile_path = Path(tmpdirname) / f"{fk}.pineappl.lz4" sign = -1 if fk in FK_WITH_MINUS else 1 fk_dict[fk].scale(sign) fk_dict[fk].write_lz4(tmpfile_path) @@ -130,7 +130,7 @@ def produce_combined_fk( with tempfile.TemporaryDirectory() as tmpdirname: combined_fk = fk_dict[list(fk_dict)[0]] for fk in list(fk_dict)[1:]: - tmpfile_path = Path(tmpdirname) / f"{i}.pineappl.lz4" + tmpfile_path = Path(tmpdirname) / f"{fk}.pineappl.lz4" sign = -1 if fk in FK_WITH_MINUS else 1 fk_dict[fk].scale(sign) for mass in FK_TO_DAMP: From 1b206d0bc7b38cbd1106599b7bb2fe31585d803e Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 13:32:26 +0200 Subject: [PATCH 029/165] Correct other small bug --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 03096fd2..4169fdad 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -48,8 +48,8 @@ def fks(self): @property def dataset_name(self): """Return the name of the dataset given by the fktables name, if all the fktables have the same name.""" - if len({self.fks[p].name for p in self.fks}) == 1: - return self.fks[list(self.fks)[0]].name + if len({self.fk_paths[p].name for p in self.fk_paths}) == 1: + return self.fk_paths[list(self.fk_paths)[0]].name else: raise ValueError("not all fktables have the same name") From 12c169393d465df13cff4e1b50d7f4ec73cbec88 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:18:29 +0200 Subject: [PATCH 030/165] First draft of automation for combine_fonll --- src/pineko/cli/fonll.py | 49 +++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 1376006b..dfaaeb83 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -19,15 +19,19 @@ class InconsistentInputsError(Exception): @command.command("combine_fonll") @click.argument("theoryID", type=int) -@click.option("--FFNS3", type=click.Path(exists=True)) -@click.option("--FFN03", type=click.Path(exists=True)) -@click.option("--FFNS4til", type=click.Path(exists=True)) -@click.option("--FFNS4bar", type=click.Path(exists=True)) -@click.option("--FFN04", type=click.Path(exists=True)) -@click.option("--FFNS5til", type=click.Path(exists=True)) -@click.option("--FFNS5bar", type=click.Path(exists=True)) -def subcommand(theoryid, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar): +@click.argument("dataset", type=str) +@click.option("--FFNS3", type=int) +@click.option("--FFN03", type=int) +@click.option("--FFNS4til", type=int) +@click.option("--FFNS4bar", type=int) +@click.option("--FFN04", type=int) +@click.option("--FFNS5til", type=int) +@click.option("--FFNS5bar", type=int) +def subcommand( + theoryid, dataset, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar +): """Combine the different FKs needed to produce the FONLL prescription.""" + # Checks if (ffn04 is None and ffns5til is not None) or ( ffn04 is not None and ffns5til is None ): @@ -42,24 +46,31 @@ def subcommand(theoryid, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns "One between ffn03 and ffns4til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) raise InconsistentInputsError - + # Get theory info configs.configs = configs.defaults(configs.load()) tcard = theory_card.load(theoryid) if not "DAMPPOWER" in tcard: if tcard["DAMP"] != 0: raise InconsistentInputsError tcard["DAMPPOWER"] = None - fonll.produce_combined_fk( - ffns3, - ffn03, - ffns4til, - ffns4bar, - ffn04, - ffns5til, - ffns5bar, - theoryid, - damp=(tcard["DAMP"], tcard["DAMPPOWER"]), + # Getting the paths to the grids + _info, grids = parser.get_yaml_information( + configs.configs["paths"]["ymldb"] / f"{dataset}.yaml", + configs.configs["paths"]["grids"] / str(theoryid), ) + grids_name = [grid.name for opgrids in grids for grid in opgrids] + for grid in grids_name: + fonll.produce_combined_fk( + configs.configs["paths"]["fktables"] / str(ffns3) / grid, + configs.configs["paths"]["fktables"] / str(ffn03) / grid, + configs.configs["paths"]["fktables"] / str(ffns4til) / grid, + configs.configs["paths"]["fktables"] / str(ffns4bar) / grid, + configs.configs["paths"]["fktables"] / str(ffn04) / grid, + configs.configs["paths"]["fktables"] / str(ffns5til) / grid, + configs.configs["paths"]["fktables"] / str(ffns5bar) / grid, + theoryid, + damp=(tcard["DAMP"], tcard["DAMPPOWER"]), + ) @command.command("fonll_tcards") From 88e780d09272d972e39d733bba8b6e3be39c8c5e Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:23:39 +0200 Subject: [PATCH 031/165] Correct small bug --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index dfaaeb83..5057f2b0 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -1,7 +1,7 @@ """CLI entry point to FONLL.""" import click -from .. import configs, fonll, theory_card +from .. import configs, fonll, parser, theory_card from ._base import command From 9ac3cb7289665b74a15f84f7e8778b09403269a4 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:29:25 +0200 Subject: [PATCH 032/165] Correct other small bug --- src/pineko/cli/fonll.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 5057f2b0..a5ecd5c9 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -17,6 +17,17 @@ class InconsistentInputsError(Exception): pass +def get_list_grids_name(yaml_file): + """Return the list of the grids in the yaml file.""" + yaml_content = parser._load_yaml(yaml_file) + # Turn the operands and the members into paths (and check all of them exist) + ret = [] + for operand in yaml_content["operands"]: + for member in operand: + ret.append(member + parser.EXT) + return ret + + @command.command("combine_fonll") @click.argument("theoryID", type=int) @click.argument("dataset", type=str) @@ -54,11 +65,9 @@ def subcommand( raise InconsistentInputsError tcard["DAMPPOWER"] = None # Getting the paths to the grids - _info, grids = parser.get_yaml_information( - configs.configs["paths"]["ymldb"] / f"{dataset}.yaml", - configs.configs["paths"]["grids"] / str(theoryid), + grids_name = get_list_grids_name( + configs.configs["paths"]["ymldb"] / f"{dataset}.yaml" ) - grids_name = [grid.name for opgrids in grids for grid in opgrids] for grid in grids_name: fonll.produce_combined_fk( configs.configs["paths"]["fktables"] / str(ffns3) / grid, From 77bfad4e4a760e5eb0945a963578816524eea51c Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:31:32 +0200 Subject: [PATCH 033/165] Add dot --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index a5ecd5c9..733bfdcc 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -24,7 +24,7 @@ def get_list_grids_name(yaml_file): ret = [] for operand in yaml_content["operands"]: for member in operand: - ret.append(member + parser.EXT) + ret.append(f"{member}.{parser.EXT}") return ret From 967a9d7060f9a95b56825eb6023b146d2887e0b8 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:44:21 +0200 Subject: [PATCH 034/165] Allow ingredients to not exists --- src/pineko/cli/fonll.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 733bfdcc..f3d10d98 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -70,13 +70,27 @@ def subcommand( ) for grid in grids_name: fonll.produce_combined_fk( - configs.configs["paths"]["fktables"] / str(ffns3) / grid, - configs.configs["paths"]["fktables"] / str(ffn03) / grid, - configs.configs["paths"]["fktables"] / str(ffns4til) / grid, - configs.configs["paths"]["fktables"] / str(ffns4bar) / grid, - configs.configs["paths"]["fktables"] / str(ffn04) / grid, - configs.configs["paths"]["fktables"] / str(ffns5til) / grid, - configs.configs["paths"]["fktables"] / str(ffns5bar) / grid, + configs.configs["paths"]["fktables"] / str(ffns3) / grid + if (configs.configs["paths"]["fktables"] / str(ffns3) / grid).exixts() + else None, + configs.configs["paths"]["fktables"] / str(ffn03) / grid + if (configs.configs["paths"]["fktables"] / str(ffn03) / grid).exists() + else None, + configs.configs["paths"]["fktables"] / str(ffns4til) / grid + if (configs.configs["paths"]["fktables"] / str(ffns4til) / grid).exists() + else None, + configs.configs["paths"]["fktables"] / str(ffns4bar) / grid + if (configs.configs["paths"]["fktables"] / str(ffns4bar) / grid).exists() + else None, + configs.configs["paths"]["fktables"] / str(ffn04) / grid + if (configs.configs["paths"]["fktables"] / str(ffn04)).exists() + else None, + configs.configs["paths"]["fktables"] / str(ffns5til) / grid + if (configs.configs["paths"]["fktables"] / str(ffns5til) / grid).exists() + else None, + configs.configs["paths"]["fktables"] / str(ffns5bar) / grid + if (configs.configs["paths"]["fktables"] / str(ffns5bar) / grid).exists() + else None, theoryid, damp=(tcard["DAMP"], tcard["DAMPPOWER"]), ) From 6d6d310204dc172795cf052e3bc66a50653eafa5 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:45:29 +0200 Subject: [PATCH 035/165] Correct spelling error --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index f3d10d98..c3b51e2c 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -71,7 +71,7 @@ def subcommand( for grid in grids_name: fonll.produce_combined_fk( configs.configs["paths"]["fktables"] / str(ffns3) / grid - if (configs.configs["paths"]["fktables"] / str(ffns3) / grid).exixts() + if (configs.configs["paths"]["fktables"] / str(ffns3) / grid).exists() else None, configs.configs["paths"]["fktables"] / str(ffn03) / grid if (configs.configs["paths"]["fktables"] / str(ffn03) / grid).exists() From f6906ecb5b5b159d59be0a4b730eb68c7d3e1dd8 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:55:14 +0200 Subject: [PATCH 036/165] Add some utility to the CLI --- src/pineko/cli/fonll.py | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index c3b51e2c..1c3c8b80 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -1,5 +1,6 @@ """CLI entry point to FONLL.""" import click +import rich from .. import configs, fonll, parser, theory_card from ._base import command @@ -29,17 +30,27 @@ def get_list_grids_name(yaml_file): @command.command("combine_fonll") -@click.argument("theoryID", type=int) -@click.argument("dataset", type=str) -@click.option("--FFNS3", type=int) -@click.option("--FFN03", type=int) -@click.option("--FFNS4til", type=int) -@click.option("--FFNS4bar", type=int) -@click.option("--FFN04", type=int) -@click.option("--FFNS5til", type=int) -@click.option("--FFNS5bar", type=int) +@click.argument("theoryID", type=int, help="theoryID of the final fktable") +@click.argument("dataset", type=str, help="dataset name") +@click.option("--FFNS3", type=int, help="theoryID containing the ffns3 fktable") +@click.option("--FFN03", type=int, help="theoryID containing the ffn03 fktable") +@click.option("--FFNS4til", type=int, help="theoryID containing the ffns4til fktable") +@click.option("--FFNS4bar", type=int, help="theoryID containing the ffns4bar fktable") +@click.option("--FFN04", type=int, help="theoryID containing the ffn04 fktable") +@click.option("--FFNS5til", type=int, help="theoryID containing the ffns5til fktable") +@click.option("--FFNS5bar", type=int, help="theoryID containing the ffns5bar fktable") +@click.option("--overwrite", is_flag=True, help="Allow files to be overwritten") def subcommand( - theoryid, dataset, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar + theoryid, + dataset, + ffns3, + ffn03, + ffns4til, + ffns4bar, + ffn04, + ffns5til, + ffns5bar, + overwrite, ): """Combine the different FKs needed to produce the FONLL prescription.""" # Checks @@ -69,6 +80,11 @@ def subcommand( configs.configs["paths"]["ymldb"] / f"{dataset}.yaml" ) for grid in grids_name: + # Checking if it already exists + if (configs.configs["paths"]["fktables"] / str(theoryid) / grid).exists(): + if not overwrite: + rich.print(f"Skipping existing FK Table {grid.stem}") + return fonll.produce_combined_fk( configs.configs["paths"]["fktables"] / str(ffns3) / grid if (configs.configs["paths"]["fktables"] / str(ffns3) / grid).exists() From 74eb2fa3327e0709de34a4ce660396883623bed2 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 14:58:46 +0200 Subject: [PATCH 037/165] Remove help for args --- src/pineko/cli/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 1c3c8b80..67913324 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -30,8 +30,8 @@ def get_list_grids_name(yaml_file): @command.command("combine_fonll") -@click.argument("theoryID", type=int, help="theoryID of the final fktable") -@click.argument("dataset", type=str, help="dataset name") +@click.argument("theoryID", type=int) +@click.argument("dataset", type=str) @click.option("--FFNS3", type=int, help="theoryID containing the ffns3 fktable") @click.option("--FFN03", type=int, help="theoryID containing the ffn03 fktable") @click.option("--FFNS4til", type=int, help="theoryID containing the ffns4til fktable") From 96394ddda5a27182a31d7c553b38bf4423caceb6 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 15:00:39 +0200 Subject: [PATCH 038/165] Remove wrong stem --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 67913324..0f287667 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -83,7 +83,7 @@ def subcommand( # Checking if it already exists if (configs.configs["paths"]["fktables"] / str(theoryid) / grid).exists(): if not overwrite: - rich.print(f"Skipping existing FK Table {grid.stem}") + rich.print(f"Skipping existing FK Table {grid}") return fonll.produce_combined_fk( configs.configs["paths"]["fktables"] / str(ffns3) / grid From c0e613c4bfcdb993644a8a6ff95b796ffdb17cd0 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 15:10:42 +0200 Subject: [PATCH 039/165] Write Success and Failure messages --- src/pineko/cli/fonll.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 0f287667..ad38d55b 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -81,9 +81,10 @@ def subcommand( ) for grid in grids_name: # Checking if it already exists - if (configs.configs["paths"]["fktables"] / str(theoryid) / grid).exists(): + new_fk_path = configs.configs["paths"]["fktables"] / str(theoryid) / grid + if new_fk_path.exists(): if not overwrite: - rich.print(f"Skipping existing FK Table {grid}") + rich.print(f"[green]Skipping existing FK Table {new_fk_path}") return fonll.produce_combined_fk( configs.configs["paths"]["fktables"] / str(ffns3) / grid @@ -110,6 +111,10 @@ def subcommand( theoryid, damp=(tcard["DAMP"], tcard["DAMPPOWER"]), ) + if new_fk_path.exists(): + rich.print(f"[green]Success:[/] Wrote FK table to {new_fk_path}") + else: + rich.print(f"[red]Failure:[/]") @command.command("fonll_tcards") From e14e22fd8bb4b5b368befe0bc6af2563af075859 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 2 Aug 2023 15:13:38 +0200 Subject: [PATCH 040/165] Modify skipping message --- src/pineko/cli/fonll.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index ad38d55b..decc869e 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -84,7 +84,9 @@ def subcommand( new_fk_path = configs.configs["paths"]["fktables"] / str(theoryid) / grid if new_fk_path.exists(): if not overwrite: - rich.print(f"[green]Skipping existing FK Table {new_fk_path}") + rich.print( + f"[green]Success:[/] skipping existing FK Table {new_fk_path}" + ) return fonll.produce_combined_fk( configs.configs["paths"]["fktables"] / str(ffns3) / grid From ebcd6fe62e87934b50fff7980c8dac5ae0442184 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Tue, 22 Aug 2023 09:38:59 +0100 Subject: [PATCH 041/165] fix theorycards check in case only one --- src/pineko/fonll.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 4169fdad..047d4efb 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -64,7 +64,10 @@ def theorycard_no_fns_pto(self): del card["NfFF"] del card["ID"] del card["FONLLParts"] - if not all([theorycards[0] == card in theorycards[1:]]): + del card["Comments"] + if len(theorycards) > 1 and not all( + [theorycards[0] == card in theorycards[1:]] + ): raise ValueError("theorycards not the same") return theorycards[0] From 524429a90e9c6ff1269dc985a49ea9526f25ad5d Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Mon, 18 Sep 2023 11:11:28 +0200 Subject: [PATCH 042/165] Add N3LO --- src/pineko/fonll.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 22cb6c76..a6176e54 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -166,6 +166,8 @@ def produce_combined_fk( "FONLL-A": [1 for _ in range(7)], "FONLL-B": [2, 2, 1, 2, 2, 1, 2], "FONLL-C": [2 for _ in range(7)], + "FONLL-D": [3, 3, 2, 3, 3, 2, 3], + "FONLL-E": [3 for _ in range(7)], } From c29463bf0f35c895498f7ebb76c0511236ff9806 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Mon, 18 Sep 2023 15:24:55 +0200 Subject: [PATCH 043/165] add config to nfonll cli --- src/pineko/cli/fonll.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index decc869e..f706c28b 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -5,6 +5,16 @@ from .. import configs, fonll, parser, theory_card from ._base import command +import pathlib + +config_setting = click.option( + "-c", + "--configs", + "cfg", + default=None, + type=click.Path(resolve_path=True, path_type=pathlib.Path), + help="Explicitly specify config file (it has to be a valid TOML file).", +) class TheoryCardError(Exception): """Raised when asked for FONLL theory cards with an original tcard as input that is not asking for FONLL.""" @@ -40,6 +50,7 @@ def get_list_grids_name(yaml_file): @click.option("--FFNS5til", type=int, help="theoryID containing the ffns5til fktable") @click.option("--FFNS5bar", type=int, help="theoryID containing the ffns5bar fktable") @click.option("--overwrite", is_flag=True, help="Allow files to be overwritten") +@config_setting def subcommand( theoryid, dataset, @@ -51,8 +62,16 @@ def subcommand( ffns5til, ffns5bar, overwrite, + cfg ): """Combine the different FKs needed to produce the FONLL prescription.""" + + path = configs.detect(cfg) + base_configs = configs.load(path) + configs.configs = configs.defaults(base_configs) + if cfg is not None: + print(f"Configurations loaded from '{path}'") + # Checks if (ffn04 is None and ffns5til is not None) or ( ffn04 is not None and ffns5til is None @@ -69,7 +88,6 @@ def subcommand( ) raise InconsistentInputsError # Get theory info - configs.configs = configs.defaults(configs.load()) tcard = theory_card.load(theoryid) if not "DAMPPOWER" in tcard: if tcard["DAMP"] != 0: @@ -121,9 +139,14 @@ def subcommand( @command.command("fonll_tcards") @click.argument("theoryID", type=int) -def fonll_tcards(theoryid): +@config_setting +def fonll_tcards(theoryid, cfg): """Produce the FONLL tcards starting from the original tcard given by the theoryID.""" - configs.configs = configs.defaults(configs.load()) + path = configs.detect(cfg) + base_configs = configs.load(path) + configs.configs = configs.defaults(base_configs) + if cfg is not None: + print(f"Configurations loaded from '{path}'") tcard = theory_card.load(theoryid) tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: From fbb750041709d9e81a42e741cb3f412c964e0b81 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Tue, 19 Sep 2023 17:07:36 +0200 Subject: [PATCH 044/165] run pre-commit --- src/pineko/cli/fonll.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index f706c28b..9eb7c75a 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -1,12 +1,12 @@ """CLI entry point to FONLL.""" +import pathlib + import click import rich from .. import configs, fonll, parser, theory_card from ._base import command -import pathlib - config_setting = click.option( "-c", "--configs", @@ -16,6 +16,7 @@ help="Explicitly specify config file (it has to be a valid TOML file).", ) + class TheoryCardError(Exception): """Raised when asked for FONLL theory cards with an original tcard as input that is not asking for FONLL.""" @@ -62,10 +63,9 @@ def subcommand( ffns5til, ffns5bar, overwrite, - cfg + cfg, ): """Combine the different FKs needed to produce the FONLL prescription.""" - path = configs.detect(cfg) base_configs = configs.load(path) configs.configs = configs.defaults(base_configs) From 3778f27f6c46f36c61f1857fd55b17beeb718218 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Tue, 19 Sep 2023 17:17:19 +0200 Subject: [PATCH 045/165] Use recipe for PTO of FNS --- benchmarks/bench_fonll.py | 2 +- src/pineko/fonll.py | 29 +++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index f0f8e576..dba03b92 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -17,7 +17,7 @@ def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid) theorycards, pineko.fonll.FNS_LIST, pineko.fonll.NFFF_LIST, - pineko.fonll.PTOS_DICT[tcard["FNS"]], + pineko.fonll.produce_ptos(tcard["FNS"]), pineko.fonll.PARTS_LIST, ): assert simFONLL_tcard["FNS"] == fns diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index ac904427..715d2c21 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -18,6 +18,7 @@ class FONLLInfo: def __init__( self, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar ) -> None: + """Initialize fonll info.""" self.ffns3 = ffns3 self.ffn03 = ffn03 self.ffns4til = ffns4til @@ -178,19 +179,31 @@ def produce_combined_fk( NFFF_LIST = [3, 3, 4, 4, 4, 5, 5, 5] PARTS_LIST = ["full", "full", "massless", "massive", "full", "massless", "massive"] -PTOS_DICT = { - "FONLL-A": [1 for _ in range(7)], - "FONLL-B": [2, 2, 1, 2, 2, 1, 2], - "FONLL-C": [2 for _ in range(7)], - "FONLL-D": [3, 3, 2, 3, 3, 2, 3], - "FONLL-E": [3 for _ in range(7)], -} +FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} +MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] + + +def produce_ptos(fns): + """Produce the list of PTOs needed for the requested fns.""" + base_pto = FNS_BASE_PTO["fns"] + if fns in MIXED_ORDER_FNS: + return [ + base_pto + 1, + base_pto + 1, + base_pto, + base_pto + 1, + base_pto + 1, + base_pto, + base_pto + 1, + ] + else: + return [base_pto for _ in range(7)] def produce_fonll_recipe(fns): """Produce the different theory cards according to which FONLL is asked for.""" fonll_recipe = [] - for fns, nfff, po, part in zip(FNS_LIST, NFFF_LIST, PTOS_DICT[fns], PARTS_LIST): + for fns, nfff, po, part in zip(FNS_LIST, NFFF_LIST, produce_ptos(fns), PARTS_LIST): fonll_recipe.append( { "FNS": fns, From fa7a60b130b2f1e4768dfa6047c56568d0612a12 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Tue, 19 Sep 2023 17:23:33 +0200 Subject: [PATCH 046/165] Correct bug --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 715d2c21..337cada8 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -185,7 +185,7 @@ def produce_combined_fk( def produce_ptos(fns): """Produce the list of PTOs needed for the requested fns.""" - base_pto = FNS_BASE_PTO["fns"] + base_pto = FNS_BASE_PTO[fns] if fns in MIXED_ORDER_FNS: return [ base_pto + 1, From 523498a075ea94012ab229498bd8016c13b6c07a Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Wed, 20 Sep 2023 12:03:14 +0200 Subject: [PATCH 047/165] Try to reduce theories form 7 to 5 --- src/pineko/cli/fonll.py | 18 ++++++++++--- src/pineko/fonll.py | 56 ++++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 9eb7c75a..f66fe8f1 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -45,9 +45,11 @@ def get_list_grids_name(yaml_file): @click.argument("dataset", type=str) @click.option("--FFNS3", type=int, help="theoryID containing the ffns3 fktable") @click.option("--FFN03", type=int, help="theoryID containing the ffn03 fktable") +@click.option("--FFNS4", type=int, help="theoryID containing the ffns4 fktable") @click.option("--FFNS4til", type=int, help="theoryID containing the ffns4til fktable") @click.option("--FFNS4bar", type=int, help="theoryID containing the ffns4bar fktable") @click.option("--FFN04", type=int, help="theoryID containing the ffn04 fktable") +@click.option("--FFNS5", type=int, help="theoryID containing the ffns4 fktable") @click.option("--FFNS5til", type=int, help="theoryID containing the ffns5til fktable") @click.option("--FFNS5bar", type=int, help="theoryID containing the ffns5bar fktable") @click.option("--overwrite", is_flag=True, help="Allow files to be overwritten") @@ -57,9 +59,11 @@ def subcommand( dataset, ffns3, ffn03, + ffns4, ffns4til, ffns4bar, ffn04, + ffns5, ffns5til, ffns5bar, overwrite, @@ -73,15 +77,15 @@ def subcommand( print(f"Configurations loaded from '{path}'") # Checks - if (ffn04 is None and ffns5til is not None) or ( - ffn04 is not None and ffns5til is None + if (ffn04 is None and (ffns5til is not None or ffns5 is not None)) or ( + ffn04 is not None and (ffns5til is None or ffns5 is None) ): print( "One between ffn04 and ffns5til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) raise InconsistentInputsError - if (ffn03 is None and ffns4til is not None) or ( - ffn03 is not None and ffns4til is None + if (ffn03 is None and (ffns4til is not None or ffns4 is not None)) or ( + ffn03 is not None and (ffns4til is None or ffns4 is None) ): print( "One between ffn03 and ffns4til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." @@ -113,6 +117,9 @@ def subcommand( configs.configs["paths"]["fktables"] / str(ffn03) / grid if (configs.configs["paths"]["fktables"] / str(ffn03) / grid).exists() else None, + configs.configs["paths"]["fktables"] / str(ffns4) / grid + if (configs.configs["paths"]["fktables"] / str(ffns4) / grid).exists() + else None, configs.configs["paths"]["fktables"] / str(ffns4til) / grid if (configs.configs["paths"]["fktables"] / str(ffns4til) / grid).exists() else None, @@ -122,6 +129,9 @@ def subcommand( configs.configs["paths"]["fktables"] / str(ffn04) / grid if (configs.configs["paths"]["fktables"] / str(ffn04)).exists() else None, + configs.configs["paths"]["fktables"] / str(ffns5) / grid + if (configs.configs["paths"]["fktables"] / str(ffns5) / grid).exists() + else None, configs.configs["paths"]["fktables"] / str(ffns5til) / grid if (configs.configs["paths"]["fktables"] / str(ffns5til) / grid).exists() else None, diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 337cada8..0c804776 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -16,14 +16,16 @@ class FONLLInfo: """Class containing all the information for FONLL predictions.""" def __init__( - self, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar + self, ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar ) -> None: """Initialize fonll info.""" self.ffns3 = ffns3 self.ffn03 = ffn03 + self.ffns4 = ffns4 self.ffns4til = ffns4til self.ffns4bar = ffns4bar self.ffn04 = ffn04 + self.ffns5 = ffns5 self.ffns5til = ffns5til self.ffns5bar = ffns5bar @@ -33,9 +35,11 @@ def fk_paths(self): paths = { "ffns3": self.ffns3, "ffn03": self.ffn03, + "ffns4": self.ffns4, "ffns4til": self.ffns4til, "ffns4bar": self.ffns4bar, "ffn04": self.ffn04, + "ffns5": self.ffns5, "ffns5til": self.ffns5til, "ffns5bar": self.ffns5bar, } @@ -96,16 +100,18 @@ def Q2grid(self): def produce_combined_fk( ffns3, ffn03, + ffns4, ffns4til, ffns4bar, ffn04, + ffns5, ffns5til, ffns5bar, theoryid, damp=(0, None), ): """Combine the FONLL FKs to produce one single final FONLL FK.""" - fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) + fonll_info = FONLLInfo(ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto fk_dict = fonll_info.fks if damp[0] == 0: @@ -167,7 +173,11 @@ def produce_combined_fk( combined_fk.write_lz4(output_path_fk) -FNS_LIST = [ +FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} +MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] + +# Mixed FONLL schemes +MIXED_FNS_LIST = [ "FONLL-FFNS", "FONLL-FFN0", "FONLL-FFNS", @@ -176,16 +186,25 @@ def produce_combined_fk( "FONLL-FFNS", "FONLL-FFNS", ] +MIXED_NFFF_LIST = [3, 3, 4, 4, 4, 5, 5, 5] +MIXED_PARTS_LIST = ["full", "full", "massless", "massive", "full", "massless", "massive"] -NFFF_LIST = [3, 3, 4, 4, 4, 5, 5, 5] -PARTS_LIST = ["full", "full", "massless", "massive", "full", "massless", "massive"] -FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} -MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] +# plain FONLL schemes +FNS_LIST = [ + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", +] +NFFF_LIST = [3, 3, 4, 4, 5] +PARTS_LIST = ["full" for _ in range(5)] -def produce_ptos(fns): +def produce_ptos(fns, is_mixed): """Produce the list of PTOs needed for the requested fns.""" base_pto = FNS_BASE_PTO[fns] + # mixed FONLL if fns in MIXED_ORDER_FNS: return [ base_pto + 1, @@ -196,14 +215,22 @@ def produce_ptos(fns): base_pto, base_pto + 1, ] - else: + # plain FONLL with damping + elif is_mixed: return [base_pto for _ in range(7)] + # plain FONLL without damping + else: + return [base_pto for _ in range(5)] -def produce_fonll_recipe(fns): +def produce_fonll_recipe(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" fonll_recipe = [] - for fns, nfff, po, part in zip(FNS_LIST, NFFF_LIST, produce_ptos(fns), PARTS_LIST): + is_mixed = fonll_fns in MIXED_ORDER_FNS or damp != 0 + fns_list = MIXED_FNS_LIST if is_mixed else FNS_LIST + nfff_list = MIXED_NFFF_LIST if is_mixed else NFFF_LIST + parts_list = MIXED_PARTS_LIST if is_mixed else PARTS_LIST + for fns, nfff, po, part in zip(fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed), parts_list): fonll_recipe.append( { "FNS": fns, @@ -217,11 +244,12 @@ def produce_fonll_recipe(fns): def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): """Produce the seven fonll tcards from an original tcard and dump them in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'.""" - theorycards = [copy.deepcopy(tcard) for _ in range(7)] - fonll_recipe = produce_fonll_recipe(tcard["FNS"]) + fonll_recipe = produce_fonll_recipe(tcard["FNS"], tcard["DAMP"]) + n_theory = len(fonll_recipe) + theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] for theorycard, recipe in zip(theorycards, fonll_recipe): theorycard.update(recipe) - paths_list = [tcard_parent_path / f"{theoryid}0{num}.yaml" for num in range(7)] + paths_list = [tcard_parent_path / f"{theoryid}0{num}.yaml" for num in range(n_theory)] for newtcard, path in zip(theorycards, paths_list): with open(path, "w", encoding="UTF-8") as f: yaml.safe_dump(newtcard, f) From acd6d81a4e2269d177603611368e6da863b3df36 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Wed, 20 Sep 2023 12:26:25 +0200 Subject: [PATCH 048/165] fix tests --- tests/test_fonll.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index 38bfddb0..62046de9 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -9,25 +9,29 @@ def test_FONLLInfo(): full_list = [ "ffns3.pineappl.lz4", "ffn03.pineappl.lz4", + "ffns4.pineappl.lz4", "ffns4til.pineappl.lz4", "ffns4bar.pineappl.lz4", "ffn04.pineappl.lz4", + "ffns5.pineappl.lz4", "ffns5til.pineappl.lz4", "ffns5bar.pineappl.lz4", ] fullfonll_fake_info = pineko.fonll.FONLLInfo(*full_list) wrongfonll_fake_info = pineko.fonll.FONLLInfo( - full_list[0], full_list[1], full_list[2], full_list[3], None, None, full_list[6] + full_list[0], full_list[1], None, full_list[3], full_list[4], None, None, None, full_list[8] ) partialfonll_fake_info = pineko.fonll.FONLLInfo( - full_list[0], full_list[1], full_list[2], None, None, None, None + full_list[0], full_list[1], None, full_list[3], None, None, None, None, None ) name_list = [ "ffns3", "ffn03", + "ffns4", "ffns4til", "ffns4bar", "ffn04", + "ffns5", "ffns5til", "ffns5bar", ] @@ -37,11 +41,11 @@ def test_FONLLInfo(): assert wrongfonll_fake_info.fk_paths == { name: pathlib.Path(fk) for name, fk in zip( - name_list[:4] + [name_list[-1]], full_list[:4] + [full_list[-1]] + name_list[:2] + name_list[3:5] + [name_list[-1]], full_list[:2] + full_list[3:5] + [full_list[-1]] ) } assert partialfonll_fake_info.fk_paths == { name: pathlib.Path(fk) - for name, fk in zip(name_list[:3], full_list[:3]) + for name, fk in zip(name_list[:2] + name_list[3:4], full_list[:2] + full_list[3:4]) if fk is not None } From 56ec7d9b43c96a3cc8a2389caf166c29167423c8 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Wed, 20 Sep 2023 12:28:37 +0200 Subject: [PATCH 049/165] black --- src/pineko/fonll.py | 22 ++++++++++++++++++---- tests/test_fonll.py | 17 ++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 0c804776..a48fb6ff 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -111,7 +111,9 @@ def produce_combined_fk( damp=(0, None), ): """Combine the FONLL FKs to produce one single final FONLL FK.""" - fonll_info = FONLLInfo(ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar) + fonll_info = FONLLInfo( + ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar + ) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto fk_dict = fonll_info.fks if damp[0] == 0: @@ -187,7 +189,15 @@ def produce_combined_fk( "FONLL-FFNS", ] MIXED_NFFF_LIST = [3, 3, 4, 4, 4, 5, 5, 5] -MIXED_PARTS_LIST = ["full", "full", "massless", "massive", "full", "massless", "massive"] +MIXED_PARTS_LIST = [ + "full", + "full", + "massless", + "massive", + "full", + "massless", + "massive", +] # plain FONLL schemes FNS_LIST = [ @@ -230,7 +240,9 @@ def produce_fonll_recipe(fonll_fns, damp): fns_list = MIXED_FNS_LIST if is_mixed else FNS_LIST nfff_list = MIXED_NFFF_LIST if is_mixed else NFFF_LIST parts_list = MIXED_PARTS_LIST if is_mixed else PARTS_LIST - for fns, nfff, po, part in zip(fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed), parts_list): + for fns, nfff, po, part in zip( + fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed), parts_list + ): fonll_recipe.append( { "FNS": fns, @@ -249,7 +261,9 @@ def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] for theorycard, recipe in zip(theorycards, fonll_recipe): theorycard.update(recipe) - paths_list = [tcard_parent_path / f"{theoryid}0{num}.yaml" for num in range(n_theory)] + paths_list = [ + tcard_parent_path / f"{theoryid}0{num}.yaml" for num in range(n_theory) + ] for newtcard, path in zip(theorycards, paths_list): with open(path, "w", encoding="UTF-8") as f: yaml.safe_dump(newtcard, f) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index 62046de9..63d37eae 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -19,7 +19,15 @@ def test_FONLLInfo(): ] fullfonll_fake_info = pineko.fonll.FONLLInfo(*full_list) wrongfonll_fake_info = pineko.fonll.FONLLInfo( - full_list[0], full_list[1], None, full_list[3], full_list[4], None, None, None, full_list[8] + full_list[0], + full_list[1], + None, + full_list[3], + full_list[4], + None, + None, + None, + full_list[8], ) partialfonll_fake_info = pineko.fonll.FONLLInfo( full_list[0], full_list[1], None, full_list[3], None, None, None, None, None @@ -41,11 +49,14 @@ def test_FONLLInfo(): assert wrongfonll_fake_info.fk_paths == { name: pathlib.Path(fk) for name, fk in zip( - name_list[:2] + name_list[3:5] + [name_list[-1]], full_list[:2] + full_list[3:5] + [full_list[-1]] + name_list[:2] + name_list[3:5] + [name_list[-1]], + full_list[:2] + full_list[3:5] + [full_list[-1]], ) } assert partialfonll_fake_info.fk_paths == { name: pathlib.Path(fk) - for name, fk in zip(name_list[:2] + name_list[3:4], full_list[:2] + full_list[3:4]) + for name, fk in zip( + name_list[:2] + name_list[3:4], full_list[:2] + full_list[3:4] + ) if fk is not None } From 4a44d08f3db77b88eb68c37272fc71b69c0362ce Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 21 Sep 2023 10:14:49 +0200 Subject: [PATCH 050/165] Update src/pineko/check.py Co-authored-by: Felix Hekhorn --- src/pineko/check.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index c62c523c..f56999d7 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -160,9 +160,7 @@ def is_fonll_b(fns, lumi): def issimFONLL(FNS): """Check if the FNS is a simFONLL FNS.""" - if FNS in ["FONLL-FFNS", "FONLL-FFN0"]: - return True - return False + return FNS in ["FONLL-FFNS", "FONLL-FFN0"] def orders(grid, max_as, max_al) -> list: From c718a1f4c7b3d352c7ed365c7cac52196b00fe31 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 21 Sep 2023 10:26:14 +0200 Subject: [PATCH 051/165] Avoid repetition in fonll and change back to nFONLL --- src/pineko/cli/fonll.py | 40 +++++++++++++++++++--------------------- src/pineko/evolve.py | 2 +- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 9eb7c75a..94c9d8f6 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -29,6 +29,12 @@ class InconsistentInputsError(Exception): pass +def load_cfg(name, grid): + """Path of the fktable in 'name' called 'grid' if it exists, else None.""" + path = configs.configs["paths"]["fktables"] / name / grid + return path if path.exists() else None + + def get_list_grids_name(yaml_file): """Return the list of the grids in the yaml file.""" yaml_content = parser._load_yaml(yaml_file) @@ -106,28 +112,20 @@ def subcommand( f"[green]Success:[/] skipping existing FK Table {new_fk_path}" ) return - fonll.produce_combined_fk( - configs.configs["paths"]["fktables"] / str(ffns3) / grid - if (configs.configs["paths"]["fktables"] / str(ffns3) / grid).exists() - else None, - configs.configs["paths"]["fktables"] / str(ffn03) / grid - if (configs.configs["paths"]["fktables"] / str(ffn03) / grid).exists() - else None, - configs.configs["paths"]["fktables"] / str(ffns4til) / grid - if (configs.configs["paths"]["fktables"] / str(ffns4til) / grid).exists() - else None, - configs.configs["paths"]["fktables"] / str(ffns4bar) / grid - if (configs.configs["paths"]["fktables"] / str(ffns4bar) / grid).exists() - else None, - configs.configs["paths"]["fktables"] / str(ffn04) / grid - if (configs.configs["paths"]["fktables"] / str(ffn04)).exists() - else None, - configs.configs["paths"]["fktables"] / str(ffns5til) / grid - if (configs.configs["paths"]["fktables"] / str(ffns5til) / grid).exists() - else None, configs.configs["paths"]["fktables"] / str(ffns5bar) / grid - if (configs.configs["paths"]["fktables"] / str(ffns5bar) / grid).exists() - else None, + fonll.produce_combined_fk( + *( + load_cfg(str(name), grid) + for name in ( + ffns3, + ffn03, + ffns4til, + ffns4bar, + ffn04, + ffns5til, + ffns5bar, + ) + ), theoryid, damp=(tcard["DAMP"], tcard["DAMPPOWER"]), ) diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 775e99af..2c19a3ed 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -106,7 +106,7 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): """ # Add a +1 to the orders for the difference in convention between nnpdf and pineappl is_fns = int(check.is_fonll_b(tcard["FNS"], pineappl_grid.lumi())) - # NB: This would not happen for simFONLL + # NB: This would not happen for nFONLL max_as = 1 + tcard["PTO"] + is_fns max_al = 1 + tcard["QED"] # ... in order to create a mask ... From 238f8802cd6900967773e1dee6fb5c9ccb6d6446 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 21 Sep 2023 10:39:33 +0200 Subject: [PATCH 052/165] Fix bench_fonll --- benchmarks/bench_fonll.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index dba03b92..15e051e0 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -4,8 +4,10 @@ import pineko -@pytest.mark.parametrize("theoryid", [400, 208]) -def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid): +@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) +def benchmark_produce_fonll_tcards( + tmp_path, test_files, test_configs, theoryid, is_mixed +): tcard = pineko.theory_card.load(theoryid) tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) # Check they are correct @@ -15,10 +17,10 @@ def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid) theorycards.append(yaml.safe_load(f)) for simFONLL_tcard, fns, nfff, po, part in zip( theorycards, - pineko.fonll.FNS_LIST, - pineko.fonll.NFFF_LIST, - pineko.fonll.produce_ptos(tcard["FNS"]), - pineko.fonll.PARTS_LIST, + pineko.fonll.MIXED_FNS_LIST if is_mixed else pineko.fonll.FNS_LIST, + pineko.fonll.MIXED_NFFF_LIST if is_mixed else pineko.fonll.NFFF_LIST, + pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), + pineko.fonll.MIXED_PARTS_LIST if is_mixed else pineko.fonll.PARTS_LIST, ): assert simFONLL_tcard["FNS"] == fns assert simFONLL_tcard["NfFF"] == nfff From 864742f97f4404456c3b11dc753326bc289cdf34 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 21 Sep 2023 10:45:44 +0200 Subject: [PATCH 053/165] Fix bench_evolve --- benchmarks/bench_evolve.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 6798fd6c..3d0696ee 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -13,9 +13,9 @@ import pineko.theory_card -@pytest.mark.parametrize("theoryid", [400, 208]) +@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) def benchmark_write_operator_card_from_file_simFONLL( - tmp_path, test_files, test_configs, theoryid + tmp_path, test_files, test_configs, theoryid, is_mixed ): tcard = pineko.theory_card.load(theoryid) tcards_path_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) @@ -27,7 +27,10 @@ def benchmark_write_operator_card_from_file_simFONLL( / "HERA_NC_225GEV_EP_SIGMARED.pineappl.lz4" ) default_path = test_files / "data" / "operator_cards" / "400" / "_template.yaml" - targets_path_list = [tmp_path / f"test_opcard_{num}.yaml" for num in range(7)] + num_opcard = 7 if is_mixed else 5 + targets_path_list = [ + tmp_path / f"test_opcard_{num}.yaml" for num in range(num_opcard) + ] for target_path, tcard_path in zip(targets_path_list, tcards_path_list): with open(tcard_path, encoding="utf-8") as f: tcard = yaml.safe_load(f) @@ -35,7 +38,10 @@ def benchmark_write_operator_card_from_file_simFONLL( pine_path, default_path, target_path, tcard ) # Check if the opcards are ok - for opcard_path, nfff in zip(targets_path_list, pineko.fonll.NFFF_LIST): + for opcard_path, nfff in zip( + targets_path_list, + pineko.fonll.MIXED_NFFF_LIST if is_mixed else pineko.fonll.NFFF_LIST, + ): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) for entry in ocard["mugrid"]: From 175ee2a52d00d1521438610c4a33348ac62c4f1a Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 21 Sep 2023 11:10:34 +0200 Subject: [PATCH 054/165] Update src/pineko/cli/fonll.py Co-authored-by: Giacomo Magni <39065935+giacomomagni@users.noreply.github.com> --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 836ff719..3d8ac056 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -55,7 +55,7 @@ def get_list_grids_name(yaml_file): @click.option("--FFNS4til", type=int, help="theoryID containing the ffns4til fktable") @click.option("--FFNS4bar", type=int, help="theoryID containing the ffns4bar fktable") @click.option("--FFN04", type=int, help="theoryID containing the ffn04 fktable") -@click.option("--FFNS5", type=int, help="theoryID containing the ffns4 fktable") +@click.option("--FFNS5", type=int, help="theoryID containing the ffns5 fktable") @click.option("--FFNS5til", type=int, help="theoryID containing the ffns5til fktable") @click.option("--FFNS5bar", type=int, help="theoryID containing the ffns5bar fktable") @click.option("--overwrite", is_flag=True, help="Allow files to be overwritten") From 3708a89d74718c03a776c24574a5eb4f6ac5cd2d Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 21 Sep 2023 11:46:16 +0200 Subject: [PATCH 055/165] add a check on FONLL theories --- src/pineko/cli/fonll.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 3d8ac056..6b8c19c2 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -84,19 +84,25 @@ def subcommand( # Checks if (ffn04 is None and (ffns5til is not None or ffns5 is not None)) or ( - ffn04 is not None and (ffns5til is None or ffns5 is None) + ffn04 is not None and (ffns5til is None and ffns5 is None) ): - print( + raise InconsistentInputsError( "One between ffn04 and ffns5til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) - raise InconsistentInputsError if (ffn03 is None and (ffns4til is not None or ffns4 is not None)) or ( - ffn03 is not None and (ffns4til is None or ffns4 is None) + ffn03 is not None and (ffns4til is None and ffns4 is None) ): - print( + raise InconsistentInputsError( "One between ffn03 and ffns4til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." ) - raise InconsistentInputsError + + # check that if we have ffns we dont have any bar or til + if ffns4 is not None or ffns5 is not None: + if not all([fk is None for fk in [ffns4til,ffns4bar, ffns5til,ffns5bar]]): + raise InconsistentInputsError( + "If ffns4 and ffns5 are provided, no ffnstil or ffnsbar should be provided." + ) + # Get theory info tcard = theory_card.load(theoryid) if not "DAMPPOWER" in tcard: From f4f0a2c2a67dc4af1a6c582561836f92f13a343b Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 21 Sep 2023 11:48:02 +0200 Subject: [PATCH 056/165] black --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 6b8c19c2..99d2066c 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -98,7 +98,7 @@ def subcommand( # check that if we have ffns we dont have any bar or til if ffns4 is not None or ffns5 is not None: - if not all([fk is None for fk in [ffns4til,ffns4bar, ffns5til,ffns5bar]]): + if not all([fk is None for fk in [ffns4til, ffns4bar, ffns5til, ffns5bar]]): raise InconsistentInputsError( "If ffns4 and ffns5 are provided, no ffnstil or ffnsbar should be provided." ) From a7d64ca629e9d11436f5f0c1364cdeb82d078d78 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 21 Sep 2023 11:53:04 +0200 Subject: [PATCH 057/165] fix merge --- src/pineko/cli/fonll.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 99d2066c..4d0b8120 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -128,9 +128,11 @@ def subcommand( for name in ( ffns3, ffn03, + ffns4, ffns4til, ffns4bar, ffn04, + ffns5, ffns5til, ffns5bar, ) From 9aad6060a5d183b565829b921b2c6d08ef28c28a Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 28 Sep 2023 09:06:43 +0200 Subject: [PATCH 058/165] update theory ID in fonll tcards --- src/pineko/fonll.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index a48fb6ff..f1875815 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -259,12 +259,14 @@ def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): fonll_recipe = produce_fonll_recipe(tcard["FNS"], tcard["DAMP"]) n_theory = len(fonll_recipe) theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] - for theorycard, recipe in zip(theorycards, fonll_recipe): + paths_list = [] + for num, (theorycard, recipe) in enumerate(zip(theorycards, fonll_recipe)): + # update cards entries theorycard.update(recipe) - paths_list = [ - tcard_parent_path / f"{theoryid}0{num}.yaml" for num in range(n_theory) - ] - for newtcard, path in zip(theorycards, paths_list): - with open(path, "w", encoding="UTF-8") as f: - yaml.safe_dump(newtcard, f) + theorycard["ID"] = int(f"{theoryid}0{num}") + # save + theorycard_path = tcard_parent_path / f'{theorycard["ID"]}.yaml' + with open(theorycard_path, "w", encoding="UTF-8") as f: + yaml.safe_dump(theorycard, f) + paths_list.append(theorycard_path) return paths_list From 5bca6e7e8ccd13935a1d0e81fcb41d5b53637da9 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Fri, 29 Sep 2023 15:50:36 +0100 Subject: [PATCH 059/165] print theory card path for fonll_tcards --- src/pineko/fonll.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index f1875815..7af318fe 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -7,6 +7,7 @@ import numpy as np import pineappl +import rich import yaml from . import configs @@ -269,4 +270,5 @@ def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): with open(theorycard_path, "w", encoding="UTF-8") as f: yaml.safe_dump(theorycard, f) paths_list.append(theorycard_path) + rich.print(f"[green]Wrote theory card to {theorycard_path}") return paths_list From a2998a382104457461a3bb86cf99b8da26ae4006 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 3 Oct 2023 10:10:26 +0200 Subject: [PATCH 060/165] Change simFONLL to num_fonll --- benchmarks/bench_evolve.py | 2 +- benchmarks/bench_fonll.py | 10 +++++----- src/pineko/check.py | 4 ++-- src/pineko/evolve.py | 4 ++-- src/pineko/theory.py | 2 +- tests/test_check.py | 10 +++++----- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 3d0696ee..34791666 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -14,7 +14,7 @@ @pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) -def benchmark_write_operator_card_from_file_simFONLL( +def benchmark_write_operator_card_from_file_num_fonll( tmp_path, test_files, test_configs, theoryid, is_mixed ): tcard = pineko.theory_card.load(theoryid) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 15e051e0..1852db35 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -15,14 +15,14 @@ def benchmark_produce_fonll_tcards( for path in tcard_paths_list: with open(path, encoding="UTF-8") as f: theorycards.append(yaml.safe_load(f)) - for simFONLL_tcard, fns, nfff, po, part in zip( + for num_fonll_tcard, fns, nfff, po, part in zip( theorycards, pineko.fonll.MIXED_FNS_LIST if is_mixed else pineko.fonll.FNS_LIST, pineko.fonll.MIXED_NFFF_LIST if is_mixed else pineko.fonll.NFFF_LIST, pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), pineko.fonll.MIXED_PARTS_LIST if is_mixed else pineko.fonll.PARTS_LIST, ): - assert simFONLL_tcard["FNS"] == fns - assert simFONLL_tcard["NfFF"] == nfff - assert simFONLL_tcard["PTO"] == po - assert simFONLL_tcard["FONLLParts"] == part + assert num_fonll_tcard["FNS"] == fns + assert num_fonll_tcard["NfFF"] == nfff + assert num_fonll_tcard["PTO"] == po + assert num_fonll_tcard["FONLLParts"] == part diff --git a/src/pineko/check.py b/src/pineko/check.py index f56999d7..bad766a3 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -158,8 +158,8 @@ def is_fonll_b(fns, lumi): return False -def issimFONLL(FNS): - """Check if the FNS is a simFONLL FNS.""" +def is_num_fonll(FNS): + """Check if the FNS is a num_fonll FNS.""" return FNS in ["FONLL-FFNS", "FONLL-FFN0"] diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 2c19a3ed..c7e6ebf3 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -129,8 +129,8 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): matching_scales=heavy_quarks.MatchingScales(masses * thresholds_ratios), origin=(tcard["Q0"] ** 2, tcard["nf0"]), ) - # If we are producing simFONLL FKs we need to look to NfFF... - if check.issimFONLL(tcard["FNS"]): + # If we are producing num_fonll FKs we need to look to NfFF... + if check.is_num_fonll(tcard["FNS"]): nfff = tcard["NfFF"] operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nfff)) for q2 in q2_grid] else: diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 849cd32a..7cec6c09 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -388,7 +388,7 @@ def fk(self, name, grid_path, tcard, pdf): grid.lumi(), ): max_as += 1 - # NB: This would not happen for simFONLL + # NB: This would not happen for num_fonll max_al = 0 # check for sv if not np.isclose(xir, 1.0): diff --git a/tests/test_check.py b/tests/test_check.py index 4a63f40d..352ed3a2 100644 --- a/tests/test_check.py +++ b/tests/test_check.py @@ -41,11 +41,11 @@ def test_is_fonll_b(): assert pineko.check.is_fonll_b(fns, lumi_crazy) is False -def test_issimFONLL(): - simFONLL_FNS = "FONLL-FFN0" - nonsimFONLL_FNS = "FONLL-B" - assert pineko.check.issimFONLL(simFONLL_FNS) is True - assert pineko.check.issimFONLL(nonsimFONLL_FNS) is False +def test_is_num_fonll(): + num_fonll_FNS = "FONLL-FFN0" + non_num_fonll_FNS = "FONLL-B" + assert pineko.check.is_num_fonll(num_fonll_FNS) is True + assert pineko.check.is_num_fonll(non_num_fonll_FNS) is False class Fake_grid: From 1b310eb9f06215365a6e31efc59ef13be22d7c37 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 3 Oct 2023 11:13:26 +0200 Subject: [PATCH 061/165] Minor changes --- src/pineko/check.py | 4 ++-- src/pineko/evolve.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index bad766a3..9d869a16 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -129,8 +129,8 @@ def is_dis(lumi): bool true if the fktable is a DIS fktable """ - for lists in lumi: - for el in lists: + for entry in lumi: + for el in entry: if (not islepton(el[0])) and (not islepton(el[1])): # If neither of the incoming particles is a lepton we are sure # it is not DIS diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index c7e6ebf3..438529e1 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -131,8 +131,8 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): ) # If we are producing num_fonll FKs we need to look to NfFF... if check.is_num_fonll(tcard["FNS"]): - nfff = tcard["NfFF"] - operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nfff)) for q2 in q2_grid] + nf = tcard["NfFF"] + operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nf)) for q2 in q2_grid] else: operators_card["mugrid"] = [ (float(np.sqrt(q2)), int(nf_default(q2, atlas))) for q2 in q2_grid From 315ed383eadb506a74b5b79f5ba5404a14c5ecc0 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 3 Oct 2023 11:17:50 +0200 Subject: [PATCH 062/165] Remove cast to int for nf_default --- src/pineko/evolve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 438529e1..02a49110 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -135,7 +135,7 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nf)) for q2 in q2_grid] else: operators_card["mugrid"] = [ - (float(np.sqrt(q2)), int(nf_default(q2, atlas))) for q2 in q2_grid + (float(np.sqrt(q2)), nf_default(q2, atlas)) for q2 in q2_grid ] if "integrability_version" in pineappl_grid.key_values(): x_grid = evol_info.x1 From 04f0ed76e17fa0948074410214e16bc37b532cd6 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Tue, 3 Oct 2023 14:57:01 +0100 Subject: [PATCH 063/165] remove unused value in MIXED_NFFF_LIST --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 7af318fe..56efbc81 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -189,7 +189,7 @@ def produce_combined_fk( "FONLL-FFNS", "FONLL-FFNS", ] -MIXED_NFFF_LIST = [3, 3, 4, 4, 4, 5, 5, 5] +MIXED_NFFF_LIST = [3, 3, 4, 4, 4, 5, 5] MIXED_PARTS_LIST = [ "full", "full", From e116783b5df5242da03554e8cfa859d89f551a52 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 4 Oct 2023 14:20:54 +0200 Subject: [PATCH 064/165] Minor changes --- src/pineko/cli/fonll.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 4d0b8120..f5056c12 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -20,22 +20,18 @@ class TheoryCardError(Exception): """Raised when asked for FONLL theory cards with an original tcard as input that is not asking for FONLL.""" - pass - class InconsistentInputsError(Exception): """Raised if the inputs are not consistent with FONLL.""" - pass - -def load_cfg(name, grid): +def cfgpath(name, grid): """Path of the fktable in 'name' called 'grid' if it exists, else None.""" path = configs.configs["paths"]["fktables"] / name / grid return path if path.exists() else None -def get_list_grids_name(yaml_file): +def grids_names(yaml_file): """Return the list of the grids in the yaml file.""" yaml_content = parser._load_yaml(yaml_file) # Turn the operands and the members into paths (and check all of them exist) @@ -110,9 +106,7 @@ def subcommand( raise InconsistentInputsError tcard["DAMPPOWER"] = None # Getting the paths to the grids - grids_name = get_list_grids_name( - configs.configs["paths"]["ymldb"] / f"{dataset}.yaml" - ) + grids_name = grids_names(configs.configs["paths"]["ymldb"] / f"{dataset}.yaml") for grid in grids_name: # Checking if it already exists new_fk_path = configs.configs["paths"]["fktables"] / str(theoryid) / grid @@ -124,7 +118,7 @@ def subcommand( return fonll.produce_combined_fk( *( - load_cfg(str(name), grid) + cfgpath(str(name), grid) for name in ( ffns3, ffn03, From 034db70cf2d59ff92325a2161e0c56edd592d4a2 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Wed, 4 Oct 2023 16:25:29 +0100 Subject: [PATCH 065/165] fix mixed FONLL by decoupling PTO and PTODIS --- src/pineko/fonll.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 56efbc81..134af881 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -252,6 +252,12 @@ def produce_fonll_recipe(fonll_fns, damp): "FONLLParts": part, } ) + # In a mixed FONLL scheme we only subract the resumt terms that are + # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we + # only subract up to NLL since there is no NNLL in FFNS4 + if is_mixed and fns == "FONLL-FFN0": + fonll_recipe[-1]["PTODIS"] = po + fonll_recipe[-1]["PTO"] = po - 1 return fonll_recipe From 25a13d515c47cf037f137a7f7a504d98c0b71a70 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 5 Oct 2023 12:40:42 +0200 Subject: [PATCH 066/165] Fix benchmarks --- benchmarks/bench_fonll.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 1852db35..6f07808b 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -24,5 +24,9 @@ def benchmark_produce_fonll_tcards( ): assert num_fonll_tcard["FNS"] == fns assert num_fonll_tcard["NfFF"] == nfff - assert num_fonll_tcard["PTO"] == po + assert ( + num_fonll_tcard["PTO"] == po - 1 + if is_mixed and nfff == "FONLL-FFN0" + else po + ) assert num_fonll_tcard["FONLLParts"] == part From fba7f9ffaa52e34d8b99bf81a292ff1abdfb889d Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 5 Oct 2023 12:49:51 +0200 Subject: [PATCH 067/165] Update src/pineko/fonll.py Co-authored-by: Alessandro Candido --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 134af881..bd4c155e 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -49,7 +49,7 @@ def fk_paths(self): @property def fks(self): """Returns the pineappl.Grid objects reading the paths provided by self.fk_paths.""" - return {fk: pineappl.grid.Grid.read(self.fk_paths[fk]) for fk in self.fk_paths} + return {fk: pineappl.grid.Grid.read(path) for fk, path in self.fk_paths.items()} @property def dataset_name(self): From 35371fd5e5cf56cf38aa51939edddc882b284230 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 5 Oct 2023 12:50:50 +0200 Subject: [PATCH 068/165] Update src/pineko/fonll.py Co-authored-by: Alessandro Candido --- src/pineko/fonll.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index bd4c155e..508872ea 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -54,8 +54,9 @@ def fks(self): @property def dataset_name(self): """Return the name of the dataset given by the fktables name, if all the fktables have the same name.""" - if len({self.fk_paths[p].name for p in self.fk_paths}) == 1: - return self.fk_paths[list(self.fk_paths)[0]].name + names = {self.fk_paths[p].name for p in self.fk_paths} + if len(names) == 1: + return names[0] else: raise ValueError("not all fktables have the same name") From 860e5f40cd2778eca0b1075e44305b7506415390 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 5 Oct 2023 12:51:20 +0200 Subject: [PATCH 069/165] Update src/pineko/fonll.py Co-authored-by: Alessandro Candido --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 508872ea..0778e19c 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -75,7 +75,7 @@ def theorycard_no_fns_pto(self): if len(theorycards) > 1 and not all( [theorycards[0] == card in theorycards[1:]] ): - raise ValueError("theorycards not the same") + raise ValueError("Theory cards are not compatible") return theorycards[0] @property From 43bcaa3ffe347cb389b0301f72e7b7c62f97c39f Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 5 Oct 2023 12:52:26 +0200 Subject: [PATCH 070/165] Update src/pineko/fonll.py Co-authored-by: Alessandro Candido --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 0778e19c..a1126fe4 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -81,10 +81,10 @@ def theorycard_no_fns_pto(self): @property def Q2grid(self): """Return the Q2grid of the fktables given by self.fks .""" - aa = json.loads(self.fks[list(self.fks)[0]].key_values()["runcard"])[ + obs = json.loads(self.fks[list(self.fks)[0]].key_values()["runcard"])[ "observables" ] - bb = list(aa.values())[ + bb = list(obs.values())[ 0 ] # there is only a single obseravble because it's a dis fktable cc = np.array([i["Q2"] for i in bb]) From b21ee3165b1b3f93296e53c86e9550acce14dfbb Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 5 Oct 2023 12:53:56 +0200 Subject: [PATCH 071/165] Update src/pineko/fonll.py Co-authored-by: Alessandro Candido --- src/pineko/fonll.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index a1126fe4..86539b98 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -87,8 +87,7 @@ def Q2grid(self): bb = list(obs.values())[ 0 ] # there is only a single obseravble because it's a dis fktable - cc = np.array([i["Q2"] for i in bb]) - return cc + return np.array([i["Q2"] for i in bb]) # Notice we rely on the order defined by the FONLLInfo class From 91c527fd654fbebd54c24bc030cc9128db37d53e Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 5 Oct 2023 12:55:27 +0200 Subject: [PATCH 072/165] Remove random names --- src/pineko/fonll.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 86539b98..fbdfb541 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -84,10 +84,10 @@ def Q2grid(self): obs = json.loads(self.fks[list(self.fks)[0]].key_values()["runcard"])[ "observables" ] - bb = list(obs.values())[ + kins = list(obs.values())[ 0 - ] # there is only a single obseravble because it's a dis fktable - return np.array([i["Q2"] for i in bb]) + ] # there is only a single observable because it's a dis fktable + return np.array([i["Q2"] for i in kins]) # Notice we rely on the order defined by the FONLLInfo class From c8b8f039400e6f666f87f38c6da8bd5d7cafc7a3 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 5 Oct 2023 12:56:24 +0200 Subject: [PATCH 073/165] Remove unnecessary else --- src/pineko/fonll.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index fbdfb541..7b71e6c8 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -57,8 +57,7 @@ def dataset_name(self): names = {self.fk_paths[p].name for p in self.fk_paths} if len(names) == 1: return names[0] - else: - raise ValueError("not all fktables have the same name") + raise ValueError("not all fktables have the same name") @property def theorycard_no_fns_pto(self): From 11d8f84ce6378824967c16879180bc08e1f173d1 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 5 Oct 2023 14:34:04 +0200 Subject: [PATCH 074/165] Remove print in the fonll cli --- src/pineko/cli/fonll.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index f5056c12..9461273e 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -148,8 +148,6 @@ def fonll_tcards(theoryid, cfg): path = configs.detect(cfg) base_configs = configs.load(path) configs.configs = configs.defaults(base_configs) - if cfg is not None: - print(f"Configurations loaded from '{path}'") tcard = theory_card.load(theoryid) tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: From 03d061be038d35500dda895c91fa7ff46e86a586 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Thu, 5 Oct 2023 14:01:36 +0100 Subject: [PATCH 075/165] tiny fix --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 7b71e6c8..ce8d2d89 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -56,7 +56,7 @@ def dataset_name(self): """Return the name of the dataset given by the fktables name, if all the fktables have the same name.""" names = {self.fk_paths[p].name for p in self.fk_paths} if len(names) == 1: - return names[0] + return names.pop() raise ValueError("not all fktables have the same name") @property From dada400d66300b7e3c464071af3243a4a4563c80 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Thu, 5 Oct 2023 17:39:32 +0100 Subject: [PATCH 076/165] update PTO to PTODIS for covoluting with eko --- src/pineko/theory.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 7cec6c09..2387eace 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -388,6 +388,11 @@ def fk(self, name, grid_path, tcard, pdf): grid.lumi(), ): max_as += 1 + + # to ensure that the higher order PTODIS terms are not neglegted + if "PTODIS" in tcard and "FONLL" in tcard["FNS"]: + tcard["PTO"] = tcard["PTODIS"] + # NB: This would not happen for num_fonll max_al = 0 # check for sv From 3f3c887e5c91a5728e0790ef6d32933cc7e5b0ba Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Thu, 5 Oct 2023 17:43:21 +0100 Subject: [PATCH 077/165] improve comment --- src/pineko/theory.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 2387eace..07410d30 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -389,7 +389,8 @@ def fk(self, name, grid_path, tcard, pdf): ): max_as += 1 - # to ensure that the higher order PTODIS terms are not neglegted + # Relevant for FONLL-B: ensures that the higher order PTODIS terms are + # not neglegted if "PTODIS" in tcard and "FONLL" in tcard["FNS"]: tcard["PTO"] = tcard["PTODIS"] From 785fc11567ba750f9ea3f0f7887d7e64d159f1e3 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Mon, 9 Oct 2023 11:53:16 +0100 Subject: [PATCH 078/165] fix check same tcards fonll --- src/pineko/fonll.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index ce8d2d89..c50c249f 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -67,12 +67,13 @@ def theorycard_no_fns_pto(self): for card in theorycards: del card["FNS"] del card["PTO"] + card.pop("PTODIS", None) del card["NfFF"] del card["ID"] del card["FONLLParts"] del card["Comments"] if len(theorycards) > 1 and not all( - [theorycards[0] == card in theorycards[1:]] + [theorycards[0] == card for card in theorycards[1:]] ): raise ValueError("Theory cards are not compatible") return theorycards[0] From 233037b58c213520c00045cc300b24a2bcffef00 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Mon, 9 Oct 2023 12:10:01 +0100 Subject: [PATCH 079/165] don't add PTODIS because DAMP!=0 --- src/pineko/fonll.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index c50c249f..8988d44e 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -212,7 +212,7 @@ def produce_combined_fk( PARTS_LIST = ["full" for _ in range(5)] -def produce_ptos(fns, is_mixed): +def produce_ptos(fns, is_mixed_or_damp): """Produce the list of PTOs needed for the requested fns.""" base_pto = FNS_BASE_PTO[fns] # mixed FONLL @@ -227,7 +227,7 @@ def produce_ptos(fns, is_mixed): base_pto + 1, ] # plain FONLL with damping - elif is_mixed: + elif is_mixed_or_damp: return [base_pto for _ in range(7)] # plain FONLL without damping else: @@ -237,12 +237,12 @@ def produce_ptos(fns, is_mixed): def produce_fonll_recipe(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" fonll_recipe = [] - is_mixed = fonll_fns in MIXED_ORDER_FNS or damp != 0 - fns_list = MIXED_FNS_LIST if is_mixed else FNS_LIST - nfff_list = MIXED_NFFF_LIST if is_mixed else NFFF_LIST - parts_list = MIXED_PARTS_LIST if is_mixed else PARTS_LIST + is_mixed_or_damp = fonll_fns in MIXED_ORDER_FNS or damp != 0 + fns_list = MIXED_FNS_LIST if is_mixed_or_damp else FNS_LIST + nfff_list = MIXED_NFFF_LIST if is_mixed_or_damp else NFFF_LIST + parts_list = MIXED_PARTS_LIST if is_mixed_or_damp else PARTS_LIST for fns, nfff, po, part in zip( - fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed), parts_list + fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed_or_damp), parts_list ): fonll_recipe.append( { @@ -252,10 +252,10 @@ def produce_fonll_recipe(fonll_fns, damp): "FONLLParts": part, } ) - # In a mixed FONLL scheme we only subract the resumt terms that are + # In a mixed FONLL scheme we only subract the resummed terms that are # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we # only subract up to NLL since there is no NNLL in FFNS4 - if is_mixed and fns == "FONLL-FFN0": + if fonll_fns in MIXED_ORDER_FNS and fns == "FONLL-FFN0": fonll_recipe[-1]["PTODIS"] = po fonll_recipe[-1]["PTO"] = po - 1 return fonll_recipe From 3745e92b501239ebd06719bb311daaa83344db42 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Mon, 9 Oct 2023 13:17:00 +0100 Subject: [PATCH 080/165] minor updates num fonll --- benchmarks/bench_evolve.py | 1 - src/pineko/check.py | 2 +- src/pineko/cli/fonll.py | 56 +++++++++++++++++++++++++------------- src/pineko/evolve.py | 4 +-- src/pineko/fonll.py | 4 +-- src/pineko/theory.py | 2 +- 6 files changed, 43 insertions(+), 26 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 34791666..05b8a582 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -6,7 +6,6 @@ import pineappl import pytest import yaml -from eko import couplings as sc import pineko import pineko.evolve diff --git a/src/pineko/check.py b/src/pineko/check.py index 9d869a16..56fb9522 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -159,7 +159,7 @@ def is_fonll_b(fns, lumi): def is_num_fonll(FNS): - """Check if the FNS is a num_fonll FNS.""" + """Check if the FNS is a nFONLL FNS.""" return FNS in ["FONLL-FFNS", "FONLL-FFN0"] diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 9461273e..c54ac543 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -79,31 +79,49 @@ def subcommand( print(f"Configurations loaded from '{path}'") # Checks - if (ffn04 is None and (ffns5til is not None or ffns5 is not None)) or ( - ffn04 is not None and (ffns5til is None and ffns5 is None) - ): - raise InconsistentInputsError( - "One between ffn04 and ffns5til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." - ) - if (ffn03 is None and (ffns4til is not None or ffns4 is not None)) or ( - ffn03 is not None and (ffns4til is None and ffns4 is None) - ): + + if not ffns3 or not ffn03: + raise InconsistentInputsError("ffns3 and/or ffn03 is not provided.") + + if any([ffns4, ffns4til, ffns4bar]): + if ffns4: + if any([ffns4til, ffns4bar]): + raise InconsistentInputsError( + "If ffns4 is provided no ffnstil or ffnsbar should be provided." + ) + else: + if ffns4til is None or ffns4bar is None: + raise InconsistentInputsError( + "if ffnstil is provided also ffnsbar should be provided, and vice versa." + ) + else: + raise InconsistentInputsError("ffns4 is not provided.") + + # Do we consider two masses, i.e. mc and mb + two_masses = False + if any([ffns5, ffns5til, ffns5bar]): + two_masses = True + if ffns5: + if any([ffns5til, ffns5bar]): + raise InconsistentInputsError( + "If ffns5 is provided no ffnstil or ffnsbar should be provided." + ) + else: + if ffns5til is None or ffns5bar is None: + raise InconsistentInputsError( + "if ffnstil is provided also ffnsbar should be provided, and vice versa." + ) + + if (ffn04 is None and two_masses) or (ffn04 is not None and not two_masses): raise InconsistentInputsError( - "One between ffn03 and ffns4til has been provided without the other. Since they are both needed to construct FONLL, this does not make sense." + "If two masses are to be considered, both ffn04 and the nf=5 coefficient should be provided" ) - # check that if we have ffns we dont have any bar or til - if ffns4 is not None or ffns5 is not None: - if not all([fk is None for fk in [ffns4til, ffns4bar, ffns5til, ffns5bar]]): - raise InconsistentInputsError( - "If ffns4 and ffns5 are provided, no ffnstil or ffnsbar should be provided." - ) - # Get theory info tcard = theory_card.load(theoryid) if not "DAMPPOWER" in tcard: if tcard["DAMP"] != 0: - raise InconsistentInputsError + raise InconsistentInputsError("If DAMP is set, set also DAMPPOWER") tcard["DAMPPOWER"] = None # Getting the paths to the grids grids_name = grids_names(configs.configs["paths"]["ymldb"] / f"{dataset}.yaml") @@ -151,5 +169,5 @@ def fonll_tcards(theoryid, cfg): tcard = theory_card.load(theoryid) tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: - raise TheoryCardError + raise TheoryCardError("The theorycard does not correspond to an FONLL scheme.") _ = fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 02a49110..7994aeb8 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -105,8 +105,8 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): """ # Add a +1 to the orders for the difference in convention between nnpdf and pineappl - is_fns = int(check.is_fonll_b(tcard["FNS"], pineappl_grid.lumi())) # NB: This would not happen for nFONLL + is_fns = int(check.is_fonll_b(tcard["FNS"], pineappl_grid.lumi())) max_as = 1 + tcard["PTO"] + is_fns max_al = 1 + tcard["QED"] # ... in order to create a mask ... @@ -129,7 +129,7 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): matching_scales=heavy_quarks.MatchingScales(masses * thresholds_ratios), origin=(tcard["Q0"] ** 2, tcard["nf0"]), ) - # If we are producing num_fonll FKs we need to look to NfFF... + # If we are producing nFONLL FKs we need to look to NfFF... if check.is_num_fonll(tcard["FNS"]): nf = tcard["NfFF"] operators_card["mugrid"] = [(float(np.sqrt(q2)), int(nf)) for q2 in q2_grid] diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 8988d44e..8e2679cc 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -120,6 +120,8 @@ def produce_combined_fk( if damp[0] == 0: # then there is no damping, not even Heaviside only combined_fk = fk_dict[list(fk_dict)[0]] + # pineappl does not support operating with two grids in memory: + # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 with tempfile.TemporaryDirectory() as tmpdirname: for fk in list(fk_dict)[1:]: tmpfile_path = Path(tmpdirname) / f"{fk}.pineappl.lz4" @@ -138,8 +140,6 @@ def produce_combined_fk( damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} - # pineappl does not support operating with two grids in memory: - # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 with tempfile.TemporaryDirectory() as tmpdirname: combined_fk = fk_dict[list(fk_dict)[0]] for fk in list(fk_dict)[1:]: diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 07410d30..0bfd6161 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -394,7 +394,7 @@ def fk(self, name, grid_path, tcard, pdf): if "PTODIS" in tcard and "FONLL" in tcard["FNS"]: tcard["PTO"] = tcard["PTODIS"] - # NB: This would not happen for num_fonll + # NB: This would not happen for nFONLL max_al = 0 # check for sv if not np.isclose(xir, 1.0): From f0ec07c886ef5fd5a1dc54905ad05a830b48ca54 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Tue, 10 Oct 2023 14:00:57 +0200 Subject: [PATCH 081/165] Update tests/test_fonll.py Co-authored-by: Roy Stegeman --- tests/test_fonll.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index 63d37eae..a364dfc9 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -1,7 +1,4 @@ import pathlib - -import pytest - import pineko From 8ad2d1f5020fdcb263ee1b4eeb27998111eb70ab Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Tue, 10 Oct 2023 14:01:47 +0200 Subject: [PATCH 082/165] Update tests/test_fonll.py Co-authored-by: Roy Stegeman --- tests/test_fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index a364dfc9..3fbe9a62 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -53,7 +53,7 @@ def test_FONLLInfo(): assert partialfonll_fake_info.fk_paths == { name: pathlib.Path(fk) for name, fk in zip( - name_list[:2] + name_list[3:4], full_list[:2] + full_list[3:4] + name_list[:2] + name_list[3], full_list[:2] + full_list[3] ) if fk is not None } From f22cc27dfe144211a695be0e89de168207639ad7 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 10 Oct 2023 14:10:02 +0200 Subject: [PATCH 083/165] Run pre-commit --- tests/test_fonll.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index 3fbe9a62..25bd78a6 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -1,4 +1,5 @@ import pathlib + import pineko @@ -52,8 +53,6 @@ def test_FONLLInfo(): } assert partialfonll_fake_info.fk_paths == { name: pathlib.Path(fk) - for name, fk in zip( - name_list[:2] + name_list[3], full_list[:2] + full_list[3] - ) + for name, fk in zip(name_list[:2] + name_list[3], full_list[:2] + full_list[3]) if fk is not None } From 53137443a26c5cf08d2e438fa67181827fb8dae0 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 10 Oct 2023 14:13:03 +0200 Subject: [PATCH 084/165] Correct test error --- tests/test_fonll.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index 25bd78a6..bb947ad1 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -53,6 +53,8 @@ def test_FONLLInfo(): } assert partialfonll_fake_info.fk_paths == { name: pathlib.Path(fk) - for name, fk in zip(name_list[:2] + name_list[3], full_list[:2] + full_list[3]) + for name, fk in zip( + name_list[:2] + name_list[3:4], full_list[:2] + full_list[3:4] + ) if fk is not None } From cc66bb4dc56bd0c3f6763856d6c26cbe84b68cce Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 10 Oct 2023 14:46:11 +0200 Subject: [PATCH 085/165] Print a warning for the fktables that do not exist during combination --- src/pineko/fonll.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 8e2679cc..b05dde42 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -2,6 +2,7 @@ import copy import json +import logging import tempfile from pathlib import Path @@ -12,6 +13,8 @@ from . import configs +logger = logging.getLogger(__name__) + class FONLLInfo: """Class containing all the information for FONLL predictions.""" @@ -44,7 +47,13 @@ def fk_paths(self): "ffns5til": self.ffns5til, "ffns5bar": self.ffns5bar, } - return {p: Path(paths[p]) for p in paths if paths[p] is not None} + actually_existing_paths = [p for p in paths if paths[p] is not None] + for p in paths: + if p not in actually_existing_paths: + logger.warning( + f"Warning! FK table for {p} does not exist and thus is being skipped." + ) + return {p: Path(paths[p]) for p in actually_existing_paths} @property def fks(self): From 4cfc8dd1555019b3574ad5f6cf2e75c83eebdc23 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Tue, 10 Oct 2023 15:29:20 +0200 Subject: [PATCH 086/165] pass cfg to configs.detect --- src/pineko/cli/fonll.py | 1 + src/pineko/fonll.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index c54ac543..01b98941 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -151,6 +151,7 @@ def subcommand( ), theoryid, damp=(tcard["DAMP"], tcard["DAMPPOWER"]), + cfg=cfg, ) if new_fk_path.exists(): rich.print(f"[green]Success:[/] Wrote FK table to {new_fk_path}") diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index b05dde42..4d709f0b 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -119,6 +119,7 @@ def produce_combined_fk( ffns5bar, theoryid, damp=(0, None), + cfg=None, ): """Combine the FONLL FKs to produce one single final FONLL FK.""" fonll_info = FONLLInfo( @@ -163,7 +164,7 @@ def produce_combined_fk( # update theorycard entries for the combined fktable by reading the yamldb of the original theory input_theorycard_path = ( - Path(configs.load(configs.detect())["paths"]["theory_cards"]) + Path(configs.load(configs.detect(cfg))["paths"]["theory_cards"]) / f"{theoryid}.yaml" ) with open(input_theorycard_path) as f: @@ -177,7 +178,7 @@ def produce_combined_fk( combined_fk.set_key_value("theory", str(theorycard)) # save final "fonll" fktable - fk_folder = Path(configs.load(configs.detect())["paths"]["fktables"]) / str( + fk_folder = Path(configs.load(configs.detect(cfg))["paths"]["fktables"]) / str( theoryid ) fk_folder.mkdir(exist_ok=True) From e364fff2127ff1033854402f1e58ad45112deb7d Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 10 Oct 2023 17:21:10 +0200 Subject: [PATCH 087/165] Update pineappl version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3bddf266..a8c4bbad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ packages = [{ include = "pineko", from = "src" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" eko = "^0.13.2" -pineappl = "^0.6.0" +pineappl = "^0.6.2" PyYAML = "^6.0" numpy = "^1.21.0" pandas = "^1.4.1" From eb735991760bf5ab32221ae8aa4174180f110eba Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 11 Oct 2023 14:45:29 +0200 Subject: [PATCH 088/165] Add explicit check for empty ekos --- src/pineko/theory.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 0bfd6161..6b7545cd 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -20,6 +20,10 @@ logger = logging.getLogger(__name__) +class EmptyEkoError(Exception): + """Raised if the loaded eko is empty.""" + + def check_scvar_evolve(grid, max_as, max_al, kind: check.Scale): """Check scale variations and central orders consistency.""" available, max_as_effective = check.contains_sv(grid, max_as, max_al, kind) @@ -404,6 +408,9 @@ def fk(self, name, grid_path, tcard, pdf): check_scvar_evolve(grid, max_as, max_al, check.Scale.FACT) # loading ekos to produce a tmp copy with eko.EKO.read(eko_filename) as operators: + # Skip the computation of the fktable if the eko is empty + if len(operators.mu2grid) == 0: + raise EmptyEkoError eko_tmp_path = operators.paths.root.parent / "eko-tmp.tar" operators.deepcopy(eko_tmp_path) with eko.EKO.edit(eko_tmp_path) as operators: From 1b32ca0ac3478b2a31e874bbfc5d6b967051162b Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 12 Oct 2023 10:40:51 +0200 Subject: [PATCH 089/165] Extend fonll_b check --- src/pineko/check.py | 11 +++++++---- src/pineko/evolve.py | 2 +- src/pineko/theory.py | 2 +- tests/test_check.py | 18 +++++++++++------- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index 56fb9522..2f6e6b4e 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -138,8 +138,8 @@ def is_dis(lumi): return True -def is_fonll_b(fns, lumi): - """Check if the fktable we are computing is a DIS FONLL-B fktable. +def is_fonll_mixed(fns, lumi): + """Check if the fktable we are computing is FONLL-B, FONLL-D or, in general, a mixed FONLL fktable. Parameters ---------- @@ -151,9 +151,12 @@ def is_fonll_b(fns, lumi): Returns ------- bool - true if the fktable is a FONLL-B DIS fktable + true if the fktable is a mixed FONLL DIS fktable """ - if is_dis(lumi) and fns == "FONLL-B": + if not is_dis(lumi): + return False + mixed_FONLL_fns = ["FONLL-B", "FONLL-D", "FONLL-F"] + if fns in mixed_FONLL_fns: return True return False diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 7994aeb8..69f9bbc4 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -106,7 +106,7 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): """ # Add a +1 to the orders for the difference in convention between nnpdf and pineappl # NB: This would not happen for nFONLL - is_fns = int(check.is_fonll_b(tcard["FNS"], pineappl_grid.lumi())) + is_fns = int(check.is_fonll_mixed(tcard["FNS"], pineappl_grid.lumi())) max_as = 1 + tcard["PTO"] + is_fns max_al = 1 + tcard["QED"] # ... in order to create a mask ... diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 6b7545cd..cc707eb0 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -387,7 +387,7 @@ def fk(self, name, grid_path, tcard, pdf): return max_as = 1 + int(tcard["PTO"]) # Check if we are computing FONLL-B fktable and eventually change max_as - if check.is_fonll_b( + if check.is_fonll_mixed( tcard["FNS"], grid.lumi(), ): diff --git a/tests/test_check.py b/tests/test_check.py index 352ed3a2..e616e825 100644 --- a/tests/test_check.py +++ b/tests/test_check.py @@ -27,18 +27,22 @@ def test_is_dis(): assert pineko.check.is_dis(nondis_fake_lumi) is False -def test_is_fonll_b(): +def test_is_fonll_mixed(): fns = "FONLL-B" lumi_first = [[(-12, 1, 2.0), (-13, 1, 5.0)]] lumi_second = [[(1, 11, 1.0), (3, 11, 5.0)]] - assert pineko.check.is_fonll_b(fns, lumi_first) is True - assert pineko.check.is_fonll_b(fns, lumi_second) is True + assert pineko.check.is_fonll_mixed(fns, lumi_first) is True + assert pineko.check.is_fonll_mixed(fns, lumi_second) is True lumi_crazy = [[(1, 1, 4.0), (2, 11, 3.0)]] - assert pineko.check.is_fonll_b(fns, lumi_crazy) is False + assert pineko.check.is_fonll_mixed(fns, lumi_crazy) is False fns = "FONLL-C" - assert pineko.check.is_fonll_b(fns, lumi_first) is False - assert pineko.check.is_fonll_b(fns, lumi_second) is False - assert pineko.check.is_fonll_b(fns, lumi_crazy) is False + assert pineko.check.is_fonll_mixed(fns, lumi_first) is False + assert pineko.check.is_fonll_mixed(fns, lumi_second) is False + assert pineko.check.is_fonll_mixed(fns, lumi_crazy) is False + fns = "FONLL-D" + assert pineko.check.is_fonll_mixed(fns, lumi_first) is True + assert pineko.check.is_fonll_mixed(fns, lumi_second) is True + assert pineko.check.is_fonll_mixed(fns, lumi_crazy) is False def test_is_num_fonll(): From 025a5787a1dff76ccf13e78bd936abc4228bc486 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 12 Oct 2023 11:05:39 +0200 Subject: [PATCH 090/165] improve empty eko error --- src/pineko/theory.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index cc707eb0..c69598fd 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -20,10 +20,6 @@ logger = logging.getLogger(__name__) -class EmptyEkoError(Exception): - """Raised if the loaded eko is empty.""" - - def check_scvar_evolve(grid, max_as, max_al, kind: check.Scale): """Check scale variations and central orders consistency.""" available, max_as_effective = check.contains_sv(grid, max_as, max_al, kind) @@ -409,9 +405,12 @@ def fk(self, name, grid_path, tcard, pdf): # loading ekos to produce a tmp copy with eko.EKO.read(eko_filename) as operators: # Skip the computation of the fktable if the eko is empty - if len(operators.mu2grid) == 0: - raise EmptyEkoError - eko_tmp_path = operators.paths.root.parent / "eko-tmp.tar" + if len(operators.mu2grid) == 0 and check.is_num_fonll(tcard["FNS"]): + rich.print(f"[green] Skipping empty eko for nFONLL.") + return + eko_tmp_path = ( + operators.paths.root.parent / f"eko-tmp-{np.random.rand()}.tar" + ) operators.deepcopy(eko_tmp_path) with eko.EKO.edit(eko_tmp_path) as operators: # Obtain the assumptions hash From 1a495a7ca8fa64b72f718ea3c8896a0a20f1af55 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Fri, 13 Oct 2023 11:07:42 +0200 Subject: [PATCH 091/165] Update check if the grid is empty --- src/pineko/theory.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index c69598fd..e213270b 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -396,6 +396,18 @@ def fk(self, name, grid_path, tcard, pdf): # NB: This would not happen for nFONLL max_al = 0 + + # check if the grid is empty + if check.is_num_fonll(tcard["FNS"]): + if ( + pineappl.grid.Order.create_mask( + grid.orders(), max_as, max_al, True + ).size + == 0 + ): + rich.print(f"[green] Skipping empty grid.") + return + # check for sv if not np.isclose(xir, 1.0): check_scvar_evolve(grid, max_as, max_al, check.Scale.REN) From 790c0a5f6cb5d8b41eb3e9158662c3a865605c3f Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 17 Oct 2023 14:45:20 +0200 Subject: [PATCH 092/165] Put the paths check in the constructor of FONLLInfo --- src/pineko/fonll.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 4d709f0b..783c0c82 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -23,20 +23,7 @@ def __init__( self, ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar ) -> None: """Initialize fonll info.""" - self.ffns3 = ffns3 - self.ffn03 = ffn03 - self.ffns4 = ffns4 - self.ffns4til = ffns4til - self.ffns4bar = ffns4bar - self.ffn04 = ffn04 - self.ffns5 = ffns5 - self.ffns5til = ffns5til - self.ffns5bar = ffns5bar - - @property - def fk_paths(self): - """Returns the list of the fk paths needed to produce FONLL predictions.""" - paths = { + self.paths = { "ffns3": self.ffns3, "ffn03": self.ffn03, "ffns4": self.ffns4, @@ -47,13 +34,17 @@ def fk_paths(self): "ffns5til": self.ffns5til, "ffns5bar": self.ffns5bar, } - actually_existing_paths = [p for p in paths if paths[p] is not None] - for p in paths: + actually_existing_paths = [p for p in self.paths if self.paths[p] is not None] + for p in self.paths: if p not in actually_existing_paths: logger.warning( f"Warning! FK table for {p} does not exist and thus is being skipped." ) - return {p: Path(paths[p]) for p in actually_existing_paths} + + @property + def fk_paths(self): + """Returns the list of the fk paths needed to produce FONLL predictions.""" + return {p: Path(self.paths[p]) for p in self.paths if self.paths is not None} @property def fks(self): From 3e688bc796a2be6d20ffb27e1c40397cb3807615 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 17 Oct 2023 14:48:06 +0200 Subject: [PATCH 093/165] Correct bug in FONLLInfo constructor --- src/pineko/fonll.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 783c0c82..54c190b3 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -24,15 +24,15 @@ def __init__( ) -> None: """Initialize fonll info.""" self.paths = { - "ffns3": self.ffns3, - "ffn03": self.ffn03, - "ffns4": self.ffns4, - "ffns4til": self.ffns4til, - "ffns4bar": self.ffns4bar, - "ffn04": self.ffn04, - "ffns5": self.ffns5, - "ffns5til": self.ffns5til, - "ffns5bar": self.ffns5bar, + "ffns3": ffns3, + "ffn03": ffn03, + "ffns4": ffns4, + "ffns4til": ffns4til, + "ffns4bar": ffns4bar, + "ffn04": ffn04, + "ffns5": ffns5, + "ffns5til": ffns5til, + "ffns5bar": ffns5bar, } actually_existing_paths = [p for p in self.paths if self.paths[p] is not None] for p in self.paths: From d7b610fa3e4fda01f1b0895cce5fa7ce834aca9e Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 17 Oct 2023 14:59:14 +0200 Subject: [PATCH 094/165] Correct other small typo --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 54c190b3..f751f057 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -44,7 +44,7 @@ def __init__( @property def fk_paths(self): """Returns the list of the fk paths needed to produce FONLL predictions.""" - return {p: Path(self.paths[p]) for p in self.paths if self.paths is not None} + return {p: Path(self.paths[p]) for p in self.paths if self.paths[p] is not None} @property def fks(self): From b8ca270151f97e68d7fd1d49398cfa3e573f690c Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 17 Oct 2023 15:05:49 +0200 Subject: [PATCH 095/165] Add grid name to tmp eko file --- src/pineko/theory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index e213270b..e80444bf 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -421,7 +421,7 @@ def fk(self, name, grid_path, tcard, pdf): rich.print(f"[green] Skipping empty eko for nFONLL.") return eko_tmp_path = ( - operators.paths.root.parent / f"eko-tmp-{np.random.rand()}.tar" + operators.paths.root.parent / f"eko-tmp-{name}-{np.random.rand()}.tar" ) operators.deepcopy(eko_tmp_path) with eko.EKO.edit(eko_tmp_path) as operators: From 04374a45ceb768198bb6bc026930a766705c154e Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:21:26 +0200 Subject: [PATCH 096/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index f751f057..3a989261 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -43,7 +43,7 @@ def __init__( @property def fk_paths(self): - """Returns the list of the fk paths needed to produce FONLL predictions.""" + """Returns the list of the FK table paths needed to produce FONLL predictions.""" return {p: Path(self.paths[p]) for p in self.paths if self.paths[p] is not None} @property From efd9a0b9380801967ed6324f15246f87391fd492 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:21:37 +0200 Subject: [PATCH 097/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 3a989261..66aae104 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -49,6 +49,7 @@ def fk_paths(self): @property def fks(self): """Returns the pineappl.Grid objects reading the paths provided by self.fk_paths.""" + # recall that FK tables are just a special grid return {fk: pineappl.grid.Grid.read(path) for fk, path in self.fk_paths.items()} @property From 9b7edb13fd3e6a532ddf9e323305aa32eba8f496 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:21:49 +0200 Subject: [PATCH 098/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 66aae104..72be7bfa 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -54,7 +54,7 @@ def fks(self): @property def dataset_name(self): - """Return the name of the dataset given by the fktables name, if all the fktables have the same name.""" + """Return the name of the underlaying dataset.""" names = {self.fk_paths[p].name for p in self.fk_paths} if len(names) == 1: return names.pop() From 73c50520b020b360bc3a7455333f533357564a98 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:22:05 +0200 Subject: [PATCH 099/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 72be7bfa..174a2249 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -58,7 +58,7 @@ def dataset_name(self): names = {self.fk_paths[p].name for p in self.fk_paths} if len(names) == 1: return names.pop() - raise ValueError("not all fktables have the same name") + raise ValueError("Not all FK tables share the same name") @property def theorycard_no_fns_pto(self): From 61b18026713dcee236b023e02a6d89530e7ac6fc Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:22:25 +0200 Subject: [PATCH 100/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 174a2249..c118bc34 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -62,7 +62,7 @@ def dataset_name(self): @property def theorycard_no_fns_pto(self): - """Return the common theory info between the different FONLL FKs.""" + """Return the common theory info between the different FONLL FK tables.""" theorycards = [json.loads(self.fks[p].key_values()["theory"]) for p in self.fks] # Only these should differ for card in theorycards: From 837ce2a11a370416c655d0bd77ee245c068bc300 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:22:39 +0200 Subject: [PATCH 101/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index c118bc34..55114f2d 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -81,7 +81,7 @@ def theorycard_no_fns_pto(self): @property def Q2grid(self): - """Return the Q2grid of the fktables given by self.fks .""" + """The Q2grid of the (DIS) FK tables.""" obs = json.loads(self.fks[list(self.fks)[0]].key_values()["runcard"])[ "observables" ] From f5cec44d5191f53e3da329c7b0832dad064f815e Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:23:03 +0200 Subject: [PATCH 102/165] Update src/pineko/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 55114f2d..9786eba5 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -113,7 +113,7 @@ def produce_combined_fk( damp=(0, None), cfg=None, ): - """Combine the FONLL FKs to produce one single final FONLL FK.""" + """Combine the FONLL FK tables into one single FK table.""" fonll_info = FONLLInfo( ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar ) From 115b820be47d4feb4ff50c1b7ec42840fef06f57 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Wed, 18 Oct 2023 14:25:04 +0200 Subject: [PATCH 103/165] Update src/pineko/check.py Co-authored-by: Giacomo Magni <39065935+giacomomagni@users.noreply.github.com> --- src/pineko/check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index 2f6e6b4e..2fe12fd4 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -155,7 +155,7 @@ def is_fonll_mixed(fns, lumi): """ if not is_dis(lumi): return False - mixed_FONLL_fns = ["FONLL-B", "FONLL-D", "FONLL-F"] + mixed_FONLL_fns = ["FONLL-B", "FONLL-D"] if fns in mixed_FONLL_fns: return True return False From ece695bf0bbc5259c863216420448d77f27906a1 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 14:30:29 +0200 Subject: [PATCH 104/165] Move the dampings construction in a separate function --- src/pineko/fonll.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 9786eba5..00a790df 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -99,6 +99,20 @@ def Q2grid(self): FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign +def produce_dampings(theorycard_constituent_fks, fonll_info, damp): + """Return the damping factors for each of the relevant masses.""" + mc = theorycard_constituent_fks["mc"] + mb = theorycard_constituent_fks["mb"] + q2grid = fonll_info.Q2grid + step_function_charm = mc**2 < q2grid + step_function_bottom = mb**2 < q2grid + damping_factor_charm = (1 - mc / q2grid) ** damp[1] + damping_factor_bottom = (1 - mb / q2grid) ** damp[1] + damping_factor_charm *= step_function_charm + damping_factor_bottom *= step_function_bottom + return {"mc": damping_factor_charm, "mb": damping_factor_bottom} + + def produce_combined_fk( ffns3, ffn03, @@ -132,16 +146,7 @@ def produce_combined_fk( fk_dict[fk].write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) else: - mc = theorycard_constituent_fks["mc"] - mb = theorycard_constituent_fks["mb"] - q2grid = fonll_info.Q2grid - step_function_charm = mc**2 < q2grid - step_function_bottom = mb**2 < q2grid - damping_factor_charm = (1 - mc / q2grid) ** damp[1] - damping_factor_bottom = (1 - mb / q2grid) ** damp[1] - damping_factor_charm *= step_function_charm - damping_factor_bottom *= step_function_bottom - dampings = {"mc": damping_factor_charm, "mb": damping_factor_bottom} + dampings = produce_dampings(theorycard_constituent_fks, fonll_info, damp) with tempfile.TemporaryDirectory() as tmpdirname: combined_fk = fk_dict[list(fk_dict)[0]] for fk in list(fk_dict)[1:]: From e406de69cc7f3ea813520c346498e0cd05fe786c Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 14:36:52 +0200 Subject: [PATCH 105/165] Move update of fk theorycard to separate function --- src/pineko/fonll.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 00a790df..711ce8a5 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -99,6 +99,19 @@ def Q2grid(self): FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign +def update_fk_theorycard(combined_fk, input_theorycard_path): + """Update theorycard entries for the combined fktable by reading the yamldb of the original theory.""" + with open(input_theorycard_path) as f: + final_theorycard = yaml.safe_load(f) + theorycard = json.loads(combined_fk.key_values()["theory"]) + theorycard["FNS"] = final_theorycard["FNS"] + theorycard["PTO"] = final_theorycard["PTO"] + theorycard["NfFF"] = final_theorycard["NfFF"] + theorycard["ID"] = final_theorycard["ID"] + # Update the theorycard with the entries set above + combined_fk.set_key_value("theory", str(theorycard)) + + def produce_dampings(theorycard_constituent_fks, fonll_info, damp): """Return the damping factors for each of the relevant masses.""" mc = theorycard_constituent_fks["mc"] @@ -158,22 +171,11 @@ def produce_combined_fk( fk_dict[fk].scale_by_bin(dampings[mass]) fk_dict[fk].write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) - - # update theorycard entries for the combined fktable by reading the yamldb of the original theory input_theorycard_path = ( Path(configs.load(configs.detect(cfg))["paths"]["theory_cards"]) / f"{theoryid}.yaml" ) - with open(input_theorycard_path) as f: - final_theorycard = yaml.safe_load(f) - theorycard = json.loads(combined_fk.key_values()["theory"]) - theorycard["FNS"] = final_theorycard["FNS"] - theorycard["PTO"] = final_theorycard["PTO"] - theorycard["NfFF"] = final_theorycard["NfFF"] - theorycard["ID"] = final_theorycard["ID"] - # Update the theorycard with the entries set above - combined_fk.set_key_value("theory", str(theorycard)) - + update_fk_theorycard(combined_fk, input_theorycard_path) # save final "fonll" fktable fk_folder = Path(configs.load(configs.detect(cfg))["paths"]["fktables"]) / str( theoryid From 5efe53768a865aa7b1569156a4d9e3bea8412033 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 14:39:39 +0200 Subject: [PATCH 106/165] Clarify the relation between damping and 5 subtheories --- src/pineko/fonll.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 711ce8a5..24b42174 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -239,6 +239,7 @@ def produce_ptos(fns, is_mixed_or_damp): elif is_mixed_or_damp: return [base_pto for _ in range(7)] # plain FONLL without damping + # In the case of not mixed and not damped FK tables, 5 sub FK tables are enough else: return [base_pto for _ in range(5)] From 34fd85d001059a9c3db7a25b7c095b5c5e40eae3 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 14:51:35 +0200 Subject: [PATCH 107/165] Move combination to separate function --- src/pineko/fonll.py | 47 ++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 24b42174..f3100ffb 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -126,6 +126,25 @@ def produce_dampings(theorycard_constituent_fks, fonll_info, damp): return {"mc": damping_factor_charm, "mb": damping_factor_bottom} +def combine(fk_dict, dampings=None): + """Rescale, eventually using dampings, and combine the sub FK tables.""" + # pineappl does not support operating with two grids in memory: + # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 + with tempfile.TemporaryDirectory() as tmpdirname: + combined_fk = fk_dict[list(fk_dict)[0]] + for fk in list(fk_dict)[1:]: + tmpfile_path = Path(tmpdirname) / f"{fk}.pineappl.lz4" + sign = -1 if fk in FK_WITH_MINUS else 1 + fk_dict[fk].scale(sign) + if dampings is not None: + for mass in FK_TO_DAMP: + if fk in FK_TO_DAMP[mass]: + fk_dict[fk].scale_by_bin(dampings[mass]) + fk_dict[fk].write_lz4(tmpfile_path) + combined_fk.merge_from_file(tmpfile_path) + return combined_fk + + def produce_combined_fk( ffns3, ffn03, @@ -148,29 +167,10 @@ def produce_combined_fk( fk_dict = fonll_info.fks if damp[0] == 0: # then there is no damping, not even Heaviside only - combined_fk = fk_dict[list(fk_dict)[0]] - # pineappl does not support operating with two grids in memory: - # https://github.com/NNPDF/pineappl/blob/8a672bef6d91b07a4edfdefbe4e30e4b1dd1f976/pineappl_py/src/grid.rs#L614-L617 - with tempfile.TemporaryDirectory() as tmpdirname: - for fk in list(fk_dict)[1:]: - tmpfile_path = Path(tmpdirname) / f"{fk}.pineappl.lz4" - sign = -1 if fk in FK_WITH_MINUS else 1 - fk_dict[fk].scale(sign) - fk_dict[fk].write_lz4(tmpfile_path) - combined_fk.merge_from_file(tmpfile_path) + combined_fk = combine(fk_dict) else: dampings = produce_dampings(theorycard_constituent_fks, fonll_info, damp) - with tempfile.TemporaryDirectory() as tmpdirname: - combined_fk = fk_dict[list(fk_dict)[0]] - for fk in list(fk_dict)[1:]: - tmpfile_path = Path(tmpdirname) / f"{fk}.pineappl.lz4" - sign = -1 if fk in FK_WITH_MINUS else 1 - fk_dict[fk].scale(sign) - for mass in FK_TO_DAMP: - if fk in FK_TO_DAMP[mass]: - fk_dict[fk].scale_by_bin(dampings[mass]) - fk_dict[fk].write_lz4(tmpfile_path) - combined_fk.merge_from_file(tmpfile_path) + combined_fk = combine(fk_dict, dampings=dampings) input_theorycard_path = ( Path(configs.load(configs.detect(cfg))["paths"]["theory_cards"]) / f"{theoryid}.yaml" @@ -272,7 +272,10 @@ def produce_fonll_recipe(fonll_fns, damp): def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): - """Produce the seven fonll tcards from an original tcard and dump them in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'.""" + """Produce the seven fonll tcards from an original tcard. + + The produced tcards are dumped in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. + """ fonll_recipe = produce_fonll_recipe(tcard["FNS"], tcard["DAMP"]) n_theory = len(fonll_recipe) theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] From babe6ae5c91a5ddbb5c4534a1afa9097fb77c3de Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 15:04:25 +0200 Subject: [PATCH 108/165] Use bin_left to get the q2grid --- src/pineko/fonll.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index f3100ffb..bcd3ec28 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -82,13 +82,7 @@ def theorycard_no_fns_pto(self): @property def Q2grid(self): """The Q2grid of the (DIS) FK tables.""" - obs = json.loads(self.fks[list(self.fks)[0]].key_values()["runcard"])[ - "observables" - ] - kins = list(obs.values())[ - 0 - ] # there is only a single observable because it's a dis fktable - return np.array([i["Q2"] for i in kins]) + return self.fks[list(self.fks)[0]].bin_left(0) # Notice we rely on the order defined by the FONLLInfo class From 5a3252e9df3d2a133c5adcffeb8fc57e4d2c0d74 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 15:20:03 +0200 Subject: [PATCH 109/165] Use CONFIG for FNS, NFFF and parts --- benchmarks/bench_fonll.py | 12 +++++-- src/pineko/fonll.py | 68 +++++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 6f07808b..3a7f4613 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -17,10 +17,16 @@ def benchmark_produce_fonll_tcards( theorycards.append(yaml.safe_load(f)) for num_fonll_tcard, fns, nfff, po, part in zip( theorycards, - pineko.fonll.MIXED_FNS_LIST if is_mixed else pineko.fonll.FNS_LIST, - pineko.fonll.MIXED_NFFF_LIST if is_mixed else pineko.fonll.NFFF_LIST, + pineko.fonll.MIXED_FNS_CONFIG.transpose()[0] + if is_mixed + else pineko.fonll.FNS_CONFIG.transpose()[0], + pineko.fonll.MIXED_FNS_CONFIG.transpose()[1] + if is_mixed + else pineko.fonll.FNS_CONFIG.transpose()[1], pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), - pineko.fonll.MIXED_PARTS_LIST if is_mixed else pineko.fonll.PARTS_LIST, + pineko.fonll.MIXED_FNS_CONFIG.transpose()[2] + if is_mixed + else pineko.fonll.FNS_CONFIG.transpose()[2], ): assert num_fonll_tcard["FNS"] == fns assert num_fonll_tcard["NfFF"] == nfff diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index bcd3ec28..3359668a 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -183,36 +183,30 @@ def produce_combined_fk( MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] # Mixed FONLL schemes -MIXED_FNS_LIST = [ - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFNS", -] -MIXED_NFFF_LIST = [3, 3, 4, 4, 4, 5, 5] -MIXED_PARTS_LIST = [ - "full", - "full", - "massless", - "massive", - "full", - "massless", - "massive", -] + +MIXED_FNS_CONFIG = np.array( + [ + ("FONLL-FFNS", 3, "full"), + ("FONLL-FFN0", 3, "full"), + ("FONLL-FFNS", 4, "massless"), + ("FONLL-FFNS", 4, "massive"), + ("FONLL-FFN0", 4, "full"), + ("FONLL-FFNS", 5, "massless"), + ("FONLL-FFNS", 5, "massive"), + ] +) # plain FONLL schemes -FNS_LIST = [ - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", -] -NFFF_LIST = [3, 3, 4, 4, 5] -PARTS_LIST = ["full" for _ in range(5)] + +FNS_CONFIG = np.array( + [ + ("FONLL-FFNS", 3, "full"), + ("FONLL-FFN0", 3, "full"), + ("FONLL-FFNS", 4, "full"), + ("FONLL-FFN0", 4, "full"), + ("FONLL-FFNS", 5, "full"), + ] +) def produce_ptos(fns, is_mixed_or_damp): @@ -242,9 +236,21 @@ def produce_fonll_recipe(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" fonll_recipe = [] is_mixed_or_damp = fonll_fns in MIXED_ORDER_FNS or damp != 0 - fns_list = MIXED_FNS_LIST if is_mixed_or_damp else FNS_LIST - nfff_list = MIXED_NFFF_LIST if is_mixed_or_damp else NFFF_LIST - parts_list = MIXED_PARTS_LIST if is_mixed_or_damp else PARTS_LIST + fns_list = ( + MIXED_FNS_CONFIG.transpose()[0] + if is_mixed_or_damp + else FNS_CONFIG.transpose()[0] + ) + nfff_list = ( + MIXED_FNS_CONFIG.transpose()[1] + if is_mixed_or_damp + else FNS_CONFIG.transpose()[1] + ) + parts_list = ( + MIXED_FNS_CONFIG.transpose()[2] + if is_mixed_or_damp + else FNS_CONFIG.transpose()[2] + ) for fns, nfff, po, part in zip( fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed_or_damp), parts_list ): From 8c9fceff078b7bd2be434175a3cbb070c89c7d09 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 15:31:26 +0200 Subject: [PATCH 110/165] Cast explicitly theory cards entries --- src/pineko/fonll.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 3359668a..fc5105b4 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -256,10 +256,10 @@ def produce_fonll_recipe(fonll_fns, damp): ): fonll_recipe.append( { - "FNS": fns, - "NfFF": nfff, - "PTO": po, - "FONLLParts": part, + "FNS": str(fns), + "NfFF": str(nfff), + "PTO": int(po), + "FONLLParts": str(part), } ) # In a mixed FONLL scheme we only subract the resummed terms that are From bb0d3f4c5224230b676fba90cb66aef9ef7e7e16 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 15:41:35 +0200 Subject: [PATCH 111/165] Correct missing test --- benchmarks/bench_evolve.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 05b8a582..089cc110 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -39,7 +39,9 @@ def benchmark_write_operator_card_from_file_num_fonll( # Check if the opcards are ok for opcard_path, nfff in zip( targets_path_list, - pineko.fonll.MIXED_NFFF_LIST if is_mixed else pineko.fonll.NFFF_LIST, + pineko.fonll.MIXED_FNS_CONFIG.transpose()[1] + if is_mixed + else pineko.fonll.FNS_CONFIG.transpose()[1], ): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) From bc7800238693498afb41963025a5550e1c21485e Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Wed, 18 Oct 2023 15:06:10 +0100 Subject: [PATCH 112/165] save NfFF as int instead of str --- src/pineko/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index fc5105b4..4e9fc603 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -257,7 +257,7 @@ def produce_fonll_recipe(fonll_fns, damp): fonll_recipe.append( { "FNS": str(fns), - "NfFF": str(nfff), + "NfFF": int(nfff), "PTO": int(po), "FONLLParts": str(part), } From bcfe6efcbe94db214dfa973a3065d697867170e0 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 16:07:16 +0200 Subject: [PATCH 113/165] Cast again --- benchmarks/bench_evolve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 089cc110..281b92fd 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -46,7 +46,7 @@ def benchmark_write_operator_card_from_file_num_fonll( with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) for entry in ocard["mugrid"]: - assert entry[1] == nfff + assert entry[1] == int(nfff) def benchmark_write_operator_card_from_file(tmp_path, test_files, test_configs): From 5ecc63570ac09681f811b98f8f0160b5df3e0130 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Wed, 18 Oct 2023 16:46:48 +0200 Subject: [PATCH 114/165] Correction to tests --- benchmarks/bench_evolve.py | 4 ++-- benchmarks/bench_fonll.py | 19 +++++++-------- src/pineko/fonll.py | 49 ++++++++++++++++++-------------------- 3 files changed, 34 insertions(+), 38 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 281b92fd..05a8455a 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -39,9 +39,9 @@ def benchmark_write_operator_card_from_file_num_fonll( # Check if the opcards are ok for opcard_path, nfff in zip( targets_path_list, - pineko.fonll.MIXED_FNS_CONFIG.transpose()[1] + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] if is_mixed - else pineko.fonll.FNS_CONFIG.transpose()[1], + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], ): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 3a7f4613..d9a90221 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -1,3 +1,4 @@ +import numpy as np import pytest import yaml @@ -17,22 +18,20 @@ def benchmark_produce_fonll_tcards( theorycards.append(yaml.safe_load(f)) for num_fonll_tcard, fns, nfff, po, part in zip( theorycards, - pineko.fonll.MIXED_FNS_CONFIG.transpose()[0] + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[0] if is_mixed - else pineko.fonll.FNS_CONFIG.transpose()[0], - pineko.fonll.MIXED_FNS_CONFIG.transpose()[1] + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[0], + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] if is_mixed - else pineko.fonll.FNS_CONFIG.transpose()[1], + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), - pineko.fonll.MIXED_FNS_CONFIG.transpose()[2] + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[2] if is_mixed - else pineko.fonll.FNS_CONFIG.transpose()[2], + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[2], ): assert num_fonll_tcard["FNS"] == fns - assert num_fonll_tcard["NfFF"] == nfff + assert num_fonll_tcard["NfFF"] == int(nfff) assert ( - num_fonll_tcard["PTO"] == po - 1 - if is_mixed and nfff == "FONLL-FFN0" - else po + num_fonll_tcard["PTO"] == po - 1 if is_mixed and fns == "FONLL-FFN0" else po ) assert num_fonll_tcard["FONLLParts"] == part diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 4e9fc603..9b22c583 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -184,29 +184,26 @@ def produce_combined_fk( # Mixed FONLL schemes -MIXED_FNS_CONFIG = np.array( - [ - ("FONLL-FFNS", 3, "full"), - ("FONLL-FFN0", 3, "full"), - ("FONLL-FFNS", 4, "massless"), - ("FONLL-FFNS", 4, "massive"), - ("FONLL-FFN0", 4, "full"), - ("FONLL-FFNS", 5, "massless"), - ("FONLL-FFNS", 5, "massive"), - ] -) +MIXED_FNS_CONFIG = [ + ("FONLL-FFNS", 3, "full"), + ("FONLL-FFN0", 3, "full"), + ("FONLL-FFNS", 4, "massless"), + ("FONLL-FFNS", 4, "massive"), + ("FONLL-FFN0", 4, "full"), + ("FONLL-FFNS", 5, "massless"), + ("FONLL-FFNS", 5, "massive"), +] + # plain FONLL schemes -FNS_CONFIG = np.array( - [ - ("FONLL-FFNS", 3, "full"), - ("FONLL-FFN0", 3, "full"), - ("FONLL-FFNS", 4, "full"), - ("FONLL-FFN0", 4, "full"), - ("FONLL-FFNS", 5, "full"), - ] -) +FNS_CONFIG = [ + ("FONLL-FFNS", 3, "full"), + ("FONLL-FFN0", 3, "full"), + ("FONLL-FFNS", 4, "full"), + ("FONLL-FFN0", 4, "full"), + ("FONLL-FFNS", 5, "full"), +] def produce_ptos(fns, is_mixed_or_damp): @@ -237,19 +234,19 @@ def produce_fonll_recipe(fonll_fns, damp): fonll_recipe = [] is_mixed_or_damp = fonll_fns in MIXED_ORDER_FNS or damp != 0 fns_list = ( - MIXED_FNS_CONFIG.transpose()[0] + np.array(MIXED_FNS_CONFIG).transpose().tolist()[0] if is_mixed_or_damp - else FNS_CONFIG.transpose()[0] + else np.array(FNS_CONFIG).transpose().tolist()[0] ) nfff_list = ( - MIXED_FNS_CONFIG.transpose()[1] + np.array(MIXED_FNS_CONFIG).transpose().tolist()[1] if is_mixed_or_damp - else FNS_CONFIG.transpose()[1] + else np.array(FNS_CONFIG).transpose().tolist()[1] ) parts_list = ( - MIXED_FNS_CONFIG.transpose()[2] + np.array(MIXED_FNS_CONFIG).transpose().tolist()[2] if is_mixed_or_damp - else FNS_CONFIG.transpose()[2] + else np.array(FNS_CONFIG).transpose().tolist()[2] ) for fns, nfff, po, part in zip( fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed_or_damp), parts_list From eb6d734b0c9a93ec602f60833c24aaf9ca66f754 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Wed, 18 Oct 2023 18:12:48 +0100 Subject: [PATCH 115/165] fix: move PTO=PTODIS for fonll-b before extracting PTO value --- src/pineko/theory.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 6a03bbf9..d7ed3cfb 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -364,6 +364,14 @@ def fk(self, name, grid_path, tcard, pdf): do_log = self.activate_logging( paths["logs"]["fk"], f"{self.theory_id}-{name}-{pdf}.log" ) + + # Relevant for FONLL-B and FONLL-D: For FFN0 terms, PTO is lower than + # PTODIS, thus using PTO instead of PTODIS to establish the perturbative + # order would result in the PTODIS terms that correspond to orders + # beyond PTO to be neglected + if "PTODIS" in tcard and "FONLL" in tcard["FNS"]: + tcard["PTO"] = tcard["PTODIS"] + # check if grid contains SV if theory is requesting them (in particular # if theory is requesting scheme A or C) sv_method = evolve.sv_scheme(tcard) @@ -388,11 +396,6 @@ def fk(self, name, grid_path, tcard, pdf): ): max_as += 1 - # Relevant for FONLL-B: ensures that the higher order PTODIS terms are - # not neglegted - if "PTODIS" in tcard and "FONLL" in tcard["FNS"]: - tcard["PTO"] = tcard["PTODIS"] - # NB: This would not happen for nFONLL max_al = 0 From 7e385a36e70932544de4a75b8fd753f2169f7f3b Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 19 Oct 2023 12:52:50 +0200 Subject: [PATCH 116/165] Rework nFONLL config --- benchmarks/bench_evolve.py | 14 +-- benchmarks/bench_fonll.py | 27 ++---- src/pineko/fonll.py | 188 ++++++++++++++++++++++--------------- 3 files changed, 128 insertions(+), 101 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 05a8455a..1df9bd18 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -12,11 +12,12 @@ import pineko.theory_card -@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) +@pytest.mark.parametrize("theoryid", [400, 208]) def benchmark_write_operator_card_from_file_num_fonll( - tmp_path, test_files, test_configs, theoryid, is_mixed + tmp_path, test_files, test_configs, theoryid ): tcard = pineko.theory_card.load(theoryid) + fonll_config = pineko.fonll.FonllSchemeConfig(tcard["FNS"], tcard["DAMP"]) tcards_path_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) pine_path = ( test_files @@ -26,7 +27,7 @@ def benchmark_write_operator_card_from_file_num_fonll( / "HERA_NC_225GEV_EP_SIGMARED.pineappl.lz4" ) default_path = test_files / "data" / "operator_cards" / "400" / "_template.yaml" - num_opcard = 7 if is_mixed else 5 + num_opcard = 7 if fonll_config.is_mixed() else 5 targets_path_list = [ tmp_path / f"test_opcard_{num}.yaml" for num in range(num_opcard) ] @@ -37,12 +38,7 @@ def benchmark_write_operator_card_from_file_num_fonll( pine_path, default_path, target_path, tcard ) # Check if the opcards are ok - for opcard_path, nfff in zip( - targets_path_list, - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], - ): + for opcard_path, nfff in zip(targets_path_list, fonll_config.subfks_nfff()): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) for entry in ocard["mugrid"]: diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index d9a90221..58509271 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -5,11 +5,10 @@ import pineko -@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) -def benchmark_produce_fonll_tcards( - tmp_path, test_files, test_configs, theoryid, is_mixed -): +@pytest.mark.parametrize("theoryid", [400, 208]) +def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid): tcard = pineko.theory_card.load(theoryid) + fonll_config = pineko.fonll.FonllSchemeConfig(tcard["FNS"], tcard["DAMP"]) tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) # Check they are correct theorycards = [] @@ -18,20 +17,14 @@ def benchmark_produce_fonll_tcards( theorycards.append(yaml.safe_load(f)) for num_fonll_tcard, fns, nfff, po, part in zip( theorycards, - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[0] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[0], - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], - pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[2] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[2], + fonll_config.subfks_fns(), + fonll_config.subfks_nfff(), + fonll_config.subfks_ptos(), + fonll_config.subfks_parts(), ): assert num_fonll_tcard["FNS"] == fns assert num_fonll_tcard["NfFF"] == int(nfff) - assert ( - num_fonll_tcard["PTO"] == po - 1 if is_mixed and fns == "FONLL-FFN0" else po - ) + assert num_fonll_tcard["PTO"] == po + if fonll_config.is_mixed() and fns == "FONLL-FFN0": + assert num_fonll_tcard["PTODIS"] == po + 1 assert num_fonll_tcard["FONLLParts"] == part diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 9b22c583..63c46143 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -4,6 +4,7 @@ import json import logging import tempfile +from dataclasses import dataclass from pathlib import Path import numpy as np @@ -15,6 +16,116 @@ logger = logging.getLogger(__name__) +FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} +MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] +# Notice we rely on the order defined by the FONLLInfo class +FK_TO_DAMP = { + "mc": ["ffn03", "ffns4til", "ffn04", "ffns5til"], + "mb": ["ffn04", "ffns5til"], +} +FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign + + +@dataclass +class FonllSchemeConfig: + """Class to group FONLL scheme configs.""" + + fonll_fns: str + is_damp: bool + + def is_mixed(self) -> bool: + """Whether the fonll fns is of mixed type.""" + return self.fonll_fns in MIXED_ORDER_FNS + + def base_pto(self) -> int: + """Return the base perturbative order of the fonll fns.""" + return FNS_BASE_PTO[self.fonll_fns] + + def subfks_fns(self) -> list[str]: + """Return the fns of the sub FK table components of the fonll fns.""" + if self.is_mixed() or self.is_damp: + return [ + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFNS", + ] + else: + return [ + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + "FONLL-FFN0", + "FONLL-FFNS", + ] + + def subfks_nfff(self) -> list[int]: + """Return the nfff of the sub FK table components of the fonll fns.""" + if self.is_mixed() or self.is_damp: + return [3, 3, 4, 4, 4, 5, 5] + else: + return [3, 3, 4, 4, 5] + + def subfks_parts(self) -> list[str]: + """Return the parts of the sub FK table components of the fonll fns that need to be computed.""" + if self.is_mixed() or self.is_damp: + return [ + "full", + "full", + "massless", + "massive", + "full", + "massless", + "massive", + ] + else: + return ["full" for _ in range(5)] + + def subfks_ptos(self) -> list[int]: + """Return the ptos of the sub FK table components of the fonll fns.""" + base_pto = self.base_pto() + if self.is_mixed(): + return [ + base_pto + 1, + base_pto, + base_pto, + base_pto + 1, + base_pto, + base_pto, + base_pto + 1, + ] + elif self.is_damp: + return [base_pto for _ in range(7)] + else: + return [base_pto for _ in range(5)] + + def produce_fonll_recipe(self) -> dict: + """Produce the different fonll recipes according to which FONLL is asked for.""" + fonll_recipe = [] + for fns, nfff, po, part in zip( + self.subfks_fns(), + self.subfks_nfff(), + self.subfks_ptos(), + self.subfks_parts(), + ): + fonll_recipe.append( + { + "FNS": fns, + "NfFF": nfff, + "PTO": po, + "FONLLParts": part, + } + ) + # In a mixed FONLL scheme we only subract the resummed terms that are + # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we + # only subract up to NLL since there is no NNLL in FFNS4 + if self.is_mixed() and fns == "FONLL-FFN0": + fonll_recipe[-1]["PTODIS"] = po + 1 + return fonll_recipe + class FONLLInfo: """Class containing all the information for FONLL predictions.""" @@ -85,14 +196,6 @@ def Q2grid(self): return self.fks[list(self.fks)[0]].bin_left(0) -# Notice we rely on the order defined by the FONLLInfo class -FK_TO_DAMP = { - "mc": ["ffn03", "ffns4til", "ffn04", "ffns5til"], - "mb": ["ffn04", "ffns5til"], -} -FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign - - def update_fk_theorycard(combined_fk, input_theorycard_path): """Update theorycard entries for the combined fktable by reading the yamldb of the original theory.""" with open(input_theorycard_path) as f: @@ -179,33 +282,6 @@ def produce_combined_fk( combined_fk.write_lz4(output_path_fk) -FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} -MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] - -# Mixed FONLL schemes - -MIXED_FNS_CONFIG = [ - ("FONLL-FFNS", 3, "full"), - ("FONLL-FFN0", 3, "full"), - ("FONLL-FFNS", 4, "massless"), - ("FONLL-FFNS", 4, "massive"), - ("FONLL-FFN0", 4, "full"), - ("FONLL-FFNS", 5, "massless"), - ("FONLL-FFNS", 5, "massive"), -] - - -# plain FONLL schemes - -FNS_CONFIG = [ - ("FONLL-FFNS", 3, "full"), - ("FONLL-FFN0", 3, "full"), - ("FONLL-FFNS", 4, "full"), - ("FONLL-FFN0", 4, "full"), - ("FONLL-FFNS", 5, "full"), -] - - def produce_ptos(fns, is_mixed_or_damp): """Produce the list of PTOs needed for the requested fns.""" base_pto = FNS_BASE_PTO[fns] @@ -229,51 +305,13 @@ def produce_ptos(fns, is_mixed_or_damp): return [base_pto for _ in range(5)] -def produce_fonll_recipe(fonll_fns, damp): - """Produce the different theory cards according to which FONLL is asked for.""" - fonll_recipe = [] - is_mixed_or_damp = fonll_fns in MIXED_ORDER_FNS or damp != 0 - fns_list = ( - np.array(MIXED_FNS_CONFIG).transpose().tolist()[0] - if is_mixed_or_damp - else np.array(FNS_CONFIG).transpose().tolist()[0] - ) - nfff_list = ( - np.array(MIXED_FNS_CONFIG).transpose().tolist()[1] - if is_mixed_or_damp - else np.array(FNS_CONFIG).transpose().tolist()[1] - ) - parts_list = ( - np.array(MIXED_FNS_CONFIG).transpose().tolist()[2] - if is_mixed_or_damp - else np.array(FNS_CONFIG).transpose().tolist()[2] - ) - for fns, nfff, po, part in zip( - fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed_or_damp), parts_list - ): - fonll_recipe.append( - { - "FNS": str(fns), - "NfFF": int(nfff), - "PTO": int(po), - "FONLLParts": str(part), - } - ) - # In a mixed FONLL scheme we only subract the resummed terms that are - # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we - # only subract up to NLL since there is no NNLL in FFNS4 - if fonll_fns in MIXED_ORDER_FNS and fns == "FONLL-FFN0": - fonll_recipe[-1]["PTODIS"] = po - fonll_recipe[-1]["PTO"] = po - 1 - return fonll_recipe - - def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): """Produce the seven fonll tcards from an original tcard. The produced tcards are dumped in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. """ - fonll_recipe = produce_fonll_recipe(tcard["FNS"], tcard["DAMP"]) + fonll_config = FonllSchemeConfig(tcard["FNS"], tcard["DAMP"]) + fonll_recipe = fonll_config.produce_fonll_recipe() n_theory = len(fonll_recipe) theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] paths_list = [] From 6d38acbed3e3b838a25cf8d8c0a4563b8f7183b9 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Thu, 19 Oct 2023 12:59:59 +0200 Subject: [PATCH 117/165] Correct error for pylint --- src/pineko/fonll.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 63c46143..0a987702 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -41,7 +41,7 @@ def base_pto(self) -> int: """Return the base perturbative order of the fonll fns.""" return FNS_BASE_PTO[self.fonll_fns] - def subfks_fns(self) -> list[str]: + def subfks_fns(self) -> list: """Return the fns of the sub FK table components of the fonll fns.""" if self.is_mixed() or self.is_damp: return [ @@ -62,14 +62,14 @@ def subfks_fns(self) -> list[str]: "FONLL-FFNS", ] - def subfks_nfff(self) -> list[int]: + def subfks_nfff(self) -> list: """Return the nfff of the sub FK table components of the fonll fns.""" if self.is_mixed() or self.is_damp: return [3, 3, 4, 4, 4, 5, 5] else: return [3, 3, 4, 4, 5] - def subfks_parts(self) -> list[str]: + def subfks_parts(self) -> list: """Return the parts of the sub FK table components of the fonll fns that need to be computed.""" if self.is_mixed() or self.is_damp: return [ @@ -84,7 +84,7 @@ def subfks_parts(self) -> list[str]: else: return ["full" for _ in range(5)] - def subfks_ptos(self) -> list[int]: + def subfks_ptos(self) -> list: """Return the ptos of the sub FK table components of the fonll fns.""" base_pto = self.base_pto() if self.is_mixed(): From 2e76e579a2d8dca33dcd7165680f3c8b99b8686e Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 19 Oct 2023 15:25:10 +0300 Subject: [PATCH 118/165] Revert "Correct error for pylint" This reverts commit 6d38acbed3e3b838a25cf8d8c0a4563b8f7183b9. --- src/pineko/fonll.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 0a987702..63c46143 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -41,7 +41,7 @@ def base_pto(self) -> int: """Return the base perturbative order of the fonll fns.""" return FNS_BASE_PTO[self.fonll_fns] - def subfks_fns(self) -> list: + def subfks_fns(self) -> list[str]: """Return the fns of the sub FK table components of the fonll fns.""" if self.is_mixed() or self.is_damp: return [ @@ -62,14 +62,14 @@ def subfks_fns(self) -> list: "FONLL-FFNS", ] - def subfks_nfff(self) -> list: + def subfks_nfff(self) -> list[int]: """Return the nfff of the sub FK table components of the fonll fns.""" if self.is_mixed() or self.is_damp: return [3, 3, 4, 4, 4, 5, 5] else: return [3, 3, 4, 4, 5] - def subfks_parts(self) -> list: + def subfks_parts(self) -> list[str]: """Return the parts of the sub FK table components of the fonll fns that need to be computed.""" if self.is_mixed() or self.is_damp: return [ @@ -84,7 +84,7 @@ def subfks_parts(self) -> list: else: return ["full" for _ in range(5)] - def subfks_ptos(self) -> list: + def subfks_ptos(self) -> list[int]: """Return the ptos of the sub FK table components of the fonll fns.""" base_pto = self.base_pto() if self.is_mixed(): From 1165dd9a5e5cf91308a6a601bce72979246db60d Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 19 Oct 2023 15:25:29 +0300 Subject: [PATCH 119/165] Revert "Rework nFONLL config" This reverts commit 7e385a36e70932544de4a75b8fd753f2169f7f3b. --- benchmarks/bench_evolve.py | 14 ++- benchmarks/bench_fonll.py | 27 ++++-- src/pineko/fonll.py | 188 +++++++++++++++---------------------- 3 files changed, 101 insertions(+), 128 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 1df9bd18..05a8455a 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -12,12 +12,11 @@ import pineko.theory_card -@pytest.mark.parametrize("theoryid", [400, 208]) +@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) def benchmark_write_operator_card_from_file_num_fonll( - tmp_path, test_files, test_configs, theoryid + tmp_path, test_files, test_configs, theoryid, is_mixed ): tcard = pineko.theory_card.load(theoryid) - fonll_config = pineko.fonll.FonllSchemeConfig(tcard["FNS"], tcard["DAMP"]) tcards_path_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) pine_path = ( test_files @@ -27,7 +26,7 @@ def benchmark_write_operator_card_from_file_num_fonll( / "HERA_NC_225GEV_EP_SIGMARED.pineappl.lz4" ) default_path = test_files / "data" / "operator_cards" / "400" / "_template.yaml" - num_opcard = 7 if fonll_config.is_mixed() else 5 + num_opcard = 7 if is_mixed else 5 targets_path_list = [ tmp_path / f"test_opcard_{num}.yaml" for num in range(num_opcard) ] @@ -38,7 +37,12 @@ def benchmark_write_operator_card_from_file_num_fonll( pine_path, default_path, target_path, tcard ) # Check if the opcards are ok - for opcard_path, nfff in zip(targets_path_list, fonll_config.subfks_nfff()): + for opcard_path, nfff in zip( + targets_path_list, + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] + if is_mixed + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], + ): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) for entry in ocard["mugrid"]: diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 58509271..d9a90221 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -5,10 +5,11 @@ import pineko -@pytest.mark.parametrize("theoryid", [400, 208]) -def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid): +@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) +def benchmark_produce_fonll_tcards( + tmp_path, test_files, test_configs, theoryid, is_mixed +): tcard = pineko.theory_card.load(theoryid) - fonll_config = pineko.fonll.FonllSchemeConfig(tcard["FNS"], tcard["DAMP"]) tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) # Check they are correct theorycards = [] @@ -17,14 +18,20 @@ def benchmark_produce_fonll_tcards(tmp_path, test_files, test_configs, theoryid) theorycards.append(yaml.safe_load(f)) for num_fonll_tcard, fns, nfff, po, part in zip( theorycards, - fonll_config.subfks_fns(), - fonll_config.subfks_nfff(), - fonll_config.subfks_ptos(), - fonll_config.subfks_parts(), + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[0] + if is_mixed + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[0], + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] + if is_mixed + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], + pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), + np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[2] + if is_mixed + else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[2], ): assert num_fonll_tcard["FNS"] == fns assert num_fonll_tcard["NfFF"] == int(nfff) - assert num_fonll_tcard["PTO"] == po - if fonll_config.is_mixed() and fns == "FONLL-FFN0": - assert num_fonll_tcard["PTODIS"] == po + 1 + assert ( + num_fonll_tcard["PTO"] == po - 1 if is_mixed and fns == "FONLL-FFN0" else po + ) assert num_fonll_tcard["FONLLParts"] == part diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 63c46143..9b22c583 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -4,7 +4,6 @@ import json import logging import tempfile -from dataclasses import dataclass from pathlib import Path import numpy as np @@ -16,116 +15,6 @@ logger = logging.getLogger(__name__) -FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} -MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] -# Notice we rely on the order defined by the FONLLInfo class -FK_TO_DAMP = { - "mc": ["ffn03", "ffns4til", "ffn04", "ffns5til"], - "mb": ["ffn04", "ffns5til"], -} -FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign - - -@dataclass -class FonllSchemeConfig: - """Class to group FONLL scheme configs.""" - - fonll_fns: str - is_damp: bool - - def is_mixed(self) -> bool: - """Whether the fonll fns is of mixed type.""" - return self.fonll_fns in MIXED_ORDER_FNS - - def base_pto(self) -> int: - """Return the base perturbative order of the fonll fns.""" - return FNS_BASE_PTO[self.fonll_fns] - - def subfks_fns(self) -> list[str]: - """Return the fns of the sub FK table components of the fonll fns.""" - if self.is_mixed() or self.is_damp: - return [ - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFNS", - ] - else: - return [ - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - "FONLL-FFN0", - "FONLL-FFNS", - ] - - def subfks_nfff(self) -> list[int]: - """Return the nfff of the sub FK table components of the fonll fns.""" - if self.is_mixed() or self.is_damp: - return [3, 3, 4, 4, 4, 5, 5] - else: - return [3, 3, 4, 4, 5] - - def subfks_parts(self) -> list[str]: - """Return the parts of the sub FK table components of the fonll fns that need to be computed.""" - if self.is_mixed() or self.is_damp: - return [ - "full", - "full", - "massless", - "massive", - "full", - "massless", - "massive", - ] - else: - return ["full" for _ in range(5)] - - def subfks_ptos(self) -> list[int]: - """Return the ptos of the sub FK table components of the fonll fns.""" - base_pto = self.base_pto() - if self.is_mixed(): - return [ - base_pto + 1, - base_pto, - base_pto, - base_pto + 1, - base_pto, - base_pto, - base_pto + 1, - ] - elif self.is_damp: - return [base_pto for _ in range(7)] - else: - return [base_pto for _ in range(5)] - - def produce_fonll_recipe(self) -> dict: - """Produce the different fonll recipes according to which FONLL is asked for.""" - fonll_recipe = [] - for fns, nfff, po, part in zip( - self.subfks_fns(), - self.subfks_nfff(), - self.subfks_ptos(), - self.subfks_parts(), - ): - fonll_recipe.append( - { - "FNS": fns, - "NfFF": nfff, - "PTO": po, - "FONLLParts": part, - } - ) - # In a mixed FONLL scheme we only subract the resummed terms that are - # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we - # only subract up to NLL since there is no NNLL in FFNS4 - if self.is_mixed() and fns == "FONLL-FFN0": - fonll_recipe[-1]["PTODIS"] = po + 1 - return fonll_recipe - class FONLLInfo: """Class containing all the information for FONLL predictions.""" @@ -196,6 +85,14 @@ def Q2grid(self): return self.fks[list(self.fks)[0]].bin_left(0) +# Notice we rely on the order defined by the FONLLInfo class +FK_TO_DAMP = { + "mc": ["ffn03", "ffns4til", "ffn04", "ffns5til"], + "mb": ["ffn04", "ffns5til"], +} +FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign + + def update_fk_theorycard(combined_fk, input_theorycard_path): """Update theorycard entries for the combined fktable by reading the yamldb of the original theory.""" with open(input_theorycard_path) as f: @@ -282,6 +179,33 @@ def produce_combined_fk( combined_fk.write_lz4(output_path_fk) +FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} +MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] + +# Mixed FONLL schemes + +MIXED_FNS_CONFIG = [ + ("FONLL-FFNS", 3, "full"), + ("FONLL-FFN0", 3, "full"), + ("FONLL-FFNS", 4, "massless"), + ("FONLL-FFNS", 4, "massive"), + ("FONLL-FFN0", 4, "full"), + ("FONLL-FFNS", 5, "massless"), + ("FONLL-FFNS", 5, "massive"), +] + + +# plain FONLL schemes + +FNS_CONFIG = [ + ("FONLL-FFNS", 3, "full"), + ("FONLL-FFN0", 3, "full"), + ("FONLL-FFNS", 4, "full"), + ("FONLL-FFN0", 4, "full"), + ("FONLL-FFNS", 5, "full"), +] + + def produce_ptos(fns, is_mixed_or_damp): """Produce the list of PTOs needed for the requested fns.""" base_pto = FNS_BASE_PTO[fns] @@ -305,13 +229,51 @@ def produce_ptos(fns, is_mixed_or_damp): return [base_pto for _ in range(5)] +def produce_fonll_recipe(fonll_fns, damp): + """Produce the different theory cards according to which FONLL is asked for.""" + fonll_recipe = [] + is_mixed_or_damp = fonll_fns in MIXED_ORDER_FNS or damp != 0 + fns_list = ( + np.array(MIXED_FNS_CONFIG).transpose().tolist()[0] + if is_mixed_or_damp + else np.array(FNS_CONFIG).transpose().tolist()[0] + ) + nfff_list = ( + np.array(MIXED_FNS_CONFIG).transpose().tolist()[1] + if is_mixed_or_damp + else np.array(FNS_CONFIG).transpose().tolist()[1] + ) + parts_list = ( + np.array(MIXED_FNS_CONFIG).transpose().tolist()[2] + if is_mixed_or_damp + else np.array(FNS_CONFIG).transpose().tolist()[2] + ) + for fns, nfff, po, part in zip( + fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed_or_damp), parts_list + ): + fonll_recipe.append( + { + "FNS": str(fns), + "NfFF": int(nfff), + "PTO": int(po), + "FONLLParts": str(part), + } + ) + # In a mixed FONLL scheme we only subract the resummed terms that are + # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we + # only subract up to NLL since there is no NNLL in FFNS4 + if fonll_fns in MIXED_ORDER_FNS and fns == "FONLL-FFN0": + fonll_recipe[-1]["PTODIS"] = po + fonll_recipe[-1]["PTO"] = po - 1 + return fonll_recipe + + def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): """Produce the seven fonll tcards from an original tcard. The produced tcards are dumped in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. """ - fonll_config = FonllSchemeConfig(tcard["FNS"], tcard["DAMP"]) - fonll_recipe = fonll_config.produce_fonll_recipe() + fonll_recipe = produce_fonll_recipe(tcard["FNS"], tcard["DAMP"]) n_theory = len(fonll_recipe) theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] paths_list = [] From 6d879953c1de34f847567fc95102c9d883d96d70 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Thu, 19 Oct 2023 14:29:00 +0200 Subject: [PATCH 120/165] Update src/pineko/cli/fonll.py Co-authored-by: Felix Hekhorn --- src/pineko/cli/fonll.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 01b98941..cd378043 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -171,4 +171,5 @@ def fonll_tcards(theoryid, cfg): tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: raise TheoryCardError("The theorycard does not correspond to an FONLL scheme.") - _ = fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) + fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) + return From e64aa94bbd30fc4fd7ce02f4858e18e3ea2b5b4a Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 19 Oct 2023 16:22:50 +0300 Subject: [PATCH 121/165] Use SubTheoryConfig --- benchmarks/bench_evolve.py | 10 ++- benchmarks/bench_fonll.py | 61 ++++++++-------- src/pineko/cli/fonll.py | 3 +- src/pineko/fonll.py | 138 +++++++++++++++---------------------- 4 files changed, 91 insertions(+), 121 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 05a8455a..094fd477 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -17,7 +17,7 @@ def benchmark_write_operator_card_from_file_num_fonll( tmp_path, test_files, test_configs, theoryid, is_mixed ): tcard = pineko.theory_card.load(theoryid) - tcards_path_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) + tcards_path_list = pineko.fonll.dump_tcards(tcard, tmp_path, theoryid) pine_path = ( test_files / "data" @@ -37,16 +37,14 @@ def benchmark_write_operator_card_from_file_num_fonll( pine_path, default_path, target_path, tcard ) # Check if the opcards are ok - for opcard_path, nfff in zip( + for opcard_path, cfg in zip( targets_path_list, - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], + pineko.fonll.MIXED_FNS_CONFIG if is_mixed else pineko.fonll.FNS_CONFIG, ): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) for entry in ocard["mugrid"]: - assert entry[1] == int(nfff) + assert entry[1] == int(cfg.nf) def benchmark_write_operator_card_from_file(tmp_path, test_files, test_configs): diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index d9a90221..3a46c772 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -4,34 +4,33 @@ import pineko - -@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) -def benchmark_produce_fonll_tcards( - tmp_path, test_files, test_configs, theoryid, is_mixed -): - tcard = pineko.theory_card.load(theoryid) - tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) - # Check they are correct - theorycards = [] - for path in tcard_paths_list: - with open(path, encoding="UTF-8") as f: - theorycards.append(yaml.safe_load(f)) - for num_fonll_tcard, fns, nfff, po, part in zip( - theorycards, - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[0] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[0], - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], - pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), - np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[2] - if is_mixed - else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[2], - ): - assert num_fonll_tcard["FNS"] == fns - assert num_fonll_tcard["NfFF"] == int(nfff) - assert ( - num_fonll_tcard["PTO"] == po - 1 if is_mixed and fns == "FONLL-FFN0" else po - ) - assert num_fonll_tcard["FONLLParts"] == part +# @pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) +# def benchmark_produce_fonll_tcards( +# tmp_path, test_files, test_configs, theoryid, is_mixed +# ): +# tcard = pineko.theory_card.load(theoryid) +# tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) +# # Check they are correct +# theorycards = [] +# for path in tcard_paths_list: +# with open(path, encoding="UTF-8") as f: +# theorycards.append(yaml.safe_load(f)) +# for num_fonll_tcard, fns, nfff, po, part in zip( +# theorycards, +# np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[0] +# if is_mixed +# else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[0], +# np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] +# if is_mixed +# else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], +# pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), +# np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[2] +# if is_mixed +# else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[2], +# ): +# assert num_fonll_tcard["FNS"] == fns +# assert num_fonll_tcard["NfFF"] == int(nfff) +# assert ( +# num_fonll_tcard["PTO"] == po - 1 if is_mixed and fns == "FONLL-FFN0" else po +# ) +# assert num_fonll_tcard["FONLLParts"] == part diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 01b98941..7b041617 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -171,4 +171,5 @@ def fonll_tcards(theoryid, cfg): tcard_parent_path = theory_card.path(theoryid).parent if "FONLL" not in tcard["FNS"]: raise TheoryCardError("The theorycard does not correspond to an FONLL scheme.") - _ = fonll.produce_fonll_tcards(tcard, tcard_parent_path, theoryid) + fonll.dump_tcards(tcard, tcard_parent_path, theoryid) + return diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 9b22c583..2e0b1cea 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -1,12 +1,12 @@ """Module to manage FONLL predictions.""" import copy +import dataclasses import json import logging import tempfile from pathlib import Path -import numpy as np import pineappl import rich import yaml @@ -159,18 +159,18 @@ def produce_combined_fk( ) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto fk_dict = fonll_info.fks - if damp[0] == 0: - # then there is no damping, not even Heaviside only - combined_fk = combine(fk_dict) - else: - dampings = produce_dampings(theorycard_constituent_fks, fonll_info, damp) - combined_fk = combine(fk_dict, dampings=dampings) + dampings = ( + None + if damp[0] == 0 + else produce_dampings(theorycard_constituent_fks, fonll_info, damp) + ) + combined_fk = combine(fk_dict, dampings=dampings) input_theorycard_path = ( Path(configs.load(configs.detect(cfg))["paths"]["theory_cards"]) / f"{theoryid}.yaml" ) update_fk_theorycard(combined_fk, input_theorycard_path) - # save final "fonll" fktable + # save final FONLL fktable fk_folder = Path(configs.load(configs.detect(cfg))["paths"]["fktables"]) / str( theoryid ) @@ -182,102 +182,74 @@ def produce_combined_fk( FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] -# Mixed FONLL schemes -MIXED_FNS_CONFIG = [ - ("FONLL-FFNS", 3, "full"), - ("FONLL-FFN0", 3, "full"), - ("FONLL-FFNS", 4, "massless"), - ("FONLL-FFNS", 4, "massive"), - ("FONLL-FFN0", 4, "full"), - ("FONLL-FFNS", 5, "massless"), - ("FONLL-FFNS", 5, "massive"), -] +@dataclasses.dataclass +class SubTheoryConfig: + """Single (sub-)theory configuration.""" + scheme: str + nf: int + parts: str + delta_pto: int = 0 -# plain FONLL schemes + +MIXED_FNS_CONFIG = [ + SubTheoryConfig("FONLL-FFNS", 3, "full", 1), + SubTheoryConfig("FONLL-FFN0", 3, "full", 1), + SubTheoryConfig("FONLL-FFNS", 4, "massless"), + SubTheoryConfig("FONLL-FFNS", 4, "massive", 1), + SubTheoryConfig("FONLL-FFN0", 4, "full", 1), + SubTheoryConfig("FONLL-FFNS", 5, "massless"), + SubTheoryConfig("FONLL-FFNS", 5, "massive", 1), +] +"""Mixed FONLL schemes.""" FNS_CONFIG = [ - ("FONLL-FFNS", 3, "full"), - ("FONLL-FFN0", 3, "full"), - ("FONLL-FFNS", 4, "full"), - ("FONLL-FFN0", 4, "full"), - ("FONLL-FFNS", 5, "full"), + SubTheoryConfig("FONLL-FFNS", 3, "full"), + SubTheoryConfig("FONLL-FFN0", 3, "full"), + SubTheoryConfig("FONLL-FFNS", 4, "full"), + SubTheoryConfig("FONLL-FFN0", 4, "full"), + SubTheoryConfig("FONLL-FFNS", 5, "full"), ] +"""Plain FONLL schemes.""" -def produce_ptos(fns, is_mixed_or_damp): - """Produce the list of PTOs needed for the requested fns.""" - base_pto = FNS_BASE_PTO[fns] - # mixed FONLL - if fns in MIXED_ORDER_FNS: - return [ - base_pto + 1, - base_pto + 1, - base_pto, - base_pto + 1, - base_pto + 1, - base_pto, - base_pto + 1, - ] - # plain FONLL with damping - elif is_mixed_or_damp: - return [base_pto for _ in range(7)] - # plain FONLL without damping - # In the case of not mixed and not damped FK tables, 5 sub FK tables are enough - else: - return [base_pto for _ in range(5)] - - -def produce_fonll_recipe(fonll_fns, damp): +def collect_updates(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" - fonll_recipe = [] - is_mixed_or_damp = fonll_fns in MIXED_ORDER_FNS or damp != 0 - fns_list = ( - np.array(MIXED_FNS_CONFIG).transpose().tolist()[0] - if is_mixed_or_damp - else np.array(FNS_CONFIG).transpose().tolist()[0] - ) - nfff_list = ( - np.array(MIXED_FNS_CONFIG).transpose().tolist()[1] - if is_mixed_or_damp - else np.array(FNS_CONFIG).transpose().tolist()[1] - ) - parts_list = ( - np.array(MIXED_FNS_CONFIG).transpose().tolist()[2] - if is_mixed_or_damp - else np.array(FNS_CONFIG).transpose().tolist()[2] - ) - for fns, nfff, po, part in zip( - fns_list, nfff_list, produce_ptos(fonll_fns, is_mixed_or_damp), parts_list - ): - fonll_recipe.append( + updates = [] + is_mixed = fonll_fns in MIXED_ORDER_FNS + is_damped = damp != 0 + base_pto = FNS_BASE_PTO[fonll_fns] + cfgs = MIXED_FNS_CONFIG if is_mixed or is_damped else FNS_CONFIG + for cfg in cfgs: + po = int(base_pto) + (cfg.delta_pto if is_mixed else 0) + updates.append( { - "FNS": str(fns), - "NfFF": int(nfff), - "PTO": int(po), - "FONLLParts": str(part), + "FNS": cfg.scheme, + "NfFF": cfg.nf, + "PTO": po, + "FONLLParts": cfg.parts, } ) # In a mixed FONLL scheme we only subract the resummed terms that are # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we # only subract up to NLL since there is no NNLL in FFNS4 - if fonll_fns in MIXED_ORDER_FNS and fns == "FONLL-FFN0": - fonll_recipe[-1]["PTODIS"] = po - fonll_recipe[-1]["PTO"] = po - 1 - return fonll_recipe + if fonll_fns in MIXED_ORDER_FNS and cfg.scheme == "FONLL-FFN0": + updates[-1]["PTODIS"] = po + updates[-1]["PTO"] = po - 1 + return updates -def produce_fonll_tcards(tcard, tcard_parent_path, theoryid): - """Produce the seven fonll tcards from an original tcard. +def dump_tcards(tcard, tcard_parent_path, theoryid): + """Produce the seven FONLL theory cards from the original one. - The produced tcards are dumped in tcard_parent_path with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. + The produced theory cards are dumped in `tcard_parent_path` with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. """ - fonll_recipe = produce_fonll_recipe(tcard["FNS"], tcard["DAMP"]) - n_theory = len(fonll_recipe) + updates = collect_updates(tcard["FNS"], tcard["DAMP"]) + n_theory = len(updates) theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] paths_list = [] - for num, (theorycard, recipe) in enumerate(zip(theorycards, fonll_recipe)): + for num, (theorycard, recipe) in enumerate(zip(theorycards, updates)): # update cards entries theorycard.update(recipe) theorycard["ID"] = int(f"{theoryid}0{num}") From 61c487a0ec64d09b6b10392174094f3b80152f1a Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 19 Oct 2023 17:08:32 +0300 Subject: [PATCH 122/165] Update src/pineko/cli/fonll.py --- src/pineko/cli/fonll.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 7b041617..30a29c98 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -172,4 +172,3 @@ def fonll_tcards(theoryid, cfg): if "FONLL" not in tcard["FNS"]: raise TheoryCardError("The theorycard does not correspond to an FONLL scheme.") fonll.dump_tcards(tcard, tcard_parent_path, theoryid) - return From b5674d099d2b19b49ae46e0c6850fa711c8c5768 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 19 Oct 2023 17:24:48 +0300 Subject: [PATCH 123/165] Booleanize subtheory scheme --- src/pineko/fonll.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 2e0b1cea..f8961d10 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -187,29 +187,34 @@ def produce_combined_fk( class SubTheoryConfig: """Single (sub-)theory configuration.""" - scheme: str + asy: bool nf: int parts: str delta_pto: int = 0 + @property + def scheme(self): + """Yadism scheme name.""" + return "FONLL-FFN" + ("0" if self.asy else "S") + MIXED_FNS_CONFIG = [ - SubTheoryConfig("FONLL-FFNS", 3, "full", 1), - SubTheoryConfig("FONLL-FFN0", 3, "full", 1), - SubTheoryConfig("FONLL-FFNS", 4, "massless"), - SubTheoryConfig("FONLL-FFNS", 4, "massive", 1), - SubTheoryConfig("FONLL-FFN0", 4, "full", 1), - SubTheoryConfig("FONLL-FFNS", 5, "massless"), - SubTheoryConfig("FONLL-FFNS", 5, "massive", 1), + SubTheoryConfig(False, 3, "full", 1), + SubTheoryConfig(True, 3, "full", 1), + SubTheoryConfig(False, 4, "massless"), + SubTheoryConfig(False, 4, "massive", 1), + SubTheoryConfig(True, 4, "full", 1), + SubTheoryConfig(False, 5, "massless"), + SubTheoryConfig(False, 5, "massive", 1), ] """Mixed FONLL schemes.""" FNS_CONFIG = [ - SubTheoryConfig("FONLL-FFNS", 3, "full"), - SubTheoryConfig("FONLL-FFN0", 3, "full"), - SubTheoryConfig("FONLL-FFNS", 4, "full"), - SubTheoryConfig("FONLL-FFN0", 4, "full"), - SubTheoryConfig("FONLL-FFNS", 5, "full"), + SubTheoryConfig(False, 3, "full"), + SubTheoryConfig(True, 3, "full"), + SubTheoryConfig(False, 4, "full"), + SubTheoryConfig(True, 4, "full"), + SubTheoryConfig(False, 5, "full"), ] """Plain FONLL schemes.""" @@ -234,7 +239,7 @@ def collect_updates(fonll_fns, damp): # In a mixed FONLL scheme we only subract the resummed terms that are # present in the FFNS scheme at nf+1. E.g. for FONLL-B in FFN03 we # only subract up to NLL since there is no NNLL in FFNS4 - if fonll_fns in MIXED_ORDER_FNS and cfg.scheme == "FONLL-FFN0": + if fonll_fns in MIXED_ORDER_FNS and cfg.asy: updates[-1]["PTODIS"] = po updates[-1]["PTO"] = po - 1 return updates From f28d9a244640128b8a68ad8f75cab54023df1741 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 19 Oct 2023 16:26:26 +0200 Subject: [PATCH 124/165] adding some docstring about fonll mapping --- src/pineko/fonll.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 0a987702..390a4fdc 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -17,13 +17,24 @@ logger = logging.getLogger(__name__) FNS_BASE_PTO = {"FONLL-A": 1, "FONLL-B": 1, "FONLL-C": 2, "FONLL-D": 2, "FONLL-E": 3} +"""Mapping between pertubative orders as in the theory card PTO and the FONLL scheme names. + +The explict mapping is the following (evolution, massive parts, massless parts): + * A: (1,1,1) + * B: (2,2,1) + * C: (2,2,2) + * D: (3,3,2) + * E: (3,3,3) +""" MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] +"""FONLL schemes with mixed orders.""" # Notice we rely on the order defined by the FONLLInfo class FK_TO_DAMP = { "mc": ["ffn03", "ffns4til", "ffn04", "ffns5til"], "mb": ["ffn04", "ffns5til"], } FK_WITH_MINUS = ["ffn03", "ffn04"] # asy terms should be subtracted, therefore the sign +"""FNS schemes to be subtracted during the FONLL procedure.""" @dataclass From 17d595685485b5aea070428c601496fecb36e9b1 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 19 Oct 2023 16:34:40 +0200 Subject: [PATCH 125/165] fix minor --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 390a4fdc..402f0e33 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -21,9 +21,9 @@ The explict mapping is the following (evolution, massive parts, massless parts): * A: (1,1,1) - * B: (2,2,1) + * B: (1,2,1) * C: (2,2,2) - * D: (3,3,2) + * D: (2,3,2) * E: (3,3,3) """ MIXED_ORDER_FNS = ["FONLL-B", "FONLL-D"] From 78ab9c909b4ac81d565555531870e2d4bf3a2a0c Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Fri, 20 Oct 2023 11:15:38 +0300 Subject: [PATCH 126/165] Recover bench_fonll --- benchmarks/bench_fonll.py | 52 +++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 3a46c772..2f2381ff 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -4,33 +4,25 @@ import pineko -# @pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) -# def benchmark_produce_fonll_tcards( -# tmp_path, test_files, test_configs, theoryid, is_mixed -# ): -# tcard = pineko.theory_card.load(theoryid) -# tcard_paths_list = pineko.fonll.produce_fonll_tcards(tcard, tmp_path, theoryid) -# # Check they are correct -# theorycards = [] -# for path in tcard_paths_list: -# with open(path, encoding="UTF-8") as f: -# theorycards.append(yaml.safe_load(f)) -# for num_fonll_tcard, fns, nfff, po, part in zip( -# theorycards, -# np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[0] -# if is_mixed -# else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[0], -# np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[1] -# if is_mixed -# else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[1], -# pineko.fonll.produce_ptos(tcard["FNS"], is_mixed), -# np.array(pineko.fonll.MIXED_FNS_CONFIG).transpose().tolist()[2] -# if is_mixed -# else np.array(pineko.fonll.FNS_CONFIG).transpose().tolist()[2], -# ): -# assert num_fonll_tcard["FNS"] == fns -# assert num_fonll_tcard["NfFF"] == int(nfff) -# assert ( -# num_fonll_tcard["PTO"] == po - 1 if is_mixed and fns == "FONLL-FFN0" else po -# ) -# assert num_fonll_tcard["FONLLParts"] == part + +@pytest.mark.parametrize("theoryid,is_mixed", [(400, False), (208, True)]) +def benchmark_produce_fonll_tcards( + tmp_path, test_files, test_configs, theoryid, is_mixed +): + tcard = pineko.theory_card.load(theoryid) + tcard_paths_list = pineko.fonll.dump_tcards(tcard, tmp_path, theoryid) + # Check they are correct + theorycards = [] + for path in tcard_paths_list: + with open(path, encoding="UTF-8") as f: + theorycards.append(yaml.safe_load(f)) + base_pto = pineko.fonll.FNS_BASE_PTO[tcard["FNS"]] + for num_fonll_tcard, cfg in zip( + theorycards, + pineko.fonll.MIXED_FNS_CONFIG if is_mixed else pineko.fonll.FNS_CONFIG, + ): + po = int(base_pto) + (cfg.delta_pto if is_mixed else 0) + assert num_fonll_tcard["FNS"] == cfg.scheme + assert num_fonll_tcard["NfFF"] == int(cfg.nf) + assert num_fonll_tcard["PTO"] == po - 1 if is_mixed and cfg.asy else po + assert num_fonll_tcard["FONLLParts"] == cfg.parts From 914dec1400ef827c5cd5557ca14f2c655c1ad711 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Mon, 23 Oct 2023 12:34:33 +0200 Subject: [PATCH 127/165] Update benchmarks/bench_evolve.py Co-authored-by: Roy Stegeman --- benchmarks/bench_evolve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 094fd477..27dd876a 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -33,7 +33,7 @@ def benchmark_write_operator_card_from_file_num_fonll( for target_path, tcard_path in zip(targets_path_list, tcards_path_list): with open(tcard_path, encoding="utf-8") as f: tcard = yaml.safe_load(f) - x_grid, _q2_grid = pineko.evolve.write_operator_card_from_file( + _x_grid, _q2_grid = pineko.evolve.write_operator_card_from_file( pine_path, default_path, target_path, tcard ) # Check if the opcards are ok From b37cb54445ca3ecb71ffb04fa0d11c2d3f48ec14 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Mon, 23 Oct 2023 12:34:57 +0200 Subject: [PATCH 128/165] Update src/pineko/check.py Co-authored-by: Roy Stegeman --- src/pineko/check.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index 2fe12fd4..e9850a6c 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -153,10 +153,7 @@ def is_fonll_mixed(fns, lumi): bool true if the fktable is a mixed FONLL DIS fktable """ - if not is_dis(lumi): - return False - mixed_FONLL_fns = ["FONLL-B", "FONLL-D"] - if fns in mixed_FONLL_fns: + if is_dis(lumi) and fns in ["FONLL-B", "FONLL-D"]: return True return False From e35a95fa34acf63d2dc86749aa8b1ab0d97b2f20 Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Mon, 23 Oct 2023 12:35:18 +0200 Subject: [PATCH 129/165] Update src/pineko/check.py Co-authored-by: Roy Stegeman --- src/pineko/check.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index e9850a6c..2e010001 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -158,9 +158,9 @@ def is_fonll_mixed(fns, lumi): return False -def is_num_fonll(FNS): +def is_num_fonll(fns): """Check if the FNS is a nFONLL FNS.""" - return FNS in ["FONLL-FFNS", "FONLL-FFN0"] + return fns in ["FONLL-FFNS", "FONLL-FFN0"] def orders(grid, max_as, max_al) -> list: From 7dca3a4317350e6c572156b498ed378284493206 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Mon, 23 Oct 2023 13:54:43 +0300 Subject: [PATCH 130/165] Update src/pineko/check.py --- src/pineko/check.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pineko/check.py b/src/pineko/check.py index 2e010001..8f03a3ae 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -153,9 +153,7 @@ def is_fonll_mixed(fns, lumi): bool true if the fktable is a mixed FONLL DIS fktable """ - if is_dis(lumi) and fns in ["FONLL-B", "FONLL-D"]: - return True - return False + return is_dis(lumi) and fns in ["FONLL-B", "FONLL-D"] def is_num_fonll(fns): From b8c386e358d002935028dd876c127e1fc5517fa8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 18:02:30 +0000 Subject: [PATCH 131/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.9.1 → 23.10.0](https://github.com/psf/black/compare/23.9.1...23.10.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b6ed8304..217d53ae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: - id: pycln args: [--config=pyproject.toml] - repo: https://github.com/psf/black - rev: 23.9.1 + rev: 23.10.0 hooks: - id: black - repo: https://github.com/asottile/blacken-docs From 2d49d6360bdba38b72e2fa8d529638e29a73a70a Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Fri, 27 Oct 2023 09:36:59 +0100 Subject: [PATCH 132/165] account for k{fl}Thr in damping step function fonll --- src/pineko/fonll.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 3075e227..ba087d08 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -122,9 +122,11 @@ def produce_dampings(theorycard_constituent_fks, fonll_info, damp): """Return the damping factors for each of the relevant masses.""" mc = theorycard_constituent_fks["mc"] mb = theorycard_constituent_fks["mb"] + kcthr = theorycard_constituent_fks["kcThr"] + kbthr = theorycard_constituent_fks["kbThr"] q2grid = fonll_info.Q2grid - step_function_charm = mc**2 < q2grid - step_function_bottom = mb**2 < q2grid + step_function_charm = (kcthr * mc) ** 2 < q2grid + step_function_bottom = (kbthr * mb) ** 2 < q2grid damping_factor_charm = (1 - mc / q2grid) ** damp[1] damping_factor_bottom = (1 - mb / q2grid) ** damp[1] damping_factor_charm *= step_function_charm From c5927eb1ba148fed976d40549b4698bc2a56a68d Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Fri, 27 Oct 2023 10:25:00 +0100 Subject: [PATCH 133/165] use matching scale instead of mb in damping factor --- src/pineko/fonll.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index ba087d08..213de023 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -120,15 +120,13 @@ def update_fk_theorycard(combined_fk, input_theorycard_path): def produce_dampings(theorycard_constituent_fks, fonll_info, damp): """Return the damping factors for each of the relevant masses.""" - mc = theorycard_constituent_fks["mc"] - mb = theorycard_constituent_fks["mb"] - kcthr = theorycard_constituent_fks["kcThr"] - kbthr = theorycard_constituent_fks["kbThr"] + cmatching = theorycard_constituent_fks["kcThr"] * theorycard_constituent_fks["mc"] + bmatching = theorycard_constituent_fks["kbThr"] * theorycard_constituent_fks["mb"] q2grid = fonll_info.Q2grid - step_function_charm = (kcthr * mc) ** 2 < q2grid - step_function_bottom = (kbthr * mb) ** 2 < q2grid - damping_factor_charm = (1 - mc / q2grid) ** damp[1] - damping_factor_bottom = (1 - mb / q2grid) ** damp[1] + step_function_charm = (cmatching) ** 2 < q2grid + step_function_bottom = (bmatching) ** 2 < q2grid + damping_factor_charm = (1 - cmatching / q2grid) ** damp[1] + damping_factor_bottom = (1 - bmatching / q2grid) ** damp[1] damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom return {"mc": damping_factor_charm, "mb": damping_factor_bottom} From 7c2435e68ecfb0f4f19c49965ab3826f265c4e6e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 17:55:43 +0000 Subject: [PATCH 134/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.10.0 → 23.10.1](https://github.com/psf/black/compare/23.10.0...23.10.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 217d53ae..a34868e6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: - id: pycln args: [--config=pyproject.toml] - repo: https://github.com/psf/black - rev: 23.10.0 + rev: 23.10.1 hooks: - id: black - repo: https://github.com/asottile/blacken-docs From 1e6ef87052a20ff0f5515d1d8b708d02cc90fb50 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 18:03:15 +0000 Subject: [PATCH 135/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.10.1 → 23.11.0](https://github.com/psf/black/compare/23.10.1...23.11.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a34868e6..0c9ce676 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: - id: pycln args: [--config=pyproject.toml] - repo: https://github.com/psf/black - rev: 23.10.1 + rev: 23.11.0 hooks: - id: black - repo: https://github.com/asottile/blacken-docs From d5081c4732b8815b8da3769bdbe896e8b0064ed0 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 14 Nov 2023 14:06:30 +0100 Subject: [PATCH 136/165] Update eko dependency to 0.14 --- poetry.lock | 517 +++++++++++++++++++++---------------------------- pyproject.toml | 2 +- 2 files changed, 219 insertions(+), 300 deletions(-) diff --git a/poetry.lock b/poetry.lock index bf7cf7d2..9dd41ae1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -16,7 +15,6 @@ files = [ name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -28,7 +26,6 @@ files = [ name = "astroid" version = "2.15.8" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -46,27 +43,26 @@ wrapt = [ [[package]] name = "asttokens" -version = "2.4.0" +version = "2.4.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ - {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, - {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -83,14 +79,13 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "babel" -version = "2.13.0" +version = "2.13.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.0-py3-none-any.whl", hash = "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec"}, - {file = "Babel-2.13.0.tar.gz", hash = "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210"}, + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] [package.dependencies] @@ -103,7 +98,6 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -115,7 +109,6 @@ files = [ name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -125,109 +118,107 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, - {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -242,7 +233,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -254,7 +244,6 @@ files = [ name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" -category = "main" optional = false python-versions = "*" files = [ @@ -269,7 +258,6 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] name = "coverage" version = "7.3.2" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -337,7 +325,6 @@ toml = ["tomli"] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -349,7 +336,6 @@ files = [ name = "dill" version = "0.3.7" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -364,7 +350,6 @@ graph = ["objgraph (>=1.7.2)"] name = "docutils" version = "0.17.1" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -374,14 +359,13 @@ files = [ [[package]] name = "eko" -version = "0.13.5" +version = "0.14.0" description = "Evolution Kernel Operators" -category = "main" optional = false python-versions = ">=3.8,<3.12" files = [ - {file = "eko-0.13.5-py3-none-any.whl", hash = "sha256:4358709dd874b50475c5279a763946fab84f5cf1df6a34800f1fb06307c51ca5"}, - {file = "eko-0.13.5.tar.gz", hash = "sha256:fe9d74c876e1f9732b110c57d8d875407ad558983045b78cdb274dde98bcae66"}, + {file = "eko-0.14.0-py3-none-any.whl", hash = "sha256:f9baca68c3aef610ddb9bea89936922b84aee9e145ae3636b8193610f68115c0"}, + {file = "eko-0.14.0.tar.gz", hash = "sha256:bbe025458ce6b24d8e87a8d0a2f45751102eac1641ea4392fe4eded80d4dc223"}, ] [package.dependencies] @@ -399,7 +383,6 @@ mark = ["banana-hep (>=0.6.9,<0.7.0)", "matplotlib (>=3.5.1,<4.0.0)", "pandas (> name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -412,14 +395,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-2.0.0-py2.py3-none-any.whl", hash = "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657"}, - {file = "executing-2.0.0.tar.gz", hash = "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] @@ -429,7 +411,6 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "fancycompleter" version = "0.9.1" description = "colorful TAB completion for Python prompt" -category = "dev" optional = false python-versions = "*" files = [ @@ -445,7 +426,6 @@ pyrepl = ">=0.8.2" name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -457,7 +437,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -469,7 +448,6 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -489,7 +467,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -501,7 +478,6 @@ files = [ name = "ipython" version = "8.12.3" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -541,7 +517,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -559,7 +534,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -579,7 +553,6 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -597,7 +570,6 @@ i18n = ["Babel (>=2.7)"] name = "latexcodec" version = "2.0.1" description = "A lexer and codec to work with LaTeX code in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -612,7 +584,6 @@ six = ">=1.4.1" name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -658,7 +629,6 @@ files = [ name = "llvmlite" version = "0.40.1" description = "lightweight wrapper around basic LLVM functionality" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -692,7 +662,6 @@ files = [ name = "lz4" version = "4.3.2" description = "LZ4 Bindings for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -742,7 +711,6 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -802,7 +770,6 @@ files = [ name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -817,7 +784,6 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -829,7 +795,6 @@ files = [ name = "numba" version = "0.57.1" description = "compiling Python code using LLVM" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -861,14 +826,13 @@ files = [ [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -llvmlite = ">=0.40.0dev0,<0.41" +llvmlite = "==0.40.*" numpy = ">=1.21,<1.25" [[package]] name = "numpy" version = "1.24.4" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -906,7 +870,6 @@ files = [ name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -918,7 +881,6 @@ files = [ name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -954,7 +916,7 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.1" @@ -967,7 +929,6 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -983,7 +944,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pdbpp" version = "0.10.3" description = "pdb++, a drop-in replacement for pdb" -category = "dev" optional = false python-versions = "*" files = [ @@ -1004,7 +964,6 @@ testing = ["funcsigs", "pytest"] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -1019,7 +978,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -1031,7 +989,6 @@ files = [ name = "pineappl" version = "0.6.2" description = "Python bindings to PineAPPL" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1068,14 +1025,13 @@ test = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "3.11.0" +version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] [package.extras] @@ -1086,7 +1042,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1100,14 +1055,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.41" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, ] [package.dependencies] @@ -1117,7 +1071,6 @@ wcwidth = "*" name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -1129,7 +1082,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -1144,7 +1096,6 @@ tests = ["pytest"] name = "pybtex" version = "0.24.0" description = "A BibTeX-compatible bibliography processor in Python" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" files = [ @@ -1164,7 +1115,6 @@ test = ["pytest"] name = "pybtex-docutils" version = "1.0.3" description = "A docutils backend for pybtex." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1180,7 +1130,6 @@ pybtex = ">=0.16" name = "pygments" version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1195,7 +1144,6 @@ plugins = ["importlib-metadata"] name = "pylint" version = "2.17.7" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -1225,7 +1173,6 @@ testutils = ["gitpython (>3)"] name = "pyreadline" version = "2.1" description = "A python implmementation of GNU readline." -category = "dev" optional = false python-versions = "*" files = [ @@ -1236,7 +1183,6 @@ files = [ name = "pyrepl" version = "0.9.0" description = "A library for building flexible command line interfaces" -category = "dev" optional = false python-versions = "*" files = [ @@ -1245,14 +1191,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.3" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] @@ -1270,7 +1215,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1289,7 +1233,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-env" version = "0.6.2" description = "py.test plugin that allows you to add environment variables." -category = "dev" optional = false python-versions = "*" files = [ @@ -1303,7 +1246,6 @@ pytest = ">=2.6.0" name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1318,7 +1260,6 @@ six = ">=1.5" name = "pytz" version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -1330,7 +1271,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1339,6 +1279,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1346,8 +1287,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1364,6 +1312,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1371,6 +1320,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1380,7 +1330,6 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1402,7 +1351,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rich" version = "12.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.6.3,<4.0.0" files = [ @@ -1422,7 +1370,6 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -1461,7 +1408,6 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1473,7 +1419,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -1485,7 +1430,6 @@ files = [ name = "sphinx" version = "4.5.0" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1521,7 +1465,6 @@ test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] name = "sphinx-rtd-theme" version = "1.3.0" description = "Read the Docs theme for Sphinx" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -1541,7 +1484,6 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1557,7 +1499,6 @@ test = ["pytest"] name = "sphinxcontrib-bibtex" version = "2.6.1" description = "Sphinx extension for BibTeX style citations." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1566,7 +1507,7 @@ files = [ ] [package.dependencies] -docutils = ">=0.8,<0.18.0 || >=0.20.0" +docutils = ">=0.8,<0.18.dev0 || >=0.20.dev0" importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} pybtex = ">=0.24" pybtex-docutils = ">=1.0.0" @@ -1576,7 +1517,6 @@ Sphinx = ">=3.5" name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1592,7 +1532,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1608,7 +1547,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jquery" version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -1623,7 +1561,6 @@ Sphinx = ">=1.8" name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1638,7 +1575,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1654,7 +1590,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1670,7 +1605,6 @@ test = ["pytest"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -1690,7 +1624,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1700,37 +1633,34 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.1" +version = "0.12.2" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, + {file = "tomlkit-0.12.2-py3-none-any.whl", hash = "sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0"}, + {file = "tomlkit-0.12.2.tar.gz", hash = "sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977"}, ] [[package]] name = "traitlets" -version = "5.11.2" +version = "5.13.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.11.2-py3-none-any.whl", hash = "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae"}, - {file = "traitlets-5.11.2.tar.gz", hash = "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e"}, + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1740,39 +1670,35 @@ files = [ [[package]] name = "urllib3" -version = "2.0.6" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.6-py3-none-any.whl", hash = "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2"}, - {file = "urllib3-2.0.6.tar.gz", hash = "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.8" +version = "0.2.10" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, - {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, + {file = "wcwidth-0.2.10-py2.py3-none-any.whl", hash = "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f"}, + {file = "wcwidth-0.2.10.tar.gz", hash = "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97"}, ] [[package]] name = "wmctrl" version = "0.5" description = "A tool to programmatically control windows inside X" -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -1788,94 +1714,87 @@ test = ["pytest"] [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1893,4 +1812,4 @@ docs = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "e27efb8dac7868c17c52a77cbd490f1563a85d6546bdf2c415b0affe49c3d14f" +content-hash = "93e2388c42da45e5d6992f46a373404eb94966193b2a1ddb4ad8be498e459d80" diff --git a/pyproject.toml b/pyproject.toml index a8c4bbad..8c1585a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ packages = [{ include = "pineko", from = "src" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" -eko = "^0.13.2" +eko = "^0.14.0" pineappl = "^0.6.2" PyYAML = "^6.0" numpy = "^1.21.0" From 5f6983cf18e8350861e5a26e0e24b0c7c6e3537e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 17:50:03 +0000 Subject: [PATCH 137/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/hadialqattan/pycln: v2.3.0 → v2.4.0](https://github.com/hadialqattan/pycln/compare/v2.3.0...v2.4.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c9ce676..6f413f3b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: - id: check-case-conflict - id: check-ast - repo: https://github.com/hadialqattan/pycln - rev: v2.3.0 + rev: v2.4.0 hooks: - id: pycln args: [--config=pyproject.toml] From dd852d8112fb27a037b8f27a08c2e8c61ac4749b Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Fri, 1 Dec 2023 12:32:37 +0100 Subject: [PATCH 138/165] Correct c and bmatching to be squared --- src/pineko/fonll.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 213de023..aa511c29 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -120,13 +120,13 @@ def update_fk_theorycard(combined_fk, input_theorycard_path): def produce_dampings(theorycard_constituent_fks, fonll_info, damp): """Return the damping factors for each of the relevant masses.""" - cmatching = theorycard_constituent_fks["kcThr"] * theorycard_constituent_fks["mc"] - bmatching = theorycard_constituent_fks["kbThr"] * theorycard_constituent_fks["mb"] + cmatching2 = (theorycard_constituent_fks["kcThr"] * theorycard_constituent_fks["mc"]) **2 + bmatching2 = (theorycard_constituent_fks["kbThr"] * theorycard_constituent_fks["mb"]) **2 q2grid = fonll_info.Q2grid - step_function_charm = (cmatching) ** 2 < q2grid - step_function_bottom = (bmatching) ** 2 < q2grid - damping_factor_charm = (1 - cmatching / q2grid) ** damp[1] - damping_factor_bottom = (1 - bmatching / q2grid) ** damp[1] + step_function_charm = cmatching2 < q2grid + step_function_bottom = bmatching2 < q2grid + damping_factor_charm = (1 - cmatching2 / q2grid) ** damp[1] + damping_factor_bottom = (1 - bmatching2 / q2grid) ** damp[1] damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom return {"mc": damping_factor_charm, "mb": damping_factor_bottom} From eff1fabed8ed9eedd6fa905c469b0af446d09a5c Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Fri, 1 Dec 2023 12:42:13 +0100 Subject: [PATCH 139/165] Add the possibility of damping c and b with different damppower --- src/pineko/cli/fonll.py | 12 +++++++----- src/pineko/fonll.py | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 30a29c98..cd2e936e 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -119,10 +119,12 @@ def subcommand( # Get theory info tcard = theory_card.load(theoryid) - if not "DAMPPOWER" in tcard: - if tcard["DAMP"] != 0: - raise InconsistentInputsError("If DAMP is set, set also DAMPPOWER") - tcard["DAMPPOWER"] = None + if tcard["DAMP"] != 0: + if not "DAMPPOWERC" in tcard or not "DAMPPOWERB" in tcard: + raise InconsistentInputsError("If DAMP is set, set also DAMPPOWERB and DAMPPOWERC") + else: + tcard["DAMPPOWERB"] = None + tcard["DAMPPOWERC"] = None # Getting the paths to the grids grids_name = grids_names(configs.configs["paths"]["ymldb"] / f"{dataset}.yaml") for grid in grids_name: @@ -150,7 +152,7 @@ def subcommand( ) ), theoryid, - damp=(tcard["DAMP"], tcard["DAMPPOWER"]), + damp=(tcard["DAMP"], tcard["DAMPPOWERC"], tcard["DAMPPOWERB"]), cfg=cfg, ) if new_fk_path.exists(): diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index aa511c29..1d7d73f8 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -126,7 +126,7 @@ def produce_dampings(theorycard_constituent_fks, fonll_info, damp): step_function_charm = cmatching2 < q2grid step_function_bottom = bmatching2 < q2grid damping_factor_charm = (1 - cmatching2 / q2grid) ** damp[1] - damping_factor_bottom = (1 - bmatching2 / q2grid) ** damp[1] + damping_factor_bottom = (1 - bmatching2 / q2grid) ** damp[2] damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom return {"mc": damping_factor_charm, "mb": damping_factor_bottom} @@ -162,7 +162,7 @@ def produce_combined_fk( ffns5til, ffns5bar, theoryid, - damp=(0, None), + damp=(0, None, None), cfg=None, ): """Combine the FONLL FK tables into one single FK table.""" From c8cf6f3e36f9dd21b5836da37c3fec5ebb18bc1b Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Fri, 1 Dec 2023 13:02:34 +0100 Subject: [PATCH 140/165] Switch to lower case b and c --- src/pineko/cli/fonll.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index cd2e936e..04939362 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -120,11 +120,11 @@ def subcommand( # Get theory info tcard = theory_card.load(theoryid) if tcard["DAMP"] != 0: - if not "DAMPPOWERC" in tcard or not "DAMPPOWERB" in tcard: - raise InconsistentInputsError("If DAMP is set, set also DAMPPOWERB and DAMPPOWERC") + if not "DAMPPOWERc" in tcard or not "DAMPPOWERb" in tcard: + raise InconsistentInputsError("If DAMP is set, set also DAMPPOWERb and DAMPPOWERc") else: - tcard["DAMPPOWERB"] = None - tcard["DAMPPOWERC"] = None + tcard["DAMPPOWERb"] = None + tcard["DAMPPOWERc"] = None # Getting the paths to the grids grids_name = grids_names(configs.configs["paths"]["ymldb"] / f"{dataset}.yaml") for grid in grids_name: @@ -152,7 +152,7 @@ def subcommand( ) ), theoryid, - damp=(tcard["DAMP"], tcard["DAMPPOWERC"], tcard["DAMPPOWERB"]), + damp=(tcard["DAMP"], tcard["DAMPPOWERc"], tcard["DAMPPOWERb"]), cfg=cfg, ) if new_fk_path.exists(): From 4322c2f7dc8b4edb3b4332d36775ccd26628ce99 Mon Sep 17 00:00:00 2001 From: RoyStegeman Date: Fri, 1 Dec 2023 12:06:21 +0000 Subject: [PATCH 141/165] run pre-commit --- src/pineko/cli/fonll.py | 4 +++- src/pineko/fonll.py | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 04939362..58d45dfe 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -121,7 +121,9 @@ def subcommand( tcard = theory_card.load(theoryid) if tcard["DAMP"] != 0: if not "DAMPPOWERc" in tcard or not "DAMPPOWERb" in tcard: - raise InconsistentInputsError("If DAMP is set, set also DAMPPOWERb and DAMPPOWERc") + raise InconsistentInputsError( + "If DAMP is set, set also DAMPPOWERb and DAMPPOWERc" + ) else: tcard["DAMPPOWERb"] = None tcard["DAMPPOWERc"] = None diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 1d7d73f8..8f0977a7 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -120,8 +120,12 @@ def update_fk_theorycard(combined_fk, input_theorycard_path): def produce_dampings(theorycard_constituent_fks, fonll_info, damp): """Return the damping factors for each of the relevant masses.""" - cmatching2 = (theorycard_constituent_fks["kcThr"] * theorycard_constituent_fks["mc"]) **2 - bmatching2 = (theorycard_constituent_fks["kbThr"] * theorycard_constituent_fks["mb"]) **2 + cmatching2 = ( + theorycard_constituent_fks["kcThr"] * theorycard_constituent_fks["mc"] + ) ** 2 + bmatching2 = ( + theorycard_constituent_fks["kbThr"] * theorycard_constituent_fks["mb"] + ) ** 2 q2grid = fonll_info.Q2grid step_function_charm = cmatching2 < q2grid step_function_bottom = bmatching2 < q2grid From a479aa71d507429175c37f28713b814ad77c1bde Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Fri, 1 Dec 2023 13:57:23 +0100 Subject: [PATCH 142/165] Change to damppowerb and damppowerc --- src/pineko/fonll.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 1d7d73f8..264bdf51 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -118,15 +118,15 @@ def update_fk_theorycard(combined_fk, input_theorycard_path): combined_fk.set_key_value("theory", str(theorycard)) -def produce_dampings(theorycard_constituent_fks, fonll_info, damp): +def produce_dampings(theorycard_constituent_fks, fonll_info, damppowerc, damppowerb): """Return the damping factors for each of the relevant masses.""" cmatching2 = (theorycard_constituent_fks["kcThr"] * theorycard_constituent_fks["mc"]) **2 bmatching2 = (theorycard_constituent_fks["kbThr"] * theorycard_constituent_fks["mb"]) **2 q2grid = fonll_info.Q2grid step_function_charm = cmatching2 < q2grid step_function_bottom = bmatching2 < q2grid - damping_factor_charm = (1 - cmatching2 / q2grid) ** damp[1] - damping_factor_bottom = (1 - bmatching2 / q2grid) ** damp[2] + damping_factor_charm = (1 - cmatching2 / q2grid) ** damppowerc + damping_factor_bottom = (1 - bmatching2 / q2grid) ** damppowerb damping_factor_charm *= step_function_charm damping_factor_bottom *= step_function_bottom return {"mc": damping_factor_charm, "mb": damping_factor_bottom} @@ -174,7 +174,7 @@ def produce_combined_fk( dampings = ( None if damp[0] == 0 - else produce_dampings(theorycard_constituent_fks, fonll_info, damp) + else produce_dampings(theorycard_constituent_fks, fonll_info, damp[1], damp[2]) ) combined_fk = combine(fk_dict, dampings=dampings) input_theorycard_path = ( From 90c075d27ce63e63a77d345af8984c4bb3dcc275 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Fri, 1 Dec 2023 14:58:52 +0100 Subject: [PATCH 143/165] Make sure that with damp:0 we use theta --- src/pineko/cli/fonll.py | 6 +++--- src/pineko/fonll.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 58d45dfe..f41c9ab5 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -119,14 +119,14 @@ def subcommand( # Get theory info tcard = theory_card.load(theoryid) - if tcard["DAMP"] != 0: + if tcard["DAMP"] not in [-1,0]: if not "DAMPPOWERc" in tcard or not "DAMPPOWERb" in tcard: raise InconsistentInputsError( "If DAMP is set, set also DAMPPOWERb and DAMPPOWERc" ) else: - tcard["DAMPPOWERb"] = None - tcard["DAMPPOWERc"] = None + tcard["DAMPPOWERb"] = 0 + tcard["DAMPPOWERc"] = 0 # Getting the paths to the grids grids_name = grids_names(configs.configs["paths"]["ymldb"] / f"{dataset}.yaml") for grid in grids_name: diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 82a07c7f..2d9fb548 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -177,7 +177,7 @@ def produce_combined_fk( fk_dict = fonll_info.fks dampings = ( None - if damp[0] == 0 + if damp[0] == -1 else produce_dampings(theorycard_constituent_fks, fonll_info, damp[1], damp[2]) ) combined_fk = combine(fk_dict, dampings=dampings) From 9ca4990bc919d1b03608855eda3a53fef7501fcf Mon Sep 17 00:00:00 2001 From: Andrea Barontini Date: Fri, 1 Dec 2023 15:07:53 +0100 Subject: [PATCH 144/165] Update src/pineko/cli/fonll.py Co-authored-by: Roy Stegeman --- src/pineko/cli/fonll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index f41c9ab5..becc5cac 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -119,7 +119,7 @@ def subcommand( # Get theory info tcard = theory_card.load(theoryid) - if tcard["DAMP"] not in [-1,0]: + if tcard["DAMP"] == 1: if not "DAMPPOWERc" in tcard or not "DAMPPOWERb" in tcard: raise InconsistentInputsError( "If DAMP is set, set also DAMPPOWERb and DAMPPOWERc" From b131ba5c902e234082605a2d29dd57b9efd4402a Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Mon, 4 Dec 2023 10:51:40 +0200 Subject: [PATCH 145/165] Fix condition to new damping convention --- .pre-commit-config.yaml | 2 +- src/pineko/fonll.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6f413f3b..768746f9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: hooks: - id: pycln args: [--config=pyproject.toml] - - repo: https://github.com/psf/black + - repo: https://github.com/psf/black-pre-commit-mirror rev: 23.11.0 hooks: - id: black diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 2d9fb548..d120d3f1 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -235,7 +235,7 @@ def collect_updates(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" updates = [] is_mixed = fonll_fns in MIXED_ORDER_FNS - is_damped = damp != 0 + is_damped = damp >= 0 base_pto = FNS_BASE_PTO[fonll_fns] cfgs = MIXED_FNS_CONFIG if is_mixed or is_damped else FNS_CONFIG for cfg in cfgs: From 8204c5ca31f9d417fe45cfcc482a77df46360246 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Mon, 4 Dec 2023 11:01:27 +0200 Subject: [PATCH 146/165] Apply linting fixes to fonll.py --- src/pineko/fonll.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index d120d3f1..a4bbb7a2 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -54,17 +54,18 @@ def __init__( "ffns5til": ffns5til, "ffns5bar": ffns5bar, } - actually_existing_paths = [p for p in self.paths if self.paths[p] is not None] + actually_existing_paths = [p for p, g in self.paths.items() if g is not None] for p in self.paths: if p not in actually_existing_paths: logger.warning( - f"Warning! FK table for {p} does not exist and thus is being skipped." + "Warning! FK table for %s does not exist and thus is being skipped.", + p, ) @property def fk_paths(self): """Returns the list of the FK table paths needed to produce FONLL predictions.""" - return {p: Path(self.paths[p]) for p in self.paths if self.paths[p] is not None} + return {p: Path(self.paths[p]) for p, g in self.paths.items() if g is not None} @property def fks(self): @@ -106,8 +107,11 @@ def Q2grid(self): def update_fk_theorycard(combined_fk, input_theorycard_path): - """Update theorycard entries for the combined fktable by reading the yamldb of the original theory.""" - with open(input_theorycard_path) as f: + """Update theorycard entries for the combined FK table. + + Update by reading the yamldb of the original theory. + """ + with open(input_theorycard_path, encoding="utf-8") as f: final_theorycard = yaml.safe_load(f) theorycard = json.loads(combined_fk.key_values()["theory"]) theorycard["FNS"] = final_theorycard["FNS"] @@ -147,8 +151,8 @@ def combine(fk_dict, dampings=None): sign = -1 if fk in FK_WITH_MINUS else 1 fk_dict[fk].scale(sign) if dampings is not None: - for mass in FK_TO_DAMP: - if fk in FK_TO_DAMP[mass]: + for mass, fks in FK_TO_DAMP.items(): + if fk in fks: fk_dict[fk].scale_by_bin(dampings[mass]) fk_dict[fk].write_lz4(tmpfile_path) combined_fk.merge_from_file(tmpfile_path) @@ -260,7 +264,8 @@ def collect_updates(fonll_fns, damp): def dump_tcards(tcard, tcard_parent_path, theoryid): """Produce the seven FONLL theory cards from the original one. - The produced theory cards are dumped in `tcard_parent_path` with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. + The produced theory cards are dumped in `tcard_parent_path` with names + from '{theoryid}00.yaml' to '{theoryid}06.yaml'. """ updates = collect_updates(tcard["FNS"], tcard["DAMP"]) n_theory = len(updates) From 643313bc1707e4f3f6f6349b5a49bfaea49ecc23 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Mon, 4 Dec 2023 12:42:03 +0200 Subject: [PATCH 147/165] Adjust damping conditions --- benchmarks/bench_fonll.py | 1 - src/pineko/fonll.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index 2f2381ff..d59cd258 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -1,4 +1,3 @@ -import numpy as np import pytest import yaml diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index a4bbb7a2..af607f22 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -181,7 +181,7 @@ def produce_combined_fk( fk_dict = fonll_info.fks dampings = ( None - if damp[0] == -1 + if damp[0] < 0 else produce_dampings(theorycard_constituent_fks, fonll_info, damp[1], damp[2]) ) combined_fk = combine(fk_dict, dampings=dampings) @@ -239,7 +239,7 @@ def collect_updates(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" updates = [] is_mixed = fonll_fns in MIXED_ORDER_FNS - is_damped = damp >= 0 + is_damped = damp > 0 base_pto = FNS_BASE_PTO[fonll_fns] cfgs = MIXED_FNS_CONFIG if is_mixed or is_damped else FNS_CONFIG for cfg in cfgs: From 9e72431bad67da7785ff16375a7e1aaf148d0792 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Mon, 4 Dec 2023 14:08:31 +0200 Subject: [PATCH 148/165] Pin damp conditions --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index af607f22..19049a7a 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -181,7 +181,7 @@ def produce_combined_fk( fk_dict = fonll_info.fks dampings = ( None - if damp[0] < 0 + if damp[0] == -1 else produce_dampings(theorycard_constituent_fks, fonll_info, damp[1], damp[2]) ) combined_fk = combine(fk_dict, dampings=dampings) @@ -239,7 +239,7 @@ def collect_updates(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" updates = [] is_mixed = fonll_fns in MIXED_ORDER_FNS - is_damped = damp > 0 + is_damped = damp == 1 base_pto = FNS_BASE_PTO[fonll_fns] cfgs = MIXED_FNS_CONFIG if is_mixed or is_damped else FNS_CONFIG for cfg in cfgs: From 9743282b63482d1753742cd4fc21d4c5afa25bd6 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 5 Dec 2023 11:34:23 +0100 Subject: [PATCH 149/165] Remove completely the possibility of having 5 grids --- src/pineko/cli/fonll.py | 46 ++++++++--------------------------------- src/pineko/fonll.py | 19 +++++++---------- 2 files changed, 16 insertions(+), 49 deletions(-) diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index becc5cac..7a061fa4 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -47,11 +47,9 @@ def grids_names(yaml_file): @click.argument("dataset", type=str) @click.option("--FFNS3", type=int, help="theoryID containing the ffns3 fktable") @click.option("--FFN03", type=int, help="theoryID containing the ffn03 fktable") -@click.option("--FFNS4", type=int, help="theoryID containing the ffns4 fktable") @click.option("--FFNS4til", type=int, help="theoryID containing the ffns4til fktable") @click.option("--FFNS4bar", type=int, help="theoryID containing the ffns4bar fktable") @click.option("--FFN04", type=int, help="theoryID containing the ffn04 fktable") -@click.option("--FFNS5", type=int, help="theoryID containing the ffns5 fktable") @click.option("--FFNS5til", type=int, help="theoryID containing the ffns5til fktable") @click.option("--FFNS5bar", type=int, help="theoryID containing the ffns5bar fktable") @click.option("--overwrite", is_flag=True, help="Allow files to be overwritten") @@ -61,11 +59,9 @@ def subcommand( dataset, ffns3, ffn03, - ffns4, ffns4til, ffns4bar, ffn04, - ffns5, ffns5til, ffns5bar, overwrite, @@ -83,40 +79,18 @@ def subcommand( if not ffns3 or not ffn03: raise InconsistentInputsError("ffns3 and/or ffn03 is not provided.") - if any([ffns4, ffns4til, ffns4bar]): - if ffns4: - if any([ffns4til, ffns4bar]): - raise InconsistentInputsError( - "If ffns4 is provided no ffnstil or ffnsbar should be provided." - ) - else: - if ffns4til is None or ffns4bar is None: - raise InconsistentInputsError( - "if ffnstil is provided also ffnsbar should be provided, and vice versa." - ) - else: - raise InconsistentInputsError("ffns4 is not provided.") - - # Do we consider two masses, i.e. mc and mb - two_masses = False - if any([ffns5, ffns5til, ffns5bar]): - two_masses = True - if ffns5: - if any([ffns5til, ffns5bar]): - raise InconsistentInputsError( - "If ffns5 is provided no ffnstil or ffnsbar should be provided." - ) - else: - if ffns5til is None or ffns5bar is None: - raise InconsistentInputsError( - "if ffnstil is provided also ffnsbar should be provided, and vice versa." - ) - - if (ffn04 is None and two_masses) or (ffn04 is not None and not two_masses): + if ffns4til is None or ffns4bar is None: raise InconsistentInputsError( - "If two masses are to be considered, both ffn04 and the nf=5 coefficient should be provided" + "At least one of ffns4til and ffns4bar should be provided." ) + # Do we consider two masses, i.e. mc and mb + if any([ffns5til, ffns5bar, ffn04]): + if (ffns5til is None and ffns5bar is None) or ffn04 is None: + raise InconsistentInputsError( + "To include nf5 contributions, ffn04 and at least one between ffns5til and ffns5bar are mandatory" + ) + # Get theory info tcard = theory_card.load(theoryid) if tcard["DAMP"] == 1: @@ -144,11 +118,9 @@ def subcommand( for name in ( ffns3, ffn03, - ffns4, ffns4til, ffns4bar, ffn04, - ffns5, ffns5til, ffns5bar, ) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 19049a7a..f4bcd9f1 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -40,17 +40,15 @@ class FONLLInfo: """Class containing all the information for FONLL predictions.""" def __init__( - self, ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar + self, ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar ) -> None: """Initialize fonll info.""" self.paths = { "ffns3": ffns3, "ffn03": ffn03, - "ffns4": ffns4, "ffns4til": ffns4til, "ffns4bar": ffns4bar, "ffn04": ffn04, - "ffns5": ffns5, "ffns5til": ffns5til, "ffns5bar": ffns5bar, } @@ -162,11 +160,9 @@ def combine(fk_dict, dampings=None): def produce_combined_fk( ffns3, ffn03, - ffns4, ffns4til, ffns4bar, ffn04, - ffns5, ffns5til, ffns5bar, theoryid, @@ -174,9 +170,7 @@ def produce_combined_fk( cfg=None, ): """Combine the FONLL FK tables into one single FK table.""" - fonll_info = FONLLInfo( - ffns3, ffn03, ffns4, ffns4til, ffns4bar, ffn04, ffns5, ffns5til, ffns5bar - ) + fonll_info = FONLLInfo(ffns3, ffn03, ffns4til, ffns4bar, ffn04, ffns5til, ffns5bar) theorycard_constituent_fks = fonll_info.theorycard_no_fns_pto fk_dict = fonll_info.fks dampings = ( @@ -228,9 +222,11 @@ def scheme(self): FNS_CONFIG = [ SubTheoryConfig(False, 3, "full"), SubTheoryConfig(True, 3, "full"), - SubTheoryConfig(False, 4, "full"), + SubTheoryConfig(False, 4, "massless"), + SubTheoryConfig(False, 4, "massive"), SubTheoryConfig(True, 4, "full"), - SubTheoryConfig(False, 5, "full"), + SubTheoryConfig(False, 5, "massless"), + SubTheoryConfig(False, 5, "massive"), ] """Plain FONLL schemes.""" @@ -239,9 +235,8 @@ def collect_updates(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" updates = [] is_mixed = fonll_fns in MIXED_ORDER_FNS - is_damped = damp == 1 base_pto = FNS_BASE_PTO[fonll_fns] - cfgs = MIXED_FNS_CONFIG if is_mixed or is_damped else FNS_CONFIG + cfgs = MIXED_FNS_CONFIG if is_mixed else FNS_CONFIG for cfg in cfgs: po = int(base_pto) + (cfg.delta_pto if is_mixed else 0) updates.append( From 91aec0c09c31c53fc6a256fb2a3edc05c39e1c19 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 5 Dec 2023 11:40:51 +0100 Subject: [PATCH 150/165] Correct test_fonll --- tests/test_fonll.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/test_fonll.py b/tests/test_fonll.py index bb947ad1..7a11d08a 100644 --- a/tests/test_fonll.py +++ b/tests/test_fonll.py @@ -7,11 +7,9 @@ def test_FONLLInfo(): full_list = [ "ffns3.pineappl.lz4", "ffn03.pineappl.lz4", - "ffns4.pineappl.lz4", "ffns4til.pineappl.lz4", "ffns4bar.pineappl.lz4", "ffn04.pineappl.lz4", - "ffns5.pineappl.lz4", "ffns5til.pineappl.lz4", "ffns5bar.pineappl.lz4", ] @@ -24,20 +22,16 @@ def test_FONLLInfo(): full_list[4], None, None, - None, - full_list[8], ) partialfonll_fake_info = pineko.fonll.FONLLInfo( - full_list[0], full_list[1], None, full_list[3], None, None, None, None, None + full_list[0], full_list[1], full_list[2], full_list[3], None, None, None ) name_list = [ "ffns3", "ffn03", - "ffns4", "ffns4til", "ffns4bar", "ffn04", - "ffns5", "ffns5til", "ffns5bar", ] @@ -47,14 +41,12 @@ def test_FONLLInfo(): assert wrongfonll_fake_info.fk_paths == { name: pathlib.Path(fk) for name, fk in zip( - name_list[:2] + name_list[3:5] + [name_list[-1]], - full_list[:2] + full_list[3:5] + [full_list[-1]], + name_list[:2] + name_list[3:5], + full_list[:2] + full_list[3:5], ) } assert partialfonll_fake_info.fk_paths == { name: pathlib.Path(fk) - for name, fk in zip( - name_list[:2] + name_list[3:4], full_list[:2] + full_list[3:4] - ) + for name, fk in zip(name_list[:4], full_list[:4]) if fk is not None } From 3d9e7f6122076181863423172affa32997049a52 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 5 Dec 2023 15:44:45 +0100 Subject: [PATCH 151/165] Remove MIXED_FNS_CONFIG --- benchmarks/bench_evolve.py | 2 +- benchmarks/bench_fonll.py | 2 +- src/pineko/fonll.py | 15 ++------------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/benchmarks/bench_evolve.py b/benchmarks/bench_evolve.py index 27dd876a..a11ef73b 100644 --- a/benchmarks/bench_evolve.py +++ b/benchmarks/bench_evolve.py @@ -39,7 +39,7 @@ def benchmark_write_operator_card_from_file_num_fonll( # Check if the opcards are ok for opcard_path, cfg in zip( targets_path_list, - pineko.fonll.MIXED_FNS_CONFIG if is_mixed else pineko.fonll.FNS_CONFIG, + pineko.fonll.FNS_CONFIG, ): with open(opcard_path, encoding="utf-8") as f: ocard = yaml.safe_load(f) diff --git a/benchmarks/bench_fonll.py b/benchmarks/bench_fonll.py index d59cd258..27e81c33 100644 --- a/benchmarks/bench_fonll.py +++ b/benchmarks/bench_fonll.py @@ -18,7 +18,7 @@ def benchmark_produce_fonll_tcards( base_pto = pineko.fonll.FNS_BASE_PTO[tcard["FNS"]] for num_fonll_tcard, cfg in zip( theorycards, - pineko.fonll.MIXED_FNS_CONFIG if is_mixed else pineko.fonll.FNS_CONFIG, + pineko.fonll.FNS_CONFIG, ): po = int(base_pto) + (cfg.delta_pto if is_mixed else 0) assert num_fonll_tcard["FNS"] == cfg.scheme diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index f4bcd9f1..9438aced 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -208,7 +208,7 @@ def scheme(self): return "FONLL-FFN" + ("0" if self.asy else "S") -MIXED_FNS_CONFIG = [ +FNS_CONFIG = [ SubTheoryConfig(False, 3, "full", 1), SubTheoryConfig(True, 3, "full", 1), SubTheoryConfig(False, 4, "massless"), @@ -219,24 +219,13 @@ def scheme(self): ] """Mixed FONLL schemes.""" -FNS_CONFIG = [ - SubTheoryConfig(False, 3, "full"), - SubTheoryConfig(True, 3, "full"), - SubTheoryConfig(False, 4, "massless"), - SubTheoryConfig(False, 4, "massive"), - SubTheoryConfig(True, 4, "full"), - SubTheoryConfig(False, 5, "massless"), - SubTheoryConfig(False, 5, "massive"), -] -"""Plain FONLL schemes.""" - def collect_updates(fonll_fns, damp): """Produce the different theory cards according to which FONLL is asked for.""" updates = [] is_mixed = fonll_fns in MIXED_ORDER_FNS base_pto = FNS_BASE_PTO[fonll_fns] - cfgs = MIXED_FNS_CONFIG if is_mixed else FNS_CONFIG + cfgs = FNS_CONFIG for cfg in cfgs: po = int(base_pto) + (cfg.delta_pto if is_mixed else 0) updates.append( From 7d5ae55a8f21210b64f54d750c90aed85fec5174 Mon Sep 17 00:00:00 2001 From: andreab1997 Date: Tue, 5 Dec 2023 16:09:24 +0100 Subject: [PATCH 152/165] Apply suggestions --- src/pineko/fonll.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pineko/fonll.py b/src/pineko/fonll.py index 9438aced..469e643c 100644 --- a/src/pineko/fonll.py +++ b/src/pineko/fonll.py @@ -220,7 +220,7 @@ def scheme(self): """Mixed FONLL schemes.""" -def collect_updates(fonll_fns, damp): +def collect_updates(fonll_fns): """Produce the different theory cards according to which FONLL is asked for.""" updates = [] is_mixed = fonll_fns in MIXED_ORDER_FNS @@ -251,7 +251,7 @@ def dump_tcards(tcard, tcard_parent_path, theoryid): The produced theory cards are dumped in `tcard_parent_path` with names from '{theoryid}00.yaml' to '{theoryid}06.yaml'. """ - updates = collect_updates(tcard["FNS"], tcard["DAMP"]) + updates = collect_updates(tcard["FNS"]) n_theory = len(updates) theorycards = [copy.deepcopy(tcard) for _ in range(n_theory)] paths_list = [] From fc88fef0f5fec26edf8e29bf153d322bd61f0c54 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 18:01:51 +0000 Subject: [PATCH 153/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pycqa/isort: 5.12.0 → 5.13.0](https://github.com/pycqa/isort/compare/5.12.0...5.13.0) - [github.com/pre-commit/pre-commit: v3.5.0 → v3.6.0](https://github.com/pre-commit/pre-commit/compare/v3.5.0...v3.6.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 768746f9..0570fef6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: hooks: - id: blacken-docs - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.0 hooks: - id: isort args: ["--profile", "black"] @@ -45,6 +45,6 @@ repos: additional_dependencies: - toml - repo: https://github.com/pre-commit/pre-commit - rev: v3.5.0 + rev: v3.6.0 hooks: - id: validate_manifest From 2f0f52efca1d0532ee9db1e0b892a86319af79ea Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 14 Dec 2023 15:31:42 +0200 Subject: [PATCH 154/165] Add N3LO ren SV --- src/pineko/scale_variations.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/pineko/scale_variations.py b/src/pineko/scale_variations.py index adea5518..c355b346 100644 --- a/src/pineko/scale_variations.py +++ b/src/pineko/scale_variations.py @@ -51,16 +51,32 @@ def ren_sv_coeffs(m, max_as, logpart, which_part, nf): float renormalization scale variation contribution """ - bcoeff = beta.beta_qcd((max_as - logpart - which_part + 2, 0), nf) - as_normalization = AS_NORM ** (max_as - which_part) + # nothing to do? if max_as == 0: return 0.0 - if max_as == 2: - if which_part > 0: - m += 1 - elif logpart > 1: - m = 0.5 * m * (m + 1) - return m * as_normalization * bcoeff + # eko uses as = alpha_s/(4pi), but pineappl just alpha_s + as_normalization = AS_NORM ** (max_as - which_part) + # the coefficients can be found in the NNLO MHOU paper + # (which also contains a generating MMa script) + beta0 = beta.beta_qcd_as2(nf) + beta1 = beta.beta_qcd_as3(nf) + beta2 = beta.beta_qcd_as4(nf) + ren_coeffs = { + # NLO + (1, 1, 0): m * beta0, + # NNLO + (2, 1, 1): (m + 1) * beta0, + (2, 1, 0): (m + 0) * beta1, + (2, 2, 0): m * (m + 1) / 2.0 * beta0**2, + # N3LO + (3, 1, 2): (m + 2) * beta0, + (3, 1, 1): (m + 1) * beta1, + (3, 1, 0): (m + 0) * beta2, + (3, 2, 1): (m + 1) * (m + 2) / 2.0 * beta0**2, + (3, 2, 0): m * (2 * m + 3) / 2.0 * beta0 * beta1, + (3, 3, 0): m * (m + 1) * (m + 2) / 6 * beta0**2, + } + return as_normalization * ren_coeffs[(max_as, logpart, which_part)] def requirements(m: int, max_as: int, al: int) -> Dict[OrderTuple, List[OrderTuple]]: From f52db38d587d1422e8a5c488ec3c4426d3314577 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 14 Dec 2023 16:08:00 +0200 Subject: [PATCH 155/165] Update src/pineko/scale_variations.py Co-authored-by: Giacomo Magni <39065935+giacomomagni@users.noreply.github.com> --- src/pineko/scale_variations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pineko/scale_variations.py b/src/pineko/scale_variations.py index c355b346..1947cb84 100644 --- a/src/pineko/scale_variations.py +++ b/src/pineko/scale_variations.py @@ -74,7 +74,7 @@ def ren_sv_coeffs(m, max_as, logpart, which_part, nf): (3, 1, 0): (m + 0) * beta2, (3, 2, 1): (m + 1) * (m + 2) / 2.0 * beta0**2, (3, 2, 0): m * (2 * m + 3) / 2.0 * beta0 * beta1, - (3, 3, 0): m * (m + 1) * (m + 2) / 6 * beta0**2, + (3, 3, 0): m * (m + 1) * (m + 2) / 6 * beta0**3, } return as_normalization * ren_coeffs[(max_as, logpart, which_part)] From 5726f35e1c450c749097da92cc458e15b597d97f Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 14 Dec 2023 16:58:37 +0200 Subject: [PATCH 156/165] Add more unit tests for ren_sv_coeffs --- tests/test_scale_variations.py | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_scale_variations.py b/tests/test_scale_variations.py index d40a62b3..e72c1d10 100644 --- a/tests/test_scale_variations.py +++ b/tests/test_scale_variations.py @@ -29,6 +29,42 @@ def test_ren_sv_coeffs(): scale_variations.ren_sv_coeffs(m=0, max_as=2, logpart=2, which_part=0, nf=5), 0.0, ) + # check all coeff are set + for m in (0, 1, 10): + for max_as in range(1, 3 + 1): + for logpart in range(1, max_as + 1): + for which_part in range(0, max_as - logpart + 1): + for nf in (4, 5): + c = scale_variations.ren_sv_coeffs( + m=m, + max_as=max_as, + logpart=logpart, + which_part=which_part, + nf=nf, + ) + assert np.isfinite(c) + if which_part > 0 and not m == 0: + assert c > 0.0 + else: + assert c >= 0.0 + # due to the exponential structure we can predict some things: + for nf in (4, 5): + # the highest log is always proportional beta0^k + for k in range(1, 3 + 1): + c = scale_variations.ren_sv_coeffs( + m=1, max_as=k, logpart=k, which_part=0, nf=nf + ) + bare_c = c * (4.0 * np.pi / beta_qcd((2, 0), nf)) ** k + int_c = bare_c * np.math.factorial(k) + np.testing.assert_allclose(int_c, int(int_c)) + # and even the second highest for the highest coeff + for k in range(2, 3 + 1): + c = scale_variations.ren_sv_coeffs( + m=1, max_as=k, logpart=k - 1, which_part=1, nf=nf + ) + bare_c = c * (4.0 * np.pi / beta_qcd((2, 0), nf)) ** (k - 1) + int_c = bare_c * np.math.factorial(k) + np.testing.assert_allclose(int_c, int(int_c)) def test_requirements(): From f653ee289edcb98222b7e76572dac2d3465c2e08 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Fri, 15 Dec 2023 10:37:29 +0200 Subject: [PATCH 157/165] Sharpen test_ren_sv_coeffs --- tests/test_scale_variations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_scale_variations.py b/tests/test_scale_variations.py index e72c1d10..1742ac1e 100644 --- a/tests/test_scale_variations.py +++ b/tests/test_scale_variations.py @@ -43,7 +43,7 @@ def test_ren_sv_coeffs(): nf=nf, ) assert np.isfinite(c) - if which_part > 0 and not m == 0: + if which_part > 0 or m > 0: assert c > 0.0 else: assert c >= 0.0 From d1440b76d3acef1f1984167a493dfd2624679208 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Fri, 15 Dec 2023 12:31:55 +0100 Subject: [PATCH 158/165] fix mu0 accordying to Q0 --- src/pineko/evolve.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 70796f50..85ce4e2d 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -119,7 +119,10 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): operators_card = copy.deepcopy(default_card) sv_method = sv_scheme(tcard) xif = 1.0 if sv_method is not None else tcard["XIF"] + # update scale variation method operators_card["configs"]["scvar_method"] = sv_method + # update initial scale mu0 + operators_card["mu0"] = tcard["Q0"] q2_grid = (xif * xif * muf2_grid).tolist() masses = np.array([tcard["mc"], tcard["mb"], tcard["mt"]]) ** 2 thresholds_ratios = np.array([tcard["kcThr"], tcard["kbThr"], tcard["ktThr"]]) ** 2 From 8a876213e04b7509742e83d8865edb27d0a1a024 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Fri, 15 Dec 2023 14:25:29 +0200 Subject: [PATCH 159/165] Add unit test for #146 --- poetry.lock | 653 ++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + src/pineko/evolve.py | 3 +- tests/test_evolve.py | 53 ++++ 4 files changed, 697 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9dd41ae1..693b3810 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -11,6 +11,17 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "appnope" version = "0.1.3" @@ -105,6 +116,29 @@ files = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] +[[package]] +name = "banana-hep" +version = "0.6.11" +description = "Benchmark QCD physics" +optional = false +python-versions = ">=3.8.0,<3.12" +files = [ + {file = "banana_hep-0.6.11-py3-none-any.whl", hash = "sha256:5eed795c5e9b2cdcb93a49df1180832a43cabfa7a4703e7dcb7ed26c3a897e4f"}, + {file = "banana_hep-0.6.11.tar.gz", hash = "sha256:e1e7f4af2f64ca17c9992ab3a4fc857fb43fbb316a3e781156d465f1ddea452d"}, +] + +[package.dependencies] +appdirs = ">=1.4.4,<2.0.0" +click = ">=8.0.3,<9.0.0" +ipython = ">=8.1.0,<9.0.0" +matplotlib = ">=3.5.1,<4.0.0" +numpy = ">=1.21.0,<2.0.0" +pandas = ">=1.3.5,<2.0.0" +pendulum = ">=2.1.2,<3.0.0" +PyYAML = ">=6.0,<7.0" +rich = ">=12.4.4,<13.0.0" +SQLAlchemy = ">=1.4.29,<2.0.0" + [[package]] name = "certifi" version = "2023.7.22" @@ -254,6 +288,77 @@ files = [ [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] +[[package]] +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + [[package]] name = "coverage" version = "7.3.2" @@ -321,6 +426,21 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "decorator" version = "5.1.1" @@ -422,6 +542,142 @@ files = [ pyreadline = {version = "*", markers = "platform_system == \"Windows\""} pyrepl = ">=0.8.2" +[[package]] +name = "fonttools" +version = "4.46.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, + {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, + {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, + {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, + {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, + {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, + {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, + {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, + {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, + {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, + {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, + {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, + {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "greenlet" +version = "3.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4"}, + {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493"}, + {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b"}, + {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773"}, + {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc"}, + {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309"}, + {file = "greenlet-3.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73"}, + {file = "greenlet-3.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51"}, + {file = "greenlet-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206"}, + {file = "greenlet-3.0.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d"}, + {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196"}, + {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa"}, + {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e"}, + {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138"}, + {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46"}, + {file = "greenlet-3.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea"}, + {file = "greenlet-3.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1"}, + {file = "greenlet-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764"}, + {file = "greenlet-3.0.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66"}, + {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144"}, + {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6"}, + {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9"}, + {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227"}, + {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d"}, + {file = "greenlet-3.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377"}, + {file = "greenlet-3.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c"}, + {file = "greenlet-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251"}, + {file = "greenlet-3.0.2-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d"}, + {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c"}, + {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397"}, + {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76"}, + {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef"}, + {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813"}, + {file = "greenlet-3.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650"}, + {file = "greenlet-3.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836"}, + {file = "greenlet-3.0.2-cp37-cp37m-win32.whl", hash = "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30"}, + {file = "greenlet-3.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a"}, + {file = "greenlet-3.0.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0"}, + {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88"}, + {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49"}, + {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495"}, + {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965"}, + {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3"}, + {file = "greenlet-3.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b"}, + {file = "greenlet-3.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd"}, + {file = "greenlet-3.0.2-cp38-cp38-win32.whl", hash = "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6"}, + {file = "greenlet-3.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4"}, + {file = "greenlet-3.0.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa"}, + {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3"}, + {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4"}, + {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a"}, + {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90"}, + {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765"}, + {file = "greenlet-3.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9"}, + {file = "greenlet-3.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8"}, + {file = "greenlet-3.0.2-cp39-cp39-win32.whl", hash = "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590"}, + {file = "greenlet-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0"}, + {file = "greenlet-3.0.2.tar.gz", hash = "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc"}, +] + +[package.extras] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] + [[package]] name = "idna" version = "3.4" @@ -463,6 +719,24 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -566,6 +840,119 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + [[package]] name = "latexcodec" version = "2.0.1" @@ -766,6 +1153,74 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "matplotlib" +version = "3.7.4" +description = "Python plotting package" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:b71079239bd866bf56df023e5146de159cb0c7294e508830901f4d79e2d89385"}, + {file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bf91a42f6274a64cb41189120b620c02e574535ff6671fa836cade7701b06fbd"}, + {file = "matplotlib-3.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f757e8b42841d6add0cb69b42497667f0d25a404dcd50bd923ec9904e38414c4"}, + {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dfee00aa4bd291e08bb9461831c26ce0da85ca9781bb8794f2025c6e925281"}, + {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3640f33632beb3993b698b1be9d1c262b742761d6101f3c27b87b2185d25c875"}, + {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff539c4a17ecdf076ed808ee271ffae4a30dcb7e157b99ccae2c837262c07db6"}, + {file = "matplotlib-3.7.4-cp310-cp310-win32.whl", hash = "sha256:24b8f28af3e766195c09b780b15aa9f6710192b415ae7866b9c03dee7ec86370"}, + {file = "matplotlib-3.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fa193286712c3b6c3cfa5fe8a6bb563f8c52cc750006c782296e0807ce5e799"}, + {file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:b167f54cb4654b210c9624ec7b54e2b3b8de68c93a14668937e7e53df60770ec"}, + {file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7dfe6821f1944cb35603ff22e21510941bbcce7ccf96095beffaac890d39ce77"}, + {file = "matplotlib-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3c557d9165320dff3c5f2bb99bfa0b6813d3e626423ff71c40d6bc23b83c3339"}, + {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08372696b3bb45c563472a552a705bfa0942f0a8ffe084db8a4e8f9153fbdf9d"}, + {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81e1a7ac818000e8ac3ca696c3fdc501bc2d3adc89005e7b4e22ee5e9d51de98"}, + {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390920a3949906bc4b0216198d378f2a640c36c622e3584dd0c79a7c59ae9f50"}, + {file = "matplotlib-3.7.4-cp311-cp311-win32.whl", hash = "sha256:62e094d8da26294634da9e7f1856beee3978752b1b530c8e1763d2faed60cc10"}, + {file = "matplotlib-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:f8fc2df756105784e650605e024d36dc2d048d68e5c1b26df97ee25d1bd41f9f"}, + {file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:568574756127791903604e315c11aef9f255151e4cfe20ec603a70f9dda8e259"}, + {file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7d479aac338195e2199a8cfc03c4f2f55914e6a120177edae79e0340a6406457"}, + {file = "matplotlib-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32183d4be84189a4c52b4b8861434d427d9118db2cec32986f98ed6c02dcfbb6"}, + {file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0037d066cca1f4bda626c507cddeb6f7da8283bc6a214da2db13ff2162933c52"}, + {file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44856632ebce88abd8efdc0a0dceec600418dcac06b72ae77af0019d260aa243"}, + {file = "matplotlib-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:632fc938c22117d4241411191cfb88ac264a4c0a9ac702244641ddf30f0d739c"}, + {file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:ce163be048613b9d1962273708cc97e09ca05d37312e670d166cf332b80bbaff"}, + {file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e680f49bb8052ba3b2698e370155d2b4afb49f9af1cc611a26579d5981e2852a"}, + {file = "matplotlib-3.7.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0604880e4327114054199108b7390f987f4f40ee5ce728985836889e11a780ba"}, + {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1e6abcde6fc52475f9d6a12b9f1792aee171ce7818ef6df5d61cb0b82816e6e8"}, + {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f59a70e2ec3212033ef6633ed07682da03f5249379722512a3a2a26a7d9a738e"}, + {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a9981b2a2dd9da06eca4ab5855d09b54b8ce7377c3e0e3957767b83219d652d"}, + {file = "matplotlib-3.7.4-cp38-cp38-win32.whl", hash = "sha256:83859ac26839660ecd164ee8311272074250b915ac300f9b2eccc84410f8953b"}, + {file = "matplotlib-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:7a7709796ac59fe8debde68272388be6ed449c8971362eb5b60d280eac8dadde"}, + {file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:b1d70bc1ea1bf110bec64f4578de3e14947909a8887df4c1fd44492eca487955"}, + {file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c83f49e795a5de6c168876eea723f5b88355202f9603c55977f5356213aa8280"}, + {file = "matplotlib-3.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c9133f230945fe10652eb33e43642e933896194ef6a4f8d5e79bb722bdb2000"}, + {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798ff59022eeb276380ce9a73ba35d13c3d1499ab9b73d194fd07f1b0a41c304"}, + {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1707b20b25e90538c2ce8d4409e30f0ef1df4017cc65ad0439633492a973635b"}, + {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e6227ca8492baeef873cdd8e169a318efb5c3a25ce94e69727e7f964995b0b1"}, + {file = "matplotlib-3.7.4-cp39-cp39-win32.whl", hash = "sha256:5661c8639aded7d1bbf781373a359011cb1dd09199dee49043e9e68dd16f07ba"}, + {file = "matplotlib-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:55eec941a4743f0bd3e5b8ee180e36b7ea8e62f867bf2613937c9f01b9ac06a2"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ab16868714e5cc90ec8f7ff5d83d23bcd6559224d8e9cb5227c9f58748889fe8"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c698b33f9a3f0b127a8e614c8fb4087563bb3caa9c9d95298722fa2400cdd3f"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be3493bbcb4d255cb71de1f9050ac71682fce21a56089eadbcc8e21784cb12ee"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f8c725d1dd2901b2e7ec6cd64165e00da2978cc23d4143cb9ef745bec88e6b04"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:286332f8f45f8ffde2d2119b9fdd42153dccd5025fa9f451b4a3b5c086e26da5"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:116ef0b43aa00ff69260b4cce39c571e4b8c6f893795b708303fa27d9b9d7548"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90590d4b46458677d80bc3218f3f1ac11fc122baa9134e0cb5b3e8fc3714052"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de7c07069687be64fd9d119da3122ba13a8d399eccd3f844815f0dc78a870b2c"}, + {file = "matplotlib-3.7.4.tar.gz", hash = "sha256:7cd4fef8187d1dd0d9dcfdbaa06ac326d396fb8c71c647129f0bf56835d77026"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.20,<2" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + [[package]] name = "matplotlib-inline" version = "0.1.6" @@ -960,6 +1415,40 @@ wmctrl = "*" funcsigs = ["funcsigs"] testing = ["funcsigs", "pytest"] +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + [[package]] name = "pexpect" version = "4.8.0" @@ -985,6 +1474,73 @@ files = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] +[[package]] +name = "pillow" +version = "10.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "pineappl" version = "0.6.2" @@ -1169,6 +1725,20 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyreadline" version = "2.1" @@ -1267,6 +1837,17 @@ files = [ {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -1279,7 +1860,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1287,15 +1867,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1312,7 +1885,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1320,7 +1892,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1601,6 +2172,64 @@ files = [ lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] +[[package]] +name = "sqlalchemy" +version = "1.4.50" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00665725063692c42badfd521d0c4392e83c6c826795d38eb88fb108e5660e5"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85292ff52ddf85a39367057c3d7968a12ee1fb84565331a36a8fead346f08796"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0fed0f791d78e7767c2db28d34068649dfeea027b83ed18c45a423f741425cb"}, + {file = "SQLAlchemy-1.4.50-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db4db3c08ffbb18582f856545f058a7a5e4ab6f17f75795ca90b3c38ee0a8ba4"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14b0cacdc8a4759a1e1bd47dc3ee3f5db997129eb091330beda1da5a0e9e5bd7"}, + {file = "SQLAlchemy-1.4.50-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fb9cb60e0f33040e4f4681e6658a7eb03b5cb4643284172f91410d8c493dace"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cb501d585aa74a0f86d0ea6263b9c5e1d1463f8f9071392477fd401bd3c7cc"}, + {file = "SQLAlchemy-1.4.50-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7a66297e46f85a04d68981917c75723e377d2e0599d15fbe7a56abed5e2d75"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1db0221cb26d66294f4ca18c533e427211673ab86c1fbaca8d6d9ff78654293"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7dbe6369677a2bea68fe9812c6e4bbca06ebfa4b5cde257b2b0bf208709131"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a9bddb60566dc45c57fd0a5e14dd2d9e5f106d2241e0a2dc0c1da144f9444516"}, + {file = "SQLAlchemy-1.4.50-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82dd4131d88395df7c318eeeef367ec768c2a6fe5bd69423f7720c4edb79473c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:273505fcad22e58cc67329cefab2e436006fc68e3c5423056ee0513e6523268a"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3257a6e09626d32b28a0c5b4f1a97bced585e319cfa90b417f9ab0f6145c33c"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d69738d582e3a24125f0c246ed8d712b03bd21e148268421e4a4d09c34f521a5"}, + {file = "SQLAlchemy-1.4.50-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1c5d9cd3e6bf3d1ce56971c62a40c06bfc02861728f368dcfec8aeedb2814"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1fcee5a2c859eecb4ed179edac5ffbc7c84ab09a5420219078ccc6edda45436"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbaf6643a604aa17e7a7afd74f665f9db882df5c297bdd86c38368f2c471f37d"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e70e0673d7d12fa6cd363453a0d22dac0d9978500aa6b46aa96e22690a55eab"}, + {file = "SQLAlchemy-1.4.50-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b881ac07d15fb3e4f68c5a67aa5cdaf9eb8f09eb5545aaf4b0a5f5f4659be18"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6997da81114daef9203d30aabfa6b218a577fc2bd797c795c9c88c9eb78d49"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdb77e1789e7596b77fd48d99ec1d2108c3349abd20227eea0d48d3f8cf398d9"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:128a948bd40780667114b0297e2cc6d657b71effa942e0a368d8cc24293febb3"}, + {file = "SQLAlchemy-1.4.50-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d526aeea1bd6a442abc7c9b4b00386fd70253b80d54a0930c0a216230a35be"}, + {file = "SQLAlchemy-1.4.50.tar.gz", hash = "sha256:3b97ddf509fc21e10b09403b5219b06c5b558b27fc2453150274fa4e70707dbf"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + [[package]] name = "stack-data" version = "0.6.3" @@ -1812,4 +2441,4 @@ docs = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "93e2388c42da45e5d6992f46a373404eb94966193b2a1ddb4ad8be498e459d80" +content-hash = "228ac88f59802aebbb013c2a702d4e3c2cf674fc2c0511e35ecbdd0d901eddb9" diff --git a/pyproject.toml b/pyproject.toml index 8c1585a3..83e6777b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ pytest = "^7.1.3" pytest-cov = "^4.0.0" pytest-env = "^0.6.2" pylint = "^2.11.1" +banana-hep = "^0.6.11" [tool.poetry.group.dev.dependencies] pdbpp = "^0.10.3" diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 85ce4e2d..ca4dd52e 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -162,7 +162,8 @@ def write_operator_card(pineappl_grid, default_card, card_path, tcard): and operators_card["configs"]["ev_op_iterations"] > 1 ): logger.warning( - "Warning! You are setting evolution_method=truncated with ev_op_iterations>1, are you sure that's what you want? " + "Warning! You are setting evolution_method=truncated with ev_op_iterations>1," + "are you sure that's what you want?" ) with open(card_path, "w", encoding="UTF-8") as f: diff --git a/tests/test_evolve.py b/tests/test_evolve.py index b881280a..51621062 100644 --- a/tests/test_evolve.py +++ b/tests/test_evolve.py @@ -1,4 +1,11 @@ +import copy + +import numpy as np +import pineappl import pytest +import yaml +from banana.data.theories import default_card +from ekobox.cards import example import pineko.evolve @@ -16,3 +23,49 @@ def test_sv_scheme(): assert pineko.evolve.sv_scheme(schemeA_tcard) == "exponentiated" assert pineko.evolve.sv_scheme(schemeB_tcard) == "expanded" assert pineko.evolve.sv_scheme(schemeC_tcard) is None + + +class FakeEvolInfo: + x1 = [0.1, 1.0] + fac1 = np.array([10.0]) + + +class FakePine: + _evolve_info = FakeEvolInfo() + + def orders(self): + return [pineappl.grid.Order(0, 0, 0, 0)] + + def lumi(self): + return [[(21, 21, 1)]] + + def evolve_info(self, _): + return self._evolve_info + + def key_values(self): + return {} + + +def test_write_operator_card_q0(tmp_path): + """Checks https://github.com/NNPDF/pineko/issues/146""" + p = tmp_path / "q0.yaml" + g = FakePine() + # 1. defaults + t = copy.deepcopy(default_card) + o = copy.deepcopy(example.raw_operator()) + _xs, _mu2s = pineko.evolve.write_operator_card(g, o, p, t) + with open(p, encoding="utf8") as f: + oo = yaml.safe_load(f) + np.testing.assert_allclose(oo["mu0"], t["Q0"]) + # 2. overwriting from theory side + t["Q0"] = 10.0 + _xs, _mu2s = pineko.evolve.write_operator_card(g, o, p, t) + with open(p, encoding="utf8") as f: + oo = yaml.safe_load(f) + np.testing.assert_allclose(oo["mu0"], t["Q0"]) + # 3. op template is ignored + o["mu0"] = 11.0 + _xs, _mu2s = pineko.evolve.write_operator_card(g, o, p, t) + with open(p, encoding="utf8") as f: + oo = yaml.safe_load(f) + np.testing.assert_allclose(oo["mu0"], t["Q0"]) From 5ccf84c69f4994f78a1947e8a26854eb694b1fe2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 18:03:39 +0000 Subject: [PATCH 160/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 23.11.0 → 23.12.0](https://github.com/psf/black-pre-commit-mirror/compare/23.11.0...23.12.0) - [github.com/pycqa/isort: 5.13.0 → 5.13.2](https://github.com/pycqa/isort/compare/5.13.0...5.13.2) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0570fef6..00ec6d6a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: - id: pycln args: [--config=pyproject.toml] - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.11.0 + rev: 23.12.0 hooks: - id: black - repo: https://github.com/asottile/blacken-docs @@ -29,7 +29,7 @@ repos: hooks: - id: blacken-docs - repo: https://github.com/pycqa/isort - rev: 5.13.0 + rev: 5.13.2 hooks: - id: isort args: ["--profile", "black"] From 55e1428044eaa9b8428aa851b16386b9e2290dea Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Dec 2023 17:59:02 +0000 Subject: [PATCH 161/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 23.12.0 → 23.12.1](https://github.com/psf/black-pre-commit-mirror/compare/23.12.0...23.12.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 00ec6d6a..69d52d12 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: - id: pycln args: [--config=pyproject.toml] - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.12.0 + rev: 23.12.1 hooks: - id: black - repo: https://github.com/asottile/blacken-docs From 6f3e8f6249dc081859b7b16a5cede17c20391fae Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:55:35 +0000 Subject: [PATCH 162/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black-pre-commit-mirror: 23.12.1 → 24.1.1](https://github.com/psf/black-pre-commit-mirror/compare/23.12.1...24.1.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 69d52d12..04d73887 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: - id: pycln args: [--config=pyproject.toml] - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.12.1 + rev: 24.1.1 hooks: - id: black - repo: https://github.com/asottile/blacken-docs From ac11ea909ef30ded7a9ffd92f3a884c84b39be57 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:56:29 +0000 Subject: [PATCH 163/165] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- benchmarks/bench_regression.py | 1 + src/pineko/__init__.py | 1 + src/pineko/check.py | 1 + src/pineko/cli/__init__.py | 1 + src/pineko/cli/check.py | 1 + src/pineko/cli/compare.py | 1 + src/pineko/cli/convolute.py | 1 + src/pineko/cli/fonll.py | 1 + src/pineko/cli/opcard.py | 1 + src/pineko/cli/scaffold.py | 1 + src/pineko/cli/theory_.py | 1 + src/pineko/configs.py | 1 + src/pineko/ekompatibility.py | 1 + src/pineko/evolve.py | 1 + src/pineko/kfactor.py | 1 + src/pineko/parser.py | 1 + src/pineko/scale_variations.py | 1 + src/pineko/theory.py | 1 + src/pineko/theory_card.py | 1 + src/pineko/version.py | 1 + 20 files changed, 20 insertions(+) diff --git a/benchmarks/bench_regression.py b/benchmarks/bench_regression.py index a0b77e16..be02e5b2 100644 --- a/benchmarks/bench_regression.py +++ b/benchmarks/bench_regression.py @@ -6,6 +6,7 @@ are downloaded from https://github.com/NNPDF/theories during this test so this tests has the double effect of ensuring compatibility between both repositories. """ + import itertools from pathlib import Path from subprocess import run diff --git a/src/pineko/__init__.py b/src/pineko/__init__.py index 884fc4b9..810f72a2 100644 --- a/src/pineko/__init__.py +++ b/src/pineko/__init__.py @@ -1,3 +1,4 @@ """pineko = PineAPPL + EKO.""" + from .cli import command from .version import __version__ diff --git a/src/pineko/check.py b/src/pineko/check.py index 8f03a3ae..67f0add2 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -1,4 +1,5 @@ """Tools to check compatibility of EKO and grid.""" + from dataclasses import dataclass from enum import Enum, auto from typing import Tuple diff --git a/src/pineko/cli/__init__.py b/src/pineko/cli/__init__.py index 6b04f67a..58491a44 100644 --- a/src/pineko/cli/__init__.py +++ b/src/pineko/cli/__init__.py @@ -1,4 +1,5 @@ """CLI entry point.""" + from . import ( check, compare, diff --git a/src/pineko/cli/check.py b/src/pineko/cli/check.py index d6723387..a515c017 100644 --- a/src/pineko/cli/check.py +++ b/src/pineko/cli/check.py @@ -1,4 +1,5 @@ """CLI entry point to check compatibility.""" + from dataclasses import dataclass from enum import Enum diff --git a/src/pineko/cli/compare.py b/src/pineko/cli/compare.py index 6d539cf9..6a85e2c9 100644 --- a/src/pineko/cli/compare.py +++ b/src/pineko/cli/compare.py @@ -1,4 +1,5 @@ """CLI entry point to comparison grid vs. FK Table.""" + import click import pineappl import rich diff --git a/src/pineko/cli/convolute.py b/src/pineko/cli/convolute.py index 958a71a6..9b1da64f 100644 --- a/src/pineko/cli/convolute.py +++ b/src/pineko/cli/convolute.py @@ -1,4 +1,5 @@ """CLI entry point to convolution.""" + import click import eko import pineappl diff --git a/src/pineko/cli/fonll.py b/src/pineko/cli/fonll.py index 7a061fa4..66368c85 100644 --- a/src/pineko/cli/fonll.py +++ b/src/pineko/cli/fonll.py @@ -1,4 +1,5 @@ """CLI entry point to FONLL.""" + import pathlib import click diff --git a/src/pineko/cli/opcard.py b/src/pineko/cli/opcard.py index e7fc51c5..7fa95494 100644 --- a/src/pineko/cli/opcard.py +++ b/src/pineko/cli/opcard.py @@ -1,4 +1,5 @@ """CLI entry point to the operator card generation.""" + import pathlib import click diff --git a/src/pineko/cli/scaffold.py b/src/pineko/cli/scaffold.py index bfcff335..c415a9c3 100644 --- a/src/pineko/cli/scaffold.py +++ b/src/pineko/cli/scaffold.py @@ -1,4 +1,5 @@ """'scaffold' mode of CLI.""" + import pathlib import click diff --git a/src/pineko/cli/theory_.py b/src/pineko/cli/theory_.py index 76dba8e2..d25c254d 100644 --- a/src/pineko/cli/theory_.py +++ b/src/pineko/cli/theory_.py @@ -1,4 +1,5 @@ """'theory' mode of CLI.""" + import pathlib import click diff --git a/src/pineko/configs.py b/src/pineko/configs.py index 750272ad..99ff0e96 100644 --- a/src/pineko/configs.py +++ b/src/pineko/configs.py @@ -1,4 +1,5 @@ """Tools related to the configuration file handling.""" + import copy import pathlib diff --git a/src/pineko/ekompatibility.py b/src/pineko/ekompatibility.py index e2fe7e0c..028c2498 100644 --- a/src/pineko/ekompatibility.py +++ b/src/pineko/ekompatibility.py @@ -1,4 +1,5 @@ """Compatibility layer for EKO migration.""" + from typing import Any, Dict from eko import EKO, basis_rotation diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index ca4dd52e..8519ba35 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -1,4 +1,5 @@ """Tools related to evolution/eko.""" + import copy import logging import os diff --git a/src/pineko/kfactor.py b/src/pineko/kfactor.py index 46dfc09b..214b8eef 100644 --- a/src/pineko/kfactor.py +++ b/src/pineko/kfactor.py @@ -1,4 +1,5 @@ """Module to include QCD K-factors in grids.""" + import io import numpy as np diff --git a/src/pineko/parser.py b/src/pineko/parser.py index 43cb8e84..f8fb23a1 100644 --- a/src/pineko/parser.py +++ b/src/pineko/parser.py @@ -1,4 +1,5 @@ """Interface to ymldb.""" + # ATTENTION: this is a partial copy from # https://github.com/NNPDF/nnpdf/blob/7cb96fc05ca2a2914bc1ccc864865e0ca4e66983/validphys2/src/validphys/pineparser.py diff --git a/src/pineko/scale_variations.py b/src/pineko/scale_variations.py index 1947cb84..75c65cc4 100644 --- a/src/pineko/scale_variations.py +++ b/src/pineko/scale_variations.py @@ -1,4 +1,5 @@ """Module to generate scale variations.""" + import pathlib from enum import Enum from typing import Dict, List, Optional, Tuple diff --git a/src/pineko/theory.py b/src/pineko/theory.py index d7ed3cfb..06411a99 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -5,6 +5,7 @@ together with other theory ingredients (such as C-factors) are often commonly referred to as 'theory'. """ + import logging import time diff --git a/src/pineko/theory_card.py b/src/pineko/theory_card.py index 3e0f3eda..931a29fc 100644 --- a/src/pineko/theory_card.py +++ b/src/pineko/theory_card.py @@ -1,4 +1,5 @@ """Tools related to theory cards.""" + import pathlib from typing import Any, Dict diff --git a/src/pineko/version.py b/src/pineko/version.py index 78b62be9..67510dbe 100644 --- a/src/pineko/version.py +++ b/src/pineko/version.py @@ -1,2 +1,3 @@ """Version information.""" + __version__ = "0.0.0" From 916bf030e9101f18bb104ce73e3fad4e3b4ddeb2 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Tue, 30 Jan 2024 13:03:46 +0200 Subject: [PATCH 164/165] Use eko.runner.managed.solve --- src/pineko/theory.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 06411a99..bd76c3cd 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -15,6 +15,7 @@ import pineappl import rich import yaml +from eko.runner.managed import solve from . import check, configs, evolve, parser, scale_variations, theory_card @@ -331,7 +332,7 @@ def eko(self, name, _grid, tcard): logger.info("Start computation of %s", name) start_time = time.perf_counter() # Actual computation of the EKO - eko.runner.solve(new_theory, new_op, eko_filename) + solve(new_theory, new_op, eko_filename) logger.info( "Finished computation of %s - took %f s", name, @@ -408,7 +409,7 @@ def fk(self, name, grid_path, tcard, pdf): ).size == 0 ): - rich.print(f"[green] Skipping empty grid.") + rich.print("[green] Skipping empty grid.") return # check for sv @@ -421,7 +422,7 @@ def fk(self, name, grid_path, tcard, pdf): with eko.EKO.read(eko_filename) as operators: # Skip the computation of the fktable if the eko is empty if len(operators.mu2grid) == 0 and check.is_num_fonll(tcard["FNS"]): - rich.print(f"[green] Skipping empty eko for nFONLL.") + rich.print("[green] Skipping empty eko for nFONLL.") return eko_tmp_path = ( operators.paths.root.parent / f"eko-tmp-{name}-{np.random.rand()}.tar" From 9b5d1afa8ed6793e54a197431e2c14ca1d470a15 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:53:11 +0000 Subject: [PATCH 165/165] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit: v3.6.0 → v3.6.1](https://github.com/pre-commit/pre-commit/compare/v3.6.0...v3.6.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 04d73887..8300d424 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,6 +45,6 @@ repos: additional_dependencies: - toml - repo: https://github.com/pre-commit/pre-commit - rev: v3.6.0 + rev: v3.6.1 hooks: - id: validate_manifest