#![allow(dead_code)]
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq)]
pub struct BmiMorph {
pub bmi: f32,
pub fat_distribution: f32,
pub muscle_mass: f32,
}
#[allow(dead_code)]
pub fn default_bmi_morph() -> BmiMorph {
BmiMorph {
bmi: 22.0,
fat_distribution: 0.3,
muscle_mass: 0.4,
}
}
#[allow(dead_code)]
pub fn bmi_category(bmi: f32) -> u8 {
if bmi < 18.5 {
0
} else if bmi < 25.0 {
1
} else if bmi < 30.0 {
2
} else {
3
}
}
#[allow(dead_code)]
pub fn apply_bmi_morph(weights: &mut [f32], bm: &BmiMorph) {
if !weights.is_empty() {
weights[0] = bm.fat_distribution;
}
if weights.len() >= 2 {
weights[1] = bm.muscle_mass;
}
}
#[allow(dead_code)]
pub fn bmi_blend(a: &BmiMorph, b: &BmiMorph, t: f32) -> BmiMorph {
let t = t.clamp(0.0, 1.0);
let lerp = |x: f32, y: f32| x + (y - x) * t;
BmiMorph {
bmi: lerp(a.bmi, b.bmi),
fat_distribution: lerp(a.fat_distribution, b.fat_distribution),
muscle_mass: lerp(a.muscle_mass, b.muscle_mass),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_bmi_morph_normal() {
let bm = default_bmi_morph();
assert!((bm.bmi - 22.0).abs() < 1e-6);
assert_eq!(bmi_category(bm.bmi), 1);
}
#[test]
fn bmi_category_underweight() {
assert_eq!(bmi_category(17.0), 0);
}
#[test]
fn bmi_category_normal() {
assert_eq!(bmi_category(22.0), 1);
}
#[test]
fn bmi_category_overweight() {
assert_eq!(bmi_category(27.0), 2);
}
#[test]
fn bmi_category_obese() {
assert_eq!(bmi_category(35.0), 3);
}
#[test]
fn apply_bmi_morph_fills_weights() {
let bm = BmiMorph { bmi: 25.0, fat_distribution: 0.6, muscle_mass: 0.3 };
let mut w = vec![0.0_f32; 2];
apply_bmi_morph(&mut w, &bm);
assert!((w[0] - 0.6).abs() < 1e-6);
assert!((w[1] - 0.3).abs() < 1e-6);
}
#[test]
fn apply_bmi_morph_short_slice() {
let bm = default_bmi_morph();
let mut w: Vec<f32> = Vec::new();
apply_bmi_morph(&mut w, &bm); }
#[test]
fn bmi_blend_at_zero() {
let a = default_bmi_morph();
let b = BmiMorph { bmi: 30.0, fat_distribution: 0.8, muscle_mass: 0.2 };
let r = bmi_blend(&a, &b, 0.0);
assert!((r.bmi - a.bmi).abs() < 1e-6);
}
#[test]
fn bmi_blend_at_one() {
let a = default_bmi_morph();
let b = BmiMorph { bmi: 30.0, fat_distribution: 0.8, muscle_mass: 0.2 };
let r = bmi_blend(&a, &b, 1.0);
assert!((r.bmi - b.bmi).abs() < 1e-6);
}
#[test]
fn bmi_blend_midpoint() {
let a = BmiMorph { bmi: 20.0, fat_distribution: 0.0, muscle_mass: 0.0 };
let b = BmiMorph { bmi: 30.0, fat_distribution: 1.0, muscle_mass: 1.0 };
let r = bmi_blend(&a, &b, 0.5);
assert!((r.bmi - 25.0).abs() < 1e-5);
}
#[test]
fn bmi_category_boundary_18_5() {
assert_eq!(bmi_category(18.5), 1);
}
}