class_docstr: Approximate Kullback-Leibler.
code: def __call__(self, epsilon, obs_data, sim_data):
      if sim_data.ndim == 1:
          sim_data = sim_data[:, None]
      nu_d, _ = cKDTree(sim_data).query(self.obs_data, 1)
      return (
          self.d_n * np.sum(-np.log(nu_d / self.rho_d) / epsilon)
          + self.log_r
      )
  
imports: import logging
  import numpy
  import pytensor
  import pytensor.tensor
  from pytensor.graph.op import Apply, Op
  from pytensor.tensor.random.op import RandomVariable
  from pytensor.tensor.variable import TensorVariable
  from scipy.spatial import cKDTree
  from pymc.distributions.distribution import Distribution, _moment
  from pymc.logprob.abstract import _logprob
  from pymc.pytensorf import floatX
label_desc: Use image node_id 2 for calling the KullbackLeibler obj's underlying member method code with example usage: obj.__call__(epsilon, obs_data, sim_data) and returns: unknown