use std::sync::Arc;
use super::super::{
MetricAttributes, MetricMetadata, NumericAttributes, NumericEntry,
state::{FormatOptions, NumericMetricState},
};
use crate::metric::{Metric, MetricName, Numeric, SerializedEntry};
use burn_core::tensor::TensorReadError;
#[derive(Clone)]
pub struct CumulativeRewardMetric {
name: MetricName,
state: NumericMetricState,
}
impl CumulativeRewardMetric {
pub fn new() -> Self {
Self {
name: Arc::new("Cum. Reward".to_string()),
state: NumericMetricState::new(),
}
}
}
impl Default for CumulativeRewardMetric {
fn default() -> Self {
Self::new()
}
}
#[derive(new)]
pub struct CumulativeRewardInput {
cum_reward: f64,
}
impl Metric for CumulativeRewardMetric {
type Input = CumulativeRewardInput;
fn update(
&mut self,
item: &CumulativeRewardInput,
_metadata: &MetricMetadata,
) -> Result<SerializedEntry, TensorReadError> {
self.state.update(item.cum_reward, 1);
Ok(self
.state
.compute_update(FormatOptions::new(self.name()).precision(2)))
}
fn compute(&mut self) -> Result<SerializedEntry, TensorReadError> {
Ok(self
.state
.compute_final(FormatOptions::new(self.name()).precision(2)))
}
fn clear(&mut self) {
self.state.reset()
}
fn name(&self) -> MetricName {
self.name.clone()
}
fn attributes(&self) -> MetricAttributes {
NumericAttributes {
unit: None,
higher_is_better: true,
}
.into()
}
}
impl Numeric for CumulativeRewardMetric {
fn value(&self) -> Option<NumericEntry> {
Some(self.state.current_value())
}
fn running_value(&self) -> Option<NumericEntry> {
Some(self.state.running_value())
}
fn final_value(&self) -> NumericEntry {
self.state.final_value()
}
}