class_docstr: Notes
  -----
  An implementation of auto feature engineering method Deepgl [#]_ ,which iteratively generates features by aggregating neighbour features
  and select a fixed number of  features to automatically add important graph-aware features.
  References
  ----------
  .. [#] Rossi, R. A., Zhou, R., & Ahmed, N. K. (2020).
      Deep Inductive Graph Representation Learning.
      IEEE Transactions on Knowledge and Data Engineering, 32(3), 438–452.
      https://doi.org/10.1109/TKDE.2018.2878247
  Parameters
  ----------
  fix_length : int
      fixed number of features for every epoch. The final number of features added will be
      ``fixlen`` \times ``max_epoch``, 200 \times 5 in default.
  max_epoch : int
      number of epochs in total process.
  time_budget : int
      timebudget(seconds) for the feature engineering process, None for no time budget . Note that
      this time budget is a soft budget ,which is obtained by rough time estimation through previous iterations and
      may finally exceed the actual timebudget
  y_sel_func : Callable
      feature selector function object for selection at each iteration ,lightgbm in default. Note that in original paper,
      connected components of feature graph is used , and you may implement it by yourself if you want.
  verbosity : int
      hide any infomation except error and fatal if ``verbosity`` < 1
class_docstr_tok: ["Notes","--","--","-","An","implementation","of","auto","feature","engineering","method","Deepgl","[","#","]","_",",","which","iteratively","generates","features","by","aggregating","neighbour","features","and","select","a","fixed","number","of","features","to","automatically","add","important","graph-aware","features",".","References","--","--","--","--","--","..","[","#","]","Rossi",",","R.","A.",",","Zhou",",","R.",",","&","Ahmed",",","N.","K.","(","2020",")",".","Deep","Inductive","Graph","Representation","Learning",".","IEEE","Transactions","on","Knowledge","and","Data","Engineering",",","32","(","3",")",",","438\u2013452",".","https",":","\/\/doi.org\/10.1109\/TKDE.2018.2878247","Parameters","--","--","--","--","--","fix_length",":","int","fixed","number","of","features","for","every","epoch",".","The","final","number","of","features","added","will","be","``","fixlen","``","\\times","``","max_epoch","``",",","200","\\times","5","in","default",".","max_epoch",":","int","number","of","epochs","in","total","process",".","time_budget",":","int","timebudget","(","seconds",")","for","the","feature","engineering","process",",","None","for","no","time","budget",".","Note","that","this","time","budget","is","a","soft","budget",",","which","is","obtained","by","rough","time","estimation","through","previous","iterations","and","may","finally","exceed","the","actual","timebudget","y_sel_func",":","Callable","feature","selector","function","object","for","selection","at","each","iteration",",","lightgbm","in","default",".","Note","that","in","original","paper",",","connected","components","of","feature","graph","is","used",",","and","you","may","implement","it","by","yourself","if","you","want",".","verbosity",":","int","hide","any","infomation","except","error","and","fatal","if","``","verbosity","``","<","1"]
code: def _fit(
      self,
      homogeneous_static_graph: autogl.data.graph.GeneralStaticGraph,
  ):
      if not (
          homogeneous_static_graph.nodes.is_homogeneous
          and homogeneous_static_graph.edges.is_homogeneous
      ):
          raise ValueError
      if "x" in homogeneous_static_graph.nodes.data:
          _feature_key = "x"
          _original_features: torch.Tensor = (
              homogeneous_static_graph.nodes.data["x"]
          )
      elif "feat" in homogeneous_static_graph.nodes.data:
          _feature_key = "feat"
          _original_features: torch.Tensor = (
              homogeneous_static_graph.nodes.data["feat"]
          )
      else:
          raise ValueError
  
      num_nodes = _original_features.size(0)
      neighbours = [[] for _ in range(num_nodes)]
      for (
          u,
          v,
      ) in homogeneous_static_graph.edges.connections.t().numpy():
          neighbours[u].append(v)
      self.__neighbours: _typing.Sequence[np.ndarray] = tuple(
          [np.array(v) for v in neighbours]
      )
  
      x: np.ndarray = _original_features.numpy()
      gx: np.ndarray = x.copy()
      verbs = []
      soft_timer = Timer(self._timebudget)
      self._selection = []
      for epoch in tqdm.tqdm(
          range(self._max_epoch), disable=self._verbosity <= 0
      ):
          soft_timer.start()
          verb = [epoch, gx.shape[1]]
          gx = self._gen(gx)
          gx = scale(gx)
          verb.append(gx.shape[1])
  
          homogeneous_static_graph.nodes.data[
              _feature_key
          ] = torch.from_numpy(gx)
          self._feature_selector._fit(homogeneous_static_graph)
          self._selection.append(self._feature_selector._selection)
          homogeneous_static_graph = self._feature_selector._transform(
              homogeneous_static_graph
          )
  
          gx: np.ndarray = homogeneous_static_graph.nodes.data[
              _feature_key
          ].numpy()
          verb.append(gx.shape[1])
          x = np.concatenate([x, gx], axis=1)
          verbs.append(verb)
          soft_timer.end()
          if soft_timer.is_timeout():
              break
      if self._verbosity >= 1:
          LOGGER.info(
              tabulate.tabulate(
                  verbs,
                  headers="epoch origin after-gen after-sel".split(),
              )
          )
      homogeneous_static_graph.nodes.data[
          _feature_key
      ] = torch.from_numpy(x)
      return homogeneous_static_graph
  
imports: import time
  import numpy
  import torch
  import typing
  from sklearn import preprocessing
  from sklearn.metrics.pairwise import cosine_similarity
  import tqdm
  import tabulate
  import autogl.data.graph
  from ._feature_engineer import FeatureEngineer
  from .._data_preprocessor_registry import DataPreprocessorUniversalRegistry
  from ._selectors import GBDTFeatureSelector
  from ....utils import get_logger
label_desc: Use image node_id 3 for calling the AutoFeatureEngineer obj's underlying member method code with example usage: obj._fit(homogeneous_static_graph) and returns: homogeneous_static_graph