pub fn baseline(traits: [f32; 5]) -> [f32; 3] {
let [o, c, e, a, n] = traits.map(|t| 2.0 * t - 1.0);
let s = -n;
let pleasure = (0.21 * e + 0.59 * a + 0.19 * s).clamp(-1.0, 1.0);
let arousal = (0.15 * o + 0.30 * a - 0.57 * s).clamp(-1.0, 1.0);
let dominance = (0.25 * o + 0.17 * c + 0.60 * e - 0.32 * a).clamp(-1.0, 1.0);
[pleasure, arousal, dominance]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn neutral_personality_has_a_neutral_baseline() {
let [p, a, d] = baseline([0.5; 5]);
assert!(p.abs() < 1e-6 && a.abs() < 1e-6 && d.abs() < 1e-6);
}
#[test]
fn extraverted_agreeable_people_start_pleased_and_dominant() {
let [p, _, d] = baseline([0.5, 0.5, 1.0, 1.0, 0.0]);
assert!((p - 0.99).abs() < 1e-5, "pleasure {p}");
assert!((d - 0.28).abs() < 1e-5, "dominance {d}");
}
#[test]
fn neuroticism_lowers_stability_and_raises_arousal() {
let calm = baseline([0.5, 0.5, 0.5, 0.5, 0.0]);
let anxious = baseline([0.5, 0.5, 0.5, 0.5, 1.0]);
assert!(anxious[1] > calm[1]);
}
}