Produce a formatted report of the current timing data.

    Notes:
        When reporting a collection of parallel subdivisions, only the one with
        the greatest total time is reported on, and the rest are ignored (no
        branching).  To compare parallel subdivisions use compare().

    Args:
        times (Times, optional): Times object to report on.  If not provided,
            uses current root timer.
        include_itrs (bool, optional): Display invidual iteration times.
        include_stats (bool, optional): Display iteration statistics.
        delim_mode (bool, optional): If True, format for spreadsheet.
        format_options (dict, optional): Formatting options, see below.

    Formatting Keywords & Defaults:
        Human-Readable Mode
            - 'stamp_name_width': 20
            - 'itr_tab_width': 2
            - 'itr_num_width': 6
            - 'itr_name_width': 12
            - 'indent_symbol': '  ' (two spaces)
            - 'parallel_symbol': '(par)'
        Delimited Mode
            - 'delimiter': '\t' (tab)
            - 'ident_symbol': '+'
            - 'parallel_symbol': '(par)'

    Returns:
        str: Timing data report as formatted string.

    Raises:
        TypeError: If 'times' param is used and value is not a Times object.

def report(times=None,
           include_itrs=True,
           include_stats=True,
           delim_mode=False,
           format_options=None):
    """
    Produce a formatted report of the current timing data.

    Notes:
        When reporting a collection of parallel subdivisions, only the one with
        the greatest total time is reported on, and the rest are ignored (no
        branching).  To compare parallel subdivisions use compare().

    Args:
        times (Times, optional): Times object to report on.  If not provided,
            uses current root timer.
        include_itrs (bool, optional): Display invidual iteration times.
        include_stats (bool, optional): Display iteration statistics.
        delim_mode (bool, optional): If True, format for spreadsheet.
        format_options (dict, optional): Formatting options, see below.

    Formatting Keywords & Defaults:
        Human-Readable Mode
            - 'stamp_name_width': 20
            - 'itr_tab_width': 2
            - 'itr_num_width': 6
            - 'itr_name_width': 12
            - 'indent_symbol': '  ' (two spaces)
            - 'parallel_symbol': '(par)'
        Delimited Mode
            - 'delimiter': '\t' (tab)
            - 'ident_symbol': '+'
            - 'parallel_symbol': '(par)'

    Returns:
        str: Timing data report as formatted string.

    Raises:
        TypeError: If 'times' param is used and value is not a Times object.
    """
    if times is None:
        if f.root.stopped:
            return report_loc.report(f.root.times,
                                     include_itrs,
                                     include_stats,
                                     delim_mode,
                                     format_options)
        else:
            t = timer()
            rep = report_loc.report(collapse.collapse_times(),
                                    include_itrs,
                                    include_stats,
                                    delim_mode,
                                    format_options,
                                    timer_state='running')
            f.root.self_cut += timer() - t
            return rep
    else:
        if not isinstance(times, Times):
            raise TypeError("Expected Times instance for param 'times' (default is root).")
        return report_loc.report(times,
                                 include_itrs,
                                 include_stats,
                                 delim_mode,
                                 format_options)