code: def __call__(self, params):
      for param in params:
          # If we've seen this parameter before, use the previously
          # constructed optimizer.
          if param in self.optim_objs:
              optim = self.optim_objs[param]
          # If we've never seen this parameter before, construct
          # an Adam optimizer and keep track of it.
          else:
              optim = torch.optim.Adam([param], **self.optim_args)
              self.optim_objs[param] = optim
          # Take a gradient step for the parameter param.
          optim.step()
  
imports: import random
  import warnings
  import weakref
  from collections import OrderedDict
  import numpy
  import torch
  from pyro.distributions import validation_enabled
label_desc: Use image node_id 2 for calling the Adam obj's underlying member method code with example usage: obj.__call__(params) without return types