Spaces:
Sleeping
Sleeping
| import pytest | |
| from itertools import product | |
| import torch | |
| from ding.model.template import NGU | |
| from ding.torch_utils import is_differentiable | |
| B = 4 | |
| H = 4 | |
| obs_shape = [4, (8, ), (4, 64, 64)] | |
| act_shape = [4, (4, )] | |
| args = list(product(*[obs_shape, act_shape])) | |
| class TestNGU: | |
| def output_check(self, model, outputs): | |
| if isinstance(outputs, torch.Tensor): | |
| loss = outputs.sum() | |
| elif isinstance(outputs, list): | |
| loss = sum([t.sum() for t in outputs]) | |
| elif isinstance(outputs, dict): | |
| loss = sum([v.sum() for v in outputs.values()]) | |
| is_differentiable(loss, model) | |
| def test_ngu(self, obs_shape, act_shape): | |
| if isinstance(obs_shape, int): | |
| inputs_obs = torch.randn(B, H, obs_shape) | |
| else: | |
| inputs_obs = torch.randn(B, H, *obs_shape) | |
| if isinstance(act_shape, int): | |
| inputs_prev_action = torch.ones(B, act_shape).long() | |
| else: | |
| inputs_prev_action = torch.ones(B, *act_shape).long() | |
| inputs_prev_reward_extrinsic = torch.randn(B, H, 1) | |
| inputs_beta = 2 * torch.ones([4, 4], dtype=torch.long) | |
| inputs = { | |
| 'obs': inputs_obs, | |
| 'prev_state': None, | |
| 'prev_action': inputs_prev_action, | |
| 'prev_reward_extrinsic': inputs_prev_reward_extrinsic, | |
| 'beta': inputs_beta | |
| } | |
| model = NGU(obs_shape, act_shape, collector_env_num=3) | |
| outputs = model(inputs) | |
| assert isinstance(outputs, dict) | |
| if isinstance(act_shape, int): | |
| assert outputs['logit'].shape == (B, act_shape, act_shape) | |
| elif len(act_shape) == 1: | |
| assert outputs['logit'].shape == (B, *act_shape, *act_shape) | |
| self.output_check(model, outputs['logit']) | |
| inputs = { | |
| 'obs': inputs_obs, | |
| 'prev_state': None, | |
| 'action': inputs_prev_action, | |
| 'reward': inputs_prev_reward_extrinsic, | |
| 'prev_reward_extrinsic': inputs_prev_reward_extrinsic, | |
| 'beta': inputs_beta | |
| } | |
| model = NGU(obs_shape, act_shape, collector_env_num=3) | |
| outputs = model(inputs) | |
| assert isinstance(outputs, dict) | |
| if isinstance(act_shape, int): | |
| assert outputs['logit'].shape == (B, act_shape, act_shape) | |
| elif len(act_shape) == 1: | |
| assert outputs['logit'].shape == (B, *act_shape, *act_shape) | |
| self.output_check(model, outputs['logit']) | |