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." ^0Python (deterministic transpilation)
pythongenerations_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)
textgenerations 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