use std::vec;
use std::any::Any;
use dyn_clone::DynClone;
pub trait Env : DynClone + Send + Sync {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn num_actions(&self) -> usize;
fn obs_shape(&self) -> Vec<usize>;
fn set_difficulty(&mut self, difficulty: usize){}
fn get_difficulty(&self) -> usize {1}
fn set_state(&mut self, state: Vec<i64>);
fn reset(&mut self);
fn step(&mut self, action: usize);
fn masks(&self) -> Vec<bool> {vec![true; self.num_actions()]}
fn is_final(&self) -> bool;
fn success(&self) -> bool;
fn reward(&self) -> f32;
fn observe(&self) -> Vec<usize>;
fn twists(&self) -> (Vec<Vec<usize>>, Vec<Vec<usize>>) {(vec![], vec![])}
fn track_solution(&self) -> bool { false }
fn solution(&self) -> Vec<usize> { vec![] }
}
dyn_clone::clone_trait_object!(Env);