code: def offline_evaluate(self):
      ckpt_paths = set([])
      for x in os.listdir(args.saved_models_dir):
          path = os.path.join(args.saved_models_dir, x)
          ckpt_paths.add(path)
      ckpt_paths = list(ckpt_paths)
      steps = [int(x.split("-")[-1]) for x in ckpt_paths]
      sorted_idx = sorted(range(len(steps)), key=lambda k: steps[k])
      ckpt_paths = [ckpt_paths[i] for i in sorted_idx]
      ckpt_paths.reverse()
      logger.info("All checkpoints: {}".format(ckpt_paths))
      for ckpt_path in ckpt_paths:
          self.model_queue.put(ckpt_path)
  
imports: import os
  import parl
  import queue
  import six
  import threading
  import time
  import numpy
  from actor import Actor
  from opensim_model import OpenSimModel
  from opensim_agent import OpenSimAgent
  from parl.utils import logger, summary, get_gpu_count
  from parl.utils.window_stat import WindowStat
  from parl.remote.client import get_global_client
  from parl.utils import machine_info
  from shutil import copy2
label_desc: Use image node_id 3 for calling the Evaluator obj's underlying member method code with example usage: obj.offline_evaluate() without return types