中文版本: CHANGELOG_zh.md
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Oracle suite at 228 triplets across L = 1, 2, 3, 4 (1L=52, 2L=53, 3L=64, 4L=59). Sub-master reuse of parent MMA caches enables cheap 4L diversity.
- Kira yaml emission aligned with MMA
interface.m:126([Propagator, 0]form, closed-form rank-1 propagator reconstruction, raw caller-order preferred list). - Opt-in
AMFLOW_STAGE_TIMINGenv var: emits[kira_time]per Kira call and[total_time]at amflow_cli exit, lets external tools split wallclock into Kira-subprocess vs amflow-internal time. - CMake install rules now include
amflow_cli: aftersudo cmake --install buildthe binary lands at${CMAKE_INSTALL_PREFIX}/bin/amflow_cli(default/usr/local/bin/) alongside the library and headers, so the CLI is reachable from any working directory without needing to invoke./build/src/cli/.
- Pentabox 2L 5-leg Jordan eigenvector normalization:
fmpq_mat_nullspace_exactrescales basis vectors so the last non-zero entry is 1, matching Mathematica's convention. build_boundaryprojection on multi-mass topologies:to_complete_explicitrank-filter no longer drops mass-bearing propagators; numeric substitution restored.- Multi-mass 3L corner-master divergence:
analyze_blockextend / Gather / Complement now match MMA; defaultsparse_chop_digits = max(chop_pre, working_pre - 40)keeps acb noise budget below legitimate values.
- Complex-valued numeric kinematics is out-of-scope (previously "deferred"); JSON dispatcher rejection is unchanged.
1.1.0 — 2026-05-12
Post-v1.0 audit-driven correctness pass + Phase 3 oracle diversity
expansion. Together they close all silent-wrong-result paths
surfaced by the post-release line-level MMA parity audit
(docs/AUDIT_MMA_PARITY.md) and open
the project's five "we-didn't-think-of-this" oracle diversity axes.
After v1.1.0 the audit table reads 86 🟢 / 0 🟡 / 7 🔴 (6 fixed + 1 D5 deferred indefinitely) / 17 ⚪, and the oracle suite covers all 5 diversity axes (loop number L ≤ 4, ≥ 3 kinematic invariants, multi-cut Cutkosky, mixed-mass, and ε-extremes) with rel ≤ ~10⁻³⁰ across the new oracles.
- 3.F L=4 banana oracle (
tools/bench/banana_4loop_eps001_*): 4-loop equal-mass banana sunrise atpsq=-3, msq=1, eps=1/1000. Surfaced and locked audit divergence D7 (see Fixed below). Matches MMA at rel 7.2 × 10⁻³¹ / 1.6 × 10⁻³⁰ (C++ 399 s vs MMA 385 s). - 3.G multi-invariant electroweak box oracle
(
tools/bench/ewbox_1loop_eps001_*): 1-loop electroweak box with alternating W/Z masses and 4 distinct kinematic invariants {s, t, mWsq, mZsq}. Matches at rel ≤ 3.8 × 10⁻³⁰ (C++ 39 s vs MMA 62 s). WW bubble above threshold gives physical imag part, locking cross-mass branch-cut handling. - 3.H multi-cut Cutkosky oracle (
tools/bench/cutbanana_4L_eps001_*): 4-loop massless cutbanana with all 5 internal lines on-shell (5-particle Cutkosky cut). Matches at rel ≤ 2.2 × 10⁻³⁰ (C++ 141 s vs MMA 149 s). 5-level subsystem recursion verified end-to-end. - 3.I mixed-mass oracle (
tools/bench/bn3mix_eps001_*): 3-loop banana with 1 W-massive + 3 massless internal propagators — first 3-loop mixed-mass case. Matches at rel ≤ 2.9 × 10⁻³⁰ (C++ 56 s vs MMA 96 s). Exercises scaleless-sub-sector detection under mixed mass. - 3.J ε-extremes oracles (
tools/bench/cutbubble_1L_eps{2,10000}_*): cutbubble at eps = 1/2 (D = 3) matches at rel 1.9 × 10⁻⁶⁴ on the exact value 1/8; at eps = 10⁻⁴ matches at rel 1.0 × 10⁻³². An initial run at eps = 1 (D = 2) revealed an upstream MMA AMFlow limitation (DESolver returns partially-symbolic(1/2π) Im[DESolver\Private`variables[1, 1]]`); eps = 1/2 was used as the next-most-extreme rational that yields a clean numeric — documented in the bench source comment.
RunningOptions::run_lengthdefault raised from 200 to 1000 to match upstreamRunLength = 1000(AMFlow.m:259,DESolver.m:97). Prevents prematureRunUnitaborts on crowded pole landscapes. (Audit D1.)GlobalOptions::rationalize_predefault raised from 20 to 100 to match upstreamRationalizePre = 100. Removes the silent precision-narrowing on rationalization steps along the contour. (Audit D2.)ibp::black_box_reducenow throwsstd::runtime_errorif Kira's reduction returns an RHS J-integral that is not in the master list, mirroring upstreamKira/interface.m:486Abort. Prior behaviour silently dropped the offending row. (Audit D6.)- D3 — Tradition-with-cut boundary projection. v1.0 silently
dropped the parent system's
Cutwhen constructing the boundary sub-family. The Phase 1A patch converted that to a loud abort. Phase 1B implements the full projection mirroring upstreamReduceBoundary(AMFlow.m:790-803): each parent cut prop is passed through the bareregion.transform.map; each fam.prop is matched against the transformed cut props moduloreduced_replacement; the newsub_cutis built and asserted to preserveCount[cut, 1]; the result is passed to theqft::FamilyConfig::buildof the sub-family. Backed by a new oracle benchmark (tradcut_phase_2L_eps001_*) — 2-loop Tradition-with-cut from upstreamexamples/automatic_phasespace, matches MMA at relative error 2.68 × 10⁻³⁰. (Audit D3.) branch_to_loop(src/qft/region.cpp) gains a defensive assert thatdet(A) = ±1(constant), whereAis the loop-redefinition matrix. This catches any future relaxation of thebranch_momentaunit-leading-loop-coefficient precondition before the missing|Det|^(4-2eps)Jacobian factor (upstreamAMFlow.m:731-732) silently produces wrong boundary integrands. (Audit D4.)- D7 — dual-Kira-call master-count divergence.
ibp::reduceandibp::diffeqnow mirror upstream'sBlackBoxReduce/BlackBoxDiffeqtwo-call pattern: a Masters-mode preheat call (sector-wide enumeration viaselect_mandatory_recursively) followed by a Reduce-mode call (select_mandatory_listfor the specific targets), both at the same(rank, dot). Each call runs in its own subdirectory (<work_dir>/masters_preheat/and<work_dir>/target_reduce/) because the Kira 2.x release refuses to share a$ReductionDirectorybetween the two calls (Masters-moderun_initiate: mastersdoesn't register the-snumeric substitutions, and the subsequent Reduce-mode call aborts withKira::update_auxiliary_file: Last Kira run set 0 variables to numeric values, this time you request N).ibp::diffeqalso no longer calls nestedreduce()(which would re-floor(rank, dot)over the derivative integrals — the L=4 banana failure mode); it inlines the Reduce-mode Kira invocation atopts_eff's(rank, dot), mirroring upstream'sAnalyticReductionwhich inheritsIBPRank/IBPDotglobals fromIBPSystem. Both functions add a SubsetQ guard on the Reduce-mode master file against the Masters-mode sector enumeration, mirroring upstream'sIf[!SubsetQ[masters, str], Abort["inconsistent masters from Kira"]]. Locked by the L=4 banana oracle. (Audit D7.)
docs/AUDIT_MMA_PARITY.md: line-level upstream-parity audit report. 86 🟢 verified / 0 🟡 unverified / 7 🔴 (6 fully fixed, 1 D5 deferred indefinitely) / 17 ⚪ not ported. (Started at 65 🟢 / 21 🟡 / 6 🔴 in v1.0.0; the post-v1.0 pass closed every 🟡, fixed 6 of the 7 🔴, and surfaced D7 as the seventh 🔴 — now fixed too.)docs/ROADMAP.md§"Performance benchmarking": wall-clock baseline vs MMA on the 12 oracle benchmarks. Median speedup ~2× on Kira-light benches; converges to ~1× on Kira-heavy benches.docs/ROADMAP.md: post-v1.0 development plan (Phase 1 implementation completeness, Phase 2 oracle expansion, Phase 3 ongoing diversification).tools/bench/run_perf_audit.sh: shell driver to reproduce the perf run.- New oracle benchmarks under
tools/bench/:tradcut_phase_2L_eps001_*— first Tradition-with-cut parity test (D3 acceptance gate).banana_4loop_eps001_*— Phase 3.F first L=4 oracle (D7 gate).ewbox_1loop_eps001_*— Phase 3.G multi-invariant oracle.cutbanana_4L_eps001_*— Phase 3.H 5-particle Cutkosky oracle.bn3mix_eps001_*— Phase 3.I 3-loop mixed-mass oracle.cutbubble_1L_eps{2,10000}_*— Phase 3.J ε-extremes oracles.
- New ending scheme:
EndingScheme::Trivial, auto-appended to the user'sending_schemeslist as a final fallback (mirror of upstreamAMFlow.m:1034). - New
solve_integralssingle-eps fast path: whennumeric_values["eps"]is supplied, skip the Laurent fit and return the integral evaluated at that eps (mirror ofAMFlow.m:1364-1374). - New per-system path direction:
AMFSystem::setup()computes the η-touching loops' prescription consensus and overrides the globalrun_directionfor that system's ODE solve (mirror ofAMFlow.m:981-991). - Cutkosky setup now validates that all phase-volume component
masses are non-negative after
Numericsubstitution; raises otherwise (mirror ofAMFlow.m:1050). apply_blackbox_options(src/api/run_json.cpp) now actively rejects the complex-numeric object form{"re":..,"im":..}inamf_options.blackbox.numeric_valueswith a clear "not implemented" error pointing to audit divergence D5. Prior behaviour would have failed deeper in the parser with an unclear message; the explicit rejection makes the feature gap visible at the input boundary.
- D5 — Kira
ComplexMode/ imaginary-numeric pipeline is not implemented. Users who need to evaluate at numeric kinematics with non-zero imaginary parts cannot do so via this port; the upstream filters such values throughIBPRule/CompensateRulebut the C++ port treatsnumeric_valuesas a flat real-valued map. All 12 oracle benchmarks use purely-real numerics, so this surface is untested. Reclassified out of scope (see Unreleased §Changed) — seedocs/AUDIT_MMA_PARITY.md§D5.
1.0.0 — 2026-05-08
First public release. C++17 reimplementation of the auxiliary-mass-flow algorithm originally introduced in the Mathematica package AMFlow by Liu and Ma (https://gitlab.com/multiloop-pku/amflow; Comput. Phys. Commun. 283 (2023) 108565). All algorithmic credit belongs to the upstream authors; this project contributes only the C++ implementation and a numerical-parity test/benchmark harness.
- Domain-oriented architecture under the
amflow::namespace:numeric,algebra,ode,qft,ibp,pipeline,api,cli. - Public headers under
include/amflow/<domain>/with strict ABI/PIMPL boundaries between domains. - ODE solver — reimplementation of the upstream
DESolver.mcovering the workflows exercised by the oracle benchmarks; matches the reference at relative precision ~1e-30 across all 12 oracle cases. - AMFlow + Kira pipeline implementing the core algorithms of upstream
AMFlow.m:amflow,black_box_amflow, andsolve_integralsmodes. amflow_cli— JSON-driven driver aroundamflow::api::run_json, exposing all three top-level modes.- 500+ GoogleTest cases, including 12 sampled-parity oracle benchmarks
under
tools/bench/(eps = 1/1000). - Mathematica reference drivers under
tools/math_ref/andtools/bench/(require a local clone of upstream AMFlow; seereference/README.md), plus committed JSON reference outputs for regression tests. - CMake install / export rules; downstream projects can use
find_package(AMFlowCpp)and linkAMFlowCpp::amflow.
- The upstream Mathematica AMFlow source is not vendored. See
reference/README.mdfor how to obtain it locally to regenerate benchmark reference data.
SolveIntegralsGaugeLink, HQET / SCET / Wilson-line workflows — seedocs/AUDIT_MMA_PARITY.md.