class_docstr: **Amortized Stein Variational Gradient Descent**
  
  **not suggested to use**
  
  This inference is based on Kernelized Stein Discrepancy
  it's main idea is to move initial noisy particles so that
  they fit target distribution best.
  
  Algorithm is outlined below
  
  *Input:* Parametrized random generator :math:`R_{\theta}`
  
  *Output:* :math:`R_{\theta^{*}}` that approximates the target distribution.
  
  .. math::
  
      \Delta x_i &= \hat{\phi}^{*}(x_i) \\
      \hat{\phi}^{*}(x) &= \frac{1}{n}\sum^{n}_{j=1}[k(x_j,x) \nabla_{x_j} logp(x_j)+ \nabla_{x_j} k(x_j,x)] \\
      \Delta_{\theta} &= \frac{1}{n}\sum^{n}_{i=1}\Delta x_i\frac{\partial x_i}{\partial \theta}
  
  Parameters
  ----------
  approx: :class:`Approximation`
      default is :class:`FullRank` but can be any
  kernel: `callable`
      kernel function for KSD :math:`f(histogram) -> (k(x,.), \nabla_x k(x,.))`
  model: :class:`Model`
  kwargs: kwargs for gradient estimator
  
  References
  ----------
  -   Dilin Wang, Yihao Feng, Qiang Liu (2016)
      Learning to Sample Using Stein Discrepancy
      http://bayesiandeeplearning.org/papers/BDL_21.pdf
  
  -   Dilin Wang, Qiang Liu (2016)
      Learning to Draw Samples: With Application to Amortized MLE for Generative Adversarial Learning
      arXiv:1611.01722
  
  -   Yang Liu, Prajit Ramachandran, Qiang Liu, Jian Peng (2017)
      Stein Variational Policy Gradient
      arXiv:1704.02399
code: def run_profiling(self, n=1000, score=None, obj_n_mc=500, **kwargs):
      return super().run_profiling(
          n=n, score=score, obj_n_mc=obj_n_mc, **kwargs
      )
  
imports: import collections
  import logging
  import warnings
  import numpy
  from fastprogress.fastprogress import progress_bar
  import pymc
  from pymc.variational import test_functions
  from pymc.variational.approximations import Empirical, FullRank, MeanField
  from pymc.variational.operators import KL, KSD
label_desc: Use image node_id 3 for calling the ASVGD obj's underlying member method code with example usage: obj.run_profiling(n, score, obj_n_mc) and returns: super