def METHOD_NAME(model_list, data_list, device, verbose=True, ic_type='spearman'):
    '''
    model_list: [model1, model2, ...]
    datalist: [loader1, loader2, ...]
    return: unified ic, specific ic (all values), loss
    '''
    spec_ic = []
    loss_test = AverageMeter()
    loss_fn = torch.nn.MSELoss()
    label_true, label_pred = torch.empty(0).to(device), torch.empty(0).to(device)
    for i in range(len(model_list)):
        label_spec_true, label_spec_pred = torch.empty(0).to(device), torch.empty(0).to(device)
        model_list[i].eval()
        with torch.no_grad():
            for _, (feature, label_actual, _, _) in enumerate(data_list[i]):
                # feature = torch.tensor(feature, dtype=torch.float32, device=device)
                label_actual = label_actual.clone().detach().view(-1, 1)
                label_actual, mask = handle_nan(label_actual)
                label_predict = model_list[i].predict(feature).view(-1, 1)
                label_predict = label_predict[mask]
                loss = loss_fn(label_actual, label_predict)
                loss_test.update(loss.item())
                # Concat them for computing IC later
                label_true = torch.cat([label_true, label_actual])
                label_pred = torch.cat([label_pred, label_predict])
                label_spec_true = torch.cat([label_spec_true, label_actual])
                label_spec_pred = torch.cat([label_spec_pred, label_predict])
        ic = calc_ic(label_spec_true, label_spec_pred, ic_type)
        spec_ic.append(ic.item())
    unify_ic = calc_ic(label_true, label_pred, ic_type).item()
    # spec_ic.append(sum(spec_ic) / len(spec_ic))
    loss = loss_test.avg
    if verbose:
        print('[IC] Unified IC: {:.6f}, specific IC: {}, loss: {:.6f}'.format(unify_ic, spec_ic, loss))
    return unify_ic, spec_ic, loss