class_docstr: Similar to :class:`~gpytorch.variational.VariationalStrategy`,
  except the whitening operation is performed using Contour Integral Quadrature
  rather than Cholesky (see `Pleiss et al. (2020)`_ for more info).
  See the `CIQ-SVGP tutorial`_ for an example.
  
  Contour Integral Quadrature uses iterative matrix-vector multiplication to approximate
  the :math:`\mathbf K_{\mathbf Z \mathbf Z}^{-1/2}` matrix used for the whitening operation.
  This can be more efficient than the standard variational strategy for large numbers
  of inducing points (e.g. :math:`M > 1000`) or when the inducing points have structure
  (e.g. they lie on an evenly-spaced grid).
  
  .. note::
  
      It is recommended that this object is used in conjunction with
      :obj:`~gpytorch.variational.NaturalVariationalDistribution` and
      `natural gradient descent`_.
  
  :param model: Model this strategy is applied to.
      Typically passed in when the VariationalStrategy is created in the
      __init__ method of the user defined model.
  :param inducing_points: Tensor containing a set of inducing
      points to use for variational inference.
  :param variational_distribution: A
      VariationalDistribution object that represents the form of the variational distribution :math:`q(\mathbf u)`
  :param learn_inducing_locations: (Default True): Whether or not
      the inducing point locations :math:`\mathbf Z` should be learned (i.e. are they
      parameters of the model).
  :param jitter_val: Amount of diagonal jitter to add for Cholesky factorization numerical stability
  
  .. _Pleiss et al. (2020):
      https://arxiv.org/pdf/2006.11267.pdf
  .. _CIQ-SVGP tutorial:
      examples/04_Variational_and_Approximate_GPs/SVGP_CIQ.html
  .. _natural gradient descent:
      examples/04_Variational_and_Approximate_GPs/Natural_Gradient_Descent.html
code: def variational_distribution(self) -> Distribution:
      if self._ngd():
          raise RuntimeError(
              "Variational distribution for NGD-CIQ should be computed during forward calls. "
              "This is probably a bug in GPyTorch."
          )
      return super().variational_distribution
  
imports: from typing import Optional, Tuple
  import torch
  from linear_operator import to_linear_operator
  from linear_operator.operators import DiagLinearOperator, LinearOperator, MatmulLinearOperator, SumLinearOperator
  from linear_operator.utils import linear_cg
  from torch import Tensor
  from torch.autograd.function import FunctionCtx
  from ..None import settings
  from ..distributions import Delta, Distribution, MultivariateNormal
  from ..module import Module
  from ..utils.memoize import cached
  from ._variational_strategy import _VariationalStrategy
  from .natural_variational_distribution import NaturalVariationalDistribution
label_desc: Use image node_id 3 for calling the CiqVariationalStrategy obj's underlying member method code with example usage: obj.variational_distribution() and returns: super