class_docstr: Implicit quantile network-based Q-function.
  
  Args:
      psi (chainer.Link): Callable link
          (batch_size, obs_size) -> (batch_size, hidden_size).
      phi (chainer.Link): Callable link
          (batch_size, n_taus) -> (batch_size, n_taus, hidden_size).
      f (chainer.Link): Callable link
          (batch_size * n_taus, hidden_size)
          -> (batch_size * n_taus, n_actions).
  
  Returns:
      QuantileDiscreteActionValue: Action values.
docstr: Evaluate given observations.
  
  Args:
      x (ndarray): Batch of observations.
  Returns:
      callable: (batch_size, taus) -> (batch_size, taus, n_actions)
docstr_tok: ["Evaluate","given","observations",".","Args",":","x","(","ndarray",")",":","Batch","of","observations",".","Returns",":","callable",":","(","batch_size",",","taus",")","-",">","(","batch_size",",","taus",",","n_actions",")"]
code: def __call__(self, x):
      """Evaluate given observations.
  
      Args:
          x (ndarray): Batch of observations.
      Returns:
          callable: (batch_size, taus) -> (batch_size, taus, n_actions)
      """
      batch_size = x.shape[0]
      psi_x = self.psi(x)
      assert psi_x.ndim == 2
      assert psi_x.shape[0] == batch_size
  
      def evaluate_with_quantile_thresholds(taus):
          return _evaluate_psi_x_with_quantile_thresholds(
              psi_x, self.phi, self.f, taus
          )
  
      return evaluate_with_quantile_thresholds
  
imports: import chainer
  from chainer import cuda
  import chainer.functions
  import chainer.links
  from chainerrl.action_value import QuantileDiscreteActionValue
  from chainerrl.agents import dqn
  from chainerrl.links import StatelessRecurrentChainList
label_desc: Use image node_id 2 for calling the ImplicitQuantileQFunction obj's underlying member method code with example usage: obj.__call__(x) and returns: evaluate_with_quantile_thresholds, _evaluate_psi_x_with_quantile_thresholds