#[derive(Debug, Clone, Copy)]
pub struct CulturalProfile {
pub agreeableness: f32,
pub openness: f32,
pub conscientiousness: f32,
pub extraversion: f32,
pub honesty_humility: f32,
pub emotionality: f32,
}
impl CulturalProfile {
pub fn new(
agreeableness: f32,
openness: f32,
conscientiousness: f32,
extraversion: f32,
honesty_humility: f32,
emotionality: f32,
) -> Self {
Self {
agreeableness,
openness,
conscientiousness,
extraversion,
honesty_humility,
emotionality,
}
}
fn normalize(score: f32) -> f32 {
(score - 1.0) / 4.0
}
pub fn normalized_agreeableness(&self) -> f32 {
Self::normalize(self.agreeableness.clamp(1.0, 5.0))
}
pub fn normalized_openness(&self) -> f32 {
Self::normalize(self.openness.clamp(1.0, 5.0))
}
pub fn normalized_conscientiousness(&self) -> f32 {
Self::normalize(self.conscientiousness.clamp(1.0, 5.0))
}
pub fn normalized_extraversion(&self) -> f32 {
Self::normalize(self.extraversion.clamp(1.0, 5.0))
}
pub fn normalized_emotionality(&self) -> f32 {
Self::normalize(self.emotionality.clamp(1.0, 5.0))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Geography {
Mountains,
Coastal,
Desert,
Forest,
Plains,
RiverValley,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cultural_profile_normalization() {
let profile = CulturalProfile::new(1.0, 3.0, 5.0, 2.5, 4.0, 3.5);
assert!((profile.normalized_agreeableness() - 0.0).abs() < 0.01);
assert!((profile.normalized_openness() - 0.5).abs() < 0.01);
assert!((profile.normalized_conscientiousness() - 1.0).abs() < 0.01);
}
}