use crate::metrics::calculate_ucb_score;
use crate::state::ProxyServer;
pub fn select_server_adaptive<'a>(servers: &'a [&ProxyServer]) -> &'a ProxyServer {
if servers.is_empty() {
panic!("Cannot select from empty server list");
}
if servers.len() == 1 {
return servers[0];
}
let total_requests: u64 = servers.iter().map(|s| s.metrics.total_requests).sum();
const UCB_C: f64 = 1.5;
let best_server = servers
.iter()
.max_by(|a, b| {
let score_a = calculate_ucb_score(a, total_requests, UCB_C);
let score_b = calculate_ucb_score(b, total_requests, UCB_C);
score_a
.partial_cmp(&score_b)
.unwrap_or(std::cmp::Ordering::Equal)
})
.unwrap();
best_server
}
pub fn find_servers_for_model<'a>(
all_servers: &'a [ProxyServer],
model_name: &str,
) -> Vec<&'a ProxyServer> {
all_servers
.iter()
.filter(|server| server.model_name == model_name)
.collect()
}