pub fn triad_delta(rate_per_day: f32, dt_days: f32, affinity_ab: f32, affinity_bc: f32) -> f32 {
rate_per_day * dt_days * affinity_ab * affinity_bc
}
pub fn relax_toward_zero(value: f32, amount: f32) -> f32 {
if value > 0.0 {
(value - amount).max(0.0)
} else {
(value + amount).min(0.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn friend_of_a_friend_is_pulled_toward_friendship() {
assert!(triad_delta(0.5, 1.0, 0.8, 0.8) > 0.0);
assert!(triad_delta(0.5, 1.0, 0.8, -0.8) < 0.0);
}
#[test]
fn relaxation_never_crosses_zero() {
assert_eq!(relax_toward_zero(0.01, 0.05), 0.0);
assert_eq!(relax_toward_zero(-0.01, 0.05), 0.0);
assert!((relax_toward_zero(0.5, 0.1) - 0.4).abs() < 1e-6);
}
}