in mtrl/experiment/multitask.py [0:0]
def _create_dmcontrol_vec_envs_for_eval(self) -> EnvType:
"""Method to create the vec env with multiple copies of the same
environment. It is useful when evaluating the agent multiple times
in the same env.
The vec env is organized as follows - number of modes x number of tasks per mode x number of episodes per task
"""
env_id_list: List[str] = []
seed_list: List[int] = []
mode_list: List[str] = []
num_episodes_per_env = self.config.experiment.num_eval_episodes
for mode in self.config.metrics.keys():
if mode == "train":
continue
if "_" in mode:
_mode, _submode = mode.split("_")
if _mode != "eval":
raise ValueError("`mode` does not start with `eval_`")
if not isinstance(self.config.env.eval, ConfigType):
raise ValueError(
f"""`self.config.env.eval` should either be a DictConfig.
Detected type is {type(self.config.env.eval)}"""
)
if _submode in self.config.env.eval:
for _id in self.config.env[_mode][_submode]:
env_id_list += [_id for _ in range(num_episodes_per_env)]
seed_list += list(range(1, num_episodes_per_env + 1))
mode_list += [_submode for _ in range(num_episodes_per_env)]
elif mode == "eval":
if isinstance(self.config.env.eval, ListConfigType):
for _id in self.config.env[mode]:
env_id_list += [_id for _ in range(num_episodes_per_env)]
seed_list += list(range(1, num_episodes_per_env + 1))
mode_list += [mode for _ in range(num_episodes_per_env)]
else:
raise ValueError(f"eval mode = `{mode}` is not supported.")
env = hydra.utils.instantiate(
self.config.env.builder,
env_id_list=env_id_list,
seed_list=seed_list,
mode_list=mode_list,
)
return env