class_docstr: The periodic family of kernels. Can be used to wrap any Stationary kernel
  to transform it into a periodic version. The canonical form (based on the
  SquaredExponential kernel) can be found in Equation (47) of
  
  D.J.C.MacKay. Introduction to Gaussian processes. In C.M.Bishop, editor,
  Neural Networks and Machine Learning, pages 133--165. Springer, 1998.
  
  The derivation can be achieved by mapping the original inputs through the
  transformation u = (cos(x), sin(x)).
  
  For the SquaredExponential base kernel, the result can be expressed as:
  
      k(r) =  σ² exp{ -0.5 sin²(π r / γ) / ℓ²}
  
  where:
  r is the Euclidean distance between the input points
  ℓ is the lengthscales parameter,
  σ² is the variance parameter,
  γ is the period parameter.
  
  NOTE: usually we have a factor of 4 instead of 0.5 in front but this
      is absorbed into the lengthscales hyperparameter.
  NOTE: periodic kernel uses `active_dims` of a base kernel, therefore
      the constructor doesn't have it as an argument.
code: def K_diag(self, X: TensorType) -> tf.Tensor:
      return self.base_kernel.K_diag(X)
  
file_path: GPflow/gpflow/kernels/periodic.py
imports: from typing import Optional
  import numpy
  import tensorflow
  from check_shapes import check_shapes, inherit_check_shapes
  from ..base import Parameter, TensorType
  from ..utilities import positive
  from ..utilities.ops import difference_matrix
  from .base import ActiveDims, Kernel, NormalizedActiveDims
  from .stationaries import IsotropicStationary
label_desc: Use image node_id 4 for calling the Periodic obj's underlying member method code with example usage: obj.K_diag(X) and returns: self