<?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_sponsor.py</id>
	<title>The Principia Machina/TPC-PY/diff sponsor.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_sponsor.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_sponsor.py&amp;action=history"/>
	<updated>2026-10-21T13:01:03Z</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_sponsor.py&amp;diff=4073&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_sponsor.py&amp;diff=4073&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;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&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;4&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;!-- diff cache key pma_cutover_20261020t051351z-soft_:diff:1.41:old-4072:rev-4073 --&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_sponsor.py&amp;diff=4072&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source diff_sponsor.py (0.1.0), SHA-256 11c9f3822eafe3a8; 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_sponsor.py&amp;diff=4072&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source diff_sponsor.py (0.1.0), SHA-256 11c9f3822eafe3a8; 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_sponsor 0.1.0: the cross-residence differential for tpc_sponsor&lt;br /&gt;
0.1.0. Random conduct events with facts at and around every window&lt;br /&gt;
boundary, random evidence lists (conduct and agent events, ages, weights,&lt;br /&gt;
priors, half-lives) and random admission and retirement tables, both&lt;br /&gt;
residences on the same inputs, 0 differences the pass.&lt;br /&gt;
Usage: python3 diff_sponsor.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_sponsor 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;
KINDS = [&amp;quot;CE-F1&amp;quot;, &amp;quot;CE-F2&amp;quot;, &amp;quot;CE-A1&amp;quot;, &amp;quot;CE-A2&amp;quot;, &amp;quot;CE-A3&amp;quot;, &amp;quot;CE-A4&amp;quot;, &amp;quot;CE-A5&amp;quot;]&lt;br /&gt;
STATES = [&amp;quot;GREEN&amp;quot;, &amp;quot;YELLOW&amp;quot;, &amp;quot;ORANGE&amp;quot;, &amp;quot;SUSPENDED&amp;quot;, &amp;quot;RED&amp;quot;]&lt;br /&gt;
def blk(): return random.choice([None, None, 1, 5, 99, 100, 101, 150, 0, -1, True])&lt;br /&gt;
def facts(kind):&lt;br /&gt;
    r = random.random()&lt;br /&gt;
    if r &amp;lt; 0.05: return {&amp;quot;audit&amp;quot;: &amp;quot;OPEN&amp;quot;} if kind != &amp;quot;CE-A1&amp;quot; else {&amp;quot;named&amp;quot;: True}&lt;br /&gt;
    if kind == &amp;quot;CE-F1&amp;quot;:&lt;br /&gt;
        pred = random.choice([None, None, {&amp;quot;state&amp;quot;: random.choice(STATES), &amp;quot;pending&amp;quot;: random.choice([0, 0, 1, 3, -1])}])&lt;br /&gt;
        return {&amp;quot;named&amp;quot;: random.choice([True, True, False]), &amp;quot;predecessor&amp;quot;: pred, &amp;quot;blocks&amp;quot;: random.choice([0, 50, 99, 100, 101, 400, -1]), &amp;quot;first_violation_block&amp;quot;: blk(), &amp;quot;period_taken&amp;quot;: random.choice([False, False, True])}&lt;br /&gt;
    if kind == &amp;quot;CE-F2&amp;quot;:&lt;br /&gt;
        return {&amp;quot;declared&amp;quot;: random.choice([True, True, False]), &amp;quot;blocks&amp;quot;: random.choice([0, 50, 99, 100, 101, 400]), &amp;quot;first_violation_block&amp;quot;: blk(), &amp;quot;first_canary_failure_block&amp;quot;: blk()}&lt;br /&gt;
    if kind in (&amp;quot;CE-A1&amp;quot;, &amp;quot;CE-A2&amp;quot;, &amp;quot;CE-A3&amp;quot;):&lt;br /&gt;
        return {&amp;quot;audit&amp;quot;: random.choice([&amp;quot;OPEN&amp;quot;, &amp;quot;CONFIRMED&amp;quot;, &amp;quot;DISMISSED&amp;quot;, &amp;quot;MAYBE&amp;quot;])}&lt;br /&gt;
    if kind == &amp;quot;CE-A4&amp;quot;:&lt;br /&gt;
        w = random.choice([0, 86400, 2592000])&lt;br /&gt;
        e = random.randint(0, 10 ** 8)&lt;br /&gt;
        return {&amp;quot;admission&amp;quot;: random.choice([e, e + w, e + w + 1, e - w, e - w - 1 if e &amp;gt; w else 0, e + random.randint(0, 2 * w + 1)]), &amp;quot;exit&amp;quot;: e, &amp;quot;state&amp;quot;: random.choice(STATES), &amp;quot;pending&amp;quot;: random.choice([0, 0, 1, 2]), &amp;quot;window&amp;quot;: w}&lt;br /&gt;
    return {&amp;quot;removed&amp;quot;: random.choice([True, True, False]), &amp;quot;cause&amp;quot;: random.choice([&amp;quot;CANARY&amp;quot;, &amp;quot;TRIP&amp;quot;, &amp;quot;OTHER&amp;quot;, None, &amp;quot;X&amp;quot;])}&lt;br /&gt;
cases = []&lt;br /&gt;
for t in range(count):&lt;br /&gt;
    fn = random.choice([&amp;quot;resolve&amp;quot;, &amp;quot;evidence&amp;quot;, &amp;quot;whitewash&amp;quot;])&lt;br /&gt;
    if fn == &amp;quot;resolve&amp;quot;:&lt;br /&gt;
        kind = random.choice(KINDS + [&amp;quot;CE-X&amp;quot;])&lt;br /&gt;
        cases.append({&amp;quot;fn&amp;quot;: &amp;quot;resolve&amp;quot;, &amp;quot;args&amp;quot;: {&amp;quot;event&amp;quot;: {&amp;quot;kind&amp;quot;: kind}, &amp;quot;facts&amp;quot;: facts(kind if kind != &amp;quot;CE-X&amp;quot; else &amp;quot;CE-A1&amp;quot;)}})&lt;br /&gt;
    elif fn == &amp;quot;evidence&amp;quot;:&lt;br /&gt;
        evs = []; ages = []&lt;br /&gt;
        for _ in range(random.randint(0, 12)):&lt;br /&gt;
            kind = random.choice(KINDS + [&amp;quot;AGENT&amp;quot;, &amp;quot;AGENT&amp;quot;])&lt;br /&gt;
            if kind == &amp;quot;AGENT&amp;quot;:&lt;br /&gt;
                e = {&amp;quot;kind&amp;quot;: &amp;quot;AGENT&amp;quot;, &amp;quot;resolution&amp;quot;: random.choice([&amp;quot;FOR&amp;quot;, &amp;quot;AGAINST&amp;quot;, &amp;quot;FOR&amp;quot;] if random.random() &amp;lt; 0.98 else [&amp;quot;PENDING&amp;quot;]), &amp;quot;weight&amp;quot;: round(random.uniform(0, 3), 4)}&lt;br /&gt;
                if random.random() &amp;lt; 0.01: del e[&amp;quot;weight&amp;quot;]&lt;br /&gt;
            else:&lt;br /&gt;
                ok = [&amp;quot;FOR&amp;quot;, &amp;quot;NEUTRAL&amp;quot;] if kind.startswith(&amp;quot;CE-F&amp;quot;) else [&amp;quot;AGAINST&amp;quot;, &amp;quot;NEUTRAL&amp;quot;]&lt;br /&gt;
                e = {&amp;quot;kind&amp;quot;: kind, &amp;quot;resolution&amp;quot;: random.choice(ok if random.random() &amp;lt; 0.97 else [&amp;quot;PENDING&amp;quot;, &amp;quot;FOR&amp;quot;, &amp;quot;AGAINST&amp;quot;])}&lt;br /&gt;
                if random.random() &amp;lt; 0.01: e[&amp;quot;weight&amp;quot;] = 1&lt;br /&gt;
            evs.append(e); ages.append(random.choice([0, 0, 1, 50, 250, 500, 1000, 5000, random.randint(0, 3000)]))&lt;br /&gt;
        if random.random() &amp;lt; 0.03 and ages: ages = ages[:-1]&lt;br /&gt;
        g = {&amp;quot;CE-F1&amp;quot;: random.choice([1, 2, 0.5]), &amp;quot;CE-F2&amp;quot;: random.choice([1, 0.25])}&lt;br /&gt;
        h = {&amp;quot;CE-A1&amp;quot;: 2, &amp;quot;CE-A2&amp;quot;: 3, &amp;quot;CE-A3&amp;quot;: 3, &amp;quot;CE-A4&amp;quot;: random.choice([2, 1.5]), &amp;quot;CE-A5&amp;quot;: 3}&lt;br /&gt;
        if random.random() &amp;lt; 0.03: del h[&amp;quot;CE-A3&amp;quot;]&lt;br /&gt;
        cases.append({&amp;quot;fn&amp;quot;: &amp;quot;evidence&amp;quot;, &amp;quot;args&amp;quot;: {&amp;quot;events&amp;quot;: evs, &amp;quot;ages&amp;quot;: ages, &amp;quot;g&amp;quot;: g, &amp;quot;h&amp;quot;: h, &amp;quot;a0&amp;quot;: random.choice([1, 1, 1, 2, 0.5, 0]), &amp;quot;b0&amp;quot;: random.choice([1, 1, 2, 0.5]), &amp;quot;half_life&amp;quot;: random.choice([500, 500, 500, 100, 1000, 0])}})&lt;br /&gt;
    else:&lt;br /&gt;
        agents = [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;α&amp;quot;, &amp;quot;N|1&amp;quot;]&lt;br /&gt;
        st = {a: {&amp;quot;state&amp;quot;: random.choice(STATES[:4]), &amp;quot;pending&amp;quot;: random.choice([0, 0, 1])} for a in agents}&lt;br /&gt;
        if random.random() &amp;lt; 0.05: del st[&amp;quot;A&amp;quot;]&lt;br /&gt;
        w = random.choice([0, 86400, 2592000])&lt;br /&gt;
        adm = [{&amp;quot;agent&amp;quot;: random.choice(agents + [&amp;quot;N2&amp;quot;, &amp;quot;N3&amp;quot;]), &amp;quot;time&amp;quot;: random.randint(0, 10 ** 7)} for _ in range(random.randint(0, 4))]&lt;br /&gt;
        ret = [{&amp;quot;agent&amp;quot;: random.choice(agents), &amp;quot;time&amp;quot;: random.randint(0, 10 ** 7)} for _ in range(random.randint(0, 4))]&lt;br /&gt;
        if random.random() &amp;lt; 0.3 and adm and ret: adm[0][&amp;quot;time&amp;quot;] = ret[0][&amp;quot;time&amp;quot;] + random.choice([w, w + 1, -w, 0])&lt;br /&gt;
        cases.append({&amp;quot;fn&amp;quot;: &amp;quot;whitewash&amp;quot;, &amp;quot;args&amp;quot;: {&amp;quot;admissions&amp;quot;: adm, &amp;quot;retirements&amp;quot;: ret, &amp;quot;states&amp;quot;: st, &amp;quot;window&amp;quot;: w}})&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_sponsor.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;
by = {}&lt;br /&gt;
for c, x in zip(cases, py):&lt;br /&gt;
    k = c[&amp;quot;fn&amp;quot;] + (&amp;quot;/ERROR&amp;quot; if x.startswith(&amp;quot;ERROR&amp;quot;) else &amp;quot;&amp;quot;)&lt;br /&gt;
    by[k] = by.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, json.dumps(by, sort_keys=True))&lt;br /&gt;
for c, a, b in zip(cases, py, php):&lt;br /&gt;
    if a != b:&lt;br /&gt;
        print(json.dumps(c, ensure_ascii=False)[:500]); 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>