libitofin 0.37.0

A ground-up Rust port of QuantLib: quantitative-finance primitives for pricing, risk, and numerical methods.
Documentation
use super::tests::request;
use super::*;

#[test]
fn invalid_and_unrepresentable_requests_fail_without_allocation() {
    let cases = [
        GjrRequest {
            spot: 0.0,
            ..request()
        },
        GjrRequest {
            spot: Real::NAN,
            ..request()
        },
        GjrRequest {
            daily_variance: -1.0,
            ..request()
        },
        GjrRequest {
            omega: -1.0,
            ..request()
        },
        GjrRequest {
            alpha: -1.0,
            ..request()
        },
        GjrRequest {
            beta: -1.0,
            ..request()
        },
        GjrRequest {
            gamma: -1.0,
            ..request()
        },
        GjrRequest {
            lambda: Real::INFINITY,
            ..request()
        },
        GjrRequest {
            days_per_year: 0.0,
            ..request()
        },
        GjrRequest {
            risk_free_rate: Real::NAN,
            ..request()
        },
        GjrRequest {
            dividend_yield: Real::INFINITY,
            ..request()
        },
        GjrRequest {
            risk_free_rate: Real::MAX,
            dividend_yield: -Real::MAX,
            ..request()
        },
        GjrRequest {
            horizon: -1.0,
            ..request()
        },
        GjrRequest {
            horizon: Real::INFINITY,
            ..request()
        },
        GjrRequest {
            horizon: Real::from_bits(1),
            ..request()
        },
        GjrRequest {
            steps: 0,
            ..request()
        },
        GjrRequest {
            paths: 0,
            ..request()
        },
        GjrRequest {
            seed: 0,
            ..request()
        },
        GjrRequest {
            steps: usize::MAX,
            ..request()
        },
        GjrRequest {
            paths: usize::MAX,
            ..request()
        },
        GjrRequest {
            daily_variance: Real::MAX,
            ..request()
        },
        GjrRequest {
            lambda: Real::MAX,
            ..request()
        },
        GjrRequest {
            days_per_year: Real::MAX,
            ..request()
        },
        GjrRequest {
            risk_free_rate: Real::MAX,
            horizon: 4.0,
            ..request()
        },
        GjrRequest {
            risk_free_rate: -Real::MAX,
            horizon: 4.0,
            ..request()
        },
    ];
    for case in cases {
        assert!(gjr_paths(&case).is_err());
    }
}

#[test]
fn output_and_work_dimension_overflow_are_checked_separately() {
    assert!(
        output_len(&GjrRequest {
            steps: usize::MAX,
            paths: 1,
            ..request()
        })
        .is_err()
    );
    assert!(
        output_len(&GjrRequest {
            steps: 1,
            paths: usize::MAX / 2 + 1,
            terminal_only: true,
            ..request()
        })
        .is_err()
    );
    let work_overflow = GjrRequest {
        steps: usize::MAX / 2 + 1,
        paths: 1,
        terminal_only: true,
        ..request()
    };
    assert_eq!(output_len(&work_overflow).unwrap(), 2);
    assert!(
        gjr_paths(&work_overflow)
            .unwrap_err()
            .message()
            .contains("work dimensions")
    );
    let allocation_overflow = GjrRequest {
        steps: 1,
        paths: usize::MAX / 32,
        terminal_only: false,
        ..request()
    };
    assert!(output_len(&allocation_overflow).is_ok());
    assert!(
        gjr_paths(&allocation_overflow)
            .unwrap_err()
            .message()
            .contains("allocation failed")
    );
}