Case 981

The maternal line was one ancestor in a thousand and twenty four

the_maternal_line_was_one_ancestor_in_a_thousand_and_twenty_four.eml - A customer takes a mitochondrial DNA test, which reads DNA passed from mother to child and from no one else. The report traces the maternal line ten generations back to one region, and the customer concludes that this is where their ancestors came from. How many of those ancestors the line passes through is computed below.

ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-23

EML

eml
# Self-authored for the EML case corpus (no external origin). A customer takes a
# mitochondrial DNA test, which reads DNA passed from mother to child and from
# no one else. The report traces the maternal line ten generations back to one
# region, and the customer concludes that this is where their ancestors came
# from. How many of those ancestors the line passes through is computed below.
#
# The reasoning is careful. The result is correct; mitochondrial DNA really is
# passed down intact through mothers; the line really does reach ten
# generations back; and the intent is exactly 'where did my ancestors come
# from'.
#
# Every generation back doubles the ancestors - two parents, four grandparents -
# so ten generations back there are 1024 of them. The maternal line is one path
# through that tree, mother's mother's mother, one ancestor in each generation:
# 1 of the 1024, and 10 of the 2046 ancestor places in all ten generations. The
# report is exactly right about 9 per ten thousand of the tenth generation.

10 => generations_back

# the exponent below is generations_back, written as a literal
2^10 => ancestors_in_the_tenth_generation
2 * ancestors_in_the_tenth_generation - 2 => ancestor_places_in_all_ten_generations
1 => maternal_line_ancestors_in_the_tenth_generation
generations_back => maternal_line_ancestors_in_all_ten_generations
ancestors_in_the_tenth_generation - maternal_line_ancestors_in_the_tenth_generation => tenth_generation_ancestors_the_report_is_silent_about
int(maternal_line_ancestors_in_the_tenth_generation * 10000 / ancestors_in_the_tenth_generation) => maternal_line_share_of_the_tenth_generation_per_myriad
int(maternal_line_ancestors_in_all_ten_generations * 10000 / ancestor_places_in_all_ten_generations) => maternal_line_share_of_all_places_per_myriad
int(1000000 / ancestors_in_the_tenth_generation) => expected_genome_share_from_that_one_ancestor_per_million

"generations back                : " + str(generations_back) ^0
"ancestors in the tenth generation : " + str(ancestors_in_the_tenth_generation) ^0
"ancestor places, all ten generations : " + str(ancestor_places_in_all_ten_generations) ^0
"" ^0
"maternal line, tenth generation : " + str(maternal_line_ancestors_in_the_tenth_generation) + " ancestor, " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per ten thousand" ^0
"maternal line, all generations  : " + str(maternal_line_ancestors_in_all_ten_generations) + " places, " + str(maternal_line_share_of_all_places_per_myriad) + " per ten thousand" ^0
"tenth-generation ancestors the report is silent about : " + str(tenth_generation_ancestors_the_report_is_silent_about) ^0
"the rest of the genome from that one ancestor : about " + str(expected_genome_share_from_that_one_ancestor_per_million) + " per million" ^0
"" ^0

# ---- what the customer verified ----

"the where-we-came-from reasoning" ^0
"  result : correct" ^0
"  inheritance : mother to child, intact, generation after generation" ^0
"  depth : " + str(generations_back) + " generations back" ^0
"  intent : where did my ancestors come from" ^0
"  facts wrong : 0" ^0
"  verdict : THE TEST SHOWS WHERE MY ANCESTORS CAME FROM" ^0
"" ^0
"  choosing DNA that passes down intact is the part done right" ^0
"  here, and it is why the line can be followed so far back" ^0
"  without being blurred" ^0
"" ^0

# ---- how many ancestors the line passes through ----

"one path through a doubling tree" ^0
"  ancestors per generation : doubling, 2, 4, 8, up to " + str(ancestors_in_the_tenth_generation) ^0
"  what the maternal line follows : mother, her mother, her" ^0
"    mother, one ancestor in each generation" ^0
"  in the tenth generation : " + str(maternal_line_ancestors_in_the_tenth_generation) + " of " + str(ancestors_in_the_tenth_generation) ^0
"  in all ten : " + str(maternal_line_ancestors_in_all_ten_generations) + " of " + str(ancestor_places_in_all_ten_generations) + " places" ^0
"  what the other " + str(tenth_generation_ancestors_the_report_is_silent_about) + " left : nothing in this test, because their" ^0
"    mitochondria were not passed down to the customer" ^0
"  what that one ancestor left elsewhere in the genome : about" ^0
"    " + str(expected_genome_share_from_that_one_ancestor_per_million) + " per million, like each of the others" ^0
"" ^0

# ---- what the customer got ----

"the report" ^0
"  believed : the origin of the customer's ancestors" ^0
"  actual : the origin of one ancestor in each generation, " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per" ^0
"    ten thousand of the tenth" ^0
"  is the report wrong : no; about its line it is exact" ^0
"  is the maternal line the ancestry : no; it is one thread of" ^0
"    a tree that doubles every generation" ^0
"" ^0

# ---- null control ----

# The same report read as a statement about the ancestors its line passes
# through instead of about all of them.
1024 => nc_ancestors_the_report_was_read_to_describe
1 => nc_ancestors_the_line_passes_through
1023 => nc_ancestors_the_report_says_nothing_about

"null control - count the ancestors on the line" ^0
"  ancestors the report was read to describe : " + str(nc_ancestors_the_report_was_read_to_describe) ^0
"  ancestors the line passes through : " + str(nc_ancestors_the_line_passes_through) ^0
"  ancestors the report says nothing about : " + str(nc_ancestors_the_report_says_nothing_about) ^0
"  no test and no result changed; the claim was sized to the" ^0
"  path the DNA actually took" ^0
"" ^0

# ---- the rule ----

"what a correct maternal-line result guarantees" ^0
"  where one ancestor in each generation came from : exactly" ^0
"  where the ancestors came from : not addressed; " + str(generations_back) + " generations back" ^0
"    there are " + str(ancestors_in_the_tenth_generation) + " of them and the line runs through " + str(maternal_line_ancestors_in_the_tenth_generation) + ", " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per" ^0
"    ten thousand; over all ten generations it touches " + str(maternal_line_ancestors_in_all_ten_generations) + " of " + str(ancestor_places_in_all_ten_generations) ^0
"" ^0

"a line that is easy to follow is easy to mistake for the whole; ancestry" ^0
"doubles every generation, and a single thread through it tells the truth" ^0
"about the thread" ^0
"" ^0

"The report is right about its line, and the DNA it reads really does pass" ^0
"down intact. But " + str(generations_back) + " generations back there are " + str(ancestors_in_the_tenth_generation) + " ancestors and the maternal line" ^0
"runs through " + str(maternal_line_ancestors_in_the_tenth_generation) + " of them, " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per ten thousand, touching " + str(maternal_line_ancestors_in_all_ten_generations) + " of " + str(ancestor_places_in_all_ten_generations) + " places in all," ^0
"until the result is read as one ancestor's origin and not the family's." ^0

Python (deterministic transpilation)

python
generations_back = 10
ancestors_in_the_tenth_generation = 2**10
ancestor_places_in_all_ten_generations = 2 * ancestors_in_the_tenth_generation - 2
maternal_line_ancestors_in_the_tenth_generation = 1
maternal_line_ancestors_in_all_ten_generations = generations_back
tenth_generation_ancestors_the_report_is_silent_about = ancestors_in_the_tenth_generation - maternal_line_ancestors_in_the_tenth_generation
maternal_line_share_of_the_tenth_generation_per_myriad = int(maternal_line_ancestors_in_the_tenth_generation * 10000 / ancestors_in_the_tenth_generation)
maternal_line_share_of_all_places_per_myriad = int(maternal_line_ancestors_in_all_ten_generations * 10000 / ancestor_places_in_all_ten_generations)
expected_genome_share_from_that_one_ancestor_per_million = int(1000000 / ancestors_in_the_tenth_generation)
print("generations back                : " + str(generations_back))
print("ancestors in the tenth generation : " + str(ancestors_in_the_tenth_generation))
print("ancestor places, all ten generations : " + str(ancestor_places_in_all_ten_generations))
print("")
print("maternal line, tenth generation : " + str(maternal_line_ancestors_in_the_tenth_generation) + " ancestor, " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per ten thousand")
print("maternal line, all generations  : " + str(maternal_line_ancestors_in_all_ten_generations) + " places, " + str(maternal_line_share_of_all_places_per_myriad) + " per ten thousand")
print("tenth-generation ancestors the report is silent about : " + str(tenth_generation_ancestors_the_report_is_silent_about))
print("the rest of the genome from that one ancestor : about " + str(expected_genome_share_from_that_one_ancestor_per_million) + " per million")
print("")
print("the where-we-came-from reasoning")
print("  result : correct")
print("  inheritance : mother to child, intact, generation after generation")
print("  depth : " + str(generations_back) + " generations back")
print("  intent : where did my ancestors come from")
print("  facts wrong : 0")
print("  verdict : THE TEST SHOWS WHERE MY ANCESTORS CAME FROM")
print("")
print("  choosing DNA that passes down intact is the part done right")
print("  here, and it is why the line can be followed so far back")
print("  without being blurred")
print("")
print("one path through a doubling tree")
print("  ancestors per generation : doubling, 2, 4, 8, up to " + str(ancestors_in_the_tenth_generation))
print("  what the maternal line follows : mother, her mother, her")
print("    mother, one ancestor in each generation")
print("  in the tenth generation : " + str(maternal_line_ancestors_in_the_tenth_generation) + " of " + str(ancestors_in_the_tenth_generation))
print("  in all ten : " + str(maternal_line_ancestors_in_all_ten_generations) + " of " + str(ancestor_places_in_all_ten_generations) + " places")
print("  what the other " + str(tenth_generation_ancestors_the_report_is_silent_about) + " left : nothing in this test, because their")
print("    mitochondria were not passed down to the customer")
print("  what that one ancestor left elsewhere in the genome : about")
print("    " + str(expected_genome_share_from_that_one_ancestor_per_million) + " per million, like each of the others")
print("")
print("the report")
print("  believed : the origin of the customer's ancestors")
print("  actual : the origin of one ancestor in each generation, " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per")
print("    ten thousand of the tenth")
print("  is the report wrong : no; about its line it is exact")
print("  is the maternal line the ancestry : no; it is one thread of")
print("    a tree that doubles every generation")
print("")
nc_ancestors_the_report_was_read_to_describe = 1024
nc_ancestors_the_line_passes_through = 1
nc_ancestors_the_report_says_nothing_about = 1023
print("null control - count the ancestors on the line")
print("  ancestors the report was read to describe : " + str(nc_ancestors_the_report_was_read_to_describe))
print("  ancestors the line passes through : " + str(nc_ancestors_the_line_passes_through))
print("  ancestors the report says nothing about : " + str(nc_ancestors_the_report_says_nothing_about))
print("  no test and no result changed; the claim was sized to the")
print("  path the DNA actually took")
print("")
print("what a correct maternal-line result guarantees")
print("  where one ancestor in each generation came from : exactly")
print("  where the ancestors came from : not addressed; " + str(generations_back) + " generations back")
print("    there are " + str(ancestors_in_the_tenth_generation) + " of them and the line runs through " + str(maternal_line_ancestors_in_the_tenth_generation) + ", " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per")
print("    ten thousand; over all ten generations it touches " + str(maternal_line_ancestors_in_all_ten_generations) + " of " + str(ancestor_places_in_all_ten_generations))
print("")
print("a line that is easy to follow is easy to mistake for the whole; ancestry")
print("doubles every generation, and a single thread through it tells the truth")
print("about the thread")
print("")
print("The report is right about its line, and the DNA it reads really does pass")
print("down intact. But " + str(generations_back) + " generations back there are " + str(ancestors_in_the_tenth_generation) + " ancestors and the maternal line")
print("runs through " + str(maternal_line_ancestors_in_the_tenth_generation) + " of them, " + str(maternal_line_share_of_the_tenth_generation_per_myriad) + " per ten thousand, touching " + str(maternal_line_ancestors_in_all_ten_generations) + " of " + str(ancestor_places_in_all_ten_generations) + " places in all,")
print("until the result is read as one ancestor's origin and not the family's.")

stdout (executed)

text
generations back                : 10
ancestors in the tenth generation : 1024
ancestor places, all ten generations : 2046

maternal line, tenth generation : 1 ancestor, 9 per ten thousand
maternal line, all generations  : 10 places, 48 per ten thousand
tenth-generation ancestors the report is silent about : 1023
the rest of the genome from that one ancestor : about 976 per million

the where-we-came-from reasoning
  result : correct
  inheritance : mother to child, intact, generation after generation
  depth : 10 generations back
  intent : where did my ancestors come from
  facts wrong : 0
  verdict : THE TEST SHOWS WHERE MY ANCESTORS CAME FROM

  choosing DNA that passes down intact is the part done right
  here, and it is why the line can be followed so far back
  without being blurred

one path through a doubling tree
  ancestors per generation : doubling, 2, 4, 8, up to 1024
  what the maternal line follows : mother, her mother, her
    mother, one ancestor in each generation
  in the tenth generation : 1 of 1024
  in all ten : 10 of 2046 places
  what the other 1023 left : nothing in this test, because their
    mitochondria were not passed down to the customer
  what that one ancestor left elsewhere in the genome : about
    976 per million, like each of the others

the report
  believed : the origin of the customer's ancestors
  actual : the origin of one ancestor in each generation, 9 per
    ten thousand of the tenth
  is the report wrong : no; about its line it is exact
  is the maternal line the ancestry : no; it is one thread of
    a tree that doubles every generation

null control - count the ancestors on the line
  ancestors the report was read to describe : 1024
  ancestors the line passes through : 1
  ancestors the report says nothing about : 1023
  no test and no result changed; the claim was sized to the
  path the DNA actually took

what a correct maternal-line result guarantees
  where one ancestor in each generation came from : exactly
  where the ancestors came from : not addressed; 10 generations back
    there are 1024 of them and the line runs through 1, 9 per
    ten thousand; over all ten generations it touches 10 of 2046

a line that is easy to follow is easy to mistake for the whole; ancestry
doubles every generation, and a single thread through it tells the truth
about the thread

The report is right about its line, and the DNA it reads really does pass
down intact. But 10 generations back there are 1024 ancestors and the maternal line
runs through 1 of them, 9 per ten thousand, touching 10 of 2046 places in all,
until the result is read as one ancestor's origin and not the family's.

Trace event types

eml:run:starteml:assigneml:outputeml:run:done