Skip to main content

EnvPool

Struct EnvPool 

Source
pub struct EnvPool<E: Environment> { /* private fields */ }
Expand description

A pool of environments for parallel execution

EnvPool manages multiple environment instances and executes operations across them in parallel using Rayon’s thread pool. This provides significant performance improvements over sequential execution.

§Performance

For N environments with average step time T:

  • Sequential: O(N * T)
  • Parallel: O(max(T)) ≈ O(T) when N ≤ num_cores

This can provide 10-100x speedups depending on environment complexity and number of CPU cores available.

§Action type

EnvPool is currently restricted to discrete-action envs (E::Action = i64). The pool’s step signature passes &[i64] because every existing trainer and example expects a dense vector of integer action indices. Adding pool support for continuous-action envs (e.g. SAC) is a separate follow-up; see issue #61 for the rationale behind the associated-type design.

Implementations§

Source§

impl<E: Environment<Action = i64> + Send> EnvPool<E>

Source

pub fn new<F>(env_fn: F, num_envs: usize) -> Self
where F: Fn() -> E,

Create a new environment pool

§Arguments
  • env_fn - Factory function to create environment instances
  • num_envs - Number of parallel environments
§Example
use thrust_rl::env::{cartpole::CartPole, pool::EnvPool};

let pool = EnvPool::new(|| CartPole::new(), 8);
Source

pub fn reset(&mut self) -> Vec<Vec<f32>>
where E: Send,

Reset all environments in parallel

Returns a vector of initial observations, one per environment.

§Example
let observations = pool.reset();
assert_eq!(observations.len(), 4);
Source

pub fn step(&mut self, actions: &[i64]) -> Vec<StepResult>
where E: Send,

Step all environments in parallel with given actions

§Arguments
  • actions - Slice of actions, one per environment
§Panics

Panics if the number of actions doesn’t match the number of environments.

§Example
let actions = vec![0, 1, 0, 1];
let results = pool.step(&actions);
assert_eq!(results.len(), 4);
Source

pub fn num_envs(&self) -> usize

Get the number of environments in the pool

Source

pub fn observation_space(&self) -> SpaceInfo

Get observation space information from first environment

Source

pub fn action_space(&self) -> SpaceInfo

Get action space information from first environment

Source

pub fn reset_env(&mut self, env_id: usize) -> Result<Vec<f32>>

Reset a specific environment by index

§Arguments
  • env_id - Index of environment to reset
§Returns

Initial observation from the reset environment

Source§

impl<E: Environment<Action = i64> + Send> EnvPool<E>

Source

pub fn step_structured(&mut self, actions: &[i64]) -> PoolStepResult<Vec<f32>>

Step all environments and return structured result

This is a convenience method that unpacks individual StepResults into a single PoolStepResult with parallel vectors.

Auto Trait Implementations§

§

impl<E> Freeze for EnvPool<E>

§

impl<E> RefUnwindSafe for EnvPool<E>
where E: RefUnwindSafe,

§

impl<E> Send for EnvPool<E>
where E: Send,

§

impl<E> Sync for EnvPool<E>
where E: Sync,

§

impl<E> Unpin for EnvPool<E>
where E: Unpin,

§

impl<E> UnsafeUnpin for EnvPool<E>

§

impl<E> UnwindSafe for EnvPool<E>
where E: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more