def with_false_negative_genotypes(gt):
  """Returns a set of genotypes that includes false negatives.

  This function takes a concrete genotype for a Variant, such as (0, 1), and
  returns a set of genotypes that includes gt as well as all possible genotypes
  consistent with some of the alleles in gt being missed. For example, here are
  a few outputs for help understand what this means:

    input genotype (gt) => returned set of genotypes
    ------------------------------------------------

    # A hom-ref genotype doesn't have any alleles to miss.
    (0, 0)  => {(0, 0)}

    # Might miss the 1 allele, or not.
    (0, 1)  => {(0, 0), (0, 1)}

    # We could miss one, or both of the 1 alleles.
    (1, 1)  => {(0, 0), (0, 1), (1, 1)}

    # Multi-allelics are more complex, in that we could miss either the 1 or the
    # 2 allele, or both.
    (1, 2)  => {(0, 0), (0, 1), (0, 2), (1, 2)}

  Args:
    gt: iterable[int]: A genotype for a Variant, such as [0, 1] or [1, 1].

  Returns:
    A set of tuples containing diploid genotypes.
  """
  alts = set(gt) - {0}
  return {(0, 0), tuple(gt)} | {(0, alt) for alt in alts}