docs: def exp_files(self):
          """A mapping from experiment to experiment configuration file
  
          Note that this attribute only contains experiments whose configuration
          has already dumped to the file!
          """
          ret = OrderedDict()
          # restore the order of the experiments
          exp_file = self.exp_file
          if osp.exists(exp_file):
              for key, val in safe_load(exp_file).items():
                  ret[key] = val
          for project, d in self.projects.items():
              project_path = d['root']
              config_path = osp.join(project_path, '.project')
              if not osp.exists(config_path):
                  continue
              for fname in glob.glob(osp.join(config_path, '*.yml')):
                  if fname == '.project.yml':
                      continue
                  exp = osp.splitext(osp.basename(fname))[0]
                  if not isinstance(ret.get(exp), Archive):
                      ret[exp] = osp.join(config_path, exp + '.yml')
                  if exp not in self._project_map[project]:
                      self._project_map[project].append(exp)
          return ret