code: def likelihood(self, outcomes, modelparams, expparams):
          r
          
          # Count the number of times the inner-most loop is called.
          self._call_count += (
              safe_shape(outcomes) * safe_shape(modelparams) * safe_shape(expparams)
          )
docs: r"""
          Calculates the probability of each given outcome, conditioned on each
          given model parameter vector and each given experimental control setting.
  
          :param np.ndarray modelparams: A shape ``(n_models, n_modelparams)``
              array of model parameter vectors describing the hypotheses for
              which the likelihood function is to be calculated.
          :param np.ndarray expparams: A shape ``(n_experiments, )`` array of
              experimental control settings, with ``dtype`` given by 
              :attr:`~qinfer.Simulatable.expparams_dtype`, describing the
              experiments from which the given outcomes were drawn.
              
          :rtype: np.ndarray
          :return: A three-index tensor ``L[i, j, k]``, where ``i`` is the outcome
              being considered, ``j`` indexes which vector of model parameters was used,
              and where ``k`` indexes which experimental parameters where used.
              Each element ``L[i, j, k]`` then corresponds to the likelihood
              :math:`\Pr(d_i | \vec{x}_j; e_k)`.