use super::DynValue;
use crate::env::{Env, RenderFrame, ResetResult, StepResult};
use crate::error::{Error, Result};
use crate::space::{Space, SpaceInfo};
pub trait DynEnv: std::fmt::Debug {
fn step_dyn(&mut self, action: &DynValue) -> Result<StepResult<DynValue>>;
fn reset_dyn(&mut self, seed: Option<u64>) -> Result<ResetResult<DynValue>>;
fn render_dyn(&mut self) -> Result<RenderFrame>;
fn close_dyn(&mut self);
fn observation_space_info(&self) -> SpaceInfo;
fn action_space_info(&self) -> SpaceInfo;
}
impl<E> DynEnv for E
where
E: Env + std::fmt::Debug,
E::Obs: Into<DynValue>,
E::Act: TryFrom<DynValue, Error = Error>,
E::ObsSpace: Space,
E::ActSpace: Space,
{
fn step_dyn(&mut self, action: &DynValue) -> Result<StepResult<DynValue>> {
let act = E::Act::try_from(action.clone())?;
let r = self.step(&act)?;
Ok(StepResult {
obs: r.obs.into(),
reward: r.reward,
terminated: r.terminated,
truncated: r.truncated,
info: r.info,
})
}
fn reset_dyn(&mut self, seed: Option<u64>) -> Result<ResetResult<DynValue>> {
let r = self.reset(seed)?;
Ok(ResetResult {
obs: r.obs.into(),
info: r.info,
})
}
fn render_dyn(&mut self) -> Result<RenderFrame> {
self.render()
}
fn close_dyn(&mut self) {
self.close();
}
fn observation_space_info(&self) -> SpaceInfo {
self.observation_space().space_info()
}
fn action_space_info(&self) -> SpaceInfo {
self.action_space().space_info()
}
}