class_docstr: AutoGCN.
  The model used in this automodel is GCN, i.e., the graph convolutional network from the
  `"Semi-supervised Classification with Graph Convolutional
  Networks" <https://arxiv.org/abs/1609.02907>`_ paper. The layer is
  
  .. math::
  
      \mathbf{X}^{\prime} = \mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}}
      \mathbf{\hat{D}}^{-1/2} \mathbf{X} \mathbf{\Theta},
  
  where :math:`\mathbf{\hat{A}} = \mathbf{A} + \mathbf{I}` denotes the
  adjacency matrix with inserted self-loops and
  :math:`\hat{D}_{ii} = \sum_{j=0} \hat{A}_{ij}` its diagonal degree matrix.
  
  Parameters
  ----------
  num_features: ``int``
      The dimension of features.
  
  num_classes: ``int``
      The number of classes.
  
  device: ``torch.device`` or ``str``
      The device where model will be running on.
  
  init: `bool`.
      If True(False), the model will (not) be initialized.
code: def __init__(
      self,
      input_dimension: Optional[int] = None,
      output_dimension: Optional[int] = None,
      device: Union[str, torch.device] = "cpu",
      **kwargs,
  ) -> None:
      super().__init__(
          input_dimension, output_dimension, device, **kwargs
      )
  
      self.hyper_parameter_space = [
          {
              "parameterName": "add_self_loops",
              "type": "CATEGORICAL",
              "feasiblePoints": [1],
          },
          {
              "parameterName": "normalize",
              "type": "CATEGORICAL",
              "feasiblePoints": [1],
          },
          {
              "parameterName": "num_layers",
              "type": "DISCRETE",
              "feasiblePoints": "2,3,4",
          },
          {
              "parameterName": "hidden",
              "type": "NUMERICAL_LIST",
              "numericalType": "INTEGER",
              "length": 3,
              "minValue": [8, 8, 8],
              "maxValue": [128, 128, 128],
              "scalingType": "LOG",
              "cutPara": ("num_layers",),
              "cutFunc": lambda x: x[0] - 1,
          },
          {
              "parameterName": "dropout",
              "type": "DOUBLE",
              "maxValue": 0.8,
              "minValue": 0.2,
              "scalingType": "LINEAR",
          },
          {
              "parameterName": "act",
              "type": "CATEGORICAL",
              "feasiblePoints": ["leaky_relu", "relu", "elu", "tanh"],
          },
      ]
  
      # initial point of hp search
      self.hyper_parameters = {
          "num_layers": 3,
          "hidden": [128, 64],
          "dropout": 0.0,
          "act": "relu",
      }
  
imports: import torch
  import torch.nn.functional
  from typing import Sequence, Optional, Union, Tuple
  from numbers import Real
  from dgl.nn.pytorch.conv import GraphConv
  from dgl import remove_self_loop, add_self_loop
  import autogl.data
  from .None import register_model
  from .base import BaseAutoModel, activate_func, ClassificationSupportedSequentialModel
  from ....utils import get_logger
label_desc: Use image node_id 1 to create a new AutoGCN object from inherited base classes: BaseAutoModel with example: obj = AutoGCN(input_dimension, output_dimension, device)