Expose the Bachelier (normal) swaption engine in Python
Deferred from binding pass A1 (#612), where the shifted-lognormal PyBlackSwaptionEngine landed
(crates/itofin-py/src/swaptionengine.rs). The core BachelierSwaptionEngine =
BlackStyleSwaptionEngine<BachelierSpec> (blackswaptionengine.rs:272) is already ported; this is
the thin concrete facade (generics do not cross FFI, D7), mirroring PyBlackSwaptionEngine's
new / with_flat_vol shape.
Already in place on the Python side: VolatilityType.Normal on PyConstantSwaptionVolatility
(A1), and the A1 oracle pins that a Normal surface on the Black engine errors at pricing time -
the mirror arm (a ShiftedLognormal surface on the Bachelier engine errors) belongs here.
Oracle: the wrapped Rust numbers - the core blackswaptionengine.rs Bachelier test arm
(BachelierSwaptionEngine::with_flat_vol at ~:1600) repriced through Python at 1e-10, plus the
vol-type mismatch arm.
Sequencing: independent of core #586 (Normal/shifted SABR) - the engine only needs a Normal
CONSTANT surface, which is already exposed. Size: S. Epic: D7 #46 (#605 follow-ups).
Expose the Bachelier (normal) swaption engine in Python
Deferred from binding pass A1 (#612), where the shifted-lognormal
PyBlackSwaptionEnginelanded(
crates/itofin-py/src/swaptionengine.rs). The coreBachelierSwaptionEngine=BlackStyleSwaptionEngine<BachelierSpec>(blackswaptionengine.rs:272) is already ported; this isthe thin concrete facade (generics do not cross FFI, D7), mirroring
PyBlackSwaptionEngine'snew/with_flat_volshape.Already in place on the Python side:
VolatilityType.NormalonPyConstantSwaptionVolatility(A1), and the A1 oracle pins that a Normal surface on the Black engine errors at pricing time -
the mirror arm (a ShiftedLognormal surface on the Bachelier engine errors) belongs here.
Oracle: the wrapped Rust numbers - the core
blackswaptionengine.rsBachelier test arm(
BachelierSwaptionEngine::with_flat_volat ~:1600) repriced through Python at 1e-10, plus thevol-type mismatch arm.
Sequencing: independent of core #586 (Normal/shifted SABR) - the engine only needs a Normal
CONSTANT surface, which is already exposed. Size: S. Epic: D7 #46 (#605 follow-ups).