use std::collections::HashMap;
use crate::env::Environment;
pub trait MultiAgentEnvironment: Environment {
fn num_agents(&self) -> usize;
fn get_agent_observation(&self, agent_id: usize) -> Vec<f32>;
fn agent_action_space(&self, agent_id: usize) -> Vec<usize>;
fn step_multi(&mut self, actions: &[Vec<i64>]) -> MultiAgentResult;
fn active_agents(&self) -> Vec<bool>;
}
#[derive(Debug, Clone)]
pub struct MultiAgentResult {
pub observations: Vec<Vec<f32>>,
pub rewards: Vec<f32>,
pub terminated: Vec<bool>,
pub truncated: Vec<bool>,
pub info: HashMap<String, String>,
}
impl MultiAgentResult {
pub fn new(
observations: Vec<Vec<f32>>,
rewards: Vec<f32>,
terminated: Vec<bool>,
truncated: Vec<bool>,
) -> Self {
Self { observations, rewards, terminated, truncated, info: HashMap::new() }
}
pub fn all_done(&self) -> bool {
self.terminated.iter().zip(&self.truncated).all(|(term, trunc)| *term || *trunc)
}
pub fn any_done(&self) -> bool {
self.terminated.iter().zip(&self.truncated).any(|(term, trunc)| *term || *trunc)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_multi_agent_result_all_done() {
let result = MultiAgentResult::new(
vec![vec![0.0; 4], vec![0.0; 4]],
vec![0.0, 0.0],
vec![true, true],
vec![false, false],
);
assert!(result.all_done());
assert!(result.any_done());
}
#[test]
fn test_multi_agent_result_any_done() {
let result = MultiAgentResult::new(
vec![vec![0.0; 4], vec![0.0; 4]],
vec![0.0, 0.0],
vec![true, false],
vec![false, false],
);
assert!(!result.all_done());
assert!(result.any_done());
}
#[test]
fn test_multi_agent_result_none_done() {
let result = MultiAgentResult::new(
vec![vec![0.0; 4], vec![0.0; 4]],
vec![0.0, 0.0],
vec![false, false],
vec![false, false],
);
assert!(!result.all_done());
assert!(!result.any_done());
}
}