code: def _calc_estimated_time(self):
      if self._state != "entered":
          if self._last_end_time == self._end_time:
              return self.get_estimated_time()
          end_time = self._end_time
          end_progress = self._end_progress
          self._last_end_time = self._end_time
      else:
          end_time = time.time()
          end_progress = self._progress
  
      if end_progress - self._start_progress < 1e-6:
          return self.get_estimated_time()
  
      current_estimate = (end_time - self._start_time) / (
          end_progress - self._start_progress
      )
  
      if (
          self._last_start_time == self._start_time
          and end_time < self._last_est_time + 2
      ):
          # print(current_estimate)
          self._last_step_time = current_estimate
      else:
          if self._last_step_time >= 0.0:
              self._beta_pow *= self._beta
              self._estimated_time *= self._beta
              self._estimated_time += (
                  1 - self._beta
              ) * self._last_step_time
          # print(self._last_step_time, current_estimate)
          self._last_step_time = current_estimate
          self._last_start_time = self._start_time
          self._last_est_time = end_time
  
      return self.get_estimated_time()
  
imports: import math
  import time
  from typing import TYPE_CHECKING, List
  from labml import logger
  from ..tracker import tracker_singleton
label_desc: Use image node_id 5 for calling the LoopingSection obj's underlying member method code with example usage: obj._calc_estimated_time() and returns: self, self, self