1212from stable_baselines3 .common import buffers , off_policy_algorithm , policies
1313from stable_baselines3 .common .policies import BasePolicy
1414from stable_baselines3 .common .save_util import load_from_pkl
15+ from stable_baselines3 .common .vec_env import DummyVecEnv
1516
1617from imitation .policies .replay_buffer_wrapper import (
1718 ReplayBufferEntropyRewardWrapper ,
@@ -123,6 +124,7 @@ def test_wrapper_class(tmpdir, rng):
123124def test_entropy_wrapper_class_no_op (tmpdir , rng ):
124125 buffer_size = 15
125126 total_timesteps = 20
127+ entropy_samples = 0
126128
127129 venv = util .make_vec_env ("Pendulum-v1" , n_envs = 1 , rng = rng )
128130 rl_algo = sb3 .SAC (
@@ -134,7 +136,7 @@ def test_entropy_wrapper_class_no_op(tmpdir, rng):
134136 replay_buffer_kwargs = dict (
135137 replay_buffer_class = buffers .ReplayBuffer ,
136138 reward_fn = zero_reward_fn ,
137- entropy_as_reward_samples = 0 ,
139+ entropy_as_reward_samples = entropy_samples ,
138140 ),
139141 buffer_size = buffer_size ,
140142 )
@@ -172,8 +174,8 @@ class ActionIsObsEnv(gym.Env):
172174 def __init__ (self ):
173175 """Initialize environment."""
174176 super ().__init__ ()
175- self .action_space = spaces .Discrete ( 50 )
176- self .observation_space = spaces .Discrete ( 50 )
177+ self .action_space = spaces .Box ( np . array ([ 0 ]), np . array ([ 1 ]) )
178+ self .observation_space = spaces .Box ( np . array ([ 0 ]), np . array ([ 1 ]) )
177179
178180 def step (self , action ):
179181 obs = action
@@ -183,17 +185,15 @@ def step(self, action):
183185 return obs , reward , done , info
184186
185187 def reset (self ):
186- return self . action_space . sample ( )
188+ return np . array ([ 0 ] )
187189
188190
189191def test_entropy_wrapper_class (tmpdir , rng ):
190- buffer_size = 15
191- entropy_samples = 10
192- total_timesteps = 20
193-
194- # TODO expect that our behavior is approximately uniformly distributed
192+ buffer_size = 20
193+ entropy_samples = 40
194+ k = 4
195195
196- venv = util . make_vec_env ( "Pendulum-v1" , n_envs = 1 , rng = rng )
196+ venv = DummyVecEnv ([ ActionIsObsEnv ] )
197197 rl_algo = sb3 .SAC (
198198 policy = sb3 .sac .policies .SACPolicy ,
199199 policy_kwargs = dict (),
@@ -204,32 +204,24 @@ def test_entropy_wrapper_class(tmpdir, rng):
204204 replay_buffer_class = buffers .ReplayBuffer ,
205205 reward_fn = zero_reward_fn ,
206206 entropy_as_reward_samples = entropy_samples ,
207+ k = k ,
207208 ),
208209 buffer_size = buffer_size ,
209210 )
210211
211- rl_algo .learn (total_timesteps = total_timesteps )
212-
213- buffer_path = osp .join (tmpdir , "buffer.pkl" )
214- rl_algo .save_replay_buffer (buffer_path )
215- replay_buffer_wrapper = load_from_pkl (buffer_path )
216- replay_buffer = replay_buffer_wrapper .replay_buffer
217-
218- # replay_buffer_wrapper.sample(...) should return zero-reward transitions
219- assert buffer_size == replay_buffer_wrapper .size () == replay_buffer .size ()
220- assert (replay_buffer_wrapper .sample (total_timesteps ).rewards == 0.0 ).all ()
221- assert (replay_buffer .sample (total_timesteps ).rewards != 0.0 ).all () # seed=42
222-
223- # replay_buffer_wrapper.pos, replay_buffer_wrapper.full
224- assert replay_buffer_wrapper .pos == total_timesteps - buffer_size
225- assert replay_buffer_wrapper .full
226-
227- # reset()
228- replay_buffer_wrapper .reset ()
229- assert 0 == replay_buffer_wrapper .size () == replay_buffer .size ()
230- assert replay_buffer_wrapper .pos == 0
231- assert not replay_buffer_wrapper .full
212+ rl_algo .learn (total_timesteps = buffer_size )
213+ initial_entropy = util .compute_state_entropy (
214+ th .Tensor (rl_algo .replay_buffer .observations ),
215+ th .Tensor (rl_algo .replay_buffer .observations ),
216+ k = k ,
217+ )
232218
233- # to_torch()
234- tensor = replay_buffer_wrapper .to_torch (np .ones (42 ))
235- assert type (tensor ) is th .Tensor
219+ rl_algo .learn (total_timesteps = entropy_samples - buffer_size )
220+ # Expect that the entropy of our replay buffer is now higher,
221+ # since we trained with that as the reward.
222+ trained_entropy = util .compute_state_entropy (
223+ th .Tensor (rl_algo .replay_buffer .observations ),
224+ th .Tensor (rl_algo .replay_buffer .observations ),
225+ k = k ,
226+ )
227+ assert trained_entropy .mean () > initial_entropy .mean ()
0 commit comments