code: def _exec_random_walk(
      self,
      graphs,
      layers_accept,
      layers_alias,
      v,
      walk_length,
      gamma,
      stay_prob=0.3,
  ):
      initialLayer = 0
      layer = initialLayer
  
      path = []
      path.append(self.idx2node[v])
  
      while len(path) < walk_length:
          r = random.random()
          if r < stay_prob:  # same layer
              v = chooseNeighbor(
                  v, graphs, layers_alias, layers_accept, layer
              )
              path.append(self.idx2node[v])
          else:  # different layer
              r = random.random()
              try:
                  x = math.log(gamma[layer][v] + math.e)
                  p_moveup = x / (x + 1)
              except:
                  print(layer, v)
                  raise ValueError()
  
              if r > p_moveup:
                  if layer > initialLayer:
                      layer = layer - 1
              else:
                  if (layer + 1) in graphs and v in graphs[layer + 1]:
                      layer = layer + 1
  
      return path
  
imports: import itertools
  import math
  import random
  import pandas
  from joblib import Parallel, delayed
  from .alias import alias_sample, create_alias_table
  from .utils import partition_num
label_desc: Use image node_id 4 for calling the BiasedWalker obj's underlying member method code with example usage: obj._exec_random_walk(graphs, layers_accept, layers_alias, v, walk_length, gamma, stay_prob) and returns: path