#[allow(dead_code)]
pub fn bellman(
old_value: f64,
learning_rate: f64,
reward: f64,
discount_factor: f64,
optimal_future_value: f64,
) -> f64 {
learning_rate.mul_add(
discount_factor.mul_add(optimal_future_value, reward) - old_value,
old_value,
)
}
#[allow(dead_code)]
pub fn bayesian_average(c: f64, n: f64, m: f64, v: f64) -> f64 {
safe_divide(c.mul_add(m, n * v), c + n)
}
#[allow(dead_code)]
pub fn safe_divide(dividend: f64, divisor: f64) -> f64 {
if divisor == 0.0 {
return 0.0;
}
dividend / divisor
}
#[cfg(test)]
#[allow(clippy::panic)]
mod tests {
use crate::internal::math;
#[test]
fn bellman() {
let old_value = 0.1;
let learning_rate = 0.2;
let reward = 0.3;
let discount_factor = 0.4;
let optimal_future_value = 0.5;
let actual_result = math::bellman(
old_value,
learning_rate,
reward,
discount_factor,
optimal_future_value,
);
let exp_result = 0.180_000_000_000_000_02;
assert_eq!(exp_result, actual_result);
}
#[test]
fn safe_divide() {
let test_cases = vec![(10.0, 2.0, 5.0), (0.0, 2.0, 0.0), (10.0, 0.0, 0.0)];
for tc in test_cases {
let result = math::safe_divide(tc.0, tc.1);
assert_eq!(tc.2, result);
}
}
}