class_docstr: AdaGrad optimizer.
  
  This class implements the AdaGrad optimizer described in *Adaptive Subgradient
  Methods for Online Learning and Stochastic Optimization*, and available at
  http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf.
  
  This optimizer updates each weight by::
  
      grad = clip(grad * rescale_grad, clip_gradient) + wd * weight
      history += square(grad)
      weight -= learning_rate * grad / (sqrt(history) + epsilon)
  
  This optimizer accepts the following parameters in addition to those accepted
  by :class:`.Optimizer`.
  
  See Also
  ----------
  :meth:`mxnet.ndarray.sparse.adagrad_update`.
  
  Parameters
  ----------
  learning_rate : float, default 0.01
      The initial learning rate. If None, the optimization will use the
      learning rate from ``lr_scheduler``. If not None, it will overwrite
      the learning rate in ``lr_scheduler``. If None and ``lr_scheduler``
      is also None, then it will be set to 0.01 by default.
  epsilon : float, default 1e-6
      Small value to avoid division by 0.
  use_fused_step : bool, default True
      Whether or not to use fused kernels for optimizer.
      When use_fused_step=False or grad is not sparse, step is called,
      otherwise, fused_step is called.
code: def create_state(self, index, weight):
      return zeros(weight.shape, weight.context, stype=weight.stype)
  
file_path: mxnet/python/mxnet/optimizer/adagrad.py
imports: from __future__ import absolute_import
  from ..ndarray import zeros, clip, sqrt, square
  from ..ndarray import sparse
  from .optimizer import Optimizer, register
label_desc: Use image node_id 2 for calling the AdaGrad obj's underlying member method code with example usage: obj.create_state(index, weight) and returns: zeros