Skip to main content

r2l_core/utils/
actor_wrapper.rs

1use std::marker::PhantomData;
2
3use crate::{error::Result, models::Actor, tensor::R2lTensor};
4
5#[derive(Debug, Clone)]
6pub struct ActorWrapper<A: Actor + Clone, T: R2lTensor> {
7    actor: A,
8    env: PhantomData<T>,
9}
10
11impl<D: Actor + Clone, T: R2lTensor> ActorWrapper<D, T> {
12    pub fn new(actor: D) -> Self {
13        Self {
14            actor,
15            env: PhantomData,
16        }
17    }
18}
19
20impl<D: Actor + Clone, T: R2lTensor> Actor for ActorWrapper<D, T> {
21    type Tensor = T;
22
23    fn action(&self, observation: Self::Tensor) -> Result<Self::Tensor> {
24        let action = self.actor.action(D::Tensor::convert(&observation)?)?;
25        Ok(T::convert(&action)?)
26    }
27
28    fn mode_action(&self, observation: Self::Tensor) -> Result<Self::Tensor> {
29        let action = self.actor.mode_action(D::Tensor::convert(&observation)?)?;
30        Ok(T::convert(&action)?)
31    }
32}