class_docstr: Manager for trading calendar
      - BaseStrategy and BaseExecutor will use it
docstr: get the calendar range
  The following assumptions are made
  1) The frequency of the exchange in common_infra is the same as the data calendar
  2) Users want the **data index** mod by **day** (i.e. 240 min)
  
  Parameters
  ----------
  rtype: str
      - "full": return the full limitation of the decision in the day
      - "step": return the limitation of current step
  
  Returns
  -------
  Tuple[int, int]:
docstr_tok: ["get","the","calendar","range","The","following","assumptions","are","made","1",")","The","frequency","of","the","exchange","in","common_infra","is","the","same","as","the","data","calendar","2",")","Users","want","the","*","*","data","index","*","*","mod","by","*","*","day","*","*","(","i.e",".","240","min",")","Parameters","--","--","--","--","--","rtype",":","str","-","``","full","''",":","return","the","full","limitation","of","the","decision","in","the","day","-","``","step","''",":","return","the","limitation","of","current","step","Returns","--","--","--","-","Tuple","[","int",",","int","]",":"]
code: def get_data_cal_range(self, rtype: str = "full") -> Tuple[int, int]:
      """
      get the calendar range
      The following assumptions are made
      1) The frequency of the exchange in common_infra is the same as the data calendar
      2) Users want the **data index** mod by **day** (i.e. 240 min)
  
      Parameters
      ----------
      rtype: str
          - "full": return the full limitation of the decision in the day
          - "step": return the limitation of current step
  
      Returns
      -------
      Tuple[int, int]:
      """
      # potential performance issue
      assert self.level_infra is not None
  
      day_start = pd.Timestamp(self.start_time.date())
      day_end = epsilon_change(day_start + pd.Timedelta(days=1))
      freq = (
          self.level_infra.get("common_infra")
          .get("trade_exchange")
          .freq
      )
      _, _, day_start_idx, _ = Cal.locate_index(
          day_start, day_end, freq=freq
      )
  
      if rtype == "full":
          _, _, start_idx, end_index = Cal.locate_index(
              self.start_time, self.end_time, freq=freq
          )
      elif rtype == "step":
          _, _, start_idx, end_index = Cal.locate_index(
              *self.get_step_time(), freq=freq
          )
      else:
          raise ValueError(
              f"This type of input {rtype} is not supported"
          )
  
      return start_idx - day_start_idx, end_index - day_start_idx
  
imports: from __future__ import annotations
  from abc import abstractmethod
  from typing import Any, Set, Tuple, TYPE_CHECKING, Union
  import numpy
  from qlib.utils.time import epsilon_change
  import warnings
  import pandas
  from ..data.data import Cal
label_desc: Use image node_id 9 for calling the TradeCalendarManager obj's underlying member method code with example usage: obj.get_data_cal_range(rtype) and returns: unknown,  unknown