class_docstr: This is the `ExpManager` class for managing experiments. The API is designed similar to mlflow.
  (The link: https://mlflow.org/docs/latest/python_api/mlflow.html)
  
  The `ExpManager` is expected to be a singleton (btw, we can have multiple `Experiment`s with different uri. user can get different experiments from different uri, and then compare records of them). Global Config (i.e. `C`)  is also a singleton.
  
  So we try to align them together.  They share the same variable, which is called **default uri**. Please refer to `ExpManager.default_uri` for details of variable sharing.
  
  When the user starts an experiment, the user may want to set the uri to a specific uri (it will override **default uri** during this period), and then unset the **specific uri** and fallback to the **default uri**.    `ExpManager._active_exp_uri` is that **specific uri**.
docstr: Get a pandas DataFrame of records that fit the search criteria of the experiment.
  Inputs are the search criteria user want to apply.
  
  Returns
  -------
  A pandas.DataFrame of records, where each metric, parameter, and tag
  are expanded into their own columns named metrics.*, params.*, and tags.*
  respectively. For records that don't have a particular metric, parameter, or tag, their
  value will be (NumPy) Nan, None, or None respectively.
code: def search_records(self, experiment_ids=None, **kwargs):
      """
      Get a pandas DataFrame of records that fit the search criteria of the experiment.
      Inputs are the search criteria user want to apply.
  
      Returns
      -------
      A pandas.DataFrame of records, where each metric, parameter, and tag
      are expanded into their own columns named metrics.*, params.*, and tags.*
      respectively. For records that don't have a particular metric, parameter, or tag, their
      value will be (NumPy) Nan, None, or None respectively.
      """
      raise NotImplementedError(
          f"Please implement the `search_records` method."
      )
  
imports: from urllib.parse import urlparse
  import mlflow
  from filelock import FileLock
  from mlflow.exceptions import MlflowException, RESOURCE_ALREADY_EXISTS, ErrorCode
  from mlflow.entities import ViewType
  import os
  from typing import Optional, Text
  from .exp import MLflowExperiment, Experiment
  from ..config import C
  from .recorder import Recorder
  from ..log import get_module_logger
  from ..utils.exceptions import ExpAlreadyExistError
label_desc: Use image node_id 8 for calling the ExpManager obj's underlying member method code with example usage: obj.search_records(experiment_ids) without return types