def save_results(args, dataset_name, eval_exp_path, dataset_results, print_header=True):
    all_ious, elapsed_time = dataset_results
    mean_spc, mean_spi = utils.get_time_metrics(all_ious, elapsed_time)

    iou_thrs = np.arange(0.8, min(0.95, args.target_iou) + 0.001, 0.05).tolist()
    noc_list, over_max_list = utils.compute_noc_metric(all_ious, iou_thrs=iou_thrs, max_clicks=args.n_clicks)
    header, table_row = utils.get_results_table(noc_list, over_max_list, args.mode, dataset_name,
                                                mean_spc, elapsed_time, args.n_clicks,
                                                model_name=eval_exp_path.stem)
    target_iou_int = int(args.target_iou * 100)
    if target_iou_int not in [80, 85, 90]:
        noc_list, over_max_list = utils.compute_noc_metric(all_ious, iou_thrs=[args.target_iou],
                                                           max_clicks=args.n_clicks)
        table_row += f' NoC@{args.target_iou:.1%} = {noc_list[0]:.2f};'
        table_row += f' >={args.n_clicks}@{args.target_iou:.1%} = {over_max_list[0]}'

    if print_header:
        print(header)
    print(table_row)

    log_path = eval_exp_path / f'results_{args.mode}_{args.n_clicks}.txt'
    if log_path.exists():
        with open(log_path, 'a') as f:
            f.write(table_row + '\n')
    else:
        with open(log_path, 'w') as f:
            f.write(header + '\n')
            f.write(table_row + '\n')

    ious_path = eval_exp_path / 'all_ious'
    ious_path.mkdir(exist_ok=True)
    with open(ious_path / f'{dataset_name}_{args.mode}_{args.n_clicks}.pkl', 'wb') as fp:
        pickle.dump(all_ious, fp)
def save_results(args,
                 row_name,
                 dataset_name,
                 logs_path,
                 logs_prefix,
                 dataset_results,
                 save_ious=False,
                 print_header=True,
                 single_model_eval=False):
    all_ious, elapsed_time = dataset_results
    mean_spc, mean_spi = utils.get_time_metrics(all_ious, elapsed_time)

    iou_thrs = np.arange(0.8,
                         min(0.95, args.target_iou) + 0.001, 0.05).tolist()
    noc_list, over_max_list = utils.compute_noc_metric(
        all_ious, iou_thrs=iou_thrs, max_clicks=args.n_clicks)

    row_name = 'last' if row_name == 'last_checkpoint' else row_name
    model_name = str(logs_path.relative_to(
        args.logs_path)) + ':' + logs_prefix if logs_prefix else logs_path.stem
    header, table_row = utils.get_results_table(noc_list,
                                                over_max_list,
                                                row_name,
                                                dataset_name,
                                                mean_spc,
                                                elapsed_time,
                                                args.n_clicks,
                                                model_name=model_name)

    if args.print_ious:
        min_num_clicks = min(len(x) for x in all_ious)
        mean_ious = np.array([x[:min_num_clicks]
                              for x in all_ious]).mean(axis=0)
        miou_str = ' '.join([
            f'mIoU@{click_id}={mean_ious[click_id - 1]:.2%};'
            for click_id in [1, 2, 3, 5, 10, 20] if click_id <= min_num_clicks
        ])
        table_row += '; ' + miou_str
    else:
        target_iou_int = int(args.target_iou * 100)
        if target_iou_int not in [80, 85, 90]:
            noc_list, over_max_list = utils.compute_noc_metric(
                all_ious, iou_thrs=[args.target_iou], max_clicks=args.n_clicks)
            table_row += f' NoC@{args.target_iou:.1%} = {noc_list[0]:.2f};'
            table_row += f' >={args.n_clicks}@{args.target_iou:.1%} = {over_max_list[0]}'

    if print_header:
        print(header)
    print(table_row)

    if save_ious:
        ious_path = logs_path / 'ious' / (logs_prefix if logs_prefix else '')
        ious_path.mkdir(parents=True, exist_ok=True)
        with open(
                ious_path /
                f'{dataset_name}_{args.eval_mode}_{args.mode}_{args.n_clicks}.pkl',
                'wb') as fp:
            pickle.dump(all_ious, fp)

    name_prefix = ''
    if logs_prefix:
        name_prefix = logs_prefix + '_'
        if not single_model_eval:
            name_prefix += f'{dataset_name}_'

    log_path = logs_path / f'{name_prefix}{args.eval_mode}_{args.mode}_{args.n_clicks}.txt'
    if log_path.exists():
        with open(log_path, 'a') as f:
            f.write(table_row + '\n')
    else:
        with open(log_path, 'w') as f:
            if print_header:
                f.write(header + '\n')
            f.write(table_row + '\n')