use crate::core::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RewardMetrics {
pub success_rate: f64,
pub efficiency_score: f64,
pub quality_score: f64,
pub total_reward: f64,
}
impl Default for RewardMetrics {
fn default() -> Self {
Self {
success_rate: 0.0,
efficiency_score: 0.0,
quality_score: 0.0,
total_reward: 0.0,
}
}
}
pub fn calculate_reward(metrics: &RewardMetrics) -> Result<f64> {
let reward = (metrics.success_rate * 0.5)
+ (metrics.efficiency_score * 0.3)
+ (metrics.quality_score * 0.2);
Ok(reward.min(1.0).max(0.0))
}
pub fn update_reward_model(agent_id: &str, reward: f64) -> Result<()> {
tracing::info!("Updating reward model for agent {}: {}", agent_id, reward);
Ok(())
}
pub fn evaluate_trajectory_quality(trajectory_data: &str) -> Result<f64> {
let quality_score = if trajectory_data.len() > 100 { 0.8 } else { 0.4 };
Ok(quality_score)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_calculate_reward() {
let metrics = RewardMetrics {
success_rate: 0.8,
efficiency_score: 0.7,
quality_score: 0.9,
total_reward: 0.0,
};
let result = calculate_reward(&metrics);
assert!(result.is_ok());
let reward = result.unwrap();
assert!(reward > 0.0 && reward <= 1.0);
assert!((reward - 0.79).abs() < 0.01); }
#[test]
fn test_update_reward_model() {
let result = update_reward_model("test_agent", 0.75);
assert!(result.is_ok());
}
#[test]
fn test_evaluate_trajectory_quality() {
let long_trajectory = "x".repeat(200);
let short_trajectory = "short";
let result1 = evaluate_trajectory_quality(&long_trajectory);
assert!(result1.is_ok());
assert_eq!(result1.unwrap(), 0.8);
let result2 = evaluate_trajectory_quality(&short_trajectory);
assert!(result2.is_ok());
assert_eq!(result2.unwrap(), 0.4);
}
#[test]
fn test_reward_metrics_default() {
let metrics = RewardMetrics::default();
assert_eq!(metrics.success_rate, 0.0);
assert_eq!(metrics.efficiency_score, 0.0);
assert_eq!(metrics.quality_score, 0.0);
assert_eq!(metrics.total_reward, 0.0);
}
}