class_docstr: Pretty printer to print the graph structure used with the `visit` method of a Variable.
  
  Attributes:
      functions (list of dict): List of functions of which element is the dictionary.
          The (key, value) pair is the (`name`, function name), (`inputs`, list of input variables),
          and (`outputs`, list of output variables) of a function.
code: def __call__(self, f):
      scope = (
          self.get_scope_name(f.inputs[1])
          if len(f.inputs) > 1
          else None
      )
      name = (
          "{}/{}({})".format(scope, f.name, f.info.type_name)
          if scope
          else "{}({})".format(f.name, f.info.type_name)
      )
      print(name)
      print("\tDepth = {}".format(f.rank))
      print(
          "\tArgs:",
          ["{}={}".format(k, v) for k, v in f.info.args.items()],
      )
      print("\tInputs:", [i.shape for i in f.inputs])
      print("\tOutputs:", [o.shape for o in f.outputs])
      print("\tBackward Inputs:", [i.need_grad for i in f.inputs])
      if self._summary:
          print("\tInput Data:")
          print("\t\tMed: ", [np.median(i.d) for i in f.inputs])
          print("\t\tAve: ", [np.mean(i.d) for i in f.inputs])
          print("\t\tStd: ", [np.std(i.d) for i in f.inputs])
          print("\t\tMin: ", [np.min(i.d) for i in f.inputs])
          print("\t\tMax: ", [np.max(i.d) for i in f.inputs])
          print("\tOutput Data:")
          print("\t\tMed: ", [np.median(i.d) for i in f.outputs])
          print("\t\tAve: ", [np.mean(i.d) for i in f.outputs])
          print("\t\tStd: ", [np.std(i.d) for i in f.outputs])
          print("\t\tMin: ", [np.min(i.d) for i in f.outputs])
          print("\t\tMax: ", [np.max(i.d) for i in f.outputs])
  
          print("\tInput Grads:")
          print("\t\tMed: ", [np.median(i.g) for i in f.inputs])
          print("\t\tAve: ", [np.mean(i.g) for i in f.inputs])
          print("\t\tStd: ", [np.std(i.g) for i in f.inputs])
          print("\t\tMin: ", [np.min(i.g) for i in f.inputs])
          print("\t\tMax: ", [np.max(i.g) for i in f.inputs])
          print("\tOutput Grads:")
          print("\t\tMed: ", [np.median(i.g) for i in f.outputs])
          print("\t\tAve: ", [np.mean(i.g) for i in f.outputs])
          print("\t\tStd: ", [np.std(i.g) for i in f.outputs])
          print("\t\tMin: ", [np.min(i.g) for i in f.outputs])
          print("\t\tMax: ", [np.max(i.g) for i in f.outputs])
  
      if self._hidden:
          h = dict(
              name=name,
              inputs=[i for i in f.inputs],
              outputs=[o for o in f.outputs],
          )
          self.functions.append(h)
  
file_path: nnabla/python/src/nnabla/utils/inspection/pretty_print.py
imports: from __future__ import absolute_import
  import nnabla
  import numpy
label_desc: Use image node_id 3 for calling the PrettyPrinter obj's underlying member method code with example usage: obj.__call__(f) without return types