nodes: 0, module; 1, function_definition; 2, function_name:predict_log_proba; 3, parameters; 4, block; 5, identifier:self; 6, identifier:X; 7, expression_statement; 8, expression_statement; 9, comment:# normalize by P(x) = P(f_1, ..., f_n); 10, expression_statement; 11, comment:# return shape = (2,); 12, return_statement; 13, comment:"""
          Return log-probability estimates for the test vector X.
  
          Parameters
          ----------
          X : array-like, shape = [n_samples, n_features]
  
          Returns
          -------
          C : array-like, shape = [n_samples, n_classes]
              Returns the log-probability of the samples for each class in
              the model. The columns correspond to the classes in sorted
              order, as they appear in the attribute `classes_`.
          """; 14, assignment; 15, assignment; 16, binary_operator:jll - np.atleast_2d(log_prob_x).T; 17, identifier:jll; 18, call; 19, identifier:log_prob_x; 20, call; 21, identifier:jll; 22, attribute; 23, attribute; 24, argument_list; 25, identifier:logsumexp; 26, argument_list; 27, call; 28, identifier:T; 29, identifier:self; 30, identifier:_joint_log_likelihood; 31, identifier:X; 32, identifier:jll; 33, keyword_argument; 34, attribute; 35, argument_list; 36, identifier:axis; 37, integer:1; 38, identifier:np; 39, identifier:atleast_2d; 40, identifier:log_prob_x
code: def predict_log_proba(self, X):
          """
          Return log-probability estimates for the test vector X.
  
          Parameters
          ----------
          X : array-like, shape = [n_samples, n_features]
  
          Returns
          -------
          C : array-like, shape = [n_samples, n_classes]
              Returns the log-probability of the samples for each class in
              the model. The columns correspond to the classes in sorted
              order, as they appear in the attribute `classes_`.
          """
          jll = self._joint_log_likelihood(X)
  
          # normalize by P(x) = P(f_1, ..., f_n)
          log_prob_x = logsumexp(jll, axis=1)  # return shape = (2,)
  
          return jll - np.atleast_2d(log_prob_x).T