<?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%2Ftpc_sponsor.py</id>
	<title>The Principia Machina/TPC-PY/tpc 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%2Ftpc_sponsor.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_sponsor.py&amp;action=history"/>
	<updated>2026-10-21T08:20:47Z</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/tpc_sponsor.py&amp;diff=4231&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/tpc_sponsor.py&amp;diff=4231&amp;oldid=prev"/>
		<updated>2026-09-28T04:37:36Z</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:37, 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/tpc_sponsor.py&amp;diff=4230&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source tpc_sponsor.py (0.1.0), SHA-256 9dc84cb4529fed12; 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/tpc_sponsor.py&amp;diff=4230&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source tpc_sponsor.py (0.1.0), SHA-256 9dc84cb4529fed12; 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;tpc_sponsor 0.1.0 (DRAFT, pending D160): the sponsor&amp;#039;s CONDUCT EVENTS,&lt;br /&gt;
the user evidence E_u with its interval and n_u, and the WHITEWASH count.&lt;br /&gt;
&lt;br /&gt;
Reference implementation, Python standard library only; imports tpc_beta&lt;br /&gt;
for the Beta layer. DATA for landing round 8 of branch&lt;br /&gt;
tpm_project_closeout (the identity speculation 0.1.0 SM-1 to SM-3 and&lt;br /&gt;
section 8; PMP-TPM 0.12.0 AI CERTIFICATION CR12 as 0.12.0 words it, the&lt;br /&gt;
blend retired by D161.1; record D160.1 (b)-(e); TUNING OPTIONS g_C, h_C,&lt;br /&gt;
SUCCESSION WINDOW); not a declared TPC-PY version and not TPX code. Every&lt;br /&gt;
function is a pure function of its arguments. Every refused argument&lt;br /&gt;
raises ValueError with a short fixed message. render_*() give the&lt;br /&gt;
canonical text the PHP residence (tpc_sponsor.php) reproduces byte for&lt;br /&gt;
byte; floats through canon_float (the tree&amp;#039;s %.12g). Ints are never&lt;br /&gt;
bools. Times are integer seconds UTC; ages and block counts are integers&lt;br /&gt;
of landed blocks.&lt;br /&gt;
&lt;br /&gt;
conduct_resolve(event, facts) -&amp;gt; dict                   (D160.1 (c), (e))&lt;br /&gt;
  event: {kind}, kind one of CE-F1, CE-F2, CE-A1, CE-A2, CE-A3, CE-A4,&lt;br /&gt;
    CE-A5. facts: the counted facts or the audit&amp;#039;s finding the kind&lt;br /&gt;
    needs (below); anything else raises ValueError(&amp;quot;facts&amp;quot;). Result&lt;br /&gt;
    {resolution: FOR, AGAINST, NEUTRAL or PENDING; reason}. &amp;quot;Each is a&lt;br /&gt;
    counted fact or an audit finding; none resolves AGAINST on a&lt;br /&gt;
    statistic&amp;quot;; &amp;quot;a PENDING item updates nothing&amp;quot;. The 100-block windows&lt;br /&gt;
    are the rule&amp;#039;s own figures (D160.1 (c)), not parameters.&lt;br /&gt;
  CR-F1 PROACTIVE SUCCESSION. facts {named: the sponsor named the agent&lt;br /&gt;
     it succeeds or the change it anticipates; predecessor: null or&lt;br /&gt;
     {state, pending} at the admission; blocks: landed by the new agent&lt;br /&gt;
     since admission; first_violation_block: null or the 1-based block of&lt;br /&gt;
     its first confirmed violation; period_taken: another CE-F1 of the&lt;br /&gt;
     sponsor already stands in this RATING PERIOD of its blocks}.&lt;br /&gt;
     Not named, a predecessor not GREEN or with a PENDING item, or the&lt;br /&gt;
     period taken (&amp;quot;at most one CE-F1 per RATING PERIOD&amp;quot;): NEUTRAL. A&lt;br /&gt;
     confirmed violation at a block up to and including 100: NEUTRAL.&lt;br /&gt;
     blocks at least 100 with none: FOR. Otherwise PENDING.&lt;br /&gt;
  CR-F2 DECLARED CHANGE KEPT CLEAN. facts {declared: declared on TPX&amp;#039;s&lt;br /&gt;
     form before use; blocks: landed after the change; first_violation_&lt;br /&gt;
     block; first_canary_failure_block}. Not declared: NEUTRAL (an&lt;br /&gt;
     undeclared change is CE-A1&amp;#039;s matter). A canary failure or a&lt;br /&gt;
     confirmed violation at a block up to 100: NEUTRAL. blocks at least&lt;br /&gt;
     100 with neither: FOR. Otherwise PENDING.&lt;br /&gt;
  CR-A1, CR-A2, CR-A3. facts {audit: OPEN, CONFIRMED or DISMISSED}, the&lt;br /&gt;
     audit block&amp;#039;s state. CONFIRMED: AGAINST; OPEN: PENDING; DISMISSED:&lt;br /&gt;
     NEUTRAL. No statistic enters (the exclusion of D160).&lt;br /&gt;
  CR-A4 WHITEWASH. facts {admission, exit: times; state, pending: the&lt;br /&gt;
     other agent&amp;#039;s at its retirement or lapse; window: SUCCESSION WINDOW&lt;br /&gt;
     in seconds}. &amp;quot;A new agent admitted within SUCCESSION WINDOW of the&lt;br /&gt;
     retirement or lapse of another agent of the sponsor that was then&lt;br /&gt;
     not GREEN or had a PENDING item&amp;quot;: |admission - exit| &amp;lt;= window&lt;br /&gt;
     (either side; the window closed on both ends: PD-OC-9) and (state&lt;br /&gt;
     not GREEN or pending &amp;gt; 0): AGAINST, &amp;quot;counted at the admission&amp;quot;;&lt;br /&gt;
     otherwise NEUTRAL; never PENDING.&lt;br /&gt;
  CR-A5 REMOVAL FOR CAUSE. facts {removed: H-DECL&amp;#039;s removal declared;&lt;br /&gt;
     cause: CANARY, TRIP, OTHER or null}. removed with cause CANARY or&lt;br /&gt;
     TRIP: AGAINST (the SPONSOR CUT is applied at once by TPX, outside&lt;br /&gt;
     this function); removed with cause OTHER: NEUTRAL (not for cause);&lt;br /&gt;
     not removed: PENDING (the decision item open).&lt;br /&gt;
&lt;br /&gt;
user_evidence(events, ages, g, h, a0, b0, half_life) -&amp;gt; dict&lt;br /&gt;
                                                        (D160.1 (b), (d))&lt;br /&gt;
  events: the resolved events of both parts, each {kind, resolution,&lt;br /&gt;
    weight?}: a CONDUCT EVENT (kind CE-F1 .. CE-A5, resolution FOR for an&lt;br /&gt;
    F kind, AGAINST for an A kind, or NEUTRAL) weighted by g[kind] or&lt;br /&gt;
    h[kind]; or an agent event of the pooled part (kind AGENT, resolution&lt;br /&gt;
    FOR or AGAINST, weight the agent-level weight CR11 gives it, g_F x q&lt;br /&gt;
    or h(standing), the DIVERSITY QUOTA already applied by the caller:&lt;br /&gt;
    &amp;quot;the diversity quota acts on the pooled part only&amp;quot;). A PENDING event,&lt;br /&gt;
    a resolution against its kind, or a weight on a conduct event raises&lt;br /&gt;
    ValueError(&amp;quot;events&amp;quot;). ages: parallel, integers of the sponsor&amp;#039;s&lt;br /&gt;
    agents&amp;#039; landed blocks since each event resolved. g: {CE-F1, CE-F2};&lt;br /&gt;
    h: {CE-A1 .. CE-A5}; a0, b0 &amp;gt; 0; half_life &amp;gt; 0.&lt;br /&gt;
  UE1 Each event&amp;#039;s weight is its base weight x 2^(-age / half_life), pow&lt;br /&gt;
      of both residences on the same doubles.&lt;br /&gt;
  UE2 F_u is the sum of the FOR weights and A_u of the AGAINST weights,&lt;br /&gt;
      in list order; a NEUTRAL event adds nothing.&lt;br /&gt;
  UE3 n_u counts the FOR and AGAINST events (PD-OC-10: a NEUTRAL event&lt;br /&gt;
      is resolved but carries no evidence and is not counted).&lt;br /&gt;
  UE4 E_u = (a0 + F_u) / (a0 + b0 + F_u + A_u) (tpc_beta.beta_mean);&lt;br /&gt;
      the 95 per cent equal-tailed interval of Beta(a0 + F_u, b0 + A_u)&lt;br /&gt;
      (tpc_beta.beta_interval). T_idle&amp;#039;s scaling of F_u and A_u toward&lt;br /&gt;
      the prior is applied by TPX to the sums before this function or by&lt;br /&gt;
      recomputing from them (both are returned).&lt;br /&gt;
&lt;br /&gt;
whitewash_count(admissions, retirements, states, window) -&amp;gt; dict (CE-A4)&lt;br /&gt;
  admissions: [{agent, time}] the sponsor&amp;#039;s new agents; retirements:&lt;br /&gt;
    [{agent, time}] the retirement or lapse of its agents; states:&lt;br /&gt;
    {agent: {state, pending}} at each retirement (every retired agent&lt;br /&gt;
    present, else ValueError(&amp;quot;states&amp;quot;)); window: SUCCESSION WINDOW in&lt;br /&gt;
    seconds. WC1 An admission counts once when some retirement of ANOTHER&lt;br /&gt;
    agent lies within the window of it (CR-A4&amp;#039;s test) and that agent was&lt;br /&gt;
    then not GREEN or had a PENDING item; the first such retirement in&lt;br /&gt;
    list order is named. WC2 count is the number of admissions that&lt;br /&gt;
    count.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import math&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))&lt;br /&gt;
from tpc_beta import beta_interval, beta_mean, canon_float  # noqa: E402&lt;br /&gt;
&lt;br /&gt;
VERSION = &amp;quot;0.1.0&amp;quot;&lt;br /&gt;
TIME_MAX = 253402300799&lt;br /&gt;
COUNT_MAX = 1000000000&lt;br /&gt;
WINDOW_BLOCKS = 100&lt;br /&gt;
FOR_KINDS = (&amp;quot;CE-F1&amp;quot;, &amp;quot;CE-F2&amp;quot;)&lt;br /&gt;
AGAINST_KINDS = (&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;
KINDS = FOR_KINDS + AGAINST_KINDS&lt;br /&gt;
STATES = (&amp;quot;GREEN&amp;quot;, &amp;quot;YELLOW&amp;quot;, &amp;quot;ORANGE&amp;quot;, &amp;quot;SUSPENDED&amp;quot;)&lt;br /&gt;
AUDITS = (&amp;quot;OPEN&amp;quot;, &amp;quot;CONFIRMED&amp;quot;, &amp;quot;DISMISSED&amp;quot;)&lt;br /&gt;
CAUSES = (&amp;quot;CANARY&amp;quot;, &amp;quot;TRIP&amp;quot;, &amp;quot;OTHER&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _esc(s):&lt;br /&gt;
    out = []&lt;br /&gt;
    for ch in s:&lt;br /&gt;
        o = ord(ch)&lt;br /&gt;
        if ch == &amp;quot;|&amp;quot; or ch == &amp;quot;\\&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\&amp;quot; + ch)&lt;br /&gt;
        elif o &amp;lt; 0x20 or o == 0x7F:&lt;br /&gt;
            out.append(&amp;quot;\\x%02x&amp;quot; % o)&lt;br /&gt;
        else:&lt;br /&gt;
            out.append(ch)&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(out)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _is_int(x, lo, hi):&lt;br /&gt;
    return type(x) is int and lo &amp;lt;= x &amp;lt;= hi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _is_name(x):&lt;br /&gt;
    return type(x) is str and x != &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _keys_are(o, required, optional=()):&lt;br /&gt;
    if type(o) is not dict:&lt;br /&gt;
        return False&lt;br /&gt;
    for k in required:&lt;br /&gt;
        if k not in o:&lt;br /&gt;
            return False&lt;br /&gt;
    for k in o:&lt;br /&gt;
        if k not in required and k not in optional:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _num(x):&lt;br /&gt;
    if type(x) is bool or not isinstance(x, (int, float)):&lt;br /&gt;
        return None&lt;br /&gt;
    x = float(x)&lt;br /&gt;
    if not math.isfinite(x):&lt;br /&gt;
        return None&lt;br /&gt;
    return x&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _opt_block(x):&lt;br /&gt;
    return x is None or _is_int(x, 1, COUNT_MAX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _state_ok(o):&lt;br /&gt;
    return (_keys_are(o, (&amp;quot;state&amp;quot;, &amp;quot;pending&amp;quot;)) and o[&amp;quot;state&amp;quot;] in STATES&lt;br /&gt;
            and _is_int(o[&amp;quot;pending&amp;quot;], 0, COUNT_MAX))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------- conduct_resolve&lt;br /&gt;
&lt;br /&gt;
def conduct_resolve(event, facts):&lt;br /&gt;
    if not _keys_are(event, (&amp;quot;kind&amp;quot;,)) or event[&amp;quot;kind&amp;quot;] not in KINDS:&lt;br /&gt;
        raise ValueError(&amp;quot;event&amp;quot;)&lt;br /&gt;
    kind = event[&amp;quot;kind&amp;quot;]&lt;br /&gt;
    if kind == &amp;quot;CE-F1&amp;quot;:&lt;br /&gt;
        if not _keys_are(facts, (&amp;quot;named&amp;quot;, &amp;quot;predecessor&amp;quot;, &amp;quot;blocks&amp;quot;,&lt;br /&gt;
                                 &amp;quot;first_violation_block&amp;quot;, &amp;quot;period_taken&amp;quot;)):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        if (type(facts[&amp;quot;named&amp;quot;]) is not bool&lt;br /&gt;
                or type(facts[&amp;quot;period_taken&amp;quot;]) is not bool&lt;br /&gt;
                or not _is_int(facts[&amp;quot;blocks&amp;quot;], 0, COUNT_MAX)&lt;br /&gt;
                or not _opt_block(facts[&amp;quot;first_violation_block&amp;quot;])):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        pred = facts[&amp;quot;predecessor&amp;quot;]&lt;br /&gt;
        if pred is not None and not _state_ok(pred):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        if not facts[&amp;quot;named&amp;quot;]:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;NOT NAMED&amp;quot;}&lt;br /&gt;
        if pred is not None and (pred[&amp;quot;state&amp;quot;] != &amp;quot;GREEN&amp;quot;&lt;br /&gt;
                                 or pred[&amp;quot;pending&amp;quot;] &amp;gt; 0):&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;PREDECESSOR&amp;quot;}&lt;br /&gt;
        if facts[&amp;quot;period_taken&amp;quot;]:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;PERIOD&amp;quot;}&lt;br /&gt;
        v = facts[&amp;quot;first_violation_block&amp;quot;]&lt;br /&gt;
        if v is not None and v &amp;lt;= WINDOW_BLOCKS:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;VIOLATION&amp;quot;}&lt;br /&gt;
        if facts[&amp;quot;blocks&amp;quot;] &amp;gt;= WINDOW_BLOCKS:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;FOR&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;CLEAN&amp;quot;}&lt;br /&gt;
        return {&amp;quot;resolution&amp;quot;: &amp;quot;PENDING&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;WINDOW&amp;quot;}&lt;br /&gt;
    if kind == &amp;quot;CE-F2&amp;quot;:&lt;br /&gt;
        if not _keys_are(facts, (&amp;quot;declared&amp;quot;, &amp;quot;blocks&amp;quot;,&lt;br /&gt;
                                 &amp;quot;first_violation_block&amp;quot;,&lt;br /&gt;
                                 &amp;quot;first_canary_failure_block&amp;quot;)):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        if (type(facts[&amp;quot;declared&amp;quot;]) is not bool&lt;br /&gt;
                or not _is_int(facts[&amp;quot;blocks&amp;quot;], 0, COUNT_MAX)&lt;br /&gt;
                or not _opt_block(facts[&amp;quot;first_violation_block&amp;quot;])&lt;br /&gt;
                or not _opt_block(facts[&amp;quot;first_canary_failure_block&amp;quot;])):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        if not facts[&amp;quot;declared&amp;quot;]:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;NOT DECLARED&amp;quot;}&lt;br /&gt;
        c = facts[&amp;quot;first_canary_failure_block&amp;quot;]&lt;br /&gt;
        if c is not None and c &amp;lt;= WINDOW_BLOCKS:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;CANARY&amp;quot;}&lt;br /&gt;
        v = facts[&amp;quot;first_violation_block&amp;quot;]&lt;br /&gt;
        if v is not None and v &amp;lt;= WINDOW_BLOCKS:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;VIOLATION&amp;quot;}&lt;br /&gt;
        if facts[&amp;quot;blocks&amp;quot;] &amp;gt;= WINDOW_BLOCKS:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;FOR&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;CLEAN&amp;quot;}&lt;br /&gt;
        return {&amp;quot;resolution&amp;quot;: &amp;quot;PENDING&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;WINDOW&amp;quot;}&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;
        if not _keys_are(facts, (&amp;quot;audit&amp;quot;,)) or facts[&amp;quot;audit&amp;quot;] not in AUDITS:&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        a = facts[&amp;quot;audit&amp;quot;]&lt;br /&gt;
        if a == &amp;quot;CONFIRMED&amp;quot;:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;AGAINST&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;AUDIT&amp;quot;}&lt;br /&gt;
        if a == &amp;quot;OPEN&amp;quot;:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;PENDING&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;AUDIT&amp;quot;}&lt;br /&gt;
        return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;DISMISSED&amp;quot;}&lt;br /&gt;
    if kind == &amp;quot;CE-A4&amp;quot;:&lt;br /&gt;
        if not _keys_are(facts, (&amp;quot;admission&amp;quot;, &amp;quot;exit&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;pending&amp;quot;,&lt;br /&gt;
                                 &amp;quot;window&amp;quot;)):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        if (not _is_int(facts[&amp;quot;admission&amp;quot;], 0, TIME_MAX)&lt;br /&gt;
                or not _is_int(facts[&amp;quot;exit&amp;quot;], 0, TIME_MAX)&lt;br /&gt;
                or facts[&amp;quot;state&amp;quot;] not in STATES&lt;br /&gt;
                or not _is_int(facts[&amp;quot;pending&amp;quot;], 0, COUNT_MAX)&lt;br /&gt;
                or not _is_int(facts[&amp;quot;window&amp;quot;], 0, TIME_MAX)):&lt;br /&gt;
            raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
        gap = facts[&amp;quot;admission&amp;quot;] - facts[&amp;quot;exit&amp;quot;]&lt;br /&gt;
        if gap &amp;lt; 0:&lt;br /&gt;
            gap = -gap&lt;br /&gt;
        if gap &amp;gt; facts[&amp;quot;window&amp;quot;]:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;OUTSIDE WINDOW&amp;quot;}&lt;br /&gt;
        if facts[&amp;quot;state&amp;quot;] == &amp;quot;GREEN&amp;quot; and facts[&amp;quot;pending&amp;quot;] == 0:&lt;br /&gt;
            return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;GREEN&amp;quot;}&lt;br /&gt;
        return {&amp;quot;resolution&amp;quot;: &amp;quot;AGAINST&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;WHITEWASH&amp;quot;}&lt;br /&gt;
    if not _keys_are(facts, (&amp;quot;removed&amp;quot;, &amp;quot;cause&amp;quot;)):&lt;br /&gt;
        raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
    if type(facts[&amp;quot;removed&amp;quot;]) is not bool or (&lt;br /&gt;
            facts[&amp;quot;cause&amp;quot;] is not None and facts[&amp;quot;cause&amp;quot;] not in CAUSES):&lt;br /&gt;
        raise ValueError(&amp;quot;facts&amp;quot;)&lt;br /&gt;
    if not facts[&amp;quot;removed&amp;quot;]:&lt;br /&gt;
        return {&amp;quot;resolution&amp;quot;: &amp;quot;PENDING&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;DECISION ITEM&amp;quot;}&lt;br /&gt;
    if facts[&amp;quot;cause&amp;quot;] in (&amp;quot;CANARY&amp;quot;, &amp;quot;TRIP&amp;quot;):&lt;br /&gt;
        return {&amp;quot;resolution&amp;quot;: &amp;quot;AGAINST&amp;quot;, &amp;quot;reason&amp;quot;: facts[&amp;quot;cause&amp;quot;]}&lt;br /&gt;
    return {&amp;quot;resolution&amp;quot;: &amp;quot;NEUTRAL&amp;quot;, &amp;quot;reason&amp;quot;: &amp;quot;NOT FOR CAUSE&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def render_resolve(d):&lt;br /&gt;
    return d[&amp;quot;resolution&amp;quot;] + &amp;quot;|&amp;quot; + d[&amp;quot;reason&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------------------------------------------------------- user_evidence&lt;br /&gt;
&lt;br /&gt;
def _check_weights(t, kinds):&lt;br /&gt;
    if not _keys_are(t, kinds):&lt;br /&gt;
        raise ValueError(&amp;quot;weights&amp;quot;)&lt;br /&gt;
    out = {}&lt;br /&gt;
    for k in kinds:&lt;br /&gt;
        v = _num(t[k])&lt;br /&gt;
        if v is None or v &amp;lt; 0.0:&lt;br /&gt;
            raise ValueError(&amp;quot;weights&amp;quot;)&lt;br /&gt;
        out[k] = v&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def user_evidence(events, ages, g, h, a0, b0, half_life):&lt;br /&gt;
    if type(events) is not list or type(ages) is not list:&lt;br /&gt;
        raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
    if len(events) != len(ages):&lt;br /&gt;
        raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
    gw = _check_weights(g, FOR_KINDS)&lt;br /&gt;
    hw = _check_weights(h, AGAINST_KINDS)&lt;br /&gt;
    a0f = _num(a0)&lt;br /&gt;
    b0f = _num(b0)&lt;br /&gt;
    hl = _num(half_life)&lt;br /&gt;
    if a0f is None or b0f is None or a0f &amp;lt;= 0.0 or b0f &amp;lt;= 0.0:&lt;br /&gt;
        raise ValueError(&amp;quot;prior&amp;quot;)&lt;br /&gt;
    if hl is None or hl &amp;lt;= 0.0:&lt;br /&gt;
        raise ValueError(&amp;quot;half_life&amp;quot;)&lt;br /&gt;
    weights = []&lt;br /&gt;
    for e, age in zip(events, ages):&lt;br /&gt;
        if not _keys_are(e, (&amp;quot;kind&amp;quot;, &amp;quot;resolution&amp;quot;), (&amp;quot;weight&amp;quot;,)):&lt;br /&gt;
            raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
        if not _is_int(age, 0, COUNT_MAX):&lt;br /&gt;
            raise ValueError(&amp;quot;ages&amp;quot;)&lt;br /&gt;
        kind = e[&amp;quot;kind&amp;quot;]&lt;br /&gt;
        res = e[&amp;quot;resolution&amp;quot;]&lt;br /&gt;
        if kind == &amp;quot;AGENT&amp;quot;:&lt;br /&gt;
            if res not in (&amp;quot;FOR&amp;quot;, &amp;quot;AGAINST&amp;quot;) or &amp;quot;weight&amp;quot; not in e:&lt;br /&gt;
                raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
            w = _num(e[&amp;quot;weight&amp;quot;])&lt;br /&gt;
            if w is None or w &amp;lt; 0.0:&lt;br /&gt;
                raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
        elif kind in FOR_KINDS:&lt;br /&gt;
            if res not in (&amp;quot;FOR&amp;quot;, &amp;quot;NEUTRAL&amp;quot;) or &amp;quot;weight&amp;quot; in e:&lt;br /&gt;
                raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
            w = gw[kind]&lt;br /&gt;
        elif kind in AGAINST_KINDS:&lt;br /&gt;
            if res not in (&amp;quot;AGAINST&amp;quot;, &amp;quot;NEUTRAL&amp;quot;) or &amp;quot;weight&amp;quot; in e:&lt;br /&gt;
                raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
            w = hw[kind]&lt;br /&gt;
        else:&lt;br /&gt;
            raise ValueError(&amp;quot;events&amp;quot;)&lt;br /&gt;
        weights.append((res, w * math.pow(2.0, -float(age) / hl)))&lt;br /&gt;
    f = 0.0&lt;br /&gt;
    a = 0.0&lt;br /&gt;
    n = 0&lt;br /&gt;
    for res, w in weights:&lt;br /&gt;
        if res == &amp;quot;FOR&amp;quot;:&lt;br /&gt;
            f = f + w&lt;br /&gt;
            n += 1&lt;br /&gt;
        elif res == &amp;quot;AGAINST&amp;quot;:&lt;br /&gt;
            a = a + w&lt;br /&gt;
            n += 1&lt;br /&gt;
    e_u = beta_mean(a0f + f, b0f + a)&lt;br /&gt;
    lo, hi = beta_interval(a0f + f, b0f + a, 0.95)&lt;br /&gt;
    return {&amp;quot;F&amp;quot;: f, &amp;quot;A&amp;quot;: a, &amp;quot;n&amp;quot;: n, &amp;quot;E&amp;quot;: e_u, &amp;quot;lo&amp;quot;: lo, &amp;quot;hi&amp;quot;: hi}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def render_evidence(d):&lt;br /&gt;
    return &amp;quot;%s|%s|%d|%s|%s|%s&amp;quot; % (canon_float(d[&amp;quot;F&amp;quot;]), canon_float(d[&amp;quot;A&amp;quot;]),&lt;br /&gt;
                                  d[&amp;quot;n&amp;quot;], canon_float(d[&amp;quot;E&amp;quot;]),&lt;br /&gt;
                                  canon_float(d[&amp;quot;lo&amp;quot;]), canon_float(d[&amp;quot;hi&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------- whitewash_count&lt;br /&gt;
&lt;br /&gt;
def whitewash_count(admissions, retirements, states, window):&lt;br /&gt;
    if type(admissions) is not list or type(retirements) is not list:&lt;br /&gt;
        raise ValueError(&amp;quot;lists&amp;quot;)&lt;br /&gt;
    for lst in (admissions, retirements):&lt;br /&gt;
        for x in lst:&lt;br /&gt;
            if not _keys_are(x, (&amp;quot;agent&amp;quot;, &amp;quot;time&amp;quot;)) or not _is_name(x[&amp;quot;agent&amp;quot;]) \&lt;br /&gt;
                    or not _is_int(x[&amp;quot;time&amp;quot;], 0, TIME_MAX):&lt;br /&gt;
                raise ValueError(&amp;quot;lists&amp;quot;)&lt;br /&gt;
    if type(states) is not dict:&lt;br /&gt;
        raise ValueError(&amp;quot;states&amp;quot;)&lt;br /&gt;
    for k, v in states.items():&lt;br /&gt;
        if not _is_name(k) or not _state_ok(v):&lt;br /&gt;
            raise ValueError(&amp;quot;states&amp;quot;)&lt;br /&gt;
    for r in retirements:&lt;br /&gt;
        if r[&amp;quot;agent&amp;quot;] not in states:&lt;br /&gt;
            raise ValueError(&amp;quot;states&amp;quot;)&lt;br /&gt;
    if not _is_int(window, 0, TIME_MAX):&lt;br /&gt;
        raise ValueError(&amp;quot;window&amp;quot;)&lt;br /&gt;
    matches = []&lt;br /&gt;
    for adm in admissions:&lt;br /&gt;
        for r in retirements:&lt;br /&gt;
            if r[&amp;quot;agent&amp;quot;] == adm[&amp;quot;agent&amp;quot;]:&lt;br /&gt;
                continue&lt;br /&gt;
            gap = adm[&amp;quot;time&amp;quot;] - r[&amp;quot;time&amp;quot;]&lt;br /&gt;
            if gap &amp;lt; 0:&lt;br /&gt;
                gap = -gap&lt;br /&gt;
            if gap &amp;gt; window:&lt;br /&gt;
                continue&lt;br /&gt;
            st = states[r[&amp;quot;agent&amp;quot;]]&lt;br /&gt;
            if st[&amp;quot;state&amp;quot;] == &amp;quot;GREEN&amp;quot; and st[&amp;quot;pending&amp;quot;] == 0:&lt;br /&gt;
                continue&lt;br /&gt;
            matches.append((adm[&amp;quot;agent&amp;quot;], r[&amp;quot;agent&amp;quot;]))&lt;br /&gt;
            break&lt;br /&gt;
    return {&amp;quot;count&amp;quot;: len(matches), &amp;quot;matches&amp;quot;: matches}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def render_whitewash(d):&lt;br /&gt;
    lines = [&amp;quot;count|%d&amp;quot; % d[&amp;quot;count&amp;quot;]]&lt;br /&gt;
    for a, r in d[&amp;quot;matches&amp;quot;]:&lt;br /&gt;
        lines.append(&amp;quot;match|%s|%s&amp;quot; % (_esc(a), _esc(r)))&lt;br /&gt;
    return &amp;quot;\n&amp;quot;.join(lines)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------------- corpus&lt;br /&gt;
&lt;br /&gt;
FNS = (&amp;quot;resolve&amp;quot;, &amp;quot;evidence&amp;quot;, &amp;quot;whitewash&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def run_case(fn, args):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;One corpus case: the render, or &amp;quot;ERROR:&amp;quot; and the message.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if fn not in FNS:&lt;br /&gt;
        raise ValueError(&amp;quot;fn&amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        if fn == &amp;quot;resolve&amp;quot;:&lt;br /&gt;
            return render_resolve(conduct_resolve(args[&amp;quot;event&amp;quot;],&lt;br /&gt;
                                                  args[&amp;quot;facts&amp;quot;]))&lt;br /&gt;
        if fn == &amp;quot;evidence&amp;quot;:&lt;br /&gt;
            return render_evidence(user_evidence(&lt;br /&gt;
                args[&amp;quot;events&amp;quot;], args[&amp;quot;ages&amp;quot;], args[&amp;quot;g&amp;quot;], args[&amp;quot;h&amp;quot;],&lt;br /&gt;
                args[&amp;quot;a0&amp;quot;], args[&amp;quot;b0&amp;quot;], args[&amp;quot;half_life&amp;quot;]))&lt;br /&gt;
        return render_whitewash(whitewash_count(&lt;br /&gt;
            args[&amp;quot;admissions&amp;quot;], args[&amp;quot;retirements&amp;quot;], args[&amp;quot;states&amp;quot;],&lt;br /&gt;
            args[&amp;quot;window&amp;quot;]))&lt;br /&gt;
    except ValueError as ex:&lt;br /&gt;
        return &amp;quot;ERROR:&amp;quot; + str(ex)&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>