docs: def fraction_done(self, start=0.0, finish=1.0, stack=None):
          '''
          :return float: The estimated fraction of the overall task hierarchy
              that has been finished. A number in the range [0.0, 1.0].
          '''
          if stack is None:
              stack = self.task_stack
  
          if len(stack) == 0:
              return start
          elif stack[0].size == 0:
              # Avoid divide by zero
              return finish
          else:
              top_fraction = stack[0].progress * 1.0 / stack[0].size
              next_top_fraction = (stack[0].progress + 1.0) / stack[0].size
              inner_start = start + top_fraction * (finish - start)
              inner_finish = start + next_top_fraction * (finish - start)
              return self.fraction_done(inner_start, inner_finish, stack[1:])