<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=The_Principia_Machina%2FTPC-PY%2Fgen_canon_corpus.py</id>
	<title>The Principia Machina/TPC-PY/gen canon corpus.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=The_Principia_Machina%2FTPC-PY%2Fgen_canon_corpus.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_canon_corpus.py&amp;action=history"/>
	<updated>2026-10-21T16:59:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_canon_corpus.py&amp;diff=4139&amp;oldid=prev</id>
		<title>BFP Rauch: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_canon_corpus.py&amp;diff=4139&amp;oldid=prev"/>
		<updated>2026-09-28T04:32:52Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:32, 28 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_canon_corpus.py&amp;diff=4138&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source gen_canon_corpus.py (-), SHA-256 7e86e356a91ed1bd; conformed TPS 0.3.0; PROPOSED, not declared (CO-8)</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_canon_corpus.py&amp;diff=4138&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source gen_canon_corpus.py (-), SHA-256 7e86e356a91ed1bd; conformed TPS 0.3.0; PROPOSED, not declared (CO-8)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;Generator for tpc/vectors/canon_corpus.json: the float form of canon(),&lt;br /&gt;
the shared oracle every other corpus is compared through. Expectations are&lt;br /&gt;
C printf &amp;quot;%.12g&amp;quot; written literally (0 for -0.0); the generator refuses to&lt;br /&gt;
write the corpus if tpc_strike.canon disagrees.&lt;br /&gt;
Run: cd tpc &amp;amp;&amp;amp; python3 gen_canon_corpus.py&lt;br /&gt;
Recovered 2026-09-27 (BASE-GEN; record 0.18.0 section 7) from the TIDY 3&lt;br /&gt;
archive, tidy3_2026-09-25/gen_canon_corpus.py, SHA-256&lt;br /&gt;
8b59a14a09695c4a790c45fc4c5c7619eb8fb6f256687c9dfcbeb4d5a3d64abf, where it&lt;br /&gt;
regenerates the archived corpus byte for byte. Changed in the tree: the&lt;br /&gt;
writer only (write_layout, one line per case; RD-C8-2). No case changed.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import json, os, sys&lt;br /&gt;
HERE = os.path.dirname(os.path.abspath(__file__))&lt;br /&gt;
sys.path.insert(0, HERE)&lt;br /&gt;
import tpc_strike as S&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_layout(path, corpus, groups):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Write the corpus in the layout the published file carries (the&lt;br /&gt;
    corpus is never re-laid; the writer follows it): the meta as&lt;br /&gt;
    json.dumps(indent=1); each case on the lines groups(case) names, the&lt;br /&gt;
    keys of a line joined by &amp;quot;, &amp;quot;, the lines by &amp;quot;,\n   &amp;quot;; values as&lt;br /&gt;
    json.dumps writes them, a non-ASCII character as itself; UTF-8, LF.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def item(k, v):&lt;br /&gt;
        return json.dumps(k) + &amp;quot;: &amp;quot; + json.dumps(v, ensure_ascii=False)&lt;br /&gt;
    rows = []&lt;br /&gt;
    for c in corpus[&amp;quot;cases&amp;quot;]:&lt;br /&gt;
        gs = groups(c)&lt;br /&gt;
        assert [k for g in gs for k in g] == list(c), c.get(&amp;quot;id&amp;quot;)&lt;br /&gt;
        rows.append(&amp;quot;  {&amp;quot; + &amp;quot;,\n   &amp;quot;.join(&amp;quot;, &amp;quot;.join(item(k, c[k]) for k in g)&lt;br /&gt;
                                           for g in gs) + &amp;quot;}&amp;quot;)&lt;br /&gt;
    text = (&amp;#039;{\n &amp;quot;meta&amp;quot;: &amp;#039;&lt;br /&gt;
            + json.dumps(corpus[&amp;quot;meta&amp;quot;], indent=1, ensure_ascii=False).replace(&amp;quot;\n&amp;quot;, &amp;quot;\n &amp;quot;)&lt;br /&gt;
            + &amp;#039;,\n &amp;quot;cases&amp;quot;: [\n&amp;#039; + &amp;quot;,\n&amp;quot;.join(rows) + &amp;quot;\n ]\n}\n&amp;quot;)&lt;br /&gt;
    with open(path, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;, newline=&amp;quot;\n&amp;quot;) as f:&lt;br /&gt;
        f.write(text)&lt;br /&gt;
&lt;br /&gt;
CASES = [&lt;br /&gt;
    (2.5, &amp;quot;2.5&amp;quot;), (3.0, &amp;quot;3&amp;quot;), (0.1, &amp;quot;0.1&amp;quot;), (1.0 / 3.0, &amp;quot;0.333333333333&amp;quot;),&lt;br /&gt;
    (0.0001, &amp;quot;0.0001&amp;quot;), (1e-05, &amp;quot;1e-05&amp;quot;), (2e-09, &amp;quot;2e-09&amp;quot;), (-2.5e-07, &amp;quot;-2.5e-07&amp;quot;),&lt;br /&gt;
    (123456789012.5, &amp;quot;123456789012&amp;quot;), (1e12, &amp;quot;1e+12&amp;quot;), (1.5e300, &amp;quot;1.5e+300&amp;quot;),&lt;br /&gt;
    (5e-324, &amp;quot;4.94065645841e-324&amp;quot;), (-0.0, &amp;quot;0&amp;quot;), (0.0, &amp;quot;0&amp;quot;), (-1e-300, &amp;quot;-1e-300&amp;quot;),&lt;br /&gt;
    (9.999999999995, &amp;quot;9.99999999999&amp;quot;), (1.7976931348623157e308, &amp;quot;1.79769313486e+308&amp;quot;),&lt;br /&gt;
]&lt;br /&gt;
cases = []&lt;br /&gt;
bad = 0&lt;br /&gt;
for i, (x, e) in enumerate(CASES):&lt;br /&gt;
    got = S.canon(x)&lt;br /&gt;
    if got != e:&lt;br /&gt;
        bad += 1&lt;br /&gt;
        print(&amp;quot;MISMATCH&amp;quot;, x, e, got)&lt;br /&gt;
    cases.append({&amp;quot;id&amp;quot;: &amp;quot;float/%02d&amp;quot; % i, &amp;quot;fn&amp;quot;: &amp;quot;canon&amp;quot;, &amp;quot;input&amp;quot;: {&amp;quot;x&amp;quot;: x}, &amp;quot;expect&amp;quot;: e})&lt;br /&gt;
if bad:&lt;br /&gt;
    sys.exit(&amp;quot;refusing to write: %d mismatches&amp;quot; % bad)&lt;br /&gt;
corpus = {&amp;quot;meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;tpc_canon_corpus&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;0.1.0&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;VERIFIED (both residences)&amp;quot;,&lt;br /&gt;
    &amp;quot;module&amp;quot;: &amp;quot;tpc_strike canon (float form rebuilt 2026-09-22)&amp;quot;,&lt;br /&gt;
    &amp;quot;note&amp;quot;: (&amp;quot;canon() writes a double as C printf %.12g. PHP&amp;#039;s sprintf(&amp;#039;%.12g&amp;#039;) writes exponents &amp;quot;&lt;br /&gt;
             &amp;quot;differently (&amp;#039;2.0e-9&amp;#039; for &amp;#039;2e-09&amp;#039;), so both residences build the string from the &amp;quot;&lt;br /&gt;
             &amp;quot;digits of %.11e. -0.0 is written 0. Both residences MUST reproduce every expect.&amp;quot;)},&lt;br /&gt;
    &amp;quot;cases&amp;quot;: cases}&lt;br /&gt;
write_layout(os.path.join(HERE, &amp;quot;vectors&amp;quot;, &amp;quot;canon_corpus.json&amp;quot;), corpus,&lt;br /&gt;
             lambda c: [list(c)])&lt;br /&gt;
print(&amp;quot;wrote&amp;quot;, len(cases), &amp;quot;canon cases; all match&amp;quot;)&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>