mod client;
mod lanes;
mod server;
mod types;
mod wire;
use async_trait::async_trait;
use crate::spaces;
pub use rlmesh_proto::{EndpointPhases, lane_skew_ns};
pub use client::{RemoteEnv, RemoteVectorEnv};
pub use lanes::LaneEnv;
pub use server::{BoundEnvServer, EnvServer, VectorEnvServer};
pub use spaces::request::{CloseResult, ResetRequest, ResetResult, StepRequest, StepResult};
pub use spaces::{CloseRequest, RenderRequest, RenderResult};
pub use types::{
CloseResult as VectorCloseResult, EpisodeMetadata, ResetRequest as VectorResetRequest,
ResetResult as VectorResetResult, StepRequest as VectorStepRequest,
StepResult as VectorStepResult,
};
#[doc(hidden)]
pub use wire::{WireEnvAdapter, WireLaneAdapter};
#[async_trait]
pub trait Env: Send + Sync {
fn observation_space(&self) -> &spaces::SpaceSpec;
fn action_space(&self) -> &spaces::SpaceSpec;
fn env_contract(&self) -> &spaces::EnvContract;
async fn reset(
&mut self,
req: ResetRequest,
) -> std::result::Result<ResetResult, spaces::EnvRuntimeError>;
async fn step(
&mut self,
req: StepRequest,
) -> std::result::Result<StepResult, spaces::EnvRuntimeError>;
async fn render(
&mut self,
req: RenderRequest,
) -> std::result::Result<RenderResult, spaces::EnvRuntimeError>;
async fn close(
&mut self,
req: CloseRequest,
) -> std::result::Result<CloseResult, spaces::EnvRuntimeError>;
fn take_last_phases(&mut self) -> EndpointPhases {
EndpointPhases::default()
}
}
#[async_trait]
pub trait VectorEnv: Send + Sync {
fn observation_space(&self) -> &spaces::SpaceSpec;
fn action_space(&self) -> &spaces::SpaceSpec;
fn num_envs(&self) -> usize;
fn env_contract(&self) -> &spaces::EnvContract;
async fn reset(
&mut self,
req: VectorResetRequest,
) -> std::result::Result<VectorResetResult, spaces::EnvRuntimeError>;
async fn reset_subset(
&mut self,
req: VectorResetRequest,
) -> std::result::Result<VectorResetResult, spaces::EnvRuntimeError> {
if req.env_indices.is_empty() {
self.reset(req).await
} else {
Err(spaces::EnvRuntimeError::Runtime(format!(
"partial reset of sub-envs {:?} is not supported by this environment. \
Per-lane reset is only available for an env that overrides \
`VectorEnv::reset_subset`. Use NEXT_STEP autoreset (the env resets done lanes \
itself), run with num_envs == 1, or ensure all lanes terminate on the same \
step so the whole vector resets together.",
req.env_indices
)))
}
}
async fn step(
&mut self,
req: VectorStepRequest,
) -> std::result::Result<VectorStepResult, spaces::EnvRuntimeError>;
async fn render(
&mut self,
req: RenderRequest,
) -> std::result::Result<RenderResult, spaces::EnvRuntimeError>;
async fn close(
&mut self,
req: CloseRequest,
) -> std::result::Result<VectorCloseResult, spaces::EnvRuntimeError>;
fn take_last_phases(&mut self) -> EndpointPhases {
EndpointPhases::default()
}
}