code: def select_starts_ends(
      start,
      end,
      p_mask,
      attention_mask,
      min_null_score=1000000,
      top_k=1,
      handle_impossible_answer=False,
      max_answer_len=15,
  ):
      """
      Takes the raw output of any `ModelForQuestionAnswering` and first normalizes its outputs and then uses
      `decode_spans()` to generate probabilities for each span to be the actual answer.
  
      Args:
          start (`np.ndarray`): Individual start logits for each token.
          end (`np.ndarray`): Individual end logits for each token.
          p_mask (`np.ndarray`): A mask with 1 for values that cannot be in the answer
          attention_mask (`np.ndarray`): The attention mask generated by the tokenizer
          min_null_score(`float`): The minimum null (empty) answer score seen so far.
          topk (`int`): Indicates how many possible answer span(s) to extract from the model output.
          handle_impossible_answer(`bool`): Whether to allow null (empty) answers
          max_answer_len (`int`): Maximum size of the answer to extract from the model's output.
      """
      # Ensure padded tokens & question tokens cannot belong to the set of candidate answers.
      undesired_tokens = np.abs(np.array(p_mask) - 1)
  
      if attention_mask is not None:
          undesired_tokens = undesired_tokens & attention_mask
  
      # Generate mask
      undesired_tokens_mask = undesired_tokens == 0.0
  
      # Make sure non-context indexes in the tensor cannot contribute to the softmax
      start = np.where(undesired_tokens_mask, -10000.0, start)
      end = np.where(undesired_tokens_mask, -10000.0, end)
  
      # Normalize logits and spans to retrieve the answer
      start = np.exp(start - start.max(axis=-1, keepdims=True))
      start = start / start.sum()
  
      end = np.exp(end - end.max(axis=-1, keepdims=True))
      end = end / end.sum()
  
      if handle_impossible_answer:
          min_null_score = min(
              min_null_score, (start[0, 0] * end[0, 0]).item()
          )
  
      # Mask CLS
      start[0, 0] = end[0, 0] = 0.0
  
      starts, ends, scores = decode_spans(
          start, end, top_k, max_answer_len, undesired_tokens
      )
      return starts, ends, scores, min_null_score
  
imports: import types
  import warnings
  from collections.abc import Iterable
  from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union
  import numpy
  from ..data import SquadExample, SquadFeatures, squad_convert_examples_to_features
  from ..modelcard import ModelCard
  from ..tokenization_utils import PreTrainedTokenizer
  from ..utils import PaddingStrategy, add_end_docstrings, is_tf_available, is_tokenizers_available, is_torch_available, logging
  from .base import PIPELINE_INIT_ARGS, ArgumentHandler, ChunkPipeline
label_desc: Use image node_id 2 for calling a global function with example usage: select_starts_ends(start, end, p_mask, attention_mask, min_null_score, top_k, handle_impossible_answer, max_answer_len) and returns: starts,  ends,  scores,  min_null_score