<?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%2Fdiff_hunk.py</id>
	<title>The Principia Machina/TPC-PY/diff hunk.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%2Fdiff_hunk.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_hunk.py&amp;action=history"/>
	<updated>2026-10-21T13:45:34Z</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/diff_hunk.py&amp;diff=4053&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/diff_hunk.py&amp;diff=4053&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/diff_hunk.py&amp;diff=4052&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source diff_hunk.py (0.1.0), SHA-256 0e2ae21ea4ddfd57; 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/diff_hunk.py&amp;diff=4052&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source diff_hunk.py (0.1.0), SHA-256 0e2ae21ea4ddfd57; 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;&amp;quot;&amp;quot;&amp;quot;diff_hunk 0.1.0: the cross-residence differential for tpc_hunk 0.1.0.&lt;br /&gt;
Random bases over a small alphabet with multi-byte characters, random&lt;br /&gt;
hunks drawn from substrings of the base (so that ABSENT, MULTIPLE, OVERLAP&lt;br /&gt;
and EMPTY all occur), both residences on the same inputs, 0 differences&lt;br /&gt;
the pass. Usage: python3 diff_hunk.py [seed] [cases].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import json, os, random, subprocess, sys, tempfile&lt;br /&gt;
here = os.path.dirname(os.path.abspath(__file__))&lt;br /&gt;
sys.path.insert(0, here)&lt;br /&gt;
from tpc_hunk import run_case&lt;br /&gt;
seed = int(sys.argv[1]) if len(sys.argv) &amp;gt; 1 else 1&lt;br /&gt;
count = int(sys.argv[2]) if len(sys.argv) &amp;gt; 2 else 20000&lt;br /&gt;
random.seed(seed)&lt;br /&gt;
ALPHA = &amp;quot;ab \n|\\é́模\U0001F600xyz\t&amp;quot;&lt;br /&gt;
cases = []&lt;br /&gt;
for t in range(count):&lt;br /&gt;
    n = random.randint(0, 40)&lt;br /&gt;
    base = &amp;quot;&amp;quot;.join(random.choice(ALPHA) for _ in range(n))&lt;br /&gt;
    hunks = []&lt;br /&gt;
    for _ in range(random.randint(0, 4)):&lt;br /&gt;
        r = random.random()&lt;br /&gt;
        if r &amp;lt; 0.08 or not base:&lt;br /&gt;
            old = &amp;quot;&amp;quot; if r &amp;lt; 0.04 else &amp;quot;&amp;quot;.join(random.choice(ALPHA) for _ in range(random.randint(1, 3)))&lt;br /&gt;
        else:&lt;br /&gt;
            i = random.randrange(len(base))&lt;br /&gt;
            j = min(len(base), i + random.randint(1, 6))&lt;br /&gt;
            old = base[i:j]&lt;br /&gt;
        new = &amp;quot;&amp;quot;.join(random.choice(ALPHA) for _ in range(random.randint(0, 5)))&lt;br /&gt;
        h = {&amp;quot;old&amp;quot;: old, &amp;quot;new&amp;quot;: new}&lt;br /&gt;
        if random.random() &amp;lt; 0.1:&lt;br /&gt;
            h[&amp;quot;n&amp;quot;] = len(hunks) + 1&lt;br /&gt;
        hunks.append(h)&lt;br /&gt;
    cases.append({&amp;quot;fn&amp;quot;: &amp;quot;hunk&amp;quot;, &amp;quot;args&amp;quot;: {&amp;quot;base&amp;quot;: base, &amp;quot;hunks&amp;quot;: hunks}})&lt;br /&gt;
CASES_PATH = os.environ.get(&amp;quot;TPC_DIFF_CASES&amp;quot;)  # named: kept, for crosspy.py&lt;br /&gt;
if not CASES_PATH:&lt;br /&gt;
    fd, CASES_PATH = tempfile.mkstemp(prefix=&amp;quot;tpc_diff_&amp;quot;, suffix=&amp;quot;.json&amp;quot;)  # outside the tree&lt;br /&gt;
    os.close(fd)&lt;br /&gt;
with open(CASES_PATH, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
    json.dump(cases, f, ensure_ascii=False)&lt;br /&gt;
py = [run_case(c[&amp;quot;fn&amp;quot;], c[&amp;quot;args&amp;quot;]) for c in cases]&lt;br /&gt;
php = json.loads(subprocess.run([&amp;quot;php&amp;quot;, os.path.join(here, &amp;quot;diff_hunk.php&amp;quot;), CASES_PATH], capture_output=True, text=True, check=True).stdout)&lt;br /&gt;
if not os.environ.get(&amp;quot;TPC_DIFF_CASES&amp;quot;):&lt;br /&gt;
    os.remove(CASES_PATH)&lt;br /&gt;
diffs = sum(1 for a, b in zip(py, php) if a != b)&lt;br /&gt;
kinds = {}&lt;br /&gt;
for x in py:&lt;br /&gt;
    k = x.split(&amp;quot;|&amp;quot;)[0] if not x.startswith(&amp;quot;REFUSED&amp;quot;) else x.split(&amp;quot;|&amp;quot;)[1]&lt;br /&gt;
    kinds[k] = kinds.get(k, 0) + 1&lt;br /&gt;
print(&amp;quot;seed&amp;quot;, seed, &amp;quot;cases&amp;quot;, len(cases), &amp;quot;differences&amp;quot;, diffs, &amp;quot;outcomes&amp;quot;, json.dumps(kinds, sort_keys=True))&lt;br /&gt;
for a, b in zip(py, php):&lt;br /&gt;
    if a != b:&lt;br /&gt;
        print(a); print(&amp;quot;---&amp;quot;); print(b); break&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>