class_docstr: The evaluation interface for unsupervised graph representation learning evaluated with 
  linear classification. You can refer to `the benchmark code 
  <https://github.com/divelab/DIG/tree/dig/benchmarks/sslgraph>`_ 
  for examples of usage.
  
  Args:
      full_dataset (torch_geometric.data.Dataset): The graph classification dataset.
      train_mask (Tensor, optional): Boolean tensor of shape :obj:`[n_nodes,]`, indicating 
          nodes for training. Set to :obj:`None` if included in dataset.
          (default: :obj:`None`)
      val_mask (Tensor, optional): Boolean tensor of shape :obj:`[n_nodes,]`, indicating 
          nodes for validation. Set to :obj:`None` if included in dataset.
          (default: :obj:`None`)
      test_mask (Tensor, optional): Boolean tensor of shape :obj:`[n_nodes,]`, indicating 
          nodes for test. Set to :obj:`None` if included in dataset. (default: :obj:`None`)
      classifier (string, optional): Linear classifier for evaluation, :obj:`"SVC"` or 
          :obj:`"LogReg"`. (default: :obj:`"LogReg"`)
      log_interval (int, optional): Perform evaluation per k epochs. (default: :obj:`1`)
      device (int, or torch.device, optional): Device for computation. (default: :obj:`None`)
      **kwargs (optional): Training and evaluation configs in :meth:`setup_train_config`.
      
  Examples
  --------
  >>> node_dataset = get_node_dataset("Cora") # using default train/test split
  >>> evaluator = NodeUnsupervised(node_dataset, log_interval=10, device=0)
  >>> evaluator.evaluate(model, encoder)
  
  >>> node_dataset = SomeDataset()
  >>> # Using your own dataset or with different train/test split
  >>> train_mask, val_mask, test_mask = torch.Tensor([...]), torch.Tensor([...]), torch.Tensor([...])
  >>> evaluator = NodeUnsupervised(node_dataset, train_mask, val_mask, test_mask, log_interval=10, device=0)
  >>> evaluator.evaluate(model, encoder)
docstr: Run evaluation with given learning model and encoder(s), return averaged scores 
  on multiple different splits.
  
  Args:
      learning_model: An object of a contrastive model (sslgraph.method.Contrastive)
          or a predictive model.
      encoder (torch.nn.Module): Trainable pytorch model or list of models.
      split_masks (list, or generator): A list of generator that contains or yields masks for
          train, val and test splits.
  
  :rtype: float
  
  Example
  -------
  >>> split_masks = [(train1, val1, test1), (train2, val2, test2), ..., (train20, val20, test20)]
docstr_tok: ["Run","evaluation","with","given","learning","model","and","encoder","(","s",")",",","return","averaged","scores","on","multiple","different","splits",".","Args",":","learning_model",":","An","object","of","a","contrastive","model","(","sslgraph.method.Contrastive",")","or","a","predictive","model",".","encoder","(","torch.nn.Module",")",":","Trainable","pytorch","model","or","list","of","models",".","split_masks","(","list",",","or","generator",")",":","A","list","of","generator","that","contains","or","yields","masks","for","train",",","val","and","test","splits",".",":","rtype",":","float","Example","--","--","--","-",">",">",">","split_masks","=","[","(","train1",",","val1",",","test1",")",",","(","train2",",","val2",",","test2",")",",","...",",","(","train20",",","val20",",","test20",")","]"]
code: def evaluate_multisplits(self, learning_model, encoder, split_masks):
      r"""Run evaluation with given learning model and encoder(s), return averaged scores
      on multiple different splits.
  
      Args:
          learning_model: An object of a contrastive model (sslgraph.method.Contrastive)
              or a predictive model.
          encoder (torch.nn.Module): Trainable pytorch model or list of models.
          split_masks (list, or generator): A list of generator that contains or yields masks for
              train, val and test splits.
  
      :rtype: float
  
      Example
      -------
      >>> split_masks = [(train1, val1, test1), (train2, val2, test2), ..., (train20, val20, test20)]
      """
  
      full_loader = DataLoader(self.full_dataset, 1)
      if isinstance(encoder, list):
          params = [{"params": enc.parameters()} for enc in encoder]
      else:
          params = encoder.parameters()
  
      p_optimizer = self.get_optim(self.p_optim)(
          params, lr=self.p_lr, weight_decay=self.p_weight_decay
      )
  
      test_scores_m, test_scores_sd = [], []
      per_epoch_out = self.log_interval < self.p_epoch
      for i, enc in enumerate(
          learning_model.train(
              encoder,
              full_loader,
              p_optimizer,
              self.p_epoch,
              per_epoch_out,
          )
      ):
          if not per_epoch_out or (i + 1) % self.log_interval == 0:
              embed, lbls = self.get_embed(
                  enc.to(self.device), full_loader
              )
              lbs = np.array(
                  preprocessing.LabelEncoder().fit_transform(lbls)
              )
  
              test_scores = []
              for train_mask, val_mask, test_mask in split_masks:
                  test_score = self.get_clf()(
                      embed[train_mask],
                      lbls[train_mask],
                      embed[test_mask],
                      lbls[test_mask],
                  )
                  test_scores.append(test_score)
  
              test_scores = torch.tensor(test_scores)
              test_score_mean = test_scores.mean().item()
              test_score_std = test_scores.std().item()
              test_scores_m.append(test_score_mean)
              test_scores_sd.append(test_score_std)
  
      idx = np.argmax(test_scores_m)
      acc = test_scores_m[idx]
      std = test_scores_sd[idx]
      print(
          "Best epoch %d: acc %.4f (+/- %.4f)."
          % ((idx + 1) * self.log_interval, acc, std)
      )
      return acc
  
imports: import copy
  import torch
  import numpy
  import torch.nn
  from torch_geometric.loader import DataLoader
  from sklearn import preprocessing
label_desc: Use image node_id 4 for calling the NodeUnsupervised obj's underlying member method code with example usage: obj.evaluate_multisplits(learning_model, encoder, split_masks) and returns: acc