code: def _evaluate(self, loader, feval=None):
      if feval is None:
          feval = self.feval
      else:
          feval = get_feval(feval)
  
      y_pred_prob, y_true = self._predict_proba(
          loader=loader, return_label=True
      )
      y_pred = y_pred_prob.max(1)[1]
  
      if not isinstance(feval, list):
          feval = [feval]
          return_signle = True
      else:
          return_signle = False
  
      res = []
      for f in feval:
          flag = False
          try:
              res.append(f.evaluate(y_pred_prob, y_true))
              flag = False
          except:
              flag = True
          if flag:
              try:
                  res.append(
                      f.evaluate(
                          y_pred_prob.cpu().numpy(),
                          y_true.cpu().numpy(),
                      )
                  )
                  flag = False
              except:
                  flag = True
          if flag:
              try:
                  res.append(
                      f.evaluate(
                          y_pred_prob.detach().numpy(),
                          y_true.detach().numpy(),
                      )
                  )
                  flag = False
              except:
                  flag = True
          if flag:
              try:
                  res.append(
                      f.evaluate(
                          y_pred_prob.cpu().detach().numpy(),
                          y_true.cpu().detach().numpy(),
                      )
                  )
                  flag = False
              except:
                  flag = True
          if flag:
              assert False
  
      if return_signle:
          return res[0]
      return res
  
imports: import os
  import torch
  import torch_geometric
  import logging
  import numpy
  import typing
  from tqdm import trange
  from typing import Union, Tuple, Sequence, Type, Callable
  import torch.nn.functional
  import torch.utils.data
  from torch.optim.lr_scheduler import StepLR, MultiStepLR, ExponentialLR, ReduceLROnPlateau
  from .losses import NTXent_loss
  from .utils import get_view_by_name
  from autogl.module.model.encoders.base_encoder import AutoHomogeneousEncoderMaintainer
  from ..base import BaseTrainer, EarlyStopping, _DummyModel
  from ..evaluation import Evaluation, get_feval, Acc
  from ...model import BaseAutoModel, BaseEncoderMaintainer, BaseDecoderMaintainer, EncoderUniversalRegistry, DecoderUniversalRegistry
  from ....utils import get_logger
  from ....datasets import utils
label_desc: Use image node_id 32 for calling the BaseContrastiveTrainer obj's underlying member method code with example usage: obj._evaluate(loader, feval) and returns: res, res