code: def evaluate(epoch, args, model, feats, labels, train, val, test):
      with torch.no_grad():
          batch_size = args.eval_batch_size
          if batch_size <= 0:
              pred = model(feats)
          else:
              pred = []
              num_nodes = labels.shape[0]
              n_batch = (num_nodes + batch_size - 1) // batch_size
              for i in range(n_batch):
                  batch_start = i * batch_size
                  batch_end = min((i + 1) * batch_size, num_nodes)
                  batch_feats = [
                      feat[batch_start:batch_end] for feat in feats
                  ]
                  pred.append(model(batch_feats))
              pred = torch.cat(pred)
  
          pred = torch.argmax(pred, dim=1)
          correct = (pred == labels).float()
          train_acc = correct[train].sum() / len(train)
          val_acc = correct[val].sum() / len(val)
          test_acc = correct[test].sum() / len(test)
          return train_acc, val_acc, test_acc
  
imports: import argparse
  import os
  import time
  import dgl
  import dgl.function
  import torch
  import torch.nn
  import torch.nn.functional
  from dataset import load_dataset
label_desc: Use image node_id 4 for calling a global function with example usage: evaluate(epoch, args, model, feats, labels, train, val, test) and returns: train_acc,  val_acc,  test_acc