code: def step(
      self,
  ):
      new_models = []
      for last_m in tqdm.tqdm(self.start_models):
          for key, based_m in self.based_models.items():
              if hasattr(last_m, "path"):
                  paths = [last_m.path, key]
              else:
                  paths = last_m.paths + [key]
              enm = [self.based_models[m] for m in paths]
              new_models.append(EnsembleModelStatus(enm))
      new_models = sorted(new_models, key=lambda x: -x.val_acc)[
          : self.beam_size
      ]
      self.start_models = new_models
      if self.best_val_acc < self.start_models[0].val_acc:
          self.best_val_acc = self.start_models[0].val_acc
          self.best_model_paths = self.start_models[0].paths
          print("Find Better", "Cross Full", self.best_val_acc)
          print(
              "Model Diff",
              np.mean(
                  np.argmax(self.best_test_pred, -1)
                  == np.argmax(self.start_models[0].test_pred, -1)
              ),
          )
          print(
              "Model Diff Num",
              np.sum(
                  np.argmax(self.best_test_pred, -1)
                  == np.argmax(self.start_models[0].test_pred, -1)
              ),
          )
          self.best_test_pred = self.start_models[0].test_pred
          np.save("best_result.npy", self.start_models[0].test_pred)
  
imports: import glob
  import os
  import pandas
  import numpy
  import json
  import tqdm
  from collections import Counter
  from ogb.lsc import MAG240MDataset, MAG240MEvaluator
  import torch
label_desc: Use image node_id 2 for calling the EnsembleModels obj's underlying member method code with example usage: obj.step() without return types