use self::benefits::nEx;
use super::*;
pub fn aax(
config: &MortTableConfig,
x: u32,
m: u32,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let i = new_config.int_rate.unwrap_or(0.0);
let m_f = m as f64;
let v = 1.0 / (1.0 + i);
let v_x = v.powf(x as f64);
let v_1_m = v.powf(1.0 / m_f);
let annuity_due = (1.0 / m_f) * ((1.0 - v_x) / (1.0 - v_1_m));
let result = annuity_due * nEx(&new_config, x, t, 0, entry_age)?;
Ok(result)
}
pub fn aaxn(
config: &MortTableConfig,
x: u32,
n: u32,
m: u32,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let aax_t = aax(&new_config, x, m, t, entry_age)?;
let nEx_tn = nEx(&new_config, x, n + t, 0, entry_age)?;
let aax_xtn = aax(&new_config, x + t + n, m, 0, entry_age)?;
let result = aax_t - nEx_tn * aax_xtn;
Ok(result)
}
pub fn Iaax(
config: &MortTableConfig,
x: u32,
m: u32,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let m_f64 = m as f64;
let sx = get_value(&new_config, x, "Sx")?;
let dx = get_value(&new_config, x, "Dx")?;
let iaax = sx / dx;
let component_iaa_x = (1.0 / m_f64) * iaax;
let i = new_config.int_rate.unwrap_or(0.0);
let eff_i = (1.0 + i).powf(1.0 / m_f64) - 1.0;
let mut eff_config = new_config.clone();
eff_config.int_rate = Some(eff_i);
let result = component_iaa_x * aaxn(config, x, m, 1, t, entry_age)?;
Ok(result)
}
pub fn Iaaxn(
config: &MortTableConfig,
x: u32,
n: u32,
m: u32,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let iaax_t = Iaax(&new_config, x, m, t, entry_age)?; let nEx_tn = nEx(&new_config, x, n + t, 0, entry_age)?; let iaax_xtn = Iaax(&new_config, x + t + n, m, 0, entry_age)?; let aax_xtn = aax(&new_config, x + t + n, m, 0, entry_age)?; let result = iaax_t - nEx_tn * (iaax_xtn + (n as f64) * aax_xtn);
Ok(result)
}
pub fn Daaxn(
config: &MortTableConfig,
x: u32,
n: u32,
m: u32,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let aaxn_val = aaxn(&new_config, x, n, m, t, entry_age)?; let iaaxn_val = Iaaxn(&new_config, x, n, m, t, entry_age)?; let result = (n as f64 + 1.0) * aaxn_val - iaaxn_val;
Ok(result)
}
pub fn gaax(
config: &MortTableConfig,
x: u32,
m: u32,
g: f64,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let adjusted_config = get_new_config_geometric_functions(&new_config, g)?;
let result = aax(&adjusted_config, x, m, t, entry_age)?;
Ok(result)
}
pub fn gaaxn(
config: &MortTableConfig,
x: u32,
n: u32,
m: u32,
g: f64,
t: u32,
entry_age: Option<u32>,
) -> PolarsResult<f64> {
let new_config = get_new_config_with_selected_table(config, entry_age)?;
let adjusted_config = get_new_config_geometric_functions(&new_config, g)?;
let result = aaxn(&adjusted_config, x, n, m, t, entry_age)?;
Ok(result)
}