use rlevo_core::base::Observation;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LunarLanderObservation {
pub values: [f32; 8],
}
impl LunarLanderObservation {
pub fn new(values: [f32; 8]) -> Self {
Self { values }
}
pub fn x(&self) -> f32 {
self.values[0]
}
pub fn y(&self) -> f32 {
self.values[1]
}
pub fn vx(&self) -> f32 {
self.values[2]
}
pub fn vy(&self) -> f32 {
self.values[3]
}
pub fn angle(&self) -> f32 {
self.values[4]
}
pub fn angular_vel(&self) -> f32 {
self.values[5]
}
pub fn leg1_contact(&self) -> f32 {
self.values[6]
}
pub fn leg2_contact(&self) -> f32 {
self.values[7]
}
pub fn is_finite(&self) -> bool {
self.values.iter().all(|v| v.is_finite())
}
}
impl Default for LunarLanderObservation {
fn default() -> Self {
Self { values: [0.0; 8] }
}
}
impl Observation<1> for LunarLanderObservation {
fn shape() -> [usize; 1] {
[8]
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_shape() {
assert_eq!(LunarLanderObservation::shape(), [8]);
}
#[test]
fn test_default_is_finite() {
assert!(LunarLanderObservation::default().is_finite());
}
}