docstr: Please be aware that this function can only work under Linux. MacOS and Windows will be supported in the future.
  Any PR to enhance this method is highly welcomed. Besides, this script doesn't support parallel running the same model
  for multiple times, and this will be fixed in the future development.
  
  Parameters:
  -----------
  times : int
      determines how many times the model should be running.
  models : str or list
      determines the specific model or list of models to run or exclude.
  exclude : boolean
      determines whether the model being used is excluded or included.
  dataset : str
      determines the dataset to be used for each model.
  universe  : str
      the stock universe of the dataset.
      default "" indicates that
  qlib_uri : str
      the uri to install qlib with pip
      it could be URI on the remote or local path (NOTE: the local path must be an absolute path)
  exp_folder_name: str
      the name of the experiment folder
  wait_before_rm_env : bool
      wait before remove environment.
  wait_when_err : bool
      wait when errors raised when executing commands
  
  Usage:
  -------
  Here are some use cases of the function in the bash:
  
  The run_all_models  will decide which config to run based no `models` `dataset`  `universe`
  Example 1):
  
      models="lightgbm", dataset="Alpha158", universe="" will result in running the following config
      examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
  
      models="lightgbm", dataset="Alpha158", universe="csi500" will result in running the following config
      examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158_csi500.yaml
  
  .. code-block:: bash
  
      # Case 1 - run all models multiple times
      python run_all_model.py run 3
  
      # Case 2 - run specific models multiple times
      python run_all_model.py run 3 mlp
  
      # Case 3 - run specific models multiple times with specific dataset
      python run_all_model.py run 3 mlp Alpha158
  
      # Case 4 - run other models except those are given as arguments for multiple times
      python run_all_model.py run 3 [mlp,tft,lstm] --exclude=True
  
      # Case 5 - run specific models for one time
      python run_all_model.py run --models=[mlp,lightgbm]
  
      # Case 6 - run other models except those are given as arguments for one time
      python run_all_model.py run --models=[mlp,tft,sfm] --exclude=True
  
      # Case 7 - run lightgbm model on csi500.
      python run_all_model.py run 3 lightgbm Alpha158 csi500
docstr_tok: ["Please","be","aware","that","this","function","can","only","work","under","Linux",".","MacOS","and","Windows","will","be","supported","in","the","future",".","Any","PR","to","enhance","this","method","is","highly","welcomed",".","Besides",",","this","script","does","n't","support","parallel","running","the","same","model","for","multiple","times",",","and","this","will","be","fixed","in","the","future","development",".","Parameters",":","--","--","--","--","--","-","times",":","int","determines","how","many","times","the","model","should","be","running",".","models",":","str","or","list","determines","the","specific","model","or","list","of","models","to","run","or","exclude",".","exclude",":","boolean","determines","whether","the","model","being","used","is","excluded","or","included",".","dataset",":","str","determines","the","dataset","to","be","used","for","each","model",".","universe",":","str","the","stock","universe","of","the","dataset",".","default","``","''","indicates","that","qlib_uri",":","str","the","uri","to","install","qlib","with","pip","it","could","be","URI","on","the","remote","or","local","path","(","NOTE",":","the","local","path","must","be","an","absolute","path",")","exp_folder_name",":","str","the","name","of","the","experiment","folder","wait_before_rm_env",":","bool","wait","before","remove","environment",".","wait_when_err",":","bool","wait","when","errors","raised","when","executing","commands","Usage",":","--","--","--","-","Here","are","some","use","cases","of","the","function","in","the","bash",":","The","run_all_models","will","decide","which","config","to","run","based","no","`","models","`","`","dataset","`","`","universe","`","Example","1",")",":","models=","''","lightgbm","''",",","dataset=","''","Alpha158","''",",","universe=","''","''","will","result","in","running","the","following","config","examples\/benchmarks\/LightGBM\/workflow_config_lightgbm_Alpha158.yaml","models=","''","lightgbm","''",",","dataset=","''","Alpha158","''",",","universe=","''","csi500","''","will","result","in","running","the","following","config","examples\/benchmarks\/LightGBM\/workflow_config_lightgbm_Alpha158_csi500.yaml","..","code-block",":",":","bash","#","Case","1","-","run","all","models","multiple","times","python","run_all_model.py","run","3","#","Case","2","-","run","specific","models","multiple","times","python","run_all_model.py","run","3","mlp","#","Case","3","-","run","specific","models","multiple","times","with","specific","dataset","python","run_all_model.py","run","3","mlp","Alpha158","#","Case","4","-","run","other","models","except","those","are","given","as","arguments","for","multiple","times","python","run_all_model.py","run","3","[","mlp",",","tft",",","lstm","]","--","exclude=True","#","Case","5","-","run","specific","models","for","one","time","python","run_all_model.py","run","--","models=","[","mlp",",","lightgbm","]","#","Case","6","-","run","other","models","except","those","are","given","as","arguments","for","one","time","python","run_all_model.py","run","--","models=","[","mlp",",","tft",",","sfm","]","--","exclude=True","#","Case","7","-","run","lightgbm","model","on","csi500",".","python","run_all_model.py","run","3","lightgbm","Alpha158","csi500"]
code: def run(
      self,
      times=1,
      models=None,
      dataset="Alpha360",
      universe="",
      exclude=False,
      qlib_uri: str = "git+https://github.com/microsoft/qlib#egg=pyqlib",
      exp_folder_name: str = "run_all_model_records",
      wait_before_rm_env: bool = False,
      wait_when_err: bool = False,
  ):
      """
      Please be aware that this function can only work under Linux. MacOS and Windows will be supported in the future.
      Any PR to enhance this method is highly welcomed. Besides, this script doesn't support parallel running the same model
      for multiple times, and this will be fixed in the future development.
  
      Parameters:
      -----------
      times : int
          determines how many times the model should be running.
      models : str or list
          determines the specific model or list of models to run or exclude.
      exclude : boolean
          determines whether the model being used is excluded or included.
      dataset : str
          determines the dataset to be used for each model.
      universe  : str
          the stock universe of the dataset.
          default "" indicates that
      qlib_uri : str
          the uri to install qlib with pip
          it could be URI on the remote or local path (NOTE: the local path must be an absolute path)
      exp_folder_name: str
          the name of the experiment folder
      wait_before_rm_env : bool
          wait before remove environment.
      wait_when_err : bool
          wait when errors raised when executing commands
  
      Usage:
      -------
      Here are some use cases of the function in the bash:
  
      The run_all_models  will decide which config to run based no `models` `dataset`  `universe`
      Example 1):
  
          models="lightgbm", dataset="Alpha158", universe="" will result in running the following config
          examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
  
          models="lightgbm", dataset="Alpha158", universe="csi500" will result in running the following config
          examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158_csi500.yaml
  
      .. code-block:: bash
  
          # Case 1 - run all models multiple times
          python run_all_model.py run 3
  
          # Case 2 - run specific models multiple times
          python run_all_model.py run 3 mlp
  
          # Case 3 - run specific models multiple times with specific dataset
          python run_all_model.py run 3 mlp Alpha158
  
          # Case 4 - run other models except those are given as arguments for multiple times
          python run_all_model.py run 3 [mlp,tft,lstm] --exclude=True
  
          # Case 5 - run specific models for one time
          python run_all_model.py run --models=[mlp,lightgbm]
  
          # Case 6 - run other models except those are given as arguments for one time
          python run_all_model.py run --models=[mlp,tft,sfm] --exclude=True
  
          # Case 7 - run lightgbm model on csi500.
          python run_all_model.py run 3 lightgbm Alpha158 csi500
  
      """
      self._init_qlib(exp_folder_name)
  
      # get all folders
      folders = get_all_folders(models, exclude)
      # init error messages:
      errors = dict()
      # run all the model for iterations
      for fn in folders:
          # get all files
          sys.stderr.write("Retrieving files...\n")
          yaml_path, req_path = get_all_files(
              folders[fn], dataset, universe=universe
          )
          if yaml_path is None:
              sys.stderr.write(
                  f"There is no {dataset}.yaml file in {folders[fn]}"
              )
              continue
          sys.stderr.write("\n")
          # create env by anaconda
          temp_dir, env_path, python_path, conda_activate = create_env()
  
          # install requirements.txt
          sys.stderr.write("Installing requirements.txt...\n")
          with open(req_path) as f:
              content = f.read()
          if "torch" in content:
              # automatically install pytorch according to nvidia's version
              execute(
                  f"{python_path} -m pip install light-the-torch",
                  wait_when_err=wait_when_err,
              )  # for automatically installing torch according to the nvidia driver
              execute(
                  f"{env_path / 'bin' / 'ltt'} install --install-cmd '{python_path} -m pip install {{packages}}' -- -r {req_path}",
                  wait_when_err=wait_when_err,
              )
          else:
              execute(
                  f"{python_path} -m pip install -r {req_path}",
                  wait_when_err=wait_when_err,
              )
          sys.stderr.write("\n")
  
          # read yaml, remove seed kwargs of model, and then save file in the temp_dir
          yaml_path = gen_yaml_file_without_seed_kwargs(
              yaml_path, temp_dir
          )
          # setup gpu for tft
          if fn == "TFT":
              execute(
                  f"conda install -y --prefix {env_path} anaconda cudatoolkit=10.0 && conda install -y --prefix {env_path} cudnn",
                  wait_when_err=wait_when_err,
              )
              sys.stderr.write("\n")
          # install qlib
          sys.stderr.write("Installing qlib...\n")
          execute(
              f"{python_path} -m pip install --upgrade pip",
              wait_when_err=wait_when_err,
          )  # TODO: FIX ME!
          execute(
              f"{python_path} -m pip install --upgrade cython",
              wait_when_err=wait_when_err,
          )  # TODO: FIX ME!
          if fn == "TFT":
              execute(
                  f"cd {env_path} && {python_path} -m pip install --upgrade --force-reinstall --ignore-installed PyYAML -e {qlib_uri}",
                  wait_when_err=wait_when_err,
              )  # TODO: FIX ME!
          else:
              execute(
                  f"cd {env_path} && {python_path} -m pip install --upgrade --force-reinstall -e {qlib_uri}",
                  wait_when_err=wait_when_err,
              )  # TODO: FIX ME!
          sys.stderr.write("\n")
          # run workflow_by_config for multiple times
          for i in range(times):
              sys.stderr.write(
                  f"Running the model: {fn} for iteration {i+1}...\n"
              )
              errs = execute(
                  f"{python_path} {env_path / 'bin' / 'qrun'} {yaml_path} {fn} {exp_folder_name}",
                  wait_when_err=wait_when_err,
              )
              if errs is not None:
                  _errs = errors.get(fn, {})
                  _errs.update({i: errs})
                  errors[fn] = _errs
              sys.stderr.write("\n")
          # remove env
          sys.stderr.write(f"Deleting the environment: {env_path}...\n")
          if wait_before_rm_env:
              input("Press Enter to Continue")
          shutil.rmtree(env_path)
      # print errors
      sys.stderr.write(
          f"Here are some of the errors of the models...\n"
      )
      pprint(errors)
      self._collect_results(exp_folder_name, dataset)
  
imports: import os
  import sys
  import fire
  import time
  import glob
  import yaml
  import shutil
  import signal
  import inspect
  import tempfile
  import functools
  import statistics
  import subprocess
  from datetime import datetime
  from pathlib import Path
  from operator import xor
  from pprint import pprint
  import qlib
  from qlib.workflow import R
  from qlib.tests.data import GetData
label_desc: Use image node_id 2 for calling the ModelRunner obj's underlying member method code with example usage: obj.run(times, models, dataset, universe, exclude, qlib_uri, exp_folder_name, wait_before_rm_env, wait_when_err) without return types