sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
pub fn competitive_inhibition(substrate: f64, inhibitor: f64, vmax: f64, km: f64, ki: f64) -> f64 {
    vmax * substrate / (km * (1.0 + inhibitor / ki) + substrate)
}

pub fn uncompetitive_inhibition(
    substrate: f64,
    inhibitor: f64,
    vmax: f64,
    km: f64,
    ki: f64,
) -> f64 {
    let alpha_prime = 1.0 + inhibitor / ki;
    vmax * substrate / (km + alpha_prime * substrate)
}

pub fn mixed_inhibition(
    substrate: f64,
    inhibitor: f64,
    vmax: f64,
    km: f64,
    ki: f64,
    ki_prime: f64,
) -> f64 {
    let alpha = 1.0 + inhibitor / ki;
    let alpha_prime = 1.0 + inhibitor / ki_prime;
    vmax * substrate / (alpha * km + alpha_prime * substrate)
}

pub fn noncompetitive_inhibition(
    substrate: f64,
    inhibitor: f64,
    vmax: f64,
    km: f64,
    ki: f64,
) -> f64 {
    let alpha = 1.0 + inhibitor / ki;
    vmax * substrate / (alpha * (km + substrate))
}

pub fn substrate_inhibition_velocity(substrate: f64, vmax: f64, km: f64, ksi: f64) -> f64 {
    vmax * substrate / (km + substrate + substrate * substrate / ksi)
}

pub fn irreversible_inhibition(active_enzyme: f64, inhibitor: f64, k_inact: f64, t: f64) -> f64 {
    active_enzyme * (-k_inact * inhibitor * t).exp()
}

pub fn tight_binding_inhibition(enzyme_total: f64, inhibitor_total: f64, ki_app: f64) -> f64 {
    let a = 1.0;
    let b = -(enzyme_total + inhibitor_total + ki_app);
    let c = enzyme_total * inhibitor_total;
    let disc = (b * b - 4.0 * a * c).max(0.0).sqrt();
    let ei = (-b - disc) / (2.0 * a);
    enzyme_total - ei
}

pub fn ic50_to_ki(ic50: f64, substrate: f64, km: f64) -> f64 {
    ic50 / (1.0 + substrate / km)
}

pub fn ki_to_ic50(ki: f64, substrate: f64, km: f64) -> f64 {
    ki * (1.0 + substrate / km)
}

pub fn cheng_prusoff_uncompetitive(ic50: f64, substrate: f64, km: f64) -> f64 {
    ic50 * (1.0 + substrate / km)
}

pub fn inhibition_constant_dixon(
    v_no_inhibitor: f64,
    v_with_inhibitor: f64,
    inhibitor: f64,
    substrate: f64,
    km: f64,
) -> f64 {
    let apparent_km = km * v_no_inhibitor / v_with_inhibitor.max(1e-30);
    inhibitor / ((apparent_km / km) - 1.0).max(1e-30) * (1.0 + substrate / km)
}