<?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_settlement_corpus.py</id>
	<title>The Principia Machina/TPC-PY/gen settlement 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_settlement_corpus.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_settlement_corpus.py&amp;action=history"/>
	<updated>2026-10-21T13:49:23Z</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_settlement_corpus.py&amp;diff=4851&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_settlement_corpus.py&amp;diff=4851&amp;oldid=prev"/>
		<updated>2026-09-30T02:11:03Z</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 02:11, 30 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_settlement_corpus.py&amp;diff=4850&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source gen_settlement_corpus.py (0.1.0), SHA-256 5ca16004f1d172a4; conformed TPS 0.4.0; PROPOSED, not declared (TPC-PY 0.2.0)</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/gen_settlement_corpus.py&amp;diff=4850&amp;oldid=prev"/>
		<updated>2026-09-30T02:10:58Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source gen_settlement_corpus.py (0.1.0), SHA-256 5ca16004f1d172a4; conformed TPS 0.4.0; PROPOSED, not declared (TPC-PY 0.2.0)&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;gen_settlement_corpus 0.1.0 (agent TQ, increment 12): writes&lt;br /&gt;
vectors/settlement_corpus.json, the vectors of tpc_eom 0.2.0&amp;#039;s&lt;br /&gt;
settlement_check (tpm_record_functions 0.2.0 section 12; D198.1 (b),&lt;br /&gt;
D199.1 (b)), answered through tpc_record&amp;#039;s run_case (tpc_eom imports&lt;br /&gt;
nothing of tpc_record).&lt;br /&gt;
&lt;br /&gt;
VECTORS FIRST: every expectation is a literal of this generator in TPM&amp;#039;s&lt;br /&gt;
canonical JSON, written before settlement_check existed. What the&lt;br /&gt;
structure test itself settles is the existing tpc_eom eom_register_test&amp;#039;s&lt;br /&gt;
answer (increment 11, unchanged in that respect), taken here over literal&lt;br /&gt;
data and pinned; a refusal of the test is quoted from it likewise. The TFK&lt;br /&gt;
is the tree&amp;#039;s example corner_no_eom_x.json, whose structure check finds v&lt;br /&gt;
UNDER. Standard library only; run from tpc/.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import json&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
HERE = os.path.dirname(os.path.abspath(__file__))&lt;br /&gt;
sys.path.insert(0, HERE)&lt;br /&gt;
import tpc_eom as E      # noqa: E402  existing function (eom_register_test), read only&lt;br /&gt;
&lt;br /&gt;
CORPUS_VERSION = &amp;quot;0.1.0&amp;quot;&lt;br /&gt;
CASES = []&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def cj(v):&lt;br /&gt;
    if v is True:&lt;br /&gt;
        return &amp;quot;true&amp;quot;&lt;br /&gt;
    if v is False:&lt;br /&gt;
        return &amp;quot;false&amp;quot;&lt;br /&gt;
    if v is None:&lt;br /&gt;
        return &amp;quot;null&amp;quot;&lt;br /&gt;
    if type(v) is int:&lt;br /&gt;
        return str(v)&lt;br /&gt;
    if type(v) is str:&lt;br /&gt;
        out = [&amp;#039;&amp;quot;&amp;#039;]&lt;br /&gt;
        for ch in v:&lt;br /&gt;
            if ch == &amp;#039;&amp;quot;&amp;#039;:&lt;br /&gt;
                out.append(&amp;#039;\\&amp;quot;&amp;#039;)&lt;br /&gt;
            elif ch == &amp;quot;\\&amp;quot;:&lt;br /&gt;
                out.append(&amp;quot;\\\\&amp;quot;)&lt;br /&gt;
            elif ord(ch) &amp;lt; 0x20:&lt;br /&gt;
                out.append(&amp;quot;\\u%04x&amp;quot; % ord(ch))&lt;br /&gt;
            else:&lt;br /&gt;
                out.append(ch)&lt;br /&gt;
        out.append(&amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
        return &amp;quot;&amp;quot;.join(out)&lt;br /&gt;
    if type(v) is list:&lt;br /&gt;
        return &amp;quot;[&amp;quot; + &amp;quot;,&amp;quot;.join(cj(x) for x in v) + &amp;quot;]&amp;quot;&lt;br /&gt;
    if type(v) is dict:&lt;br /&gt;
        return &amp;quot;{&amp;quot; + &amp;quot;,&amp;quot;.join(cj(k) + &amp;quot;:&amp;quot; + cj(v[k]) for k in sorted(v)) + &amp;quot;}&amp;quot;&lt;br /&gt;
    raise TypeError(type(v))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def refused(*p):&lt;br /&gt;
    return cj([&amp;quot;REFUSED&amp;quot;, [list(x) for x in sorted(set(tuple(x) for x in p))]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def okd(by_test, by_naming, open_, used):&lt;br /&gt;
    return cj([&amp;quot;OK&amp;quot;, {&amp;quot;BY_TEST&amp;quot;: by_test, &amp;quot;BY_NAMING&amp;quot;: by_naming, &amp;quot;OPEN&amp;quot;: open_, &amp;quot;USED&amp;quot;: used}])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with open(os.path.join(HERE, &amp;quot;examples&amp;quot;, &amp;quot;corner_no_eom_x.json&amp;quot;), encoding=&amp;quot;utf-8&amp;quot;) as _f:&lt;br /&gt;
    TFK = json.load(_f)&lt;br /&gt;
_t = E.eom_register_test(TFK, [{&amp;quot;ID&amp;quot;: &amp;quot;RR-10&amp;quot;, &amp;quot;STATUS&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;ROLE&amp;quot;: &amp;quot;EOM(v)&amp;quot;,&lt;br /&gt;
                                &amp;quot;EQUATION&amp;quot;: &amp;quot;m*D(v,t) = -k_s*x&amp;quot;}])&lt;br /&gt;
assert _t[3:] == [[&amp;quot;USED&amp;quot;, [&amp;quot;RR-10&amp;quot;]], [&amp;quot;SETTLED&amp;quot;, [&amp;quot;v&amp;quot;]], [&amp;quot;OPEN&amp;quot;, []]], _t&lt;br /&gt;
assert E.eom_register_test(TFK, [])[5] == [&amp;quot;OPEN&amp;quot;, [&amp;quot;v&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
GAP = {&amp;quot;ID&amp;quot;: &amp;quot;RR-2&amp;quot;, &amp;quot;CLASS&amp;quot;: &amp;quot;NAMED_GAP&amp;quot;, &amp;quot;GRADE&amp;quot;: &amp;quot;NOT GRADED&amp;quot;, &amp;quot;SOURCE&amp;quot;: &amp;quot;UNDER&amp;quot;, &amp;quot;AGAINST&amp;quot;: [&amp;quot;v&amp;quot;],&lt;br /&gt;
       &amp;quot;TRIGGER&amp;quot;: &amp;quot;T&amp;quot;, &amp;quot;STATEMENT&amp;quot;: &amp;quot;The unknown DOF v is determined by no form (UNDER).&amp;quot;, &amp;quot;STATE&amp;quot;: &amp;quot;OPEN&amp;quot;}&lt;br /&gt;
IC2 = dict(GAP, ID=&amp;quot;RR-3&amp;quot;, SOURCE=&amp;quot;IC2&amp;quot;, AGAINST=[&amp;quot;x&amp;quot;])&lt;br /&gt;
R10 = {&amp;quot;ID&amp;quot;: &amp;quot;RR-10&amp;quot;, &amp;quot;CLASS&amp;quot;: &amp;quot;RESULT&amp;quot;, &amp;quot;GRADE&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;REGIME&amp;quot;: &amp;quot;L&amp;quot;, &amp;quot;ROLE&amp;quot;: &amp;quot;EOM(v)&amp;quot;,&lt;br /&gt;
       &amp;quot;EQUATION&amp;quot;: &amp;quot;m*D(v,t) = -k_s*x&amp;quot;, &amp;quot;REFS&amp;quot;: [&amp;quot;k_s&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;x&amp;quot;]}&lt;br /&gt;
R11 = {&amp;quot;ID&amp;quot;: &amp;quot;RR-11&amp;quot;, &amp;quot;CLASS&amp;quot;: &amp;quot;RESULT&amp;quot;, &amp;quot;GRADE&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;REGIME&amp;quot;: &amp;quot;L&amp;quot;,&lt;br /&gt;
       &amp;quot;STATEMENT&amp;quot;: &amp;quot;m dv/dt = -k_s x, derived in prose&amp;quot;}&lt;br /&gt;
R12 = dict(R10, ID=&amp;quot;RR-12&amp;quot;, ROLE=&amp;quot;INVARIANT&amp;quot;, EQUATION=&amp;quot;m*v = m*v&amp;quot;, REFS=[&amp;quot;m&amp;quot;, &amp;quot;v&amp;quot;])&lt;br /&gt;
R13 = dict(R10, ID=&amp;quot;RR-13&amp;quot;, EQUATION=&amp;quot;m*D(v,t) = -k_q*x&amp;quot;)&lt;br /&gt;
A14 = {&amp;quot;ID&amp;quot;: &amp;quot;RR-14&amp;quot;, &amp;quot;CLASS&amp;quot;: &amp;quot;ASSUMPTION&amp;quot;, &amp;quot;GRADE&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;ROLE&amp;quot;: &amp;quot;EOM(v)&amp;quot;,&lt;br /&gt;
       &amp;quot;EQUATION&amp;quot;: &amp;quot;m*D(v,t) = -k_s*x&amp;quot;, &amp;quot;REFS&amp;quot;: [&amp;quot;k_s&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;x&amp;quot;], &amp;quot;PROPOSITION&amp;quot;: &amp;quot;p&amp;quot;}&lt;br /&gt;
W = {&amp;quot;RR-10&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;RR-11&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;RR-12&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;RR-13&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;,&lt;br /&gt;
     &amp;quot;RR-14&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;RR-2&amp;quot;: &amp;quot;NOT GRADED&amp;quot;, &amp;quot;RR-3&amp;quot;: &amp;quot;NOT GRADED&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def st(name, records, words, naming, expected):&lt;br /&gt;
    CASES.append({&amp;quot;name&amp;quot;: name, &amp;quot;fn&amp;quot;: &amp;quot;settlement_check&amp;quot;,&lt;br /&gt;
                  &amp;quot;args&amp;quot;: {&amp;quot;tfk&amp;quot;: TFK, &amp;quot;records&amp;quot;: records, &amp;quot;words&amp;quot;: words, &amp;quot;naming&amp;quot;: naming},&lt;br /&gt;
                  &amp;quot;expected&amp;quot;: expected})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
st(&amp;quot;ST01 settled by the form&amp;quot;, [GAP, IC2, R10], W, [], okd([&amp;quot;v&amp;quot;], [], [], [&amp;quot;RR-10&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST02 settled by an ASSUMPTION&amp;#039;s form&amp;quot;, [GAP, A14], W, [], okd([&amp;quot;v&amp;quot;], [], [], [&amp;quot;RR-14&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST03 settled by the lead&amp;#039;s naming of a prose record&amp;quot;, [GAP, R11], W, [[&amp;quot;v&amp;quot;, &amp;quot;RR-11&amp;quot;]],&lt;br /&gt;
   okd([], [[&amp;quot;v&amp;quot;, &amp;quot;RR-11&amp;quot;]], [], []))&lt;br /&gt;
st(&amp;quot;ST04 REC-88 a naming of a formed record&amp;quot;, [GAP, R12], W, [[&amp;quot;v&amp;quot;, &amp;quot;RR-12&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-88&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;RECORD_ID RR-12 carries a form; it settles by the test alone&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST05 REC-86 an unknown that is not an OPEN UNDER gap&amp;#039;s DOF&amp;quot;, [GAP, IC2, R11], W, [[&amp;quot;x&amp;quot;, &amp;quot;RR-11&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-86&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;UNKNOWN x is not an OPEN UNDER gap&amp;#039;s DOF left open by the test&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST06 REC-86 an unknown the test settled&amp;quot;, [GAP, R10, R11], W, [[&amp;quot;v&amp;quot;, &amp;quot;RR-11&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-86&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;UNKNOWN v is not an OPEN UNDER gap&amp;#039;s DOF left open by the test&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST07 a HELD settling record: not standing, not settled&amp;quot;, [GAP, R10], dict(W, **{&amp;quot;RR-10&amp;quot;: &amp;quot;HELD&amp;quot;}), [],&lt;br /&gt;
   okd([], [], [&amp;quot;v&amp;quot;], []))&lt;br /&gt;
st(&amp;quot;ST08 a WITHDRAWN settling record&amp;quot;, [GAP, R10], dict(W, **{&amp;quot;RR-10&amp;quot;: &amp;quot;WITHDRAWN&amp;quot;}), [],&lt;br /&gt;
   okd([], [], [&amp;quot;v&amp;quot;], []))&lt;br /&gt;
st(&amp;quot;ST09 an empty naming, nothing settles&amp;quot;, [GAP, R11], W, [], okd([], [], [&amp;quot;v&amp;quot;], []))&lt;br /&gt;
st(&amp;quot;ST10 REC-84 a naming out of order&amp;quot;, [GAP, R11], W, [[&amp;quot;x&amp;quot;, &amp;quot;RR-11&amp;quot;], [&amp;quot;v&amp;quot;, &amp;quot;RR-11&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-84&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;naming is not a sorted list of [UNKNOWN, RECORD_ID] pairs&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST11 REC-84 a naming not of pairs&amp;quot;, [GAP, R11], W, [[&amp;quot;v&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-84&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;naming is not a sorted list of [UNKNOWN, RECORD_ID] pairs&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST12 REC-87 a naming of a record that does not stand&amp;quot;, [GAP, R11], dict(W, **{&amp;quot;RR-11&amp;quot;: &amp;quot;HELD&amp;quot;}),&lt;br /&gt;
   [[&amp;quot;v&amp;quot;, &amp;quot;RR-11&amp;quot;]], refused([&amp;quot;REC-87&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;RECORD_ID RR-11 is not a standing record of the register&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST13 REC-87 a naming of a record not in the register&amp;quot;, [GAP], W, [[&amp;quot;v&amp;quot;, &amp;quot;RR-77&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-87&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;RECORD_ID RR-77 is not a standing record of the register&amp;quot;]))&lt;br /&gt;
st(&amp;quot;ST14 the gap already SETTLED: nothing is OPEN&amp;quot;, [dict(GAP, STATE=&amp;quot;SETTLED 2026-09-28 BY RR-10&amp;quot;), R10], W,&lt;br /&gt;
   [], okd([], [], [], [&amp;quot;RR-10&amp;quot;]))&lt;br /&gt;
_ref = E.eom_register_test(TFK, [{&amp;quot;ID&amp;quot;: &amp;quot;RR-13&amp;quot;, &amp;quot;STATUS&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;, &amp;quot;ROLE&amp;quot;: &amp;quot;EOM(v)&amp;quot;,&lt;br /&gt;
                                  &amp;quot;EQUATION&amp;quot;: &amp;quot;m*D(v,t) = -k_q*x&amp;quot;}])&lt;br /&gt;
assert _ref[0] == &amp;quot;REFUSED&amp;quot;, _ref&lt;br /&gt;
st(&amp;quot;ST15 REC-85 the structure test refuses&amp;quot;, [GAP, R13], W, [],&lt;br /&gt;
   refused([&amp;quot;REC-85&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;the structure test refused: &amp;quot; + _ref[1]]))&lt;br /&gt;
R15 = dict(R10, ID=&amp;quot;RR-15&amp;quot;)&lt;br /&gt;
del R15[&amp;quot;ROLE&amp;quot;]&lt;br /&gt;
st(&amp;quot;ST16 an EQUATION without ROLE enters no matching&amp;quot;, [GAP, R15], dict(W, **{&amp;quot;RR-15&amp;quot;: &amp;quot;PROVISIONAL&amp;quot;}), [],&lt;br /&gt;
   okd([], [], [&amp;quot;v&amp;quot;], []))&lt;br /&gt;
st(&amp;quot;ST17 two naming failures reported together&amp;quot;, [GAP, R12], W, [[&amp;quot;v&amp;quot;, &amp;quot;RR-12&amp;quot;], [&amp;quot;w&amp;quot;, &amp;quot;RR-12&amp;quot;]],&lt;br /&gt;
   refused([&amp;quot;REC-86&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;UNKNOWN w is not an OPEN UNDER gap&amp;#039;s DOF left open by the test&amp;quot;],&lt;br /&gt;
           [&amp;quot;REC-88&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;RECORD_ID RR-12 carries a form; it settles by the test alone&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    names = [c[&amp;quot;name&amp;quot;] for c in CASES]&lt;br /&gt;
    assert len(set(names)) == len(names)&lt;br /&gt;
    out = {&amp;quot;corpus&amp;quot;: &amp;quot;settlement&amp;quot;, &amp;quot;version&amp;quot;: CORPUS_VERSION,&lt;br /&gt;
           &amp;quot;spec&amp;quot;: &amp;quot;tpm_record_functions 0.2.0 section 12 (tpc_eom 0.2.0)&amp;quot;,&lt;br /&gt;
           &amp;quot;note&amp;quot;: (&amp;quot;vectors first: every expectation a literal of the generator; the structure test&amp;#039;s &amp;quot;&lt;br /&gt;
                    &amp;quot;answers pinned from the existing eom_register_test&amp;quot;),&lt;br /&gt;
           &amp;quot;cases&amp;quot;: CASES}&lt;br /&gt;
    with open(os.path.join(HERE, &amp;quot;vectors&amp;quot;, &amp;quot;settlement_corpus.json&amp;quot;), &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;,&lt;br /&gt;
              newline=&amp;quot;\n&amp;quot;) as f:&lt;br /&gt;
        json.dump(out, f, indent=1, sort_keys=True, ensure_ascii=True)&lt;br /&gt;
        f.write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(&amp;quot;wrote %d settlement cases&amp;quot; % len(CASES))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
# END OF ARTIFACT --- gen_settlement_corpus.py 0.1.0&lt;br /&gt;
# If this line is absent, the payload arrived truncated.&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>