code: def call_with_returns(self, loss):
      # print ("call_with_returns before apply loss.data: \n", loss.data)
      pn_p_g_list = []
      for p, g in autograd.backward(loss):
          if p.name is None:
              p.name = id(p)
          self.apply(p.name, p, g)
          # print ("call with returns")
          # print ("p.name: \n", p.name)
          # print ("p.data: \n", p.data)
          # print ("g.data: \n", g.data)
          pn_p_g_list.append([p.name, p, g])  # need iterables
      # print ("call_with_returns after apply loss.data: \n", loss.data)
      return pn_p_g_list
  
imports: from src.eva_engine.phase1.algo.alg_base import Evaluator
  from src.common.constant import Config
  from singa import singa_wrap
  from singa import device
  from singa import tensor
  from singa import opt
  from singa import autograd
  from singa.opt import Optimizer
  from singa.opt import DecayScheduler
  from singa.opt import Constant
  import numpy
  import time
  import argparse
  from PIL import Image
  from numpy import linalg
  import torch
label_desc: Use image node_id 2 for calling the MSOptimizer obj's underlying member method code with example usage: obj.call_with_returns(loss) and returns: pn_p_g_list