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: End an active experiment.
  
  Maintaining `_active_exp_uri` is included in end_exp, remaining implementation should be included in _end_exp in subclass
  
  Parameters
  ----------
  experiment_name : str
      name of the active experiment.
  recorder_status : str
      the status of the active recorder of the experiment.
code: def end_exp(
      self, recorder_status: Text = Recorder.STATUS_S, **kwargs
  ):
      """
      End an active experiment.
  
      Maintaining `_active_exp_uri` is included in end_exp, remaining implementation should be included in _end_exp in subclass
  
      Parameters
      ----------
      experiment_name : str
          name of the active experiment.
      recorder_status : str
          the status of the active recorder of the experiment.
      """
      self._active_exp_uri = None
      # The subclass may set the underlying uri back.
      # So setting `_active_exp_uri` come before `_end_exp`
      self._end_exp(recorder_status=recorder_status, **kwargs)
  
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 5 for calling the ExpManager obj's underlying member method code with example usage: obj.end_exp(recorder_status) without return types