class_docstr: Still under development.
class_docstr_tok: ["Still","under","development","."]
code: def log_probability(self, X):
      X = _check_parameter(
          _cast_as_tensor(X),
          "X",
          ndim=3,
          shape=(-1, self.n_parents, self.d),
          check_parameter=self.check_data,
      )
  
      logps = torch.zeros(
          len(X),
          dtype=self.probs[0].dtype,
          device=X.device,
          requires_grad=False,
      )
  
      for i in range(len(X)):
          for j in range(self.d):
              logps[i] += self._log_probs[j][tuple(X[i, :, j])]
  
      return logps
  
file_path: pomegranate/pomegranate/distributions/conditional_categorical.py
imports: import numpy
  import torch
  import itertools
  from .._utils import _cast_as_tensor
  from .._utils import _cast_as_parameter
  from .._utils import _update_parameter
  from .._utils import _check_parameter
  from .._utils import _reshape_weights
  from .._utils import BufferList
  from ._distribution import ConditionalDistribution
  from .categorical import Categorical
label_desc: Use image node_id 5 for calling the ConditionalCategorical obj's underlying member method code with example usage: obj.log_probability(X) and returns: logps