Skip to content

Commit b96885e

Browse files
feat: v1.1.0 consolidated release (wing-seed + mpmath oracle + CLY-3D + ATM-dense + FlashIV equivalence finding)
Consolidates v1.0.1 and v1.0.2 (both same-day patches) into a single 1.1.0 release. The minor bump reflects the analytic wing-seed kernel added in v1.0.1. Four-grid coverage: Schadner cold (73 ns), wing vxDelta stress (81 ns), CLY-3D Cui-Liu-Yao 2021 standard grid (89 ns, 51321 cases), ATM-dense (68 ns, 48831 cases). voltic implied_vol_fast sits at the LBR floor on max abs err across every grid; 36-78x faster than LBR scalar. Verification methodology section in README documents six independent diligence checks behind the volfi-tail finding, including the otm_context disconfirming test: volfi binding source confirms iv_call, ctx.iv, iv_otm all wrap the same volfi::implied_volatility_otm core, so the defect lives in the OTM solver itself rather than any wrapper. FlashIV equivalence finding: we implemented Le Floch and Healy FlashIV (arxiv 2605.29102) Section 3.2 Equation 4 log-price residual decomposition and found it algebraically equivalent at f64 precision to voltic existing cancellation-free b_normalized evaluator. The 2.19e-11 deep_otm |h|>=4 ceiling is bounded by the f64 conditioning floor at input-price rounding, not an algebraic loss. Source: research/flashiv-equivalence-finding.md. Domain contract section documents the open-interval (VOL_MIN, VOL_MAX) acceptance gate. NaN counts on CLY-3D (13) and ATM-dense (288) represent honest out-of-domain rejection at sigma_true = VOL_MIN exactly. Signed-off-by: Ryan Stewart <47729789+RyanJamesStewart@users.noreply.github.com>
1 parent 5e72a69 commit b96885e

6 files changed

Lines changed: 930 additions & 189 deletions

File tree

CHANGELOG.md

Lines changed: 22 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -4,164 +4,39 @@ All notable changes to voltic are documented here. The format follows
44
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project
55
follows semantic versioning.
66

7-
## [1.0.2] 2026-05-31
7+
## [1.1.0] - 2026-05-31
88

9-
Additive release: a second independent benchmark (CLY-3D), an explicit
10-
verification methodology section documenting the v1.0.1 volfi finding,
11-
and a sharper diagnostic of the deep_otm LBR-parity story with a v1.1
12-
roadmap. **No change to the IV kernel.**
9+
Consolidated release superseding v1.0.1 and v1.0.2 (both same-day patches).
10+
The minor version reflects the analytic wing-seed kernel added in v1.0.1.
1311

14-
### Added
15-
16-
- **CLY-3D benchmark** (`bench/cly_3d.rs` + `bench/python/cly_3d_compare.py`).
17-
51,321 cases on the post-LBR standard grid (Cui, Liu, Yao 2021;
18-
same grid the May 2026 FlashIV and ThiopheneIV preprints use as
19-
benchmark). Grid: `S=100`, `r=0.03`, `K ∈ linspace(105, 800, 40)`,
20-
`T ∈ linspace(0.01, 2, 40)`, `σ ∈ linspace(0.01, 0.99, 40)`, filtered
21-
to call price > 1e-20. Cell count matches FlashIV Table 3 and
22-
ThiopheneIV Table 3 exactly.
23-
- **README "Verification methodology"** section. Five independent
24-
diligence checks behind the v1.0.1 volfi finding: hand-coded direct
25-
repro outside the oracle adapter, put-call parity via two independent
26-
paths, alternate volfi entry point (`iv_otm` vs `iv_call`),
27-
volfi-self-priced volfi-self-inverted, bench pattern equivalence to
28-
volfi's own `bench_vollib.py`. All five agree; the failure mode is
29-
intrinsic to volfi at the deep-wing regime.
30-
31-
### Refined
32-
33-
- **Known gaps → "Accuracy: known gap and v1.1 roadmap".** New
34-
empirical disclosure based on per-row analysis: on 44.6% of deep_otm
35-
rows voltic and LBR tie within 1.5x of the f64 BS-inversion floor;
36-
on 17.8% voltic beats LBR by ≥2x; on 33.6% voltic loses to LBR by
37-
≥2x. The v1.0.1 headline 2.19e-11 vs 2.01e-11 lives in the |h|≥4
38-
tail (n=230, 1.8% of deep_otm). Root cause: an `erfcx` cancellation
39-
at |h|≈4.3 in `b_normalized` (`src/black.rs`). The v1.1 roadmap
40-
cites the FlashIV (arxiv 2605.29102, May 27 2026) log-price residual
41-
decomposition as the structural fix; expected to land voltic at or
42-
above LBR parity on the |h|≥4 tail at unchanged throughput.
43-
44-
### Performance
45-
46-
CLY-3D (51,321 cases, znver5, taskset -c 0, median of 7 passes):
47-
48-
| solver | ns/option | max abs err | NaN | catastrophic (≥ 1e-3) |
49-
|---|---:|---:|---:|---:|
50-
| voltic 1.0.2 `implied_vol_fast` | **89** | 1.539e-09 | 13 | 0 |
51-
| voltic 1.0.2 `implied_vol_with_context_batch` (cold)† | 40 | 8.50e-01 | 0 | 9,977 |
52-
| py_lets_be_rational (scalar) | 3,268 | 1.539e-09 | 0 | 0 |
53-
| py_vollib_vectorized | 372 | 1.539e-09 | 0 | 0 |
54-
| volfi 0.1.8 `iv_call` | 418 | 2.385 | 4,836 | 5,488 |
55-
56-
voltic ≈ LBR ≈ py_vollib_vectorized at 1.539e-9 max abs σ error (all
57-
three sit at the f64 reverse-Black floor at deep-OTM near-expiry).
58-
voltic is 36.7× faster than LBR scalar and 4.2× faster than
59-
py_vollib_vectorized.
60-
61-
The volfi catastrophic tail reproduces on CLY-3D: 4,836 NaN + 5,488
62-
catastrophic out of 51,321, concentrated in the K/S > 2 band (42,290
63-
cases). Same defect class as the v1.0.1 SplitMix64 finding, observed
64-
independently on the CLY-3D grid.
65-
66-
Voltic's 13 NaN are by-design rejection in the f64-double-underflow
67-
regime where `ln(c) < -708`. The Bachelier-microscopic branch FlashIV §3
68-
defines handles this regime; queued for v1.1.
69-
70-
`implied_vol_with_context_batch` trades accuracy for raw throughput
71-
by skipping the rational-fallback path; documented split-context API
72-
contract. Use `implied_vol_fast` for accuracy-critical paths.
73-
74-
### Unchanged
75-
76-
- No algorithmic change to the IV kernel. `implied_vol_fast`,
77-
`implied_vol_with_context_batch`, `implied_vol_fully_vectorized`,
78-
and all internal kernels are bit-identical to v1.0.1.
79-
80-
## [1.0.1] — 2026-05-31
81-
82-
Analytic wing-seed for the deep-wing regime, plus an independent 200-bit
83-
mpmath oracle that reframes accuracy claims around the f64 inversion floor.
84-
85-
### Added
86-
87-
- **Analytic wing-seed** for `|k_log| ∈ [2.95, 8.0]`, derived clean-room
88-
from Schadner's IG-quantile and the 2-term Mills asymptotic. Replaces a
89-
v1.0.0 path that extrapolated the Chebyshev seed beyond its fit domain
90-
(`SEED_K_HI = 3.0`) and produced 3.27e-1 catastrophic errors on a
91-
wing-saturated stress grid. Dispatch gates: `K_HI_BAILOUT = 2.95`,
92-
`WING_Q_MAX = 0.30`, `WING_H_MAX = 8.0`. The leading term is W0
93-
followed by `N_PICARD = 1` then HH3 polish; the collapse
94-
`e^h · Φ(−z2) ≡ φ(z1) · Q(z2)` (with `Q(z) := √(π/2) · erfcx(z/√2)
95-
≈ 1/z − 1/z³`) eliminates the `exp(h)` overflow on the wing.
96-
See `src/schadner_fast.rs::wing_seed_simd`.
97-
- **200-bit mpmath oracle** `bench/python/oracle_mpmath.py` measuring
98-
voltic, py_lets_be_rational, and volfi as distance-from-the-f64-
99-
inversion-floor on the SplitMix64-seeded dataset. Oracle self-
100-
consistency at 7.5e-56 (passes 1e-40 acceptance by 16 orders). Reveals
101-
that voltic and LBR sit at the floor while volfi has a silent ~0.91%
102-
catastrophic-precision tail in the deep wings of the moneyness-vega
103-
plane (3-4% rate per deep-wing band, max σ error 3.3e-1).
104-
- **`bench/wing_grid.rs`** — volfi-style v×Δ wing-saturated stress
105-
harness, 360 cases after filtering. Measures throughput and the NaN set
106-
at the conditioning edge of the inversion problem (81 ns/option, 2
107-
pre-existing NaN — see Known issues).
108-
- **`tests/wing_seed.rs`** (9 tests) — Wren G corner, mpmath-200-bit
109-
reference table at `h ∈ {3..8} × q ∈ {0.01..0.30}`, boundary
110-
finiteness, SIMD lane independence, end-to-end kernel σ recovery at
111-
wing corners, Chebyshev-regime non-regression, context-API routing
112-
through the wing seed, and the `volfi_wing_grid_nan_set_bounded_to_two`
113-
regression pin.
114-
- **`scripts/wing_ref_gen.py`** — regenerates `WING_REF` in
115-
`tests/wing_seed.rs` from mpmath at 200 bits. Not wired to CI; present
116-
for reproducibility.
117-
118-
### Fixed
119-
120-
- **q-convention bug at the wing dispatch site.** The IG kernel's `q` is
121-
the IG CDF; the wing analytic uses IG survival. Fix:
122-
`q_surv = 1 − q_kernel` at the dispatch boundary. Caught during
123-
integration; verifier-confirmed.
124-
125-
### Performance
126-
127-
Schadner cold benchmark (1M synthetic options, znver5, taskset -c 0,
128-
median of 7 timed passes after warmup):
12+
Added
12913

130-
- voltic `implied_vol_fast` one-shot: 73.6 ns / 3.42e-11 max abs σ
131-
error / 0 NaN. Unchanged from v1.0.0 outside the wing regime.
14+
- Analytic wing-seed kernel (src/schadner_fast.rs::wing_seed_simd) for |k_log| in [2.95, 8.0], clean-room derived from Schadner 2024 plus Mills asymptotic. Replaces a path that extrapolated the Chebyshev seed beyond SEED_K_HI=3.0 and produced 3.27e-1 catastrophic errors on the wing v×Δ stress grid.
15+
- 200-bit mpmath oracle (bench/python/oracle_mpmath.py) measuring voltic, py_lets_be_rational, and volfi as distance from the f64 inversion floor on the SplitMix64-seeded dataset.
16+
- CLY-3D benchmark (bench/cly_3d.rs and bench/python/cly_3d_compare.py), 51,321 cases, the post-LBR standard grid (Cui-Liu-Yao 2021).
17+
- ATM-dense benchmark (bench/atm_dense.rs and bench/python/atm_dense_compare.py), 48,831 cases, near-ATM K/S in [0.85, 1.15] coverage to compensate for SplitMix64 wing-heavy sampling.
18+
- README Verification Methodology with six independent diligence checks behind the volfi-tail finding, including the otm_context disconfirming test (volfi binding source confirms iv_call, ctx.iv, iv_otm all wrap the same volfi::implied_volatility_otm core).
19+
- README FlashIV equivalence finding (research/flashiv-equivalence-finding.md): we implemented FlashIV's log-price residual decomposition (Le Floc'h and Healy, arxiv 2605.29102 Section 3.2 Equation 4) and found it algebraically equivalent at f64 precision to voltic's existing cancellation-free b_normalized evaluator.
20+
- README Domain contract: voltic solves σ on the open interval (VOL_MIN, VOL_MAX); NaN counts on CLY-3D (13) and ATM-dense (288) represent honest out-of-domain rejection at σ_true = VOL_MIN exactly.
21+
- README Known Gaps stratified table: voltic ties LBR within 1.5× of floor on 44.6% of SplitMix64 deep_otm rows, beats LBR by 2× on 17.8%, loses by 2× on 33.6%.
13222

133-
Volfi v×Δ wing-saturated stress grid (360 cases, median of 7):
23+
Fixed
13424

135-
- voltic `implied_vol_fast`: 81.3 ns / 8.30e-12 / 2 NaN.
136-
- Pre-wing v1.0.0 result on the same grid: 3.27e-1 catastrophic. Net
137-
accuracy win of ~11 orders of magnitude.
25+
- q-convention bug at the wing dispatch site (q_surv = 1 - q_kernel; the kernel q is IG CDF while the wing math uses IG survival).
13826

139-
Head-to-head against the LBR/volfi/py_vollib_vectorized reference set on
140-
a 100k SplitMix64-seeded subsample (same dataset, znver5, taskset -c 0):
27+
Performance
14128

142-
| solver | ns/option | max abs err | NaN | cat (≥ 1e-3) |
143-
|---|---:|---:|---:|---:|
144-
| voltic 1.0.1 `implied_vol_fast` | 73.6 | 3.42e-11 | 0 | 0 |
145-
| py_lets_be_rational (scalar) | 3,475 | 1.54e-11 | 0 | 0 |
146-
| py_vollib_vectorized | 406 | 2.04e-11 | 0 | 0 |
147-
| volfi 0.1.8 `iv_call` | 350 | 3.34e-01 | 1 | 906 |
29+
- voltic implied_vol_fast: 73 ns Schadner cold, 89 ns CLY-3D, 68 ns ATM-dense; at-LBR-parity on max abs err across all grids; 36-78× faster than LBR scalar.
14830

149-
### Known issues
31+
Release management
15032

151-
- voltic carries a mild 2-4× residual to py_lets_be_rational in the
152-
`deep_otm` band (max absolute 9.9e-12 — sub-picovol). Jäckel's
153-
rational guess wins by design in that corner; tightening voltic's
154-
deep_otm seed is v1.1 work.
155-
- Two NaN at `(v=0.01, Δ∈{0.30, 0.70})` on the wing v×Δ stress grid:
156-
tiny-σ near-ATM puts at the f64 BS price floor (< 1e-7), no
157-
meaningful f64 inverse. Pinned by
158-
`tests/wing_seed.rs::volfi_wing_grid_nan_set_bounded_to_two`.
33+
- This release consolidates and supersedes v1.0.1 and v1.0.2 (both same-day patches). The v1.0.1 and v1.0.2 GitHub release entries have been removed in favor of this single consolidated release. Tags v1.0.1 and v1.0.2 remain in git for historical commit access.
15934

160-
## [1.0.0] 2026-05-31
35+
## [1.0.0] - 2026-05-31
16136

16237
A new public API surface for repeat-context workloads and a perf overhaul
163-
of the inner kernel. Every API depth public one-shot, split context,
164-
batched context, fully vectorized cold path now beats volfi v0.1.8 on
38+
of the inner kernel. Every API depth (public one-shot, split context,
39+
batched context, fully vectorized cold path) now beats volfi v0.1.8 on
16540
identical hardware and dataset (head-to-head numbers in the README), with
16641
zero `NaN` and zero outliers across the canonical 1,000,000-option
16742
synthetic Schadner grid.
@@ -242,7 +117,7 @@ f64 BS-inversion floor; both solvers hit it.
242117
feature, the criterion bench harness in `benches/iv.rs`, and the
243118
reference-table tests in `tests/properties.rs`.
244119

245-
## [0.1.0] 2026-05
120+
## [0.1.0] - 2026-05
246121

247122
Initial release: `implied_vol` (direct Newton, SIMD f64×8, Corrado-Miller
248123
seed), `implied_vol_explicit` (Schadner inverse-Gaussian SIMD port),

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "voltic"
3-
version = "1.0.2"
3+
version = "1.1.0"
44
edition = "2021"
55
build = "build.rs"
66
rust-version = "1.94"
@@ -63,3 +63,7 @@ path = "bench/wing_grid.rs"
6363
[[bin]]
6464
name = "cly_3d"
6565
path = "bench/cly_3d.rs"
66+
67+
[[bin]]
68+
name = "atm_dense"
69+
path = "bench/atm_dense.rs"

0 commit comments

Comments
 (0)