code: def _get_gdv_sample(self, v, u):
      if self._node_degrees[v] >= self._node_degrees[u]:
          pass
      else:
          u, v = v, u
      Sv = set()
      sigma1, sigma2 = 0, 0
      nb = self._neighbours
      N = self._num_nodes
      M = self._num_edges
      phi = np.zeros(self._num_nodes, dtype=int)
      c1, c2, c3, c4 = 1, 2, 3, 4
      x = np.zeros(16)
      dw = self._dw
  
      # p1
      Sv = set(nb[v][nb[v] != u])
      phi[list(Sv)] = c1
      # p2
      p2w = nb[u][nb[u] != c1]
      p2w1 = p2w[phi[p2w] == c1]
      p2w2 = p2w[phi[p2w] != c1]
      Te = p2w1
      phi[p2w1] = c3
      Sv -= set(list(p2w1))
      Su = p2w2
      phi[p2w2] = c2
      # p3
      for w in Te:
          if dw >= len(nb[w]):
              region = nb[w]
              inc = 1
          else:
              region = np.random.choice(nb[w], dw, replace=False)
              inc = self._node_degrees[w] / dw
          phir = phi[region]
          x[5] += inc * np.sum(phir == c3)
          phi[w] = c4
          sigma2 = sigma2 + len(nb[w]) - 2
      # p4
      for w in Su:
          if dw >= len(nb[w]):
              region = nb[w]
              inc = 1
          else:
              region = np.random.choice(nb[w], dw, replace=False)
              inc = self._node_degrees[w] / dw
          phir = phi[region]
          x[8] += inc * np.sum(phir == c1)
          x[7] += inc * np.sum(phir == c2)
          sigma1 += inc * np.sum(phir == c4)
          phi[w] = 0
          sigma2 = sigma2 + len(nb[w]) - 1
      # p5
      for w in Sv:
          if dw >= len(nb[w]):
              region = nb[w]
              inc = 1
          else:
              region = np.random.choice(nb[w], dw, replace=False)
              inc = self._node_degrees[w] / dw
          phir = phi[region]
          x[7] += inc * np.sum(phir == c1)
          sigma1 += inc * np.sum(phir == c4)
          phi[w] = 0
          sigma2 = sigma2 + len(nb[w]) - 1
  
      lsv, lsu, lte, du, dv = (
          len(Sv),
          len(Su),
          len(Te),
          len(nb[u]),
          len(nb[v]),
      )
      # 3-graphlet
      x[1] = lte
      x[2] = du + dv - 2 - 2 * x[1]
      x[3] = N - x[2] - x[1] - 2
      x[4] = N * (N - 1) * (N - 2) / 6 - (x[1] + x[2] + x[3])
      # 4 connected graphlets
      x[6] = x[1] * (x[1] - 1) / 2 - x[5]
      x[10] = lsv * lsu - x[8]
      x[9] = lsv * (lsv - 1) / 2 + lsu * (lsu - 1) / 2 - x[7]
      # 4 diconnected graphlets
      t1 = N - (lte + lsu + lsv + 2)
      x[11] = x[1] * t1
      x[12] = M - (du + dv - 1) - (sigma2 - sigma1 - x[5] - x[8] - x[7])
      x[13] = (lsu + lsv) * t1
      x[14] = t1 * (t1 - 1) / 2 - x[12]
      x[15] = N * (N - 1) * (N - 2) * (N - 3) / 24 - np.sum(x[5:15])
  
      return x
  
file_path: AutoGL/autogl/module/_feature/generators/graphlet.py
imports: import numpy
  import copy
  from .base import BaseGenerator
  from tqdm import tqdm
  from ....utils import get_logger
  from ..None import register_feature
label_desc: Use image node_id 4 for calling the Graphlet obj's underlying member method code with example usage: obj._get_gdv_sample(v, u) and returns: x