Published Benchmark Bundle

Accuracy, slowdown, and tree complexity in one place.

The plots below were generated from the current docs benchmark bundle with sample_count = 1024 and repeats = 2. The same commands are available through the public benchmark CLI.

3.55e-15 maximum absolute error across the 11 benchmark cases
2.42e-16 mean absolute error across the current docs run
141.54× mean slowdown versus direct NumPy evaluation
313.60× maximum slowdown, reached by a principal-branch inverse case

Error vs slowdown

Scatter plot of max absolute error versus slowdown

Small exponential trees sit near the lower-left corner; larger trigonometric and inverse constructions drift to the right because they expand into much deeper EML trees.

Complexity vs slowdown

Scatter plot of tree leaf count versus slowdown

Slowdown is strongly correlated with tree size. That is exactly what a constructive one-operator implementation should make visible.

Category slowdown

Bar chart of mean slowdown grouped by function category

Exponential and stability-oriented helpers are relatively cheap. Trigonometric, hyperbolic, and inverse families are more expensive because their EML representations are structurally larger.

Depth vs error

Scatter plot of tree depth versus max absolute error

Larger trees do not immediately imply poor accuracy. Even the deeper constructions still track NumPy at roughly machine-precision levels on the sampled domains.

Interpretation

Observation Meaning
Exponential cases are shallow and fast The primitive is already exp-minus-log, so these functions sit close to the operator itself.
Trigonometric and inverse cases are much deeper They rely on Euler-style reductions and logarithmic inverse formulas, which create many nested EML nodes.
Accuracy remains very strong The current implementation stays in the machine-precision regime on the sampled real domains despite large trees.