diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index ca195fb6..1ae0d241 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -42,7 +42,7 @@ jobs: uses: actions/cache@v3 with: path: data_files - key: data_files-v4 + key: data_files-v5 - name: Download data files if: steps.cache-data_files.outputs.cache-hit != 'true' run: | diff --git a/benchmarks/bench_evolution_consistency.py b/benchmarks/bench_evolution_consistency.py new file mode 100644 index 00000000..9dc73829 --- /dev/null +++ b/benchmarks/bench_evolution_consistency.py @@ -0,0 +1,270 @@ +import pathlib + +import eko +import numpy as np +import pineappl +import pytest +from nnpdf_data import THEORY_CARDS_PATH +from nnpdf_data.theorydbutils import fetch_theory +from pineappl.grid import Grid +from pineappl.subgrid import ImportSubgridV1 + +from pineko import check + +HERA225 = "HERA_NC_225GEV_EP_SIGMARED" +HERA318 = "HERA_NC_318GEV_EP_SIGMARED" + + +def test_no_central_order(test_files, toy_xfx, toy_alphas): + grid_path = pathlib.Path(f"{test_files}/data/grids/400/{HERA225}.pineappl.lz4") + if not grid_path.exists(): + pytest.fail("Test grid not found") + + template_grid = Grid.read(str(grid_path)) + + template_subgrid = None + for b in range(template_grid.bins()): + for c in range(len(template_grid.channels())): + for o in range(len(template_grid.orders())): + sub = template_grid.subgrid(o, b, c) + if sub.is_empty(): + continue + + node_values = sub.node_values + if len(node_values) < 2: + continue + shape = tuple(len(v) for v in node_values) + if any(s == 0 for s in shape): + continue + template_subgrid = sub + break + if template_subgrid: + break + if template_subgrid: + break + + if not template_subgrid: + pytest.skip("Could not find a non-empty subgrid in template!") + + order_0 = pineappl.boc.Order(0, 0, 0, 0, 0) + order_1 = pineappl.boc.Order(1, 0, 0, 0, 0) + + grid_zeroed = Grid( + pid_basis=template_grid.pid_basis, + channels=[pineappl.boc.Channel(c) for c in template_grid.channels()], + orders=[order_0, order_1], + bins=template_grid.bwfl(), + convolutions=template_grid.convolutions, + interpolations=template_grid.interpolations, + kinematics=template_grid.kinematics, + scale_funcs=template_grid.scales, + ) + + grid_opt = Grid( + pid_basis=template_grid.pid_basis, + channels=[pineappl.boc.Channel(c) for c in template_grid.channels()], + orders=[order_1], + bins=template_grid.bwfl(), + convolutions=template_grid.convolutions, + interpolations=template_grid.interpolations, + kinematics=template_grid.kinematics, + scale_funcs=template_grid.scales, + ) + + node_values = template_subgrid.node_values + shape = tuple(len(v) for v in node_values) + data_1 = np.random.rand(*shape) + subgrid_1 = ImportSubgridV1(array=data_1, node_values=node_values) + data_0 = np.zeros(shape) + subgrid_0 = ImportSubgridV1(array=data_0, node_values=node_values) + + for b in range(template_grid.bins()): + for c in range(len(template_grid.channels())): + grid_zeroed.set_subgrid(0, b, c, subgrid_0.into()) + grid_zeroed.set_subgrid(1, b, c, subgrid_1.into()) + grid_opt.set_subgrid(0, b, c, subgrid_1.into()) + + mask_zeroed = pineappl.boc.Order.create_mask(grid_zeroed.orders(), 2, 0, True) + mask_opt = pineappl.boc.Order.create_mask(grid_opt.orders(), 2, 0, True) + pdg_convs = template_grid.convolutions + xfxs = [toy_xfx] * len(pdg_convs) + + res_zeroed = grid_zeroed.convolve(pdg_convs, xfxs, toy_alphas, mask_zeroed) + res_opt = grid_opt.convolve(pdg_convs, xfxs, toy_alphas, mask_opt) + + np.testing.assert_allclose(res_zeroed, res_opt) + + +def test_evolution_no_central_order(test_4100001000, tmp_path, toy_xfx): + """Check that evolution with a real EKO gives identical results for zeroed + vs optimized central order grids.""" + from pineko import evolve + + # Use theory 4100001000 which we know is consistent + tcard_meta = fetch_theory(THEORY_CARDS_PATH, 41000010) + grid_path = pathlib.Path(f"{test_4100001000}/grids/{HERA318}.pineappl.lz4") + eko_path = pathlib.Path(f"{test_4100001000}/ekos/{HERA318}.tar") + + # Grid 1: Zeroed central order. Zero out template grid order at (3,0,0,0,0). + grid_zeroed = Grid.read(str(grid_path)) + target_order = (3, 0, 0, 0, 0) + order_idx = None + for i, o in enumerate(grid_zeroed.orders()): + if o.as_tuple() == target_order: + order_idx = i + break + + if order_idx is None: + pytest.fail(f"Target order {target_order} not found in grid") + + for b in range(grid_zeroed.bins()): + for c in range(len(grid_zeroed.channels())): + sub = grid_zeroed.subgrid(order_idx, b, c) + if sub.is_empty(): + continue + + nv = sub.node_values + if len(nv) > 0: + shape = tuple(len(v) for v in nv) + sub_zero = ImportSubgridV1(array=np.zeros(shape), node_values=nv) + grid_zeroed.set_subgrid(order_idx, b, c, sub_zero.into()) + + # Grid 2: Optimized (removed) central order + grid_opt = Grid.read(str(grid_path)) + grid_opt.delete_orders([order_idx]) + + with eko.EKO.read(eko_path) as operator: + operators = [operator] + fk_zeroed_path = tmp_path / "fk_zeroed.pineappl.lz4" + fk_opt_path = tmp_path / "fk_opt.pineappl.lz4" + + evolve.evolve_grid( + grid_zeroed, + operators, + str(fk_zeroed_path), + max_as=4, + max_al=0, + xir=1.0, + xif=1.0, + xia=1.0, + theory_meta=tcard_meta, + ) + + evolve.evolve_grid( + grid_opt, + operators, + str(fk_opt_path), + max_as=4, + max_al=0, + xir=1.0, + xif=1.0, + xia=1.0, + theory_meta=tcard_meta, + ) + + # Compare resulting FK tables + fk_zeroed = pineappl.fk_table.FkTable.read(str(fk_zeroed_path)) + fk_opt = pineappl.fk_table.FkTable.read(str(fk_opt_path)) + + res_zeroed = fk_zeroed.convolve( + fk_zeroed.convolutions, + [toy_xfx] * len(fk_zeroed.convolutions), + ) + res_opt = fk_opt.convolve( + fk_opt.convolutions, + [toy_xfx] * len(fk_opt.convolutions), + ) + + np.testing.assert_allclose(res_zeroed, res_opt) + + +def test_contains_sv_empty_grid_orders(): + class EmptyGrid: + def orders(self): + return [] + + available, max_as_effective = check.contains_sv( + EmptyGrid(), + max_as=4, + max_al=0, + sv_type=check.Scale.REN, + ) + assert available is check.AvailableAtMax.BOTH + assert max_as_effective == 0 + + +def test_evolution_no_orders(test_4100001000, tmp_path, toy_xfx): + """Compare evolution of: (a) a grid with orders, but all subgrids explicitly + set to zero with (b) the same grid after deleting all orders (no orders at all). + + This test effectively checks how to construct a completely empty FK table from + a completely empty grid. + """ + from pineko import evolve + + tcard_meta = fetch_theory(THEORY_CARDS_PATH, 41000010) + grid_path = pathlib.Path(f"{test_4100001000}/grids/{HERA318}.pineappl.lz4") + eko_path = pathlib.Path(f"{test_4100001000}/ekos/{HERA318}.tar") + + if not (grid_path.exists() and eko_path.exists()): + pytest.skip("Test data not found") + + def zero_all_subgrids(grid: Grid) -> None: + for o in range(len(grid.orders())): + for b in range(grid.bins()): + for c in range(len(grid.channels())): + sub = grid.subgrid(o, b, c) + if sub.is_empty(): + continue + nv = sub.node_values + shape = tuple(len(v) for v in nv) + sub_zero = ImportSubgridV1(array=np.zeros(shape), node_values=nv) + grid.set_subgrid(o, b, c, sub_zero.into()) + + grid_zeroed = Grid.read(str(grid_path)) + zero_all_subgrids(grid_zeroed) + + grid_no_orders = Grid.read(str(grid_path)) + grid_no_orders.delete_orders(list(range(len(grid_no_orders.orders())))) + + with eko.EKO.read(eko_path) as operator: + fk_zeroed_path = tmp_path / "fk_zeroed_subgrids_no_orders_ref.pineappl.lz4" + fk_no_orders_path = tmp_path / "fk_no_orders.pineappl.lz4" + + evolve.evolve_grid( + grid_zeroed, + [operator], + str(fk_zeroed_path), + max_as=4, + max_al=0, + xir=1.0, + xif=1.0, + xia=1.0, + theory_meta=tcard_meta, + ) + + evolve.evolve_grid( + grid_no_orders, + [operator], + str(fk_no_orders_path), + max_as=4, + max_al=0, + xir=1.0, + xif=1.0, + xia=1.0, + theory_meta=tcard_meta, + ) + + fk_zeroed = pineappl.fk_table.FkTable.read(str(fk_zeroed_path)) + fk_no_orders = pineappl.fk_table.FkTable.read(str(fk_no_orders_path)) + + res_zeroed = fk_zeroed.convolve( + fk_zeroed.convolutions, + [toy_xfx] * len(fk_zeroed.convolutions), + ) + res_no_orders = fk_no_orders.convolve( + fk_no_orders.convolutions, + [toy_xfx] * len(fk_no_orders.convolutions), + ) + + np.testing.assert_allclose(res_zeroed, res_no_orders) diff --git a/benchmarks/conftest.py b/benchmarks/conftest.py index 44de162d..e2de8489 100644 --- a/benchmarks/conftest.py +++ b/benchmarks/conftest.py @@ -14,6 +14,11 @@ def test_files(): return pathlib.Path(__file__).parents[0] / "data_files/" +@pytest.fixture +def test_4100001000(): + return pathlib.Path(__file__).parents[0] / "4100001000/" + + @pytest.fixture def test_empty_proj(test_files): path = test_files / "empty_proj/" @@ -65,3 +70,23 @@ def wrapped(newdir): os.chdir(prevdir) return wrapped + + +@pytest.fixture +def toy_xfx(): + """Toy PDF callable.""" + + def xfx(pid, x, q2): + return 1.0 + + return xfx + + +@pytest.fixture +def toy_alphas(): + """Toy alpha_s callable.""" + + def alphas(q2): + return 1.0 + + return alphas diff --git a/download_test_data.sh b/download_test_data.sh old mode 100644 new mode 100755 index 4621dc0d..af6f4e11 --- a/download_test_data.sh +++ b/download_test_data.sh @@ -2,3 +2,4 @@ wget -r -np -nH --cut-dirs=1 -l 4 -e robots=off --no-verbose -R index.* https://data.nnpdf.science/pineko/theory_productions/ wget -r -np -nH --cut-dirs=1 -l 4 -e robots=off --no-verbose -P benchmarks -R index.* https://data.nnpdf.science/pineko/data_files/ wget -r -np -nH --cut-dirs=1 -l 4 -e robots=off --no-verbose -P benchmarks -R index.* https://data.nnpdf.science/pineko/fakepdfs/ +wget -r -np -nH --cut-dirs=1 -l 4 -e robots=off --no-verbose -P benchmarks -R index.* https://data.nnpdf.science/pineko/4100001000/ diff --git a/poetry.lock b/poetry.lock index a74dde3e..10d8aa22 100644 --- a/poetry.lock +++ b/poetry.lock @@ -96,14 +96,14 @@ SQLAlchemy = ">=1.4.29,<2.0.0" [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.4.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["docs"] files = [ - {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, - {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, + {file = "certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a"}, + {file = "certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580"}, ] [[package]] @@ -247,14 +247,14 @@ files = [ [[package]] name = "click" -version = "8.3.2" +version = "8.3.3" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" groups = ["main", "test"] files = [ - {file = "click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d"}, - {file = "click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5"}, + {file = "click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613"}, + {file = "click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2"}, ] [package.dependencies] @@ -790,72 +790,72 @@ woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "bro [[package]] name = "greenlet" -version = "3.4.0" +version = "3.5.0" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.10" groups = ["test"] markers = "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\"" files = [ - {file = "greenlet-3.4.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d18eae9a7fb0f499efcd146b8c9750a2e1f6e0e93b5a382b3481875354a430e6"}, - {file = "greenlet-3.4.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:636d2f95c309e35f650e421c23297d5011716be15d966e6328b367c9fc513a82"}, - {file = "greenlet-3.4.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:234582c20af9742583c3b2ddfbdbb58a756cfff803763ffaae1ac7990a9fac31"}, - {file = "greenlet-3.4.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ac6a5f618be581e1e0713aecec8e54093c235e5fa17d6d8eb7ffc487e2300508"}, - {file = "greenlet-3.4.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:523677e69cd4711b5a014e37bc1fb3a29947c3e3a5bb6a527e1cc50312e5a398"}, - {file = "greenlet-3.4.0-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:d336d46878e486de7d9458653c722875547ac8d36a1cff9ffaf4a74a3c1f62eb"}, - {file = "greenlet-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b45e45fe47a19051a396abb22e19e7836a59ee6c5a90f3be427343c37908d65b"}, - {file = "greenlet-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5434271357be07f3ad0936c312645853b7e689e679e29310e2de09a9ea6c3adf"}, - {file = "greenlet-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:a19093fbad824ed7c0f355b5ff4214bffda5f1a7f35f29b31fcaa240cc0135ab"}, - {file = "greenlet-3.4.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:805bebb4945094acbab757d34d6e1098be6de8966009ab9ca54f06ff492def58"}, - {file = "greenlet-3.4.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:439fc2f12b9b512d9dfa681c5afe5f6b3232c708d13e6f02c845e0d9f4c2d8c6"}, - {file = "greenlet-3.4.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a70ed1cb0295bee1df57b63bf7f46b4e56a5c93709eea769c1fec1bb23a95875"}, - {file = "greenlet-3.4.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c5696c42e6bb5cfb7c6ff4453789081c66b9b91f061e5e9367fa15792644e76"}, - {file = "greenlet-3.4.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c660bce1940a1acae5f51f0a064f1bc785d07ea16efcb4bc708090afc4d69e83"}, - {file = "greenlet-3.4.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:89995ce5ddcd2896d89615116dd39b9703bfa0c07b583b85b89bf1b5d6eddf81"}, - {file = "greenlet-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee407d4d1ca9dc632265aee1c8732c4a2d60adff848057cdebfe5fe94eb2c8a2"}, - {file = "greenlet-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:956215d5e355fffa7c021d168728321fd4d31fd730ac609b1653b450f6a4bc71"}, - {file = "greenlet-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:5cb614ace7c27571270354e9c9f696554d073f8aa9319079dcba466bbdead711"}, - {file = "greenlet-3.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:04403ac74fe295a361f650818de93be11b5038a78f49ccfb64d3b1be8fbf1267"}, - {file = "greenlet-3.4.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:1a54a921561dd9518d31d2d3db4d7f80e589083063ab4d3e2e950756ef809e1a"}, - {file = "greenlet-3.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16dec271460a9a2b154e3b1c2fa1050ce6280878430320e85e08c166772e3f97"}, - {file = "greenlet-3.4.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90036ce224ed6fe75508c1907a77e4540176dcf0744473627785dd519c6f9996"}, - {file = "greenlet-3.4.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f0def07ec9a71d72315cf26c061aceee53b306c36ed38c35caba952ea1b319d"}, - {file = "greenlet-3.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1c4f6b453006efb8310affb2d132832e9bbb4fc01ce6df6b70d810d38f1f6dc"}, - {file = "greenlet-3.4.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:0e1254cf0cbaa17b04320c3a78575f29f3c161ef38f59c977108f19ffddaf077"}, - {file = "greenlet-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b2d9a138ffa0e306d0e2b72976d2fb10b97e690d40ab36a472acaab0838e2de"}, - {file = "greenlet-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8424683caf46eb0eb6f626cb95e008e8cc30d0cb675bdfa48200925c79b38a08"}, - {file = "greenlet-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0a53fb071531d003b075c444014ff8f8b1a9898d36bb88abd9ac7b3524648a2"}, - {file = "greenlet-3.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:f38b81880ba28f232f1f675893a39cf7b6db25b31cc0a09bb50787ecf957e85e"}, - {file = "greenlet-3.4.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:43748988b097f9c6f09364f260741aa73c80747f63389824435c7a50bfdfd5c1"}, - {file = "greenlet-3.4.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5566e4e2cd7a880e8c27618e3eab20f3494452d12fd5129edef7b2f7aa9a36d1"}, - {file = "greenlet-3.4.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1054c5a3c78e2ab599d452f23f7adafef55062a783a8e241d24f3b633ba6ff82"}, - {file = "greenlet-3.4.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:98eedd1803353daf1cd9ef23eef23eda5a4d22f99b1f998d273a8b78b70dd47f"}, - {file = "greenlet-3.4.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f82cb6cddc27dd81c96b1506f4aa7def15070c3b2a67d4e46fd19016aacce6cf"}, - {file = "greenlet-3.4.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:b7857e2202aae67bc5725e0c1f6403c20a8ff46094ece015e7d474f5f7020b55"}, - {file = "greenlet-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:227a46251ecba4ff46ae742bc5ce95c91d5aceb4b02f885487aff269c127a729"}, - {file = "greenlet-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5b99e87be7eba788dd5b75ba1cde5639edffdec5f91fe0d734a249535ec3408c"}, - {file = "greenlet-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:849f8bc17acd6295fcb5de8e46d55cc0e52381c56eaf50a2afd258e97bc65940"}, - {file = "greenlet-3.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9390ad88b652b1903814eaabd629ca184db15e0eeb6fe8a390bbf8b9106ae15a"}, - {file = "greenlet-3.4.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:10a07aca6babdd18c16a3f4f8880acfffc2b88dfe431ad6aa5f5740759d7d75e"}, - {file = "greenlet-3.4.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:076e21040b3a917d3ce4ad68fb5c3c6b32f1405616c4a57aa83120979649bd3d"}, - {file = "greenlet-3.4.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e82689eea4a237e530bb5cb41b180ef81fa2160e1f89422a67be7d90da67f615"}, - {file = "greenlet-3.4.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:06c2d3b89e0c62ba50bd7adf491b14f39da9e7e701647cb7b9ff4c99bee04b19"}, - {file = "greenlet-3.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df3b0b2289ec686d3c821a5fee44259c05cfe824dd5e6e12c8e5f5df23085cf"}, - {file = "greenlet-3.4.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:070b8bac2ff3b4d9e0ff36a0d19e42103331d9737e8504747cd1e659f76297bd"}, - {file = "greenlet-3.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8bff29d586ea415688f4cec96a591fcc3bf762d046a796cdadc1fdb6e7f2d5bf"}, - {file = "greenlet-3.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a569c2fb840c53c13a2b8967c63621fafbd1a0e015b9c82f408c33d626a2fda"}, - {file = "greenlet-3.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:207ba5b97ea8b0b60eb43ffcacf26969dd83726095161d676aac03ff913ee50d"}, - {file = "greenlet-3.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:f8296d4e2b92af34ebde81085a01690f26a51eb9ac09a0fcadb331eb36dbc802"}, - {file = "greenlet-3.4.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d70012e51df2dbbccfaf63a40aaf9b40c8bed37c3e3a38751c926301ce538ece"}, - {file = "greenlet-3.4.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a58bec0751f43068cd40cff31bb3ca02ad6000b3a51ca81367af4eb5abc480c8"}, - {file = "greenlet-3.4.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05fa0803561028f4b2e3b490ee41216a842eaee11aed004cc343a996d9523aa2"}, - {file = "greenlet-3.4.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c4cd56a9eb7a6444edbc19062f7b6fbc8f287c663b946e3171d899693b1c19fa"}, - {file = "greenlet-3.4.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e60d38719cb80b3ab5e85f9f1aed4960acfde09868af6762ccb27b260d68f4ed"}, - {file = "greenlet-3.4.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:1f85f204c4d54134ae850d401fa435c89cd667d5ce9dc567571776b45941af72"}, - {file = "greenlet-3.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f50c804733b43eded05ae694691c9aa68bca7d0a867d67d4a3f514742a2d53f"}, - {file = "greenlet-3.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2d4f0635dc4aa638cda4b2f5a07ae9a2cff9280327b581a3fcb6f317b4fbc38a"}, - {file = "greenlet-3.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1a4a48f24681300c640f143ba7c404270e1ebbbcf34331d7104a4ff40f8ea705"}, - {file = "greenlet-3.4.0.tar.gz", hash = "sha256:f50a96b64dafd6169e595a5c56c9146ef80333e67d4476a65a9c55f400fc22ff"}, + {file = "greenlet-3.5.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ea813b2e1f45fa9649a17853b2b5465c4072fbcb072e5af6cd3a288216574a"}, + {file = "greenlet-3.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:804a70b328e706b785c6ef16187051c394a63dd1a906d89be24b6ad77759f13f"}, + {file = "greenlet-3.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:884f649de075b84739713d41dd4dfd41e2b910bfb769c4a3ea02ec1da52cd9bb"}, + {file = "greenlet-3.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4d0eadc7e4d9ffb2af4247b606cae307be8e448911e5a0d0b16d72fc3d224cfd"}, + {file = "greenlet-3.5.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b28037cb07768933c54d81bfe47a85f9f402f57d7d69743b991a713b63954eb"}, + {file = "greenlet-3.5.0-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:f8c30c2225f40dd76c50790f0eb3b5c7c18431efb299e2782083e1981feed243"}, + {file = "greenlet-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cda05425526240807408156b6960a17a79a0c760b813573b67027823be760977"}, + {file = "greenlet-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c615f869163e14bb1ced20322d8038fb680b08236521ac3f30cd4c1288785a0"}, + {file = "greenlet-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:ba8f0bdc2fae6ce915dfd0c16d2d00bca7e4247c1eae4416e06430e522137858"}, + {file = "greenlet-3.5.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8f1cc966c126639cd152fdaa52624d2655f492faa79e013fea161de3e6dda082"}, + {file = "greenlet-3.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:362624e6a8e5bca3b8233e45eef33903a100e9539a2b995c364d595dbc4018b3"}, + {file = "greenlet-3.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5ecd83806b0f4c2f53b1018e0005cd82269ea01d42befc0368730028d850ed1c"}, + {file = "greenlet-3.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa94cb2288681e3a11645958f1871d48ee9211bd2f66628fdace505927d6e564"}, + {file = "greenlet-3.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ff251e9a0279522e62f6176412869395a64ddf2b5c5f782ff609a8216a4e662"}, + {file = "greenlet-3.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:64d6ac45f7271f48e45f67c95b54ef73534c52ec041fcda8edf520c6d811f4bc"}, + {file = "greenlet-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d874e79afd41a96e11ff4c5d0bc90a80973e476fda1c2c64985667397df432b"}, + {file = "greenlet-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0ed006e4b86c59de7467eb2601cd1b77b5a7d657d1ee55e30fe30d76451edba4"}, + {file = "greenlet-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:703cb211b820dbffbbc55a16bfc6e4583a6e6e990f33a119d2cc8b83211119c8"}, + {file = "greenlet-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:6c18dfb59c70f5a94acd271c72e90128c3c776e41e5f07767908c8c1b74ad339"}, + {file = "greenlet-3.5.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:db2910d3c809444e0a20147361f343fe2798e106af8d9d8506f5305302655a9f"}, + {file = "greenlet-3.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ec9ea74e7268ace7f9aab1b1a4e730193fc661b39a993cd91c606c32d4a3628"}, + {file = "greenlet-3.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54d243512da35485fc7a6bf3c178fdda6327a9d6506fcdd62b1abd1e41b2927b"}, + {file = "greenlet-3.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:41353ec2ecedf7aa8f682753a41919f8718031a6edac46b8d3dc7ed9e1ceb136"}, + {file = "greenlet-3.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d280a7f5c331622c69f97eb167f33577ff2d1df282c41cd15907fc0a3ca198c"}, + {file = "greenlet-3.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:58c1c374fe2b3d852f9b6b11a7dff4c85404e51b9a596fd9e89cf904eb09866d"}, + {file = "greenlet-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1eb67d5adefb5bd2e182d42678a328979a209e4e82eb93575708185d31d1f588"}, + {file = "greenlet-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2628d6c86f6cb0cb45e0c3c54058bbec559f57eaae699447748cb3928150577e"}, + {file = "greenlet-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:d4d9f0624c775f2dfc56ba54d515a8c771044346852a918b405914f6b19d7fd8"}, + {file = "greenlet-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:83ed9f27f1680b50e89f40f6df348a290ea234b249a4003d366663a12eab94f2"}, + {file = "greenlet-3.5.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5a5ed18de6a0f6cc7087f1563f6bd93fc7df1c19165ca01e9bde5a5dc281d106"}, + {file = "greenlet-3.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a717fbc46d8a354fa675f7c1e813485b6ba3885f9bef0cd56e5ba27d758ff5b"}, + {file = "greenlet-3.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ddc090c5c1792b10246a78e8c2163ebbe04cf877f9d785c230a7b27b39ad038e"}, + {file = "greenlet-3.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4964101b8585c144cbda5532b1aa644255126c08a265dae90c16e7a0e63aaa9d"}, + {file = "greenlet-3.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2094acd54b272cb6eae8c03dd87b3fa1820a4cef18d6889c378d503500a1dc13"}, + {file = "greenlet-3.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:7022615368890680e67b9965d33f5773aade330d5343bbe25560135aaa849eae"}, + {file = "greenlet-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5e05ba267789ea87b5a155cf0e810b1ab88bf18e9e8740813945ceb8ee4350ba"}, + {file = "greenlet-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0ecec963079cd58cbd14723582384f11f166fd58883c15dcbfb342e0bc9b5846"}, + {file = "greenlet-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:728d9667d8f2f586644b748dbd9bb67e50d6a9381767d1357714ea6825bb3bf5"}, + {file = "greenlet-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:47422135b1d308c14b2c6e758beedb1acd33bb91679f5670edf77bf46244722b"}, + {file = "greenlet-3.5.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:f35807464c4c58c55f0d31dfa83c541a5615d825c2fe3d2b95360cf7c4e3c0a8"}, + {file = "greenlet-3.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55fa7ea52771be44af0de27d8b80c02cd18c2c3cddde6c847ecebdf72418b6a1"}, + {file = "greenlet-3.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a97e4821aa710603f94de0da25f25096454d78ffdace5dc77f3a006bc01abba3"}, + {file = "greenlet-3.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf2d8a80bec89ab46221ae45c5373d5ba0bd36c19aa8508e85c6cd7e5106cd37"}, + {file = "greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f52a464e4ed91780bdfbbdd2b97197f3accaa629b98c200f4dffada759f3ae7"}, + {file = "greenlet-3.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:1bae92a1dd94c5f9d9493c3a212dd874c202442047cf96446412c862feca83a2"}, + {file = "greenlet-3.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:762612baf1161ccb8437c0161c668a688223cba28e1bf038f4eb47b13e39ccdf"}, + {file = "greenlet-3.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:57a43c6079a89713522bc4bcb9f75070ecf5d3dbad7792bfe42239362cbf2a16"}, + {file = "greenlet-3.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bc59be3945ae9750b9e7d45067d01ae3fe90ea5f9ade99239dabdd6e28a5033"}, + {file = "greenlet-3.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:a96fcee45e03fe30a62669fd16ab5c9d3c172660d3085605cb1e2d1280d3c988"}, + {file = "greenlet-3.5.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:a10a732421ab4fec934783ce3e54763470d0181db6e3468f9103a275c3ed1853"}, + {file = "greenlet-3.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fc391b1566f2907d17aaebe78f8855dc45675159a775fcf9e61f8ee0078e87f"}, + {file = "greenlet-3.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:680bd0e7ad5e8daa8a4aa89f68fd6adc834b8a8036dc256533f7e08f4a4b01f7"}, + {file = "greenlet-3.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1aa4ce8debcd4ea7fb2e150f3036588c41493d1d52c43538924ae1819003f4ce"}, + {file = "greenlet-3.5.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddb36c7d6c9c0a65f18c7258634e0c416c6ab59caac8c987b96f80c2ebda0112"}, + {file = "greenlet-3.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:728a73687e39ae9ca34e4694cbf2f049d3fbc7174639468d0f67200a97d8f9e2"}, + {file = "greenlet-3.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e5ddf316ced87539144621453c3aef229575825fe60c604e62bedc4003f372b2"}, + {file = "greenlet-3.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4a448128607be0de65342dc9b31be7f948ef4cc0bc8832069350abefd310a8f2"}, + {file = "greenlet-3.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d60097128cb0a1cab9ea541186ea13cd7b847b8449a7787c2e2350da0cb82d86"}, + {file = "greenlet-3.5.0.tar.gz", hash = "sha256:d419647372241bc68e957bf38d5c1f98852155e4146bd1e4121adea81f4f01e4"}, ] [package.extras] @@ -864,18 +864,18 @@ test = ["objgraph", "psutil", "setuptools"] [[package]] name = "idna" -version = "3.11" +version = "3.13" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" groups = ["docs"] files = [ - {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, - {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, + {file = "idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3"}, + {file = "idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242"}, ] [package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "imagesize" @@ -1357,67 +1357,67 @@ files = [ [[package]] name = "matplotlib" -version = "3.10.8" +version = "3.10.9" description = "Python plotting package" optional = false python-versions = ">=3.10" groups = ["test"] files = [ - {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, - {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, - {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, - {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, - {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, - {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, - {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, - {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, - {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, - {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, - {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294"}, + {file = "matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65"}, + {file = "matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9"}, + {file = "matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2"}, + {file = "matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838"}, + {file = "matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99"}, + {file = "matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2"}, + {file = "matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4"}, + {file = "matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4"}, + {file = "matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358"}, ] [package.dependencies] @@ -1432,7 +1432,7 @@ pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7,<10)"] [[package]] name = "matplotlib-inline" @@ -1944,48 +1944,42 @@ xmp = ["defusedxml"] [[package]] name = "pineappl" -version = "1.3.3" -description = "" +version = "1.4.0a1" +description = "Python bindings to PineAPPL" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "pineappl-1.3.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eb9ca46d53993e8d2494c83122078cc833360f193d7156d082cd9b7b8bdf72c5"}, - {file = "pineappl-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2af6eb2df950ce97200d608cad708b297aafb0b4f842a862b64cedccaa8776e5"}, - {file = "pineappl-1.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af405c0bf2ee06aea8a232676e7e823a31d83dd5f74e2f91a9440dffcba71864"}, - {file = "pineappl-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:38a66793a6227cf9b262ecaf4196d5d7333163b408a7eb1cf635f543c3c73bf0"}, - {file = "pineappl-1.3.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:42cbf122c3db471a5716ca05456efe11069b1dcb4aa551ddb8fea7d6382c0d7d"}, - {file = "pineappl-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:10caa002fee54096cb57d01f20029cab9a49dc4c402b4c815e21490df0e1c113"}, - {file = "pineappl-1.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80872e08bddcdde2e9c4526a92d036ef011d460a8eca5e5db81c7d80756a82f"}, - {file = "pineappl-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:7b1a8534c48d7da572218cb0fb6759eb875dd4449c02c41b97cf1f46cd6eadff"}, - {file = "pineappl-1.3.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4a7052349a10d683d7fb0f3cb7193c7cf59a47db2cb9439d41afccf07dfe1f13"}, - {file = "pineappl-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db25eeac62c4a045a520132fa641640e7259e14d0776f1e8f0e3120fd5112c87"}, - {file = "pineappl-1.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e5fc6a335561836fd49308c83d0431b61abf2ba3a7d94367c1488270573441"}, - {file = "pineappl-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:cd089b930e0ecd688c67441cb67edea9cbd2517462b733378a70d206a5c836e3"}, - {file = "pineappl-1.3.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ec079053079a201cbfc635f1f5f5da243235fce7d22221213b24059d67e18a4d"}, - {file = "pineappl-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f0325624bfb8c96fb187a0a25f5216e2b2dc9faf0df664212b66846812a0cf54"}, - {file = "pineappl-1.3.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba7d4a4c2e961e8ae7425a671fdaa7b5e3513b68e926f4462a80759f76a0e675"}, - {file = "pineappl-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:4d3f5826bd55b60897b483cc9f8e94e86d46d75e0d768100bd60878944f24e65"}, - {file = "pineappl-1.3.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d10243118b97e0c6c45247bd068935fa48fc4d63a610676c3194fc5ae034bc8b"}, - {file = "pineappl-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:089a9a9a1c372aa68d1e92bbcfbb65890a125babe106765763ab9094345f6d2b"}, - {file = "pineappl-1.3.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322939a7041740c56b17c17b4528541aa3356c70460442ab5adc75fe24c3538"}, - {file = "pineappl-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:f87166b4336d14b796c7406ce06dcb7dfb97247227021d2f73ed07cae6b11e9e"}, - {file = "pineappl-1.3.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:7b02de869eeac34447e6a168f6ef9757c213df4c67123d67f2c8b48a2a05bda5"}, - {file = "pineappl-1.3.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:9f10d1d3786af716af6bc99a2ad0165b80baa7f786d81f8e606009301316943a"}, - {file = "pineappl-1.3.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b15e5b9685b3bc8257949816d18eecccd63904481da628bcdba72519e31a7ba3"}, - {file = "pineappl-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9e82df6d7aa9983c60f5d74582dcc0f4d6cb21d3689f434a56f48f0fd3159d78"}, - {file = "pineappl-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d751aee827ddb48610b4239922efe416413728985d2ff73aaa941f5038a5408"}, - {file = "pineappl-1.3.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:d3ccc641f5734f27141a123292ca60263cdf0252d52ef98ed446df9177222a3c"}, - {file = "pineappl-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:66ca579d730ae4b81f299297c454306d23cae1fb210ed3e6501b228dffafd582"}, - {file = "pineappl-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cfabe68c545beae33a770327458fb0950455a44d45158d329b7ce7b224dfd0e"}, - {file = "pineappl-1.3.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5ea3c0fc9e8cc7de6dc4bf6df1d718f47c8a5017d8429c14c65aee6438a4d4eb"}, - {file = "pineappl-1.3.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:261d29966d5416a5fd48045eaab1e335038e7fd11d22d7127d5f922e94a3f5f8"}, - {file = "pineappl-1.3.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0569da307c0d9af3c9befd0453b67eb63674b1be4c97befba9fff082bf0309"}, - {file = "pineappl-1.3.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9fdd74d38cd72b3db6d559750eb4e2a05a3eb76cc5f73e7f2df32f416447a91"}, - {file = "pineappl-1.3.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bbec4b83c8b33434aa0a424479c4f8b38387a29a228eebfc8ab19a55286b4f33"}, - {file = "pineappl-1.3.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:091a03b9d6bb909ace6f0eb58aa4fac403118d6f5a4e66c80e2f985d893980fc"}, - {file = "pineappl-1.3.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d064d38525e7cdf0dc4872f93808ff9905b954e44e8c1ce0760cc17637ee4527"}, - {file = "pineappl-1.3.3.tar.gz", hash = "sha256:befa7df98681d19eb6ceea88a130bd315a02bb85ba775fab4b34812da7c388ff"}, + {file = "pineappl-1.4.0a1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2da28370658ec440ee437485d9d0fe59b173722277734e56e426b507729862"}, + {file = "pineappl-1.4.0a1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62a391370a0ddd7d74eeb5051415795f2c7c8af690b6629461dda5306cfed1d6"}, + {file = "pineappl-1.4.0a1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f797b01253046c8fe9f194c16a3547450efbaca2ffc97bc9b6fdeabea94f8e4"}, + {file = "pineappl-1.4.0a1-cp310-cp310-win_amd64.whl", hash = "sha256:31975593f34e8fd9d41e8a0f439ba699206dcadb967422ed34a6baf87bf2a616"}, + {file = "pineappl-1.4.0a1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:895a6fec350f7cafd9cdf9af70861952b6bdf7e3b828785cf1a7b33589c371f6"}, + {file = "pineappl-1.4.0a1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72230cb8e729b913a3bd1287e843148cc31d72069d08d0943c820fac783e019c"}, + {file = "pineappl-1.4.0a1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbbf92f414080b212dac80845da50887ebe5dc8242b08b6eee8cd91141244b6e"}, + {file = "pineappl-1.4.0a1-cp311-cp311-win_amd64.whl", hash = "sha256:142d3d0a0b655040a63e05888c5f32d52e5ddda8908eb3f5fc59816850fd74f9"}, + {file = "pineappl-1.4.0a1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1aeadba4dae6583ea1bcffa4b6f0e82a890da3f602c5946843a97bc4a9665934"}, + {file = "pineappl-1.4.0a1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a215e845c798dccd97ab3db442f029c2fae1b1f87425d93ce5edba1c7cd1b148"}, + {file = "pineappl-1.4.0a1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb1aec83cba600902a83ed471a8bc19153fbd0196cb0f79dd696767375467795"}, + {file = "pineappl-1.4.0a1-cp312-cp312-win_amd64.whl", hash = "sha256:a80952d6507d83f141da47b0083f43918a6766400f0e17fd9f901598c329b219"}, + {file = "pineappl-1.4.0a1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5101986a6a587e16eb97fe9cc5dc57a69c0062bfe2cb2d3e3b2f702d8491a910"}, + {file = "pineappl-1.4.0a1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bfd8cd5cfd3b6399b4358c958ae83e1760ee6afc9f7d1a60c4f97a857698d0a1"}, + {file = "pineappl-1.4.0a1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c75d5fa019daf0ac998c18cf938d276321d377ffdef1e5847e0b9de8443b434"}, + {file = "pineappl-1.4.0a1-cp313-cp313-win_amd64.whl", hash = "sha256:22c9d12e956e44992428ccb530ae5137497d8cbb8f29022a91d582ac760f8ab3"}, + {file = "pineappl-1.4.0a1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:98d208c253914b6eca82df2125539d5f2194d3bff9a13042b1507f40ed51bbdf"}, + {file = "pineappl-1.4.0a1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:30dbed18fa7cc631600f9a4a9c5008d9194894e606f9990b61553b3a1fb427f5"}, + {file = "pineappl-1.4.0a1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab7cf2c7ecd806953976a0b568d5a6ad67a0d18150abfe086e92e4f7aca66b2c"}, + {file = "pineappl-1.4.0a1-cp314-cp314-win_amd64.whl", hash = "sha256:0c6b7e43d117f4ed25d395e54aa2f835c3c14ae6ea6f5c15f0307487bce7e422"}, + {file = "pineappl-1.4.0a1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:c6428df3c3535c2e30490c677536dbcec6a5cb95ae3b600e28a90b4af8870484"}, + {file = "pineappl-1.4.0a1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:67957a7e8e7e6cc2ab59aed26a7d0de9b003c6b5eeb08e0e8bb96f25f82aa980"}, + {file = "pineappl-1.4.0a1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9ad9e5b04e5f5e2f9a6e78d85ecde6e0436b15d523a51a5cea50d6db704f389d"}, + {file = "pineappl-1.4.0a1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aad854a49b7f4cf245653e0598db9652dedae721309ce75f6a490dbfc01af230"}, + {file = "pineappl-1.4.0a1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:349641d34c13bd6b6ce704aa2626d7b29a6aef6c5c09bf06bfcfa28ec1174190"}, + {file = "pineappl-1.4.0a1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:12ed45694d54141be507f50cd2ea3470b4cdeb83f52353a6f5878554218b5b5d"}, + {file = "pineappl-1.4.0a1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:91b76eaa4c968c855e41cb605b789a13c5d15f1a8c6cb0b23f8d624fe296272d"}, + {file = "pineappl-1.4.0a1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97248ddba3364db8e45e7d74b2189f6f232f8444ed9353449f759aa1287b5c43"}, + {file = "pineappl-1.4.0a1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f05bd31c98c02c886e4cc596b737ea5ba3c8dbae0240268509defaa98e37d752"}, + {file = "pineappl-1.4.0a1.tar.gz", hash = "sha256:e2964759a07468f8a2f0ed3682440daf8755ce12b4b30e896e06c8dafc434aca"}, ] [package.dependencies] @@ -1998,16 +1992,16 @@ test = ["pytest", "pytest-cov"] [[package]] name = "pineappl-cli" -version = "1.3.3" +version = "1.4.0a1" description = "Read, write, and query PineAPPL grids" optional = false -python-versions = "*" +python-versions = ">=3.7" groups = ["test"] files = [ - {file = "pineappl_cli-1.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:37982d3823e7ab0fd7785a0dda9baea5c0eb3191e012c1dd117fe2efc9605206"}, - {file = "pineappl_cli-1.3.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:59180f18ab48f1c71236b8bb9c29037adcaf11546e3a287d6781b86fc6d475c1"}, - {file = "pineappl_cli-1.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bdac8af2b3c414e4040812c8270f7ef436054ebe479f93371695500d006b00a"}, - {file = "pineappl_cli-1.3.3.tar.gz", hash = "sha256:b08260652f0a8af1bdd9762f840b3df1f8538a43650f52bbe92b2d202d6a23dd"}, + {file = "pineappl_cli-1.4.0a1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:07654ef66da584fdea2e33b5f0c1b3f54c6cfc6eca03272cee1f2e0773375fe2"}, + {file = "pineappl_cli-1.4.0a1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:013cd8be5018037e43e9614da883fcf4e88c0f7a0d6258c0db24136cf8c93810"}, + {file = "pineappl_cli-1.4.0a1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906350e6b6e78eea56147be32959bcfbd7f47547da09d75839968a857a60af08"}, + {file = "pineappl_cli-1.4.0a1.tar.gz", hash = "sha256:3c2068795961f5e55144ef1437850a3e86c27175361aa7cb7719d5f07c59782a"}, ] [[package]] @@ -3028,14 +3022,14 @@ markers = {main = "python_version == \"3.10\"", dev = "python_version < \"3.12\" [[package]] name = "tzdata" -version = "2026.1" +version = "2026.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main", "test"] files = [ - {file = "tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9"}, - {file = "tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98"}, + {file = "tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7"}, + {file = "tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10"}, ] [[package]] @@ -3092,4 +3086,4 @@ nnpdf = ["nnpdf-data"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.14" -content-hash = "b3a6eef624b5675a0a794b3aa5de228ba8d1abd42ff08637585b22f2f6322b34" +content-hash = "6867ac31984418b1444b3907bacd4937bdd294276923d8abee88479464ae2557" diff --git a/pyproject.toml b/pyproject.toml index 7e79c94e..54e2b9a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ packages = [{ include = "pineko", from = "src" }] [tool.poetry.dependencies] python = ">=3.10,<3.14" eko = "^0.15.3" -pineappl = "^1.3.0" +pineappl = "^1.4.0a1" PyYAML = "^6.0" numpy = "^2" pandas = "^2.1" @@ -59,7 +59,7 @@ pytest-cov = "^4.0.0" pytest-env = "^0.6.2" pylint = "^3.1.0" banana-hep = "^0.6.13" -pineappl-cli = "^1.3.0" +pineappl-cli = "^1.4.0a1" [tool.poetry.group.dev.dependencies] pdbpp = "^0.11.6" diff --git a/src/pineko/check.py b/src/pineko/check.py index 7aa7103a..be981372 100644 --- a/src/pineko/check.py +++ b/src/pineko/check.py @@ -165,6 +165,8 @@ def orders(grid, max_as, max_al) -> list: def pure_qcd(orders): """Select the QCD LO and pure QCD corrections to it.""" + if len(orders) == 0: + return [] min_al = min(ord[1] for ord in orders) return [ord for ord in orders if ord[1] == min_al] @@ -174,7 +176,14 @@ def contains_sv( ) -> Tuple[AvailableAtMax, int]: """Check whether renormalization scale-variations are available in the pineappl grid.""" svindex = sv_type.value.index - ords = pure_qcd(orders(grid, max_as, max_al)) + ords = orders(grid, max_as, max_al) + # Empty grids (no orders) are a valid case: we must be able to propagate them and + # generate empty FK tables (e.g. for numerical FONLL workflows). + if len(ords) == 0: + return AvailableAtMax.BOTH, 0 + ords = pure_qcd(ords) + if len(ords) == 0: + return AvailableAtMax.BOTH, 0 max_as = max(ord[0] for ord in ords) min_as = min(ord[0] for ord in ords) max_as_cen = max(ord[0] for ord in ords if ord[svindex] == 0) diff --git a/src/pineko/cli/check.py b/src/pineko/cli/check.py index adae173f..48938842 100644 --- a/src/pineko/cli/check.py +++ b/src/pineko/cli/check.py @@ -71,8 +71,8 @@ class Coupling(Enum): SCVAR_MESSAGES = { check.AvailableAtMax.BOTH: "[green]Success:[/] grids contain", - check.AvailableAtMax.CENTRAL: "[orange]Warning:[/] grids do not contain central order for requested", - check.AvailableAtMax.SCVAR: SCVAR_ERROR, + check.AvailableAtMax.CENTRAL: "[orange]Warning:[/] grids do not contain scale variation order for requested", + check.AvailableAtMax.SCVAR: "[orange]Warning:[/] grids do not contain central order for requested", } diff --git a/src/pineko/evolve.py b/src/pineko/evolve.py index 9ae02ba2..c74c5797 100644 --- a/src/pineko/evolve.py +++ b/src/pineko/evolve.py @@ -333,6 +333,31 @@ def evolve_grid( min_as: None or int minimum power of strong coupling """ + + def construct_empty_fktable(): + empty_order = pineappl.boc.Order(0, 0, 0, 0, 0) + empty_grid = pineappl.grid.Grid( + pid_basis=grid.pid_basis, + channels=[pineappl.boc.Channel(c) for c in grid.channels()], + orders=[empty_order], + bins=grid.bwfl(), + convolutions=grid.convolutions, + interpolations=grid.interpolations, + kinematics=grid.kinematics, + scale_funcs=grid.scales, + ) + fktable = pineappl.fk_table.FkTable(empty_grid) + fktable.set_metadata("pineko_version", version.__version__) + fktable.set_metadata("theory_card", json.dumps(theory_meta)) + fktable.write_lz4(str(fktable_path)) + return fktable + + # A grid with no orders is a valid input for some workflows. In that case we + # cannot build evolution kinematics, so we directly emit an empty FK table. + if len(grid.orders()) == 0: + fktable = construct_empty_fktable() + return grid, fktable, None + order_mask = pineappl.boc.Order.create_mask(grid.orders(), max_as, max_al, True) if min_as is not None and min_as > 1: # If using min_as, we want to ignore only orders below that (e.g., if min_as=2 @@ -349,6 +374,14 @@ def evolve_grid( muf2_grid = evol_info.fac1 mur2_grid = evol_info.ren1 + + # If the grid is effectively empty (no kinematic support), PineAPPL/eko will + # panic later when constructing the target interpolation grid. This situation + # is valid , so we effectively construct an empty FK table. + if (len(x_grid) < 2) or (len(muf2_grid) == 0) or (len(mur2_grid) == 0): + fktable = construct_empty_fktable() + return grid, fktable, None + xif = 1.0 if operators[0].operator_card.configs.scvar_method is not None else xif tcard = operators[0].theory_card opcard = operators[0].operator_card diff --git a/src/pineko/theory.py b/src/pineko/theory.py index 4a8e3e36..55cbf1e6 100644 --- a/src/pineko/theory.py +++ b/src/pineko/theory.py @@ -80,9 +80,6 @@ def get_eko_names(grid_path, name, filter=True): 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) - if max_as == max_as_effective: - if available is check.AvailableAtMax.SCVAR: - raise ValueError("Central order is not available but sv order is.") if max_as < max_as_effective and available is not check.AvailableAtMax.BOTH: raise ValueError("No available central order or sv order.") diff --git a/tests/conftest.py b/tests/conftest.py index b39879fa..549ddadb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -43,3 +43,23 @@ def fake_configs(tmp_path): "root": tmp_path, } return fake_configs + + +@pytest.fixture +def toy_xfx(): + """Toy PDF callable.""" + + def xfx(pid, x, q2): + return 1.0 + + return xfx + + +@pytest.fixture +def toy_alphas(): + """Toy alpha_s callable.""" + + def alphas(q2): + return 1.0 + + return alphas diff --git a/tests/test_theory_sv.py b/tests/test_theory_sv.py new file mode 100644 index 00000000..7c28f56f --- /dev/null +++ b/tests/test_theory_sv.py @@ -0,0 +1,77 @@ +import pineappl + +import pineko.check +import pineko.theory + + +class Fake_grid: + def __init__(self, order_list, convolutions=[]): + self.orderlist = order_list + self.convolutions = convolutions + + def orders(self): + return [order._raw for order in self.orderlist] + + +class Order: + def __init__(self, order_tup): + self.orders = order_tup + self._raw = pineappl.boc.Order(*order_tup) + + def as_tuple(self): + return self.orders + + +def test_check_scvar_evolve(): + max_as = 3 + max_al = 0 + + grid_both = Fake_grid( + [ + Order((0, 0, 0, 0, 0)), + Order((1, 0, 0, 0, 0)), + Order((2, 0, 0, 0, 0)), + Order((2, 0, 1, 0, 0)), + ] + ) + pineko.theory.check_scvar_evolve( + grid_both, + max_as, + max_al, + pineko.check.Scale.REN, + ) + + grid_central = Fake_grid( + [ + Order((0, 0, 0, 0, 0)), + Order((1, 0, 0, 0, 0)), + Order((2, 0, 0, 0, 0)), + ] + ) + pineko.theory.check_scvar_evolve( + grid_central, + max_as, + max_al, + pineko.check.Scale.REN, + ) + + grid_scvar = Fake_grid( + [ + Order((0, 0, 0, 0, 0)), + Order((1, 0, 0, 0, 0)), + Order((2, 0, 1, 0, 0)), + ] + ) + pineko.theory.check_scvar_evolve( + grid_scvar, + max_as, + max_al, + pineko.check.Scale.REN, + ) + + pineko.theory.check_scvar_evolve( + grid_scvar, + 1, + max_al, + pineko.check.Scale.REN, + )