border_atari_env/lib.rs
1//! A thin wrapper of [`atari-env`](https://crates.io/crates/atari-env) for [`Border`](https://crates.io/crates/border).
2//!
3//! The code under [atari_env] is adapted from the
4//! [`atari-env`](https://crates.io/crates/atari-env) crate
5//! (rev = `0ef0422f953d79e96b32ad14284c9600bd34f335`),
6//! because the crate registered in crates.io does not implement
7//! [`atari_env::AtariEnv::lives()`] method, which is required for episodic life environments.
8//!
9//! This environment applies some preprocessing to observation as in
10//! [`atari_wrapper.py`](https://github.com/openai/baselines/blob/master/baselines/common/atari_wrappers.py).
11//!
12//! You need to place Atari Rom directories under the directory specified by environment variable
13//! `ATARI_ROM_DIR`. An easy way to do this is to use [AutoROM](https://pypi.org/project/AutoROM/)
14//! Python package.
15//!
16//! ```bash
17//! pip install autorom
18//! mkdir $HOME/atari_rom
19//! AutoROM --install-dir $HOME/atari_rom
20//! export ATARI_ROM_DIR=$HOME/atari_rom
21//! ```
22//!
23//! Here is an example of running Pong environment with a random policy.
24//!
25//! ```no_run
26//! use anyhow::Result;
27//! use border_atari_env::{
28//! BorderAtariAct, BorderAtariActRawFilter, BorderAtariEnv, BorderAtariEnvConfig,
29//! BorderAtariObs, BorderAtariObsRawFilter,
30//! };
31//! use border_core::{Env as _, Policy, DefaultEvaluator, Evaluator as _, NullReplayBuffer, Agent};
32//!
33//! # type Obs = BorderAtariObs;
34//! # type Act = BorderAtariAct;
35//! # type ObsFilter = BorderAtariObsRawFilter<Obs>;
36//! # type ActFilter = BorderAtariActRawFilter<Act>;
37//! # type EnvConfig = BorderAtariEnvConfig<Obs, Act, ObsFilter, ActFilter>;
38//! # type Env = BorderAtariEnv<Obs, Act, ObsFilter, ActFilter>;
39//! #
40//! # #[derive(Clone)]
41//! # struct RandomPolicyConfig {
42//! # pub n_acts: usize,
43//! # }
44//! #
45//! # struct RandomPolicy {
46//! # n_acts: usize,
47//! # }
48//! #
49//! # impl RandomPolicy {
50//! # pub fn build(n_acts: usize) -> Self {
51//! # Self { n_acts }
52//! # }
53//! # }
54//! #
55//! # impl Policy<Env> for RandomPolicy {
56//! # fn sample(&mut self, _: &Obs) -> Act {
57//! # fastrand::u8(..self.n_acts as u8).into()
58//! # }
59//! # }
60//! #
61//! # impl Agent<Env, NullReplayBuffer> for RandomPolicy {}
62//! #
63//! # fn env_config(name: String) -> EnvConfig {
64//! # EnvConfig::default().name(name)
65//! # }
66//! #
67//! fn main() -> Result<()> {
68//! # env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
69//! # fastrand::seed(42);
70//! #
71//! // Creates Pong environment
72//! let env_config = env_config("pong".to_string());
73//!
74//! // Creates a random policy
75//! let n_acts = 4;
76//! let mut policy = Box::new(RandomPolicy::build(n_acts)) as _;
77//!
78//! // Runs evaluation
79//! let env_config = env_config.render(true);
80//! let _ = DefaultEvaluator::new(&env_config, 42, 5)?
81//! .evaluate(&mut policy);
82//!
83//! Ok(())
84//! }
85//! ```
86//! [`atari_env::AtariEnv::lives()`]: atari_env::AtariEnv::lives
87mod act;
88pub mod atari_env;
89mod env;
90mod obs;
91pub mod util;
92pub use act::{BorderAtariAct, BorderAtariActFilter, BorderAtariActRawFilter};
93pub use env::{BorderAtariEnv, BorderAtariEnvConfig};
94pub use obs::{BorderAtariObs, BorderAtariObsFilter, BorderAtariObsRawFilter};