code: def _find_cluster_and_probability(
      tree,
      cluster_tree,
      neighbor_indices,
      neighbor_distances,
      core_distances,
      cluster_map,
      max_lambdas,
      min_samples,
  ):
      """
      Return the cluster label (of the original clustering) and membership
      probability of a new data point.
  
      Parameters
      ----------
      tree : CondensedTree
          The condensed tree associated with the clustering.
  
      cluster_tree : structured_array
          The raw form of the condensed tree with only cluster information (no
          data on individual points). This is significantly more compact.
  
      neighbor_indices : array (2 * min_samples, )
          An array of raw distance based nearest neighbor indices.
  
      neighbor_distances : array (2 * min_samples, )
          An array of raw distances to the nearest neighbors.
  
      core_distances : array (n_samples, )
          An array of core distances for all points
  
      cluster_map : dict
          A dictionary mapping cluster numbers in the condensed tree to labels
          in the final selected clustering.
  
      max_lambdas : dict
          A dictionary mapping cluster numbers in the condensed tree to the
          maximum lambda value seen in that cluster.
  
      min_samples : int
          The min_samples value used to generate core distances.
      """
      raw_tree = tree._raw_tree
      tree_root = cluster_tree["parent"].min()
  
      nearest_neighbor, lambda_ = _find_neighbor_and_lambda(
          neighbor_indices,
          neighbor_distances,
          core_distances,
          min_samples,
      )
  
      neighbor_tree_row = get_tree_row_with_child(
          raw_tree, nearest_neighbor
      )
      potential_cluster = neighbor_tree_row["parent"]
  
      if neighbor_tree_row["lambda_val"] > lambda_:
          # Find appropriate cluster based on lambda of new point
          while (
              potential_cluster > tree_root
              and cluster_tree["lambda_val"][
                  cluster_tree["child"] == potential_cluster
              ]
              >= lambda_
          ):
              potential_cluster = cluster_tree["parent"][
                  cluster_tree["child"] == potential_cluster
              ][0]
  
      if potential_cluster in cluster_map:
          cluster_label = cluster_map[potential_cluster]
      else:
          cluster_label = -1
  
      if cluster_label >= 0:
          max_lambda = max_lambdas[potential_cluster]
  
          if max_lambda > 0.0:
              lambda_ = min(max_lambda, lambda_)
              prob = lambda_ / max_lambda
          else:
              prob = 1.0
      else:
          prob = 0.0
  
      return cluster_label, prob
  
file_path: hdbscan/hdbscan/prediction.py
imports: import numpy
  from sklearn.neighbors import KDTree, BallTree
  from .dist_metrics import DistanceMetric
  from ._hdbscan_tree import recurse_leaf_dfs
  from ._prediction_utils import get_tree_row_with_child, dist_membership_vector, outlier_membership_vector, prob_in_some_cluster, all_points_dist_membership_vector, all_points_outlier_membership_vector, all_points_prob_in_some_cluster
  from warnings import warn
label_desc: Use image node_id 3 for calling a global function with example usage: _find_cluster_and_probability(tree, cluster_tree, neighbor_indices, neighbor_distances, core_distances, cluster_map, max_lambdas, min_samples) and returns: cluster_label,  prob