code: def min_cost_matching(
      distance_metric,
      max_distance,
      tracks,
      detections,
      track_indices=None,
      detection_indices=None,
  ):
      """
      Solve linear assignment problem.
  
      Args:
          distance_metric :
              Callable[List[Track], List[Detection], List[int], List[int]) -> ndarray
              The distance metric is given a list of tracks and detections as
              well as a list of N track indices and M detection indices. The
              metric should return the NxM dimensional cost matrix, where element
              (i, j) is the association cost between the i-th track in the given
              track indices and the j-th detection in the given detection_indices.
          max_distance (float): Gating threshold. Associations with cost larger
              than this value are disregarded.
          tracks (list[Track]): A list of predicted tracks at the current time
              step.
          detections (list[Detection]): A list of detections at the current time
              step.
          track_indices (list[int]): List of track indices that maps rows in
              `cost_matrix` to tracks in `tracks`.
          detection_indices (List[int]): List of detection indices that maps
              columns in `cost_matrix` to detections in `detections`.
  
      Returns:
          A tuple (List[(int, int)], List[int], List[int]) with the following
          three entries:
              * A list of matched track and detection indices.
              * A list of unmatched track indices.
              * A list of unmatched detection indices.
      """
      if track_indices is None:
          track_indices = np.arange(len(tracks))
      if detection_indices is None:
          detection_indices = np.arange(len(detections))
  
      if len(detection_indices) == 0 or len(track_indices) == 0:
          return (
              [],
              track_indices,
              detection_indices,
          )  # Nothing to match.
  
      cost_matrix = distance_metric(
          tracks, detections, track_indices, detection_indices
      )
  
      cost_matrix[cost_matrix > max_distance] = max_distance + 1e-5
      indices = linear_sum_assignment(cost_matrix)
  
      matches, unmatched_tracks, unmatched_detections = [], [], []
      for col, detection_idx in enumerate(detection_indices):
          if col not in indices[1]:
              unmatched_detections.append(detection_idx)
      for row, track_idx in enumerate(track_indices):
          if row not in indices[0]:
              unmatched_tracks.append(track_idx)
      for row, col in zip(indices[0], indices[1]):
          track_idx = track_indices[row]
          detection_idx = detection_indices[col]
          if cost_matrix[row, col] > max_distance:
              unmatched_tracks.append(track_idx)
              unmatched_detections.append(detection_idx)
          else:
              matches.append((track_idx, detection_idx))
      return matches, unmatched_tracks, unmatched_detections
  
file_path: PaddleHub/modules/video/multiple_object_tracking/fairmot_dla34/modeling/mot/matching/deepsort_matching.py
imports: import numpy
  from scipy.optimize import linear_sum_assignment
  from ..motion import kalman_filter
label_desc: Use image node_id 5 for calling a global function with example usage: min_cost_matching(distance_metric, max_distance, tracks, detections, track_indices, detection_indices) and returns: matches,  unmatched_tracks,  unmatched_detections, list,  track_indices,  detection_indices