diff --git a/src/garage/tf/algos/npo.py b/src/garage/tf/algos/npo.py index a02a2df654..4527f4ce51 100644 --- a/src/garage/tf/algos/npo.py +++ b/src/garage/tf/algos/npo.py @@ -129,6 +129,9 @@ def __init__(self, if pg_loss not in ['vanilla', 'surrogate', 'surrogate_clip']: raise ValueError('Invalid pg_loss') + if self.max_episode_length == None: + raise ValueError('max_episode_length must not be None') + self._optimizer = make_optimizer(optimizer, **optimizer_args) self._lr_clip_range = float(lr_clip_range) self._max_kl_step = float(max_kl_step) diff --git a/tests/garage/tf/algos/test_npo.py b/tests/garage/tf/algos/test_npo.py index abeea28de0..b889f22650 100644 --- a/tests/garage/tf/algos/test_npo.py +++ b/tests/garage/tf/algos/test_npo.py @@ -115,6 +115,22 @@ def test_npo_with_invalid_no_entropy_configuration(self): entropy_method='no_entropy', policy_ent_coeff=0.02, ) + + @pytest.mark.mujoco + def test_npo_with_invalid_max_episode_length(self): + """Test NPO with invalid max_episode_length.""" + with pytest.raises(ValueError): + env = normalize( + GymEnv('InvertedDoublePendulum-v2', max_episode_length=None)) + NPO( + env_spec=env.spec, + policy=self.policy, + baseline=self.baseline, + sampler=self.sampler, + discount=0.99, + gae_lambda=0.98, + policy_ent_coeff=0.0 + ) def teardown_method(self): self.env.close()