code: def online_evaluate(self):
      last_model_step = None
      while True:
          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)
          if len(ckpt_paths) == 0:
              time.sleep(60)
              continue
          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]
          model_step = ckpt_paths[-1].split("-")[-1]
          if model_step != last_model_step:
              logger.info(
                  "Adding new checkpoint: :{}".format(ckpt_paths[-1])
              )
              self.model_queue.put(ckpt_paths[-1])
              last_model_step = model_step
          time.sleep(60)
  
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 4 for calling the Evaluator obj's underlying member method code with example usage: obj.online_evaluate() without return types