From 96f8019163ea41efacb971d6b60692e7f6980b08 Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Tue, 13 Jan 2026 13:00:02 +0100 Subject: [PATCH 01/12] add lha n3lo to ekomark --- benchmarks/lha_paper_bench.py | 10 +++- doc/source/refs.bib | 11 ++++ pyproject.toml | 1 + src/ekomark/benchmark/external/LHA_n3lo.yaml | 57 ++++++++++++++++++++ src/ekomark/benchmark/external/LHA_utils.py | 21 +++++--- 5 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 src/ekomark/benchmark/external/LHA_n3lo.yaml diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py index 165006e66..a9b9b37aa 100644 --- a/benchmarks/lha_paper_bench.py +++ b/benchmarks/lha_paper_bench.py @@ -1,5 +1,5 @@ """Benchmark to :cite:`Giele:2002hx` (LO + NLO) and :cite:`Dittmar:2005ed` -(NNLO).""" +(NNLO) and :cite:`Cooper-Sarkar:2024crx` (aN3LO).""" import os @@ -162,6 +162,14 @@ def benchmark_sv_nlo(self): def benchmark_sv_nnlo(self): self.transformed_runner().run_sv(2) + @pytest.mark.n3lo + def benchmark_plain_n3lo(self): + self.transformed_runner().run_plain(3) + + @pytest.mark.n3lo + @pytest.mark.sv + def benchmark_sv_n3lo(self): + self.transformed_runner().run_sv(3) class VFNS(LHA): """Provide |VFNS| settings.""" diff --git a/doc/source/refs.bib b/doc/source/refs.bib index 6b201ca72..9e6563f34 100644 --- a/doc/source/refs.bib +++ b/doc/source/refs.bib @@ -1103,3 +1103,14 @@ @article{Barontini:2024xgu pages = "004", year = "2024" } + +@article{Cooper-Sarkar:2024crx, + author = "Cooper-Sarkar, A. and Cridge, T. and Giuli, F. and Harland-Lang, L. A. and Hekhorn, F. and Huston, J. and Magni, G. and Moch, S. and Thorne, R. S.", + title = "{A Benchmarking of QCD Evolution at Approximate $N^3LO$}", + eprint = "2406.16188", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-24-088", + month = "6", + year = "2024" +} diff --git a/pyproject.toml b/pyproject.toml index 60caa262a..27f3e11b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -187,6 +187,7 @@ markers = [ "lo: Leading order", "nlo: Next-to-leading order", "nnlo: Next-to-next-to-leading order", + "n3lo: Next-to-next-to-next-to-leading order", "sv: Scale variations", ] diff --git a/src/ekomark/benchmark/external/LHA_n3lo.yaml b/src/ekomark/benchmark/external/LHA_n3lo.yaml new file mode 100644 index 000000000..11b7c0c65 --- /dev/null +++ b/src/ekomark/benchmark/external/LHA_n3lo.yaml @@ -0,0 +1,57 @@ +# :cite:`Cooper-Sarkar:2024crx` +table2: # aN3LO, FFNS Nf = 4 , mu^2_f = 1e4 as( mu^2 = 1e4 ) = 0.110141 + part1: # mu_r^2 = mu_f^2 + u_v: [9.836966763290094e-05,0.000564046814527517,0.002894550067637567,0.013633373064192433,0.059567244488320764,0.2312988676321236,0.5513064130916566,0.35043500486036405,0.12111579323956667,0.02007701303116419,0.00034849118995363597] + d_v: [4.5170742957375996e-05,0.00030894671096857177,0.0016810059147234187,0.00798321595792946,0.03438239502080421,0.12961714737018606,0.2714017369636914,0.13014939156487818,0.031518221573520404,0.0030900215804487564,1.8134629015527025e-05] + L_m: [7.5012328115190414e-06,3.0730219060224596e-05,0.00012301844981697828,0.00047274225964280526,0.0017231472128770805,0.005764529760983048,0.01008463431290519,0.003014371134640736,0.0003778065281636943,1.3437066675585028e-05,1.383807018107099e-08] + L_p: [148.8479923788534,71.89461934475517,33.857846225888515,15.18190430761921,6.300657024758885,2.2668454260071638,0.38980785041340854,0.0354503767816389,0.002408549501956864,5.68184377618557e-05,1.0981659270521223e-07] + s_v: [-2.9105106396121748e-05,-4.6738507368897986e-05,-3.5760279193678265e-06,0.0002112318554907076,0.00039314366013795107,-0.0001964417289353511,-0.00031812084861453175,-3.840886663652343e-05,-3.3050615272957185e-06,-1.1797439429872146e-07,-2.173962424308085e-10] + s_p: [73.3520551546216,35.096091298185016,16.25335183240206,7.057102726770335,2.7376273069860133,0.8522344357944198,0.11388551884287874,0.009101887974272681,0.0005906511214455499,1.426872161057861e-05,4.262671491121996e-08] + c_p: [72.63743281068675,34.52859011025279,15.802791260701232,6.700536655532828,2.461131322708322,0.663719406393098,0.05985044225727666,0.003362504011935469,0.00018275868728081834,4.900884840671619e-06,3.462774080294777e-08] + g: [1084.6194196314023,503.58853877907796,222.82008299478008,90.22155735168697,31.335866454344348,8.153411502330732,0.9062273296258493,0.08444388661607322,0.008158561478268756,0.000392352882178833,1.3275395881224846e-06] + part2: # mu_r^2 = 2 mu_f^2 + u_v: [0.00011399870390829583,0.0005932722031445099,0.0029065745115558084,0.013478050436372508,0.0589731010122744,0.23047819608234932,0.5524586123655006,0.35229272532708483,0.12205216545223178,0.020291197147089376,0.00035422200467102524] + d_v: [6.330103615841663e-05,0.0003461690676606411,0.0017186356475401567,0.007908413048201748,0.03401030535319129,0.12918069227213513,0.2721287976724995,0.13092215038495922,0.031784829440831844,0.0031255889990524964,1.84400318246947e-05] + L_m: [6.506630375379668e-06,2.7505068891239513e-05,0.00011267853970914973,0.00044130591966008535,0.0016441448933411235,0.005647316877893464,0.010080698831967674,0.003031487576374331,0.0003811776885343257,1.360414444496989e-05,1.4098533476175113e-08] + L_p: [141.1807672237301,69.88542840916088,33.325102679472614,15.01425334479254,6.249426020541564,2.259721160892982,0.39105191546905554,0.03567609933823607,0.002425104937607314,5.6612887329583114e-05,9.390028215006851e-08] + s_v: [-7.805393553793631e-06,6.101874493328452e-07,6.644686983454611e-05,0.00023633309667370678,0.00027889000553903956,-0.00028956386398067564,-0.000283168444698302,-3.2738034816271e-05,-2.816669536741768e-06,-1.0200619758456473e-07,-1.9148272066410448e-10] + s_p: [69.516676677558,34.090114845398695,15.98588644880997,6.972292799130723,2.7108988324241583,0.8475644751518376,0.114070648437936,0.009149408719053611,0.0005929380555339524,1.3991204610110866e-05,3.447470280305331e-08] + c_p: [68.80086515997151,33.521668866785035,15.534573774392893,6.615123442616829,2.4339002238156175,0.658588845066715,0.059774819090554945,0.0033663959316812013,0.00018093926866717344,4.500123484484158e-06,2.631969773658036e-08] + g: [1053.3378598855688,498.5869853815596,222.28491943010485,90.02831958828148,31.21558544277237,8.129558033568381,0.9077424101421349,0.08477881018933561,0.00820044195904654,0.0003949218001363784,1.3406836368816369e-06] + part3: # mu_r^2 = 1/2 mu_f^2 + u_v: [4.4194950400441815e-05,0.00043474043868612207,0.0026806713316609,0.013512213662302208,0.059946375681815156,0.23195359334853094,0.55087807729676,0.34987370310264426,0.1208775843970954,0.02002994162198278,0.0003473908814849215] + d_v: [-1.118197112563163e-05,0.00017517235335878895,0.0014585823160986333,0.007839824309771709,0.03468811582724409,0.13013160135795698,0.2711574673628005,0.1299258147544942,0.03145305473621582,0.003082427101223118,1.8076047550798325e-05] + L_m: [9.04975120143592e-06,3.5176175364328666e-05,0.00013589222065980023,0.0005107525922836171,0.001823113682946333,0.005928657788550578,0.010131667780544943,0.003014014415372373,0.0003772978308111484,1.3408358676122433e-05,1.3770117818803742e-08] + L_p: [166.55967912450984,75.68502080256071,34.39237511605513,15.205790946951542,6.289633861532113,2.2605944996552942,0.38935961200248764,0.03548867308270458,0.0024189576984714814,5.813697880658746e-05,1.3969307013981123e-07] + s_v: [-8.79878213511575e-05,-0.0001855608906736739,-0.0002360392778959023,3.9415210377246346e-05,0.0006105708632265041,0.00019683149856754498,-0.0003033286198382841,-4.16823324904435e-05,-3.6076130438602534e-06,-1.2486823816453688e-07,-2.2060043346678508e-10] + s_p: [82.20962957137907,36.99258464794126,16.521547584142024,7.069872598657493,2.733290761147704,0.8503706807246125,0.1139337932855121,0.009143308267414803,0.0005973948629649652,1.4966795993048046e-05,5.7581602031556144e-08] + c_p: [81.49619680146388,36.426026892585995,16.071730803862025,6.713878422511899,2.4572015317753078,0.6621006212849259,0.05998228410091322,0.0034151178224801166,0.00019042846492671217,5.624086493379352e-06,4.961106111117491e-08] + g: [1182.6894776731117,521.5108298391596,224.7004459649999,90.32562734637254,31.41363913809554,8.173147632209384,0.9049780361365459,0.08437202807291361,0.008162614279834267,0.0003929791448305216,1.3299328717615924e-06] +table7: # aN3LO, ZM-VFNS Nf = 3,4,5 , as( mu^2 = 1e4 ) = 0.115818, 0.115605 and 0.115410, mu^2_f = 1e4 + part1: # mu_r^2 = mu_f^2 + u_v: [0.00010346649884936447,0.0005884994306477766,0.00299628283301012,0.01399820446619811,0.060651071158585354,0.2333945604182823,0.5489978056233501,0.34484634366217287,0.11802765196167009,0.01934407441283745,0.00032954606911219834] + d_v: [4.7297122716479425e-05,0.0003215823178497898,0.001737972406001252,0.008190750888109733,0.034981314268656305,0.13065228442684312,0.26978290645569086,0.12776366982136414,0.030628774937758094,0.0029683244224162414,1.723195356568458e-05] + L_m: [7.987005582323925e-06,3.2457791069548786e-05,0.00012877543178501836,0.0004899203423315251,0.0017651321129471863,0.005824812860198384,0.010007387376151729,0.0029490965997561276,0.0003656314767484141,1.2839152564793639e-05,1.0350063357422296e-08] + L_p: [158.4611878039315,75.93340954104686,35.42704767445896,15.705460296871028,6.426879288867245,2.274352838882689,0.384249598818643,0.0345222683508937,0.002317603523391949,5.2470880319563025e-05,5.569955807580773e-08] + s_p: [78.16077977411199,37.11721368670594,17.039344249459916,7.320078915731144,2.8019501508741307,0.857492055220866,0.11224580311157475,0.00885168881378991,0.0005661094886825072,1.274885385588025e-05,1.989338064447886e-08] + c_p: [76.57338415146259,35.95901543347871,16.220884203015064,6.768792580378763,2.455917272920739,0.6679591821673182,0.06465780140758652,0.00406009184043722,0.00024370639663409758,5.98012812462151e-06,1.4418314018119843e-08] + b_p: [63.89678230033376,29.511261600420198,13.02128839744941,5.266617657018453,1.8182630442835406,0.4514502788568631,0.03727442012044401,0.0021150098365176288,0.00012202686314225518,3.0846529754115454e-06,7.707421859643254e-09] + g: [1094.0780598122665,504.755401376924,221.68805114560007,88.94174262303882,30.527007320743312,7.817286466127755,0.8506787683067757,0.07866655746267838,0.00762461492381188,0.0003702032036035734,1.2668574836488075e-06] + part2: # mu_r^2 = 2 mu_f^2 + u_v: [0.00011908806262740724,0.0006153837885678697,0.0029934751127938157,0.013780163538952688,0.05985522700638366,0.23215756902370252,0.5505801263464511,0.3477905269857941,0.11956411175294189,0.0196999965720733,0.00033898925793546253] + d_v: [6.597072870559114e-05,0.0003585454820102998,0.0017684768565956654,0.008080556638607999,0.034495498551129065,0.1300066797343936,0.2708171758495179,0.12900032315659976,0.03106805833187806,0.0030274276020397805,1.7734728815976885e-05] + L_m: [6.8741618419875304e-06,2.8837332184722937e-05,0.0001171642984372324,0.0004547200800278301,0.0016768194179527854,0.005693752698739103,0.010017826221843237,0.002978885215477127,0.00037136334792834715,1.3120021248128246e-05,1.0778571248834138e-08] + L_p: [148.21483040653567,72.88026672976058,34.48786756285672,15.397672270270641,6.339600711005833,2.263943890282836,0.38658270918144944,0.0349354917607629,0.002353066326773837,5.328785573921925e-05,5.39173531979897e-08] + s_p: [73.03541731205941,35.58892918740405,16.56839273969507,7.1649689731220745,2.7569610313563913,0.8508865954496228,0.11275350414499544,0.008951357661577444,0.0005738016920642896,1.2860549327491927e-05,1.8647649182171902e-08] + c_p: [71.71215098111794,34.60930743617797,15.860936556990067,6.672183773417946,2.431520943572863,0.661272627654568,0.06304472442750407,0.0038484445251646144,0.00022346110645222146,5.2550427434527326e-06,1.2597538190180729e-08] + b_p: [60.91620683064805,28.797207738508803,12.847072115187427,5.210828315603854,1.7990712297288955,0.4473987692487134,0.03701003263639486,0.0020908077001668317,0.00011958573326822801,2.9615767872452676e-06,6.840094660623959e-09] + g: [1048.3742085147176,493.8052652740806,218.90810730976665,88.04347010018539,30.253765637888613,7.784540385735429,0.8558880779999418,0.0795893745801716,0.007733102046750407,0.00037634156724938834,1.2945473168475123e-06] + part3: # mu_r^2 = 1/2 mu_f^2 + u_v: [4.5552421212092366e-05,0.0004542922304084659,0.0027921419519473145,0.013968553973361577,0.06137495783252291,0.23477453909695123,0.5478647298569946,0.3424545942011686,0.11677146657401195,0.019054612578586004,0.0003219920459606725] + d_v: [-1.3714825205951084e-05,0.0001796042789394338,0.0015132422057706995,0.0080954465282816,0.0354877199221459,0.13154263189094573,0.26903057868211305,0.12675690877379697,0.030270050462470083,0.00292038033123047,1.683157561893255e-05] + L_m: [9.798500463773167e-06,3.7731259201563074e-05,0.00014422543217304447,0.0005355935912143429,0.0018845439648894884,0.006018829585868177,0.010032497379342017,0.00292744025836758,0.00036110502729119705,1.2614767130494165e-05,9.970915081575462e-09] + L_p: [181.9026471484787,81.75599064856551,36.683269394710656,15.967214840319713,6.475286593717728,2.272751401987424,0.3818375743114902,0.03423338020893611,0.002294853254463504,5.194414670657397e-05,5.910504660806111e-08] + s_p: [89.88399272147207,40.030389268399055,17.668857685258267,7.452191710141249,2.8277657354630743,0.858487724539762,0.11169208545584086,0.008800319891162109,0.0005631944713867157,1.2734471532655936e-05,2.1920077709819686e-08] + c_p: [87.76586108231211,38.513109177636366,16.62690317111648,6.7827749677620774,2.439679317754664,0.6683480197419192,0.06788335805337271,0.004551573253812125,0.00028913355980756186,7.416766575492072e-06,1.7298960659898744e-08] + b_p: [71.47667696638237,31.14659480055792,13.310806107777188,5.327312723731891,1.8381153802908312,0.45573228543773037,0.03759222689272437,0.002152773198543754,0.00012583593233828156,3.260403504753742e-06,8.901355449135556e-09] + g: [1221.8981004156606,533.7149499601768,227.54165905389192,90.29160550812001,30.881239325362223,7.854926387484864,0.8431559943039453,0.0775812519959332,0.007513933295829257,0.00036473224711486345,1.244342438655749e-06] diff --git a/src/ekomark/benchmark/external/LHA_utils.py b/src/ekomark/benchmark/external/LHA_utils.py index 867a0e2b7..87ba1d20d 100644 --- a/src/ekomark/benchmark/external/LHA_utils.py +++ b/src/ekomark/benchmark/external/LHA_utils.py @@ -54,7 +54,7 @@ # rotate basis -def rotate_data(raw, is_ffns_nnlo=False, rotate_to_evolution_basis=False): +def rotate_data(raw, is_ffns_nnlo_n3lo=False, rotate_to_evolution_basis=False): """Rotate data in flavor space. Rotate either to flavor basis or evolution basis from the LHA basis, which is yet an other basis. @@ -63,8 +63,8 @@ def rotate_data(raw, is_ffns_nnlo=False, rotate_to_evolution_basis=False): ---------- raw : dict data - is_ffns_nnlo : bool - special table for NNLO FFNS + is_ffns_nnlo_n3lo : bool + special table for NNLO or aN3LO FFNS rotate_to_evolution_basis : bool to evolution basis? @@ -77,7 +77,7 @@ def rotate_data(raw, is_ffns_nnlo=False, rotate_to_evolution_basis=False): label_list = raw_label_list to_flavor = LHA_rotate_to_flavor to_evolution = np.copy(br.rotate_flavor_to_evolution) - if is_ffns_nnlo: + if is_ffns_nnlo_n3lo: # add s_v and delete b_p to label_list label_list = np.insert(label_list, 4, "s_v") label_list = np.delete(label_list, -2) @@ -135,6 +135,8 @@ def compute_LHA_data(theory, operators, rotate_to_evolution_basis=False): yaml_file = "LHA_polarized.yaml" elif polarized and order > 1: raise ValueError("LHA tables beyond NLO do not exist for polarized Case") + elif order == 3: + yaml_file = "LHA_an3lo.yaml" else: yaml_file = "LHA.yaml" # load data @@ -146,7 +148,7 @@ def compute_LHA_data(theory, operators, rotate_to_evolution_basis=False): raise ValueError("LO LHA tables with scale variations are not available") table = None part = None - is_ffns_nnlo = False + is_ffns_nnlo_n3lo = False # Switching at the intermediate point. if xif2 > np.sqrt(2): @@ -162,8 +164,11 @@ def compute_LHA_data(theory, operators, rotate_to_evolution_basis=False): elif order == 1: table = 17 if polarized else 3 elif order == 2: - is_ffns_nnlo = True + is_ffns_nnlo_n3lo = True table = 14 + elif order == 3: + table = 2 + is_ffns_nnlo_n3lo = True elif fns == "ZM-VFNS": if order == 0: part = 3 @@ -172,10 +177,12 @@ def compute_LHA_data(theory, operators, rotate_to_evolution_basis=False): table = 18 if polarized else 4 elif order == 2: table = 15 + elif order == 3: + table = 7 else: raise ValueError(f"unknown FNS {fns} or order {order}") ref_values = rotate_data( - data[f"table{table}"][f"part{part}"], is_ffns_nnlo, rotate_to_evolution_basis + data[f"table{table}"][f"part{part}"], is_ffns_nnlo_n3lo, rotate_to_evolution_basis ) ref = { "target_xgrid": toy_xgrid, From b14865b5fd93c3e036bad53bfd0bd22950f59405 Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Tue, 13 Jan 2026 15:26:47 +0100 Subject: [PATCH 02/12] pre-commit and ski pol --- benchmarks/lha_paper_bench.py | 10 ++++++++++ src/ekomark/benchmark/external/LHA_utils.py | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py index a9b9b37aa..9dd40fe9f 100644 --- a/benchmarks/lha_paper_bench.py +++ b/benchmarks/lha_paper_bench.py @@ -171,6 +171,7 @@ def benchmark_plain_n3lo(self): def benchmark_sv_n3lo(self): self.transformed_runner().run_sv(3) + class VFNS(LHA): """Provide |VFNS| settings.""" @@ -278,6 +279,15 @@ def benchmark_plain_nnlo(self): def benchmark_sv_nnlo(self): pass + @pytest.mark.n3lo + def benchmark_plain_n3lo(self): + pass + + @pytest.mark.n3lo + @pytest.mark.sv + def benchmark_sv_n3lo(self): + pass + class CommonRunner(VFNS): """Generic benchmark runner using the LHA |VFNS| settings.""" diff --git a/src/ekomark/benchmark/external/LHA_utils.py b/src/ekomark/benchmark/external/LHA_utils.py index 87ba1d20d..f98196556 100644 --- a/src/ekomark/benchmark/external/LHA_utils.py +++ b/src/ekomark/benchmark/external/LHA_utils.py @@ -182,7 +182,9 @@ def compute_LHA_data(theory, operators, rotate_to_evolution_basis=False): else: raise ValueError(f"unknown FNS {fns} or order {order}") ref_values = rotate_data( - data[f"table{table}"][f"part{part}"], is_ffns_nnlo_n3lo, rotate_to_evolution_basis + data[f"table{table}"][f"part{part}"], + is_ffns_nnlo_n3lo, + rotate_to_evolution_basis, ) ref = { "target_xgrid": toy_xgrid, From 4594eafb5aa6a72d532cc594c4c26156d173e3e6 Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Tue, 13 Jan 2026 17:16:17 +0100 Subject: [PATCH 03/12] another fix --- benchmarks/lha_paper_bench.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py index 9dd40fe9f..d8b6ed1f0 100644 --- a/benchmarks/lha_paper_bench.py +++ b/benchmarks/lha_paper_bench.py @@ -162,6 +162,14 @@ def benchmark_sv_nlo(self): def benchmark_sv_nnlo(self): self.transformed_runner().run_sv(2) + +class BaseBenchmarkN3LO(BaseBenchmark): + """Abstract common benchmark tasks.""" + + def runner(self) -> LHA: + """Runner to run.""" + raise NotImplementedError("runner method has to be overwritten!") + @pytest.mark.n3lo def benchmark_plain_n3lo(self): self.transformed_runner().run_plain(3) @@ -191,7 +199,7 @@ def __init__(self): @pytest.mark.vfns -class BenchmarkVFNS(BaseBenchmark): +class BenchmarkVFNS(BaseBenchmarkN3LO): def runner(self): return VFNS() @@ -237,7 +245,7 @@ def skip_pdfs(theory): @pytest.mark.ffns -class BenchmarkFFNS(BaseBenchmark): +class BenchmarkFFNS(BaseBenchmarkN3LO): def runner(self): return FFNS() @@ -279,15 +287,6 @@ def benchmark_plain_nnlo(self): def benchmark_sv_nnlo(self): pass - @pytest.mark.n3lo - def benchmark_plain_n3lo(self): - pass - - @pytest.mark.n3lo - @pytest.mark.sv - def benchmark_sv_n3lo(self): - pass - class CommonRunner(VFNS): """Generic benchmark runner using the LHA |VFNS| settings.""" From 88008b7e38491847350db3564f82e07d846e0519 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Wed, 14 Jan 2026 11:11:04 +0200 Subject: [PATCH 04/12] Add N3LO to lha_bot --- .github/workflows/lha_bot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lha_bot.yml b/.github/workflows/lha_bot.yml index d70c4a948..8ca2f9289 100644 --- a/.github/workflows/lha_bot.yml +++ b/.github/workflows/lha_bot.yml @@ -42,3 +42,4 @@ jobs: run: | poe lha -m "nnlo and sv" poe lha -m "ffns_pol and sv" + poe lha -m "n3lo and sv" From d9df7681b55daa25c9cc3197c77b81e297c1d5a0 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Wed, 14 Jan 2026 11:16:30 +0200 Subject: [PATCH 05/12] Add N3LO to lha_bot_rust --- .github/workflows/lha_bot_rust.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lha_bot_rust.yml b/.github/workflows/lha_bot_rust.yml index 04d1293de..0ccb911a4 100644 --- a/.github/workflows/lha_bot_rust.yml +++ b/.github/workflows/lha_bot_rust.yml @@ -46,3 +46,4 @@ jobs: poe compile poe lha -m "nnlo and sv" poe lha -m "ffns_pol and sv" + poe lha -m "n3lo and sv" From 6125bb721247a43ab1e363b6fb52199eb0d246f7 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Wed, 14 Jan 2026 11:27:46 +0200 Subject: [PATCH 06/12] Fix typo in LHA_an3lo.yaml --- src/ekomark/benchmark/external/{LHA_n3lo.yaml => LHA_an3lo.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/ekomark/benchmark/external/{LHA_n3lo.yaml => LHA_an3lo.yaml} (100%) diff --git a/src/ekomark/benchmark/external/LHA_n3lo.yaml b/src/ekomark/benchmark/external/LHA_an3lo.yaml similarity index 100% rename from src/ekomark/benchmark/external/LHA_n3lo.yaml rename to src/ekomark/benchmark/external/LHA_an3lo.yaml From 4de50d1dd9065813c3f3a0af5380242ad510e383 Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Thu, 15 Jan 2026 15:42:38 +0100 Subject: [PATCH 07/12] explicitly set matching order nnlo for n3lo theories --- benchmarks/lha_paper_bench.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py index d8b6ed1f0..c11ef0bfd 100644 --- a/benchmarks/lha_paper_bench.py +++ b/benchmarks/lha_paper_bench.py @@ -57,6 +57,8 @@ def plain_theory(self, pto): """ th = self.theory.copy() th.update({"PTO": pto}) + if pto == 3: + th["matching_order"] = pto - 1 return [th] def sv_theories(self, pto): @@ -80,6 +82,9 @@ def sv_theories(self, pto): high["PTO"] = pto high["XIF"] = _sqrt2 high["ModSV"] = "exponentiated" + if pto == 3: + low["matching_order"] = pto - 1 + high["matching_order"] = pto - 1 return [high, low] @staticmethod From 5b4177ac92f5baa012bf4877eb2da64ed2735c5a Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Tue, 20 Jan 2026 17:09:48 +0200 Subject: [PATCH 08/12] Adjust PTO_matching in LHA --- benchmarks/lha_paper_bench.py | 6 +++--- src/eko/io/runcards.py | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py index c11ef0bfd..8bcc24e5b 100644 --- a/benchmarks/lha_paper_bench.py +++ b/benchmarks/lha_paper_bench.py @@ -58,7 +58,7 @@ def plain_theory(self, pto): th = self.theory.copy() th.update({"PTO": pto}) if pto == 3: - th["matching_order"] = pto - 1 + th["PTO_matching"] = pto - 1 return [th] def sv_theories(self, pto): @@ -83,8 +83,8 @@ def sv_theories(self, pto): high["XIF"] = _sqrt2 high["ModSV"] = "exponentiated" if pto == 3: - low["matching_order"] = pto - 1 - high["matching_order"] = pto - 1 + low["PTO_matching"] = pto - 1 + high["PTO_matching"] = pto - 1 return [high, low] @staticmethod diff --git a/src/eko/io/runcards.py b/src/eko/io/runcards.py index 92e23af6a..b3e5e5825 100644 --- a/src/eko/io/runcards.py +++ b/src/eko/io/runcards.py @@ -238,7 +238,13 @@ def new_theory(self): new["n3lo_ad_variation"] = old.get("n3lo_ad_variation", (0, 0, 0, 0, 0, 0, 0)) # here PTO: 0 means truly LO, no QED matching is available so far. - new["matching_order"] = old.get("PTO_matching", [old["PTO"], 0]) + pto_matching = old.get("PTO_matching") + if pto_matching is None: + new["matching_order"] = [old["PTO"], 0] + elif isinstance(pto_matching, int): + new["matching_order"] = [pto_matching + 1, 0] + else: + new["matching_order"] = pto_matching new["use_fhmruvv"] = old.get("use_fhmruvv", True) return TheoryCard.from_dict(new) From afd82499721755be24614846e57229d63ec41c95 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Tue, 20 Jan 2026 17:18:46 +0200 Subject: [PATCH 09/12] Add Changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7728f2806..6269b243b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ Items without prefix refer to a global change. ### Added - rust: N3LO unpolarized, space-like anomalous dimensions from FHMRUVV translated ([#443](https://github.com/NNPDF/eko/pull/443)) +- Added N3LO benchmark tables from 2406.16188 ([#489](https://github.com/NNPDF/eko/pull/489)) + +### Changed +- py: When converting from "old-style" NNPDF runcards, the perturbative order of the matching is now determined as follows. If `PTO_matching` is `None`, it is set to match the anomalous dimensions, i.e. according to `PTO`. If `PTO_matching` is a number, it is translated with the same logic as for the anomalous dimension, i.e. subtracting the one unit difference between `PTO` and `order`. In any other case it is used as is. ([#489](https://github.com/NNPDF/eko/pull/489)) ## [0.15.2](https://github.com/NNPDF/eko/compare/v0.15.1...v0.15.2) - 2025-07-14 From d160e0cf029db81aaa032085e14aaf810bef0375 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Tue, 20 Jan 2026 17:32:09 +0200 Subject: [PATCH 10/12] Drop py3.9 unit tests --- .github/workflows/unittests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index d3e4c4763..1dabd4a56 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -6,7 +6,7 @@ jobs: test: strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13"] fail-fast: false uses: ./.github/workflows/python-poetry-tests-with-data.yml From da1d79f7c329ff110b956fbbcb0bb63ec36853c1 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Tue, 20 Jan 2026 17:56:59 +0200 Subject: [PATCH 11/12] Bump banana --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 597aa07d9..734c01b42 100644 --- a/poetry.lock +++ b/poetry.lock @@ -118,15 +118,15 @@ dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)" [[package]] name = "banana-hep" -version = "0.6.16" +version = "0.6.17" description = "Benchmark QCD physics" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] markers = "extra == \"mark\"" files = [ - {file = "banana_hep-0.6.16-py3-none-any.whl", hash = "sha256:cf809dd579f791aa5562a8ea6d274ecbcc5dad0423a253dd3b19d2512ad5b1d5"}, - {file = "banana_hep-0.6.16.tar.gz", hash = "sha256:dc26cb644a43ba297d40d99eb321746388b91b327ebc3ed8a357a3cb669314c9"}, + {file = "banana_hep-0.6.17-py3-none-any.whl", hash = "sha256:2a0e370ed4cd8e62923d50cd7c963ddb21cb705e1b408c051c70a001961717b0"}, + {file = "banana_hep-0.6.17.tar.gz", hash = "sha256:aabfe4f37baf40fb3ebeed85805424d6d8de446448dd0c0e75535bd8f42086ef"}, ] [package.dependencies] @@ -5199,4 +5199,4 @@ mark = ["banana-hep", "matplotlib", "pandas", "sqlalchemy"] [metadata] lock-version = "2.1" python-versions = "^3.9,<3.14" -content-hash = "d28a6efb56783f332e2c142520190e32e1a49829c56c048f491ed00c56ff7471" +content-hash = "48f0e89526500e24d8ec8628782c22dbd18d9fd44c117ffbf5f8f4d669c5f2ac" diff --git a/pyproject.toml b/pyproject.toml index 27f3e11b5..5ffc9278d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ lz4 = "^4.0.2" numba = "~0.60.0 || ~0.61.0" packaging = "^24.1" # ekomark -banana-hep = { version = "^0.6.16", optional = true } +banana-hep = { version = "^0.6.17", optional = true } sqlalchemy = { version = "^1.4.21", optional = true } pandas = { version = "^2.1.4", optional = true } matplotlib = { version = "^3.5.1", optional = true } From 22b2daf0c21b56b3a2d50303b62dd79cefccf431 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Tue, 27 Jan 2026 16:36:44 +0200 Subject: [PATCH 12/12] Run poetry lock --- poetry.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 92e85e66b..54898398d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3839,4 +3839,4 @@ mark = ["banana-hep", "matplotlib", "pandas", "sqlalchemy"] [metadata] lock-version = "2.1" python-versions = "^3.10,<3.14" -content-hash = "6acc91ef35ad85e13a0de4c5e650f8b9374c2f45d4c0596dfdb16b44418197fd" +content-hash = "fec02cc5fd20915217830faebf259d3fa239fe681738da37ff106fed73acefce"