use std::collections::HashMap;
use crate::error::Result;
use crate::space::Space;
#[derive(Debug, Clone, PartialEq)]
pub enum InfoValue {
Bool(bool),
Int(i64),
Float(f64),
String(String),
IntArray(Vec<i64>),
FloatArray(Vec<f64>),
}
pub type Info = HashMap<String, InfoValue>;
#[derive(Debug, Clone)]
pub struct StepResult<O> {
pub obs: O,
pub reward: f64,
pub terminated: bool,
pub truncated: bool,
pub info: Info,
}
#[derive(Debug, Clone)]
pub struct ResetResult<O> {
pub obs: O,
pub info: Info,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum RenderMode {
#[default]
None,
RgbArray,
Human,
Ansi,
}
#[derive(Debug, Clone)]
pub enum RenderFrame {
None,
Ansi(String),
RgbArray {
width: u32,
height: u32,
data: Vec<u8>,
},
}
#[derive(Debug, Clone, Copy)]
pub struct EnvMetadata {
pub render_modes: &'static [&'static str],
pub render_fps: Option<u32>,
}
impl EnvMetadata {
pub const DEFAULT: Self = Self {
render_modes: &[],
render_fps: None,
};
}
pub trait Env {
type Obs;
type Act;
type ObsSpace: Space<Element = Self::Obs>;
type ActSpace: Space<Element = Self::Act>;
fn step(&mut self, action: &Self::Act) -> Result<StepResult<Self::Obs>>;
fn reset(&mut self, seed: Option<u64>) -> Result<ResetResult<Self::Obs>>;
fn render(&mut self) -> Result<RenderFrame>;
fn close(&mut self) {}
fn observation_space(&self) -> &Self::ObsSpace;
fn action_space(&self) -> &Self::ActSpace;
fn render_mode(&self) -> &RenderMode;
fn metadata(&self) -> EnvMetadata {
EnvMetadata::DEFAULT
}
}