sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
pub fn target_cell_model(
    v: f64,
    x: f64,
    y: f64,
    beta: f64,
    delta: f64,
    p: f64,
    c: f64,
) -> (f64, f64, f64) {
    let dx = -beta * x * v;
    let dy = beta * x * v - delta * y;
    let dv = p * y - c * v;
    ((x + dx).max(0.0), (y + dy).max(0.0), (v + dv).max(0.0))
}

pub fn basic_reproduction_number_viral(beta: f64, p: f64, x0: f64, delta: f64, c: f64) -> f64 {
    beta * p * x0 / (delta * c)
}

pub fn viral_fitness(replication_rate: f64, clearance_rate: f64) -> f64 {
    replication_rate / clearance_rate
}

pub fn burst_size(p: f64, delta: f64) -> f64 {
    p / delta
}

pub fn viral_load_decay(v0: f64, clearance: f64, t: f64) -> f64 {
    v0 * (-clearance * t).exp()
}

pub fn eclipse_phase_model(
    v: f64,
    x: f64,
    y1: f64,
    y2: f64,
    beta: f64,
    k: f64,
    delta: f64,
    p: f64,
    c: f64,
) -> (f64, f64, f64, f64) {
    let dx = -beta * x * v;
    let dy1 = beta * x * v - k * y1;
    let dy2 = k * y1 - delta * y2;
    let dv = p * y2 - c * v;
    (
        (x + dx).max(0.0),
        (y1 + dy1).max(0.0),
        (y2 + dy2).max(0.0),
        (v + dv).max(0.0),
    )
}

pub fn effective_reproduction_number(r0: f64, susceptible_fraction: f64) -> f64 {
    r0 * susceptible_fraction
}

pub fn viral_load_biphasic_decay(v0: f64, f_fast: f64, delta1: f64, delta2: f64, t: f64) -> f64 {
    v0 * (f_fast * (-delta1 * t).exp() + (1.0 - f_fast) * (-delta2 * t).exp())
}

pub fn within_host_r0(beta: f64, s0: f64, p: f64, delta: f64, c: f64) -> f64 {
    beta * s0 * p / (delta * c)
}

pub fn latently_infected_dynamics(
    x: f64,
    y_l: f64,
    y_a: f64,
    v: f64,
    beta: f64,
    alpha: f64,
    delta_l: f64,
    delta_a: f64,
    p: f64,
    c: f64,
    f_latent: f64,
) -> (f64, f64, f64, f64) {
    let infection = beta * x * v;
    let dx = -infection;
    let dy_l = f_latent * infection - (alpha + delta_l) * y_l;
    let dy_a = (1.0 - f_latent) * infection + alpha * y_l - delta_a * y_a;
    let dv = p * y_a - c * v;
    (dx, dy_l, dy_a, dv)
}

pub fn immune_response_ctl(y: f64, z: f64, k_kill: f64, k_expand: f64, d_z: f64) -> (f64, f64) {
    let killing = k_kill * y * z;
    let dz = k_expand * y * z - d_z * z;
    (-killing, dz)
}

pub fn antibody_neutralization(v: f64, ab: f64, k_neut: f64) -> f64 {
    v / (1.0 + k_neut * ab)
}

pub fn viral_replication_logistic(v: f64, r: f64, k_capacity: f64) -> f64 {
    r * v * (1.0 - v / k_capacity)
}

pub fn cell_to_cell_transmission(y: f64, x: f64, gamma: f64) -> f64 {
    gamma * y * x
}

pub fn defective_interfering_particles(
    v: f64,
    d: f64,
    beta_v: f64,
    beta_d: f64,
    p_v: f64,
    p_d: f64,
    c: f64,
) -> (f64, f64) {
    let dv = p_v * beta_v * v / (1.0 + v + d) - c * v;
    let dd = p_d * beta_d * v / (1.0 + v + d) - c * d;
    (dv, dd)
}

pub fn superinfection_exclusion(
    v1: f64,
    v2: f64,
    beta1: f64,
    beta2: f64,
    exclusion_factor: f64,
) -> (f64, f64) {
    let eff1 = beta1 * v1 / (1.0 + exclusion_factor * v2);
    let eff2 = beta2 * v2 / (1.0 + exclusion_factor * v1);
    (eff1, eff2)
}

pub fn time_to_peak_viremia(beta: f64, x0: f64, p: f64, delta: f64, c: f64) -> f64 {
    let r0 = beta * x0 * p / (delta * c);
    if r0 <= 1.0 {
        return f64::INFINITY;
    }
    (r0.ln()) / (beta * x0 * p / c - delta)
}

pub fn generation_time_viral(eclipse: f64, infectious_lifespan: f64) -> f64 {
    eclipse + infectious_lifespan
}