From 8ee99ffb7f9cb5f4151fb9c76ef05857b936690e Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Tue, 10 Feb 2026 07:57:25 +0000 Subject: [PATCH] check point --- developer/authored/Symbol.py | 82 ++++++++ developer/authored/Synbol.py | 66 ------- developer/authored/TM.py | 74 +++++++- developer/authored/TM_module.c | 177 ++++++++---------- .../temp.linux-x86_64-cpython-311/TM_module.o | Bin 40584 -> 37864 bytes developer/authored/example_TM_0.py | 104 ---------- developer/authored/example_TM_1.py | 79 -------- developer/authored/example_TM_SR_ND.py | 28 --- developer/authored/example_TM_SR_ND_aR.py | 48 ----- developer/authored/example_features.py | 59 ------ developer/authored/example_queries.py | 88 --------- developer/authored/example_region.py | 43 ----- 12 files changed, 233 insertions(+), 615 deletions(-) create mode 100755 developer/authored/Symbol.py delete mode 100644 developer/authored/Synbol.py delete mode 100755 developer/authored/example_TM_0.py delete mode 100755 developer/authored/example_TM_1.py delete mode 100755 developer/authored/example_TM_SR_ND.py delete mode 100755 developer/authored/example_TM_SR_ND_aR.py delete mode 100755 developer/authored/example_features.py delete mode 100755 developer/authored/example_queries.py delete mode 100644 developer/authored/example_region.py diff --git a/developer/authored/Symbol.py b/developer/authored/Symbol.py new file mode 100755 index 0000000..98deb40 --- /dev/null +++ b/developer/authored/Symbol.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +""" +Symbol.py +Epimetheus Symbol Implementation. +Core Concept: A Symbol is a discrete, hashable set defined by its identity. +""" + +import weakref + +class Symbol(set): + """ + A persistent, unique identity that acts as a container. + + Properties: + - Identity: Equality and Hashing are based on memory address (id). + - Container: Inherits from set. Can contain other symbols (differentiation). + - Hierarchy: Knows its parent to support dealloc(). + """ + + def __init__(self, parent=None): + super().__init__() + # We hold a strong ref to the parent? + # If we hold strong, the root keeps the whole tree alive. + # If we hold weak, we can't dealloc if parent dies (but that's expected). + # Standard graph theory: Edges are usually strong. + self._parent = parent + + def alloc(self): + """ + Allocates a new differentiated symbol from this one. + The new symbol is added to this symbol (the set). + """ + child = Symbol(parent=self) + self.add(child) + return child + + def dealloc(self): + """ + Removes this symbol from its parent. + If no other references exist, this symbol will be garbage collected. + """ + if self._parent is not None: + self._parent.remove(self) + self._parent = None + # If parent is None (Root), dealloc does nothing. + + # --- Identity Overrides (Force Set to be Hashable) --- + + def __hash__(self): + return id(self) + + def __eq__(self, other): + return self is other + + def __repr__(self): + return f"" + +# --- Example --- + +def example_symbol_lifecycle(): + print("--- Symbol Lifecycle Example ---") + root = Symbol() + + # 1. Root exists + print(f"Root: {root}") + + # 2. Alloc Features + nav = root.alloc() + print(f"Allocated 'nav' inside root: {nav}") + print(f"root has nav? {nav in root}") + + # 3. Alloc Leaf + left = nav.alloc() + print(f"Allocated 'left' inside nav: {left}") + + # 4. Dealloc + print("Deallocating 'left'...") + left.dealloc() + print(f"nav has left? {left in nav} (Expected: False)") + +if __name__ == "__main__": + example_symbol_lifecycle() diff --git a/developer/authored/Synbol.py b/developer/authored/Synbol.py deleted file mode 100644 index 8234e18..0000000 --- a/developer/authored/Synbol.py +++ /dev/null @@ -1,66 +0,0 @@ -class Symbol(set): - """ - Epimetheus Symbol. - - Properties: - 1. Identity: Each instance is unique (based on memory address). - 2. Container: It is a Set. Differentiation puts child symbols inside parents. - 3. Hashable: It uses id(self), allowing symbols to contain symbols. - """ - - def __hash__(self): - # The distinctness of the symbol is its memory address (Process Local ID) - return id(self) - - def __eq__(self, other): - # Symbols are only equal if they are the same object - return self is other - - def __repr__(self): - # Hex address is the standard Python way to represent opaque identity - return f"" - -# --- The Factory --- - -class Epimetheus: - @staticmethod - def symbol(): - """Mints a new, unique Symbol.""" - return Symbol() - - @staticmethod - def differentiate(parent_symbol): - """ - Creates a new symbol that is a differentiation of the parent. - The child is added to the parent's set. - """ - child = Symbol() - parent_symbol.add(child) - return child - -# --- Usage Example --- - -def test_symbols(): - # 1. Mint a Root Symbol - color = Epimetheus.symbol() - print(f"Root: {color}") - - # 2. Differentiate - red = Epimetheus.differentiate(color) - blue = Epimetheus.differentiate(color) - - print(f"Red: {red}") - print(f"Blue: {blue}") - - # 3. Verify Structure - print(f"Color contains Red? {red in color}") # True - print(f"Color contains Blue? {blue in color}") # True - print(f"Red is Blue? {red == blue}") # False - - # 4. Nested Differentiation (Hierarchical) - dark_red = Epimetheus.differentiate(red) - print(f"Red contains DarkRed? {dark_red in red}") # True - print(f"Color contains DarkRed? {dark_red in color}") # False (Direct containment only) - -if __name__ == "__main__": - test_symbols() diff --git a/developer/authored/TM.py b/developer/authored/TM.py index 3fff29a..a20fb31 100755 --- a/developer/authored/TM.py +++ b/developer/authored/TM.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import sys +from Symbol import Symbol try: import TM_module @@ -7,9 +8,72 @@ except ImportError: print("Error: Import failed. Run 'python3 setup.py build_ext --inplace'") sys.exit(1) -class Features: - # No features currently supported for Array TM - pass +# ========================================== +# 1. The TM Stub (Callable Proxy) +# ========================================== -# The First Order TM Factory -TM = TM_module.TM +class TM_Factory_Stub: + """ + A Proxy object that acts as both: + 1. The Namespace Root (holding .feature) + 2. The Callable Factory (delegating to an implementation) + """ + def __init__(self): + self._impl = None + + def __call__(self, *args, **kwargs): + if self._impl is None: + raise TypeError("TM factory logic not yet bound.") + return self._impl(*args, **kwargs) + +# Create the persistent TM object immediately +TM = TM_Factory_Stub() + +# ========================================== +# 2. Define Features (Directly on TM) +# ========================================== + +# Create the namespace root +TM.feature = Symbol() + +# Allocating features directly onto the persistent object. +# Now we don't need temporary variables like _SR or _L. +TM.feature.SR = TM.feature.alloc() # Step Right +TM.feature.ND = TM.feature.alloc() # Non-Destructive +TM.feature.L = TM.feature.alloc() # Mirror View + +# ========================================== +# 3. The Implementation Logic +# ========================================== + +def _tm_implementation(data_obj ,feature_seq=None): + """ + The actual factory logic. + Now allows us to refer to 'TM.feature' directly inside the function. + """ + # Optimization: Default Case + if not feature_seq: return TM_module.TM_Array_SR_ND(data_obj) + + # Normalize + fs = set(feature_seq) + + # Remove Defaults (Referring to the authoritative symbols directly) + fs.discard(TM.feature.SR) + fs.discard(TM.feature.ND) + + # Check Empty + if not fs: return TM_module.TM_Array_SR_ND(data_obj) + + # Check Mirror View + if TM.feature.L in fs: + fs.remove(TM.feature.L) + if not fs: return TM_module.TM_Array_ND(data_obj) + + # Unknowns + raise ValueError(f"Unrecognized features: {fs}") + +# ========================================== +# 4. Bind the Logic +# ========================================== + +TM._impl = _tm_implementation diff --git a/developer/authored/TM_module.c b/developer/authored/TM_module.c index 4056135..81be861 100644 --- a/developer/authored/TM_module.c +++ b/developer/authored/TM_module.c @@ -1,14 +1,13 @@ /* TM_module.c - CPython Extension: Tape Machine Factory + CPython Extension: Tape Machine Types Implements: - - TM·Array_SR_ND (Pointer-based, Solitary, Step Right, Non-Destructive) - - Style Note: - - RT Naming Convention: TM·Class·Method - - Uses UTF-8 center dot '·' for namespace separation. + - TM·Array_SR_ND + - TM·Array_ND */ +/* #define · _ */ + #define PY_SSIZE_T_CLEAN #include #include "structmember.h" @@ -31,58 +30,56 @@ static void FastTM_dealloc(FastTM* self){ Py_TYPE(self)->tp_free((PyObject*)self); } -/* Helper: Refresh Pointers (Used on Init) */ static int refresh_pointers(FastTM* self){ if (!PyList_Check(self->tape_obj)) return -1; - Py_ssize_t len = PyList_GET_SIZE(self->tape_obj); PyObject** items = ((PyListObject*)self->tape_obj)->ob_item; - self->start_ptr = items; self->end_ptr = items + len; - self->head_ptr = items; /* Initialize to start */ - + self->head_ptr = items; return 0; } /* ========================================================= */ -/* 2. TM·Array_SR_ND Methods (Static Implementation) */ +/* 2. MIXINS */ /* ========================================================= */ -/* TM·Array_SR_ND·s: Step Right */ -static PyObject* TM·Array_SR_ND·s(FastTM* self){ +/* --- Navigation --- */ +static PyObject* Mixin·s(FastTM* self){ self->head_ptr++; Py_RETURN_NONE; } -/* TM·Array_SR_ND·sn: Step N */ -static PyObject* TM·Array_SR_ND·sn(FastTM* self, PyObject* arg_tuple){ +static PyObject* Mixin·sn(FastTM* self, PyObject* arg_tuple){ Py_ssize_t n_val; if( !PyArg_ParseTuple(arg_tuple, "n", &n_val) ) return NULL; - - if (n_val < 0) { - PyErr_SetString(PyExc_ValueError, "Step Right machine supports positive steps only."); - return NULL; - } self->head_ptr += n_val; Py_RETURN_NONE; } -/* TM·Array_SR_ND·LsR: Rewind */ -static PyObject* TM·Array_SR_ND·LsR(FastTM* self){ +static PyObject* Mixin·ls(FastTM* self){ + self->head_ptr--; + Py_RETURN_NONE; +} + +static PyObject* Mixin·LsR(FastTM* self){ self->head_ptr = self->start_ptr; Py_RETURN_NONE; } -/* TM·Array_SR_ND·r: Read */ -static PyObject* TM·Array_SR_ND·r(FastTM* self){ +static PyObject* Mixin·sR(FastTM* self){ + self->head_ptr = self->end_ptr - 1; + Py_RETURN_NONE; +} + +/* --- I/O --- */ +static PyObject* Mixin·r(FastTM* self){ PyObject* item = *(self->head_ptr); Py_INCREF(item); return item; } -/* TM·Array_SR_ND·w: Write */ -static PyObject* TM·Array_SR_ND·w(FastTM* self, PyObject* val_obj){ +static PyObject* Mixin·w(FastTM* self, PyObject* val_obj){ PyObject* old_val = *(self->head_ptr); Py_INCREF(val_obj); *(self->head_ptr) = val_obj; @@ -90,58 +87,55 @@ static PyObject* TM·Array_SR_ND·w(FastTM* self, PyObject* val_obj){ Py_RETURN_NONE; } -/* TM·Array_SR_ND·qR: Query Rightmost */ -static PyObject* TM·Array_SR_ND·qR(FastTM* self){ +/* --- Queries --- */ +static PyObject* Mixin·qR(FastTM* self){ if( self->head_ptr >= (self->end_ptr - 1) ) Py_RETURN_TRUE; Py_RETURN_FALSE; } -/* TM·Array_SR_ND·address: Get Index */ -static PyObject* TM·Array_SR_ND·address(FastTM* self){ +static PyObject* Mixin·qL(FastTM* self){ + if( self->head_ptr <= self->start_ptr ) Py_RETURN_TRUE; + Py_RETURN_FALSE; +} + +static PyObject* Mixin·address(FastTM* self){ Py_ssize_t idx = self->head_ptr - self->start_ptr; return PyLong_FromSsize_t(idx); } /* ========================================================= */ -/* 3. TM·Array_SR_ND Init */ +/* 3. INITIALIZATION */ /* ========================================================= */ -static int TM·Array_SR_ND·init(FastTM* self, PyObject* args, PyObject* kwds){ +static int Common·init(FastTM* self, PyObject* args, PyObject* kwds){ PyObject* input_obj = NULL; - PyObject* features_obj = NULL; - - if( !PyArg_ParseTuple(args, "O|O", &input_obj, &features_obj) ) return -1; + /* Accepts 1 argument: The List */ + if( !PyArg_ParseTuple(args, "O", &input_obj) ) return -1; - if( !PyList_Check(input_obj) ){ - PyErr_SetString(PyExc_TypeError, "Array TM requires a list data object."); - return -1; - } - - if (PyList_Size(input_obj) == 0) { - PyErr_SetString(PyExc_ValueError, "First Order TM cannot be empty."); + if( !PyList_Check(input_obj) || PyList_Size(input_obj) == 0 ){ + PyErr_SetString(PyExc_ValueError, "TM requires non-empty list."); return -1; } self->tape_obj = input_obj; Py_INCREF(self->tape_obj); - refresh_pointers(self); - return 0; } /* ========================================================= */ -/* 4. TYPE DEFINITION */ +/* 4. TYPES */ /* ========================================================= */ +/* TM·Array_SR_ND */ static PyMethodDef TM·Array_SR_ND·methods[] = { - {"s", (PyCFunction)TM·Array_SR_ND·s, METH_NOARGS, "Step Right"}, - {"sn", (PyCFunction)TM·Array_SR_ND·sn, METH_VARARGS, "Step N"}, - {"r", (PyCFunction)TM·Array_SR_ND·r, METH_NOARGS, "Read"}, - {"w", (PyCFunction)TM·Array_SR_ND·w, METH_O, "Write"}, - {"qR", (PyCFunction)TM·Array_SR_ND·qR, METH_NOARGS, "Query Rightmost"}, - {"LsR", (PyCFunction)TM·Array_SR_ND·LsR, METH_NOARGS, "Rewind"}, - {"address", (PyCFunction)TM·Array_SR_ND·address, METH_NOARGS, "Get Index"}, + {"s", (PyCFunction)Mixin·s, METH_NOARGS, ""}, + {"sn", (PyCFunction)Mixin·sn, METH_VARARGS, ""}, + {"r", (PyCFunction)Mixin·r, METH_NOARGS, ""}, + {"w", (PyCFunction)Mixin·w, METH_O, ""}, + {"qR", (PyCFunction)Mixin·qR, METH_NOARGS, ""}, + {"LsR", (PyCFunction)Mixin·LsR, METH_NOARGS, ""}, + {"address", (PyCFunction)Mixin·address, METH_NOARGS, ""}, {NULL} }; @@ -152,66 +146,59 @@ static PyTypeObject TM·Array_SR_ND·Type = { .tp_basicsize = sizeof(FastTM), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .tp_new = PyType_GenericNew, - .tp_init = (initproc)TM·Array_SR_ND·init, + .tp_init = (initproc)Common·init, .tp_dealloc = (destructor)FastTM_dealloc, .tp_methods = TM·Array_SR_ND·methods, }; -/* ========================================================= */ -/* 5. FACTORY */ -/* ========================================================= */ - -static PyObject* TM·Factory(PyObject* self, PyObject* args, PyObject* kwds){ - PyObject* input_obj = NULL; - PyObject* features_obj = NULL; - - if( !PyArg_ParseTuple(args, "O|O", &input_obj, &features_obj) ) return NULL; - - /* Check Features (Reject incompatible ones) */ - if( features_obj && PyList_Check(features_obj) ){ - Py_ssize_t size = PyList_Size(features_obj); - for( Py_ssize_t i=0; iv7HUFr_QcG7RPorHbu7O*u|ENBquS1Vn|p* zLK`SsOK4J-l2V{7rw|CGfwH8uv|$gW&_Lk}1qzg{Q2HysnYnZ2t8vuO)1LGF{qcJz z)_e20bLY;TJNLe)rzhpSd5h+|Y}?YCZOycLB~2}>bzARo4IS24L#-iJXsZXM(540D zzR)Ji{$)!`m4Db~((n(f=`D|ED_;-{ZCOyBwv%aMduZ!|QK3z5`=pL;1InQ;v=8;L zz539WFGE}Y7P{;N<<@(F=FnF6(WB7EEptcu#_bDjdHroHyKrA>JQR%#J$%Rs*>g+} zLR%X~`kF(>mr%Vfe`wRAfm6Z!T+14_@7>p^x_?*?TA}uj$38p}diX2n&&Z4rY$t!V zo)-vR_*Kdq+Ei_)N<&-cKzIIlYG`Xu4TSouL+CfzeD{ss{!Up?o-E3U3bk*Nuif9! z6Yi1d828)18OJBIb^1u~-uGG0Pe5{|PN&ikgr%Osvb7exoD;yves+OU84}uB3vsFm zgf4SG(h~B=9s!L}E&ld>{=zxs5ZcVR!N8^Crv2t|**ck8+w&D{@9wAL7VaO8=j6~P zuN~SlmI9Wi>*5%PHofOlj_Sm-Y-q*@qtgT3P~$OWK`>cn*6PhklVbd4H7pNZR*5xX zq&^_a7w+58w&=2>kuBQtmPRWc`qTmQm(4(~JlOI}jMj|MmUnczK@x1D`CyaAqAjn( zK9&SusE2Ap4HWsh$e%vc&swo(V6NFwznlyRZte5 zl}JRo!}WFHC3Aa4b=(ne?rM)(^CQVr5UezGcSe(_qj*)iGH53)D;cxelUB0MS_FS* z!M{aT!dh=dnwz2J!`4%cVy_Rk9d4~SoStMj@VH6-pUUnd7&wx@N2>q-db#fi{Xdfb zN2qQcss4W&-~ZJABl&lva@l{HcrdS~25aMOu~als*%(Pio5uv}Ep{w z_M@tsCR~n>c2uK(-r&DOi68!~)|``k=R$5$dgh#5@>BspB`orv4#%UEu$Y9gN?1~W zmM1G=Y2dSb%fbs(XsovMB`^?D!m>aC^tM(Bb-B6F=T%Cm&zlS-YgC{5=T~e2Ozs47 zru*&!L8;B?KMSoYVP@{taO~qc1%rPMnCb*`PxO5S0;%OrDnhSWm|WNe?)X&6l)_n1 z5KzK2QY&X`{=vB}wl*p+*LMmCq?VUgNY)D1MpIT^e%{~ET454}f;fs*_(rJynk8mj*Dr%F+BXDk-OS@&`~IZMvxZ zVQo6#YWDqEn|8I30o4W9+TvEoKOMK?!Jq0n!Gb#95J(8}prGEf9n(|^4Y`HTQyra> z!J|QKJd|43+WsqjKZA57J^xikCI8h%5d7DW3qhrJ%~0%+$|V1Ffd&|Rl}Y{`q^2^- ze|=#ml+>s?KPdbm2r85OJ4;`I98;O(|6#$4P@*!)e{AhassmI3d9 z(5Zx<6#NP5Y*4~&g|9(Zdz5fHS-V6DcNAR(YTK3Y)1qI4aIF&VF8M21+ogn`732Kh zt%Uoi+jlBqZxN>a9wj`Kk14-T36B&y{Vi+15+0*&A5g;n!b&JPsDxh?O#$JM5`I&J zQ|oOdJXQ212p=lpw?!5V(C4&n9H0TVY!aUKFUHYU!ZStlz*s;D&lW8Mpj}tb~IFIB9E?@DlYcq=es7qqRzSnS@nJ_yY-Rl<*1( ztx9;6gia;=k#b^#5?(LD6|hGMZ&1l4N_ewmZVnAkpf*r~{VZ(kYOw;PG~ukmc;h#% zKpENf6}CrXR$u^iGe9v5l#@`dgrjI$1(h&}gpo=ZoO@F`Sp!1~S3)ymRmo5iCM#hW z2{lRxk_REnjnn&B^vt~QusBmz?xN)il%3U2e&8U_uR)Fd(#FeY6j;qt@05z)b zdbDge8oV7|ylDDC_;cX_mp@jv9|ZSP@IvL7+*EEVJzn+~RQgCOVP^I!nVL`d2SAy7 zFuZtYK_ka&O>S;~*(5BVj^)_NlSTQjN>^g}X;_Y4cIt8$YO|4F7i>hO^HB*K`F@6y z>CRIHKSIr)Xw65{nrPhA{GI;*YCf+u|D2)84Il7-ib{XiN;q9r9PsSIN>BTb0_+|J zFXSEOy;35ZhURmDxv04iUWVYZ<}%8j53IqmD3;;EX8QU<=|(I&A6_U(xa_DFF!|Vx z7fW$qRT3QZ-;NdT#tIlPT$*|-n5JLyW586c-+J&v0ty{sx#?`7v()8y~ zr8`mcCat+At+^jvnSd{@i(F+mhbDU5=%4E*SHWALHVVruy0Ld29oyE4NL;&J&SOwc zF8WXOTd8nOAXYXAzaus*=TIdX*BEkg!GxOG#)|LM;iM zN?1n11|`&ywH_tZ)B1Rc5*nyvyAoDVookh_l7wAKSVh8aC9EdlP9>Z|J>8>(Q>kR1 z5>6vwzY6lNlEz|>_Iw`eM37=%! zNGP{CCBErwfFuai`rF@64|GR9uBeu3B1ZZ?CB%zxEe$B4lLWAYDR7p$q*Owp6qnRd zN=Q=4SS6$axH?W&!a6ctqlEQjEyQkZaGJoKK)L_y*wfg^BH z!HH0XFGBqnJ5i7V0soe#(}pfB`2<>JLtD#7K&<&X*T2oV1JvBus2eAl8wbFR-F0Jq zH@?Ym<8{6p-#Sot3XU&&5UdULz?D@6{0+m4Jj)8=OJUJbczLaki|IHp%JH;;8dL`Z zUgJvG@ddE!YU~_!H6K)MIAzWhs6*}L7SsAp?_oyej0yZw8_TJ5dM^xes{H$*K*c1d zn%;RS%Q<87F}6W#GVa`1o$Tg}bIyljH@>ZN{|Sz0HNv+pYHWH>QF*@7S9Ptt{(e8W z;x2&~S`I7Wz!*%bMg1>Im1BcB0eVLn7;BeY3aS(ayVUU9E+hYx=k|bt-k8|sBm`BR zfh3Gl&f7;hHDGNhj?a(afCizTRfIv_RB|N)Gg` z`D0O&%-vt|K3MKGHw7DVy5RJS?4rsqr26k+Ilat6t8VNY z*)O)Ke!oJtZ%xN?`{w~1S-oxM1AE6964OPAKkgFL$kjIGg-F<{J%;A$Udc-cjpsH#j-)F-*EP2GR$eK&wf3Z7_A0 zVM8-?L#UcX4cfJGQ7@K9@#HE`^4{L@Mu}y?Is*z7c&Imp#+k8GXqJg6|Kc=fT$iuO zZ!&|ZE$MyI_avzMQl?J+50BEtyb_>DlN9zzUl~Nhx7X0|-DL=6j~RkhnjF|`3*V$z zXFH3aN50JlKMr}>cMMW?ogtK({=gZ;vWEM1{YxK|!3;;Nj5z4dpfTEp`<_9I8F45` z8a;t!By+Pzl=wCq3T59hgn|={fc9z38Ik9kZzz;4GX!iUzt4m~s_k?;-@*uHOpbJd z;@WU46hr1YH$r;K4844fl@2W~G3ko90=+;Ljhyb)T`~kczy+ETH(F$798{yt-tmo6 zPTc5dGjV6OHE*!&7CPy$uJsLlfGeUk03~}3nYB*?E5i}28A(=D;i;;yTNj?H3dx_k z41cCzUD)g$?Pcsw-3Zeknl*J3%s$YvRBw`hJqitu8*FEeLTNu^ASq*3IFnGT$l&Sl z55sDAAiX@$H3zu#b=DPHD`+Ig zW^}GMet1@(_>JWp?Hj-GM~vOanXHgRio845R(mqFc@!)wz{e)`Hn%=l`ib}U}$!wYjiIzb>ZYj zT~voeOh(jhV^o+R$tK4Yob+&XIZ`Vb`_^xRqfa4YNPWqM5S+w*;e5rcC{aN^}pK1 zxw?Cnoo_h>Q*)=~PRU(ZJQ-FM_>glUEK5$A!68BXR&Iq43p`Yz!p}9}mbtgoK6c>3 zVjBwkd8~1;gU?vU6}tx9Hycu_|3b@E{w-J)b4FUZxifPem@BzeHZ)pcqYbQDXczUX zDL;E4n#l8D!>VkdHj+QY9#>pv@0p#8s;esO)wwHkQM(|sAQw5@h$#m9xw)!as1_); zS*+-fav^lWXZE^iVn(arZgI#y*FKMWRg&3Ag==-iJMNVg(Dl-E$?^e)S7j4>`#*sC zN&&{M2FdO6D*GD)b=(n8r@jviS=c5l-kCuFcLrs&k2u- z)-CH8HNNOqMai)PgB1=sb?h;eS)QDH!}0)F9m`qhgAeZ^r@@W!lq{a!WSPKy zBl9X$6W#XA++2t;XaUCFoIu@x^W2F%Q`nnHkZOjp$)y(d%(AAWha41-g#kb#Q`3-U zf`Ze)b8C8LN#-1xp>or*W`e8fJmv}a4NRg7?17j^HD)F{q21yT`TF1%cS=y3$4Af*vr< z=_>bj1-*kO584UE-*p8bnj^}+_^K$@x7-KZFS^0Ni|#ERWq|4DZV2<|ic)+*1=w;N z!x!BzLn$0V{a4*@VEqqOA%KhRZ8r81kGA5G-rU>mYiv-x#(u|!5q`&h*H$C^uKfi7 zRs*dc*wFM3?E6vqekki5VWs2V1s@4P*>2Zf7Z}>>`Xx%gbUms<;C|HgJK&@XI`?4V zqpsh;PI-KL26DOG_aK0Lb-6!u!6n;rx@MxL!K z)Gm0ed(2qN%{%nQy&v3z4~BaWUvge?AT_qSEjJ&&>8QX$SU+^TKXHEnMQ^x2aKpi7 zPsZUU?PQ|xwmioDKaj_tNRh0flM zDUah_4RD}yFAz_Or^Gq`JUDQ2ZBVpN@_4+?r({XK99TNe`w7^=X26L}KP_^g+sC_ck-t{$VzY4WSdB2Ob z^Qqx3s9NG&?--p1Gmh7JX(M#mTkM(Xb)u_4)wj+wGjS4>d|d4Df$X7%+5Nrbz)!!1 z1HU`R_MPOJ+T^hpd#b$7@ehD2#hww~LQlbMo}80cL4eIs`x%S|_&VBK81y(Z&{wbX zfE&i8gq-N_T@Bvv#UU$0(4u_5aH9>XL!AGCPv|_wG~GT-ZL+DH*y@0ouV zMHE~w@#Ig1;BKaFc~iE-sG93s>NyFtik#0tOXW$4^N|bdafU-F4EE-8ZBL$a3k4gSbYADknN3n0z0MEL z#wwS)9nVn#a0|PA6nudNBdtOW_O1p?1>i6=S?n2z6RGHA&%l)^>x75W9Oqf6W>-T( z^z%9!T70WLQ@jN*(Q;FsX6@v4giI}^#+1r0P{mA#hbSEe zI+s)I#2gpH`ImDraF862I6+VcH}+8N{?2~qBup0Q-Ov9$dyrp`U{5^c<4!O?(7EVq zxbit=mb2luub*4Tc%5f9LI%K;I>sCD^qc89CgJHfTu;`1;DP52=)xjMAMA>6277f1 zcva&3h%-ZV^T4?niX!Ju*ZvFAL@C~wq4+E--kw$jatf^;Q=H^>mmAIv9pScEb94iJ z-=tx&mFf()Mv|>oEYcCRYP%QHmr=rV646L1I^Jq*i@_uEEnTrDD_q+>E3r0Q8%ZRi z4PBk>(Qtj++0h0onM$-Z!#7r9jbOO5J<=2ncgEL86JU%ihf~-FJgA9}XLf`;qN&z+ zbJCg<@92of9=WeA)|Rru?eW-JxElfw;akb}cnaz+h^FeJskzY>3+hEusYIN-=m_KE z`@q^;td{o3+9Vopjz-$s;dxKPg$?n91$}6a$J)D5C6WwxL^?a$Vr#+nB4}-?YON#O z)Ex5d+-(+{JX)!wtMkq#&E#X8I>LjD^kXsA&vpyPYu8St2 zA~(e)4T~SS&-micBlqEVd#uH68`_}b`28KQN&Sa?DiK*1h0t1Xqm6n>odJ}xAgo=f zFy1WUs_>m34hm^P?e)>fnfP5JtpQ&Vf{0_-RMgrj?iP$wD$&)Hg5aFF9tOdv8Eu(!%sF19Kaf>IKU=XOaE_m*G!gv_>NJlscp)tn= zYN8iS(9;wt*LGu2!V99YXrirYNpw97Ydn&&;*C7gXN4gmYg4ThEcpHgjvw?iykK5K zxPIX&^Uyl<#~AxWv?GE!p0F^jg7nfAOSY|zMVo{8OgMC?Dbmy$rBTVXJg{(@=y*e160zt8$Xv+shD2Aip5lrplhCnvBHY}z4(1Cs z-5F1|rP|g-AyJKd((U#J)mj&6?}}QO0XRWg;t5Dqt9JE*c}v1|^BR`dErFPX8&=oO zv#3pSG6|Cth9KD*fs_MpAh@kf@s7?&B5Jk5#0Yn$66F2-NPAMd-$7ZXEH9b2s)1w8 za|OSl2H!?I%xvpBb$A__)!fXLd7SH@>2AzT97%AiBN4aOLx>^QlI?9xjGFt&4f zYJ+OBtFfs)l1#!{ql~33&)d)xUV$;1mq5-KMb}1XTxg7NDNAxRA(<&|X0jz)+gczGQjo zOcu=N=C-wv8GRN7-CgMIs=4##)XkfZ4zgpgBCBOfFGDb;unWDJjR~#SZCEbD^|*en zYlGCHOu`vVH89xGjz(BxKwZt8L=@(EvK11M!bEF$@8qfN<^V%~5~`P~2RIhICabv& z!$~=Z0|qm=4i;?=XhI**T0=`Wm#jBuEDRd0G-MziOQ&O}p8H%$Et&XezuDv2ct%J; zo~!Kbo--fLSNLr%Y$5{d4>+6-1B?;;izL=kbRe1#F8DsBN=VK`NHWew-ENHhOG0YV zdfftN$1a#iU>N$;)ukjquIS+U^yR1jky< zy?J$YOX=)DOC_$pRtHT0SUB4{;f%n`kBWNOTyP__EWto5Ttcao{vs(ltIn8^isY~g z1;qjU)F*G4W^gXT6LD)ik)rhy6Cj$5Ce}rp)d~aG1{76X@>MEg7Iw6&(*ZVw=Z{!( zTLbRp6=^y%+|+tzxFyooZp?=zbNLJjdNh=LPEt{(X}<^-^zi&d zyrUj_0P9*m~$(Whw&6j*HJ?T83yy@Or4W zdr23rOS)6(kkSH9kx`eG?P?K%acoP5*EYeVjWyG#0KroT2glNvQaZEYj0@kT#_?}% zg9{aPp~I573ei#l=XHI>3o6h(OsVv|p;ZcIh%%DC$Wqs)psy|_>0H~7p!XjrlW}&2kEY- zIixhC47f3yu3~H9YA1=470+XMepVjn5aMMUIMaJg5;npZZ8xLXC(+g5r7x?&ObfiL zXveb{bdG|QUI^7?1EvOydt*G_4%a>jSPRf|_Bh_&ObZDp^e$C6aUmXLtSdc$Z87{p zK3#6$ibqzm53Bw!)@Z<*;zCaT+FP3>LH(dy1_FdmywHEx_$eRy8oq;ynyds}1m+NP#z zn7QE-Csww%#kw|Bu8nn7j~lOTW*X|F*w_Z=!Hl;0s3g119~fwYywg8Y&;+T2k*aE? zcMxeInQCs1wgAPnN*a48fP}2XGgl07XLl!@Z0GJ@AJcJqa_bAh5}`tRU!GkW&ztRp6VSOZ9G2 zDrsNQ<{oDBJO|Y~C8xl*I2YS_j?46CR@|Lw3b!Qg@wz*~%lwah83W9Klwlk-o9NL&&;F}E}=>5wLO}nkX z9`<)C9QwE*vpPP=;xf1%8@y$XJjm*rql~C0^< z0JOiI3-l9BA(H#*FJ^t+1?|si%!3?j{hZF3%xlFMbTRK?t{+v?9>>D1rzw5*>ohaGL#vR@Cw-nM!_?r7!m z{j~R3L6-IIDdxKWn&aLv>|}DEDW;Dd@KbKj06>3wxL^(Y`8M-IEQ3;dbJEYGq!ArB z7G`7L&A~639%ggYQ}umHj0dhW${edSL)L<0i4TaN06$#9xhl5-S@bIr(-8J0q zV}y4Vb!qyj_g#3*s#-K>tk%%C@x+ZCt`9#hlyQ?5YL3I|<8}4*`T*`n_PMLkfY*_| zH2vNV3`{^P6GfrEYVEB;zgzUkeYzmLVA0aqvlfMy&YxcoxBePt&0aJwOn0!B^xiRm z8wj%wcayr$yH0fzIODCPdAkXZ%^PDVH}u}-<6DsRcnu5hKr?SY$+x6^-iT$~3ez_- z(zo2xpwGQC;~pulRcga$^N)tVf2f~h`f5ZLesUHb&%(dY9Me1p{{L?&Xa6GqaekpVG({J!Q4Ev^^zcDzTbF`h~ zc|K#Cl?ETr9Cx_>Y5l3p(f=xg&o{W)-?hwTe7X#MGY%WG=wEMeGd}ki+>FoT%y9?L zoLW1$|L}wYZRkHfycS`a10rgL6oTTx)Q&kJn+i?V{IS`|T|6HaObZ&a%Ev*X?RM`wV@wujl!GgQJ}w z%Lff^`g2I|1j}z59PO-O`E!Gtb|_#_rv2<&B{5-bPYH+mE!+e9mO*=h;pU?W2 z7#!{B>*#9@Zra%;_$Icq+u&%&VtJ3jO*@AK*ZKUm!O0HW|J>lF9sNcDi;?Sm_Hkw8 zc&PKa+~B62px`>rqYRFRJ@ALyWP_V_Y6L%Dsaqj~X!+u_CaMR8%!PDbza5`jv_88o>Q_k(68gl*Ap1JN})gars)6gHt z$GCgj;Apdld`er=QAD!R(jX0S8 z95lG;55@$y9QYebN9sktQ$s!+{=Vw3c#+zX{s=zCoqmUf`pEMT!iMK8+|Yk^fn+?_ zuSD?J5(q5<9usjwcvlwRUj(4TY<9#{~u=i`{#l; zGXIs}7qg$w3*N@^p9KFQ+j&RuD|z5Q5d1pkUuNMx&VL<;hgh#v@I~D2aKXRe_*4u2 z3y#lp!Ovy;`np}Wo6qrIA@nb0`%Quuu-qy52=)`-zvHIuKga&)>wL+t5&FBRwq@NU z_&q!??iTznoL3KJ;rPBDH{I?jtbb7OPgs6a@Nt|c9|`^{+tHI;+rL>gXXSA`Bp)a^ zUi;#-V?c6?`M-?JmLf`>Wdp|ANQm z0m0*J=Lx}|<@|Y0@Q>O5*96D+_PD(-IR3;JZeI$19Ji}}U$b}qma|?dkDDI%*&NT| zf}g?pQ!V%xJTB7({{`DwDEO6ZXNBOWu%AtWf5Lut3a;0Ma|OSj^Y&7~XS1Da1mDT> zO@gbRRkEzR1W&3kTMr4of&2Sw!TWK)4hnuN$L&qQuVDR;1pk8b! zY~lV66#O=}e~jRboIeu;f0)~?5gdQ%4Y$RD!*@GqJ4JB4zN{7eUe-?u{tWl)e8HFS z{Qb7zXK*~P6TFA@cMEYT$L9vYA7?wi5&SM?-a07wM2^E7f=}T*baT1xR};5eCHTi2 z=c$6@FSp?~U+^Uy=Q_bJ;C1*6!AG(`-xPcsw|k}Fudx38g5&Q8;`Y4Y`&s{G!GFO1 zzb3do&%G`9GLHYJf{$cBM{-{1cCO| zf57sif*;T8*VBRzWB#h(7jwJs3f{>2p9_8q`|siW!s6lZx0~ZxB=|2_9wzvB?$;Q> z-(x;S@DV&t@F)juy4|Na{`G=yV*NFOPvH5}A^4fBf41OBwy)m@>vl`o&Xq#Ho#XRE z!Cz!McL=^pb;sH(_)j_R`vsrN&i@d+gXd9y?uYJgisMrz zc%1WRgy73r9xM1&Y-fhxWt=}J39hd%R|$SO$4AFo`}tFjbGOjHiQ{&W;P{5Zq>cecsdlJM5=E4{NT+=>uWs0k-4tjXACV6CU4y z;PKc1s~0Ma-ZNk zIgcL|yoU9k5xjuo=;cRDblj$M+=dID$Kzfl_!92#Y{B*Q*iyl#vY)33{taGFzA1Pm zx4Ta8L+s}TfL*FG5yT@ z@DB?8GdVx^8~S)}Twf=@CiI`>{P~NakM?`u54X>R{&sfM6;S2aoWA#tgdTK+y&jhj zIL-qMeYCH)AakvME5~z!;Cs2TYvr_N{`nh?r+fGs9#Om@MAg5^|)Wm ze43$;?e?HS*y@D-V+vcR864xbnE4vP=P{2Od^oVxJn!NLM?3m{R8sH`wzI+DXr~`K z3)=+-M?2ezTGmB^Z)3jI;AlsGesDc=9Z&uF!H=@=hYdT}?oDj}F~M(O{<|!84rbvW z3p;nPoxcfw8*}|jr8vIm&tB&4Vs)VT{mkqmKkvAVx%THZ);}c+?-F*_vwpYWUChrDcJw-S zoxySa=Vj9RiNTTS=PmXKK9egvWpK2^r+w>1gQMz6tp5&k9IxTkh%v}4UpLe-V=xaMS8yw^FDEs+i!S^x0!{FGj8*wmU+hcIF^Ly5R zQ1BO+KWuQcvyU(Ao-{bx(ev)Ng1^UhUSy6U#(yQgz;-AL|5Dibob7xi_-D-f^Mg3r z{uyk)h&kq45dIqA54Q?~qyKK!KU#1-k&YAgyIFs_;LXhE8FqqTzZw2;YsjL1y3mg+ zb*sbR!-2JM{;U^vdRYJ4LSN_4b%I~Rc5X5_#-Wt`-z|7C^ShYqIP2@l2eR;Igq>k* z=LNxsFn`71!@-}Qv7c`V`)jzr{}lSVzkYt;LHpUx`sG>p30e5eEPN$%y^fua4Z#)> z`ZYx1xhbKq{oEq-L#%&A7XH&Ld`}ksG;{6etL*2?LO;muekAm@pANri(eWI^`gzRt z{L=5e2W8P8DfBDY&P0RbxL5M~g_**RzRq7R^tGR1gJV8db6zzGek}7=gJZkD;`-f(R`h2>u78&|MFrxXXS@fHQK3^_cDT8C2bJ@=e z1=s%U5FGz=J=}gQ_*A~oxs$n$PY@4adqU`I`%fDj^F%)%{Jh{X&XZS#{ZVZHEki#D zc1FP;Zl4((?cd0D{x0}V<_=Fl?SCcP&ttCV=>)P4_wEdi_VsgJg9X2v?N*wMg6nrk{ z&*OsYdHtN=r*eM&Rq*e5)ByMfslA?eud+YG1b>s;JyCFn?biwZQ=VYWfu7XDHe{;A;l`O$x7;bnYd6XS#VsXq@rO7P$D_>N$%`=#xV z$-)tP?Rk8Xsn5dodWQbsRM>?FuuW4t@{^|s5l(A*pU5VO>-){RUtFEud*U(rGXnnV zQGo3jwM+BwvwWQ3ce7k2_%kez7yL_>PZWG8_p3(m8s_r^U&Q<*!B;U~D!9JSpx?*n z{>E5;wb0l16V4D^zmIMb{9?A#D)`mR^?h00?oQ?jp?@3m^@8tZzESWenV&DXem?sm z!QW#2t%85bTwf<@KmW=6Dxt4`&{*e%)-U7vwNvOZq6n4=qvh_tbw zd64}KvOX4@`V$4$dLhAUSUyegH7s`u-ox@{!F3#W3r-Uj*n@&={|^eT&oA!@-oyP3 z@Lu;<-w)B(N1E&PR)4QS^L;uFG>@0sH5%~#bN)bS4PT$2 z9=7A-a(+8Q>p5~(<5Kv2840+A(<-eu29D6CRR6m5$3b1Rsm}*+NSm&&*9FaW`+AS- zKOW2WYcMFV9nyKML@UU9y{mzP!^LmaGNti3+rjwZ7|Hl82ZrrS|ATye*$8Fkrt53} z+o14p{_o=Y`g;=EMo=H{z8Ut1^S^e5QV4QG=s#Wx>-P2dZvdu!Q8m=-L0q_DTV-A> zfGl;Bzz)}b=Sr*%|D8I2aEk5YtpM5nW?<4LAZzR>e1-cKXx!MO?ln**8LFR-i3!_F zV*I7<6`*rC{}1sAax7Va|91xV_^68X|2AOKCRRC-`>pFE!%gbm0_WBD3beO0hMC<%8 literal 40584 zcmc(I349b))^Al;cc()_y2%1zZx#{7BDb#(Mo$I)?k=bU?P=k`f@ocX@@e&2=es`J0+ zp6#A{>sEDDWzCFvGhMcA>0(=_SRIr`Ez5Up$9^g8mRbX>{#Iy<2dU8dS%tpPdduEd zS6A#GxPdtQ152TPRxq@AR$-Dam1Qf`LmjjS9QhZAHvbUX{MXRsnQB5?Du()MLnHF3aa%C7{;9wj z`?MV_f6D}tHEQpt2We;Pk`CpIL+d}AkfMD!Xuo{k&|v8DilK#}XQvM>BqL!bh&ybS zf5QNXAgT|BHolx_4sDt0`*!VJz~J(4yc#y4EeUA8Wo8nk29LX-YSdm561sdc5a98? z(B@|pvVMe}n2JJ&Cw=m7bWqXyrzV_n76flCHR&Y#NfflD04qPeVQXmfI}}GHbPGiE z(>tl3HorFNumU$f4Iy3Q|Fo9y_51A5#J3VlLt8EYe>T6(4aVl{_iX5iqt3_Zwvm#UZ^J|DKk|hp&MJ)OYN?dC+@A9} zT|Nd=GNMprL;y3whZ*5Rg}4*I9Wrd=UjK$Ih(ZK?pkH@;q9z%(_7L_&XiJ$dw0T+p z2ZM^PE72c7$dyvi;C`|$w1prWf@kdO7=zlw)VMtW zK|T5@2leyX~e>T!Hd2(9r3oJww8%egE8V$Zs>`?vcU$Q&PN*0Th;_Z z8;>Tu)Vv_HWg58o&KaRCYfB-2j~>B1BN?Cm3C7>$MHo3~_eD}RjPO~Hed9m~)woa! zVQ@gk6^Ax|qGt=}^Yzqyw&DOgLYrTQ!O;Z0rM9gpV$BT46Tyo4!5OO)k!ZZJB?@)$KR7d7lW2*xcW@R95pipABGMWxZ>(=f zSn;T$7FaQ>JQA+8R#{79jfsf0qTE{47KybhzUG#A!kQN^2cA`p(ON59TN{hSVb^kb(gI#;FbXS<@1YCt_{rY%msC(bfnC z1;fF4jSv>7ON2prOe@f>P0l9dtPLl^!ItWCA~gx*o!J-zaAB-A5(8bqns7AQk_c8u zf|2Id1emMkObV8@G)5DVSW$I29;rPcxVWXMF%gcn!(RCbLFgz|x;j>Apa0nw2LP6T z#`9mPgCzZL757iH{waTds=e#oARzhF-kQ-8GZ6E)z!ZBz3)iwZ_D40tZp(t z(?=U>k(u4^d#LFFAFH9;9N&eIo0Oj2=H|bU1E3=2`Okv=;fk0~#7IRf$U(^y6tOVy zZFkGU1Ds`bD=YXT2nZ=+Q6LArEmK5!Ru=eNsffkd6QE|f@+q_Xpv?f2Ie~5``+f_A zVw;>f1*IzDl&ouD-^Xoo`aKFTwFzd8_ZO%j@@zZWGKY_w|Q_APaI9d$wYlDxxB*2Y9NZli%++ zU>ggy)^)c3YTvz(uEgixZZz^=V+6r}EtwEhY}XDzhg2r{ZwORC->XdW?;tjnN&a8< zXoZ?m)#kJ_Djv z5qIUh4{cT}VporM!PT{j*iF(lDdIP|+ktJXBJR#T0K|2QxF`Qhkan{o?#;vTzf%$S zliPa~@o+At`~!-3tUIRsUPV0F!^yO){fc;++&-v?{XL4H=5<9pmpc)NBZ_!F7l+nI zig+RS2O$2Uh~MX0&_UnPEOL-K*s_Uu$v+=^TM;kk&H!NnMf@Rm5fFunIK3A-l3dWt%&z>aRywgh(A%yCPjRZKfN1uPi|QtAN}lE-BxD>3TVJtJz?<$1Cr$W zdNxI(R-hNT8K9U23W+FGL?0SfK}GZ>VyGheW!;uc)d+ z0!l_`PFAiMBygqi~fVi`HJTJIE9lHAM}5NOy6rJ9Ih%3cywW=m;8MIb`OLvvJUfJ zF_BDz^H5+qa?XaYfjF(XjJj6>%dswkbvUt^w!T_$0oGj%Ulb&qc9aH8J~rdE0_<3o z1h4ydV}pCJ0R{}Grj7=t=s)@~V5-#{1(-T&|8T(Ol6oey7R z5>84=0|gqDvZS{Rsc#$m?-XE;DQ!m#E8aEs-z#WCE$3-1IN7)wbWfW0ykBq=a^9vn zA4qcUM^ossnd=f)PaH$zJ#Mtmb(<^aLtr}|8LSiWYYpw&)&wM6J6+DxP){cM$NMdq zP23*%qL2=N9py0Xk;CpYwMYIF10~2l7QP1JG}OV$@+KCPA;S{*q5#H|Ote>w24E;H zcR74d4BGz5nM<>I{QIW{a9pd&z(0)$pACTJpH76D#QZaeP?MN{CJ{l!Hj9pG!xa(o z?*M6P-tx~TLd{$LIYg8ywz)iulb(50Q>JR>ljurCEFfaJA{G+SpolUeS{1Q~h}DWH zCuwUHv6$w^O^T?XnyrdBjoMtNh^0i_tcXe?b}C{S5qlJII(hnlBF>Nr$K9{3c|Ks9`jZ6u=5=9D2JlWCB-El^>l!_?v`xMcVi*so}5v@dkBus%7YDuYxSOHF{!xa&ynvse~ z1aNkopooOOXNLq-^TJ6+;Ik|=Y^Nxolh2l8hH0uJ>tPAsSb`Egci=6MFtr|gV z3#USR_bmAG;ka84J8D?al!2t>#@*bYf88xWDOKw!d`xWMSdyO`iQouak~1Ef@FLXz zGbaL6Zot3!rKF%s^S=hIENDyN5FB}I+GWmffX$6c-8jhH*a2>I*NyGnc#`49b-o)< z9mt)W5xI|mw4eu8R)g?^i#*HfgI_&z`{43g?dQ>c?r_J`2yEn&<26>ojxT_&tG;v8 zYCfoRI6a+-(1!G7<3tqy?+dcP=BsZOdlAxYDvZp}pQ&@#4eOY8zuVqdjgbwRwN_F8tlK-tnl_w;uuzw*Q zO0yvY4TF03rSs(B8YLAYl(61os4kRJXSUr)%4)ElzR*}0d+?=VmuHiJHOPRmvnC^h z{bGP(h5JyN)W))Rl;&DiFQg7q`Y>+gO&p+iIoV!y-T;xF=>~4W5LBfBs=k7c*IwdU zX?5V}Mj>bbyrbv6c7@XoF2VQJtuYYTG7jGrCf_0yX5}N_ZMmlX4^b|IWjnrtU!!1B z0*2uxgMub>hC(JpDg7VhxNBR8sN0z;qo6#V5|n;;`m;9$IssK?2R12{>rQFpkg8I^1n4Gh;g?IJ(?Z07Ro*5s~{E+XpP8##fn2^SY zeEq?V^l=!1vQmR#wWIqkfs4Ir#5U7BO5uaA zA9=^#@kjWjn}%oe@wlstg6Ke-3e7P`0*%oqkI_n^T9{g%lGa*AavS&kqUXPtG;!bm z!505wTIXHSFR9Cdg$!I@ar%LOo|_C@Wx$;V61dMGQc?<5gqAhb*9!ANdKp0G;T6UJ?KC0S!}2{h84Q6t4Wh8j$kR^BoFUnsu)z>$G6*y$tJ84? zQ7z{pX8}gA>thb4{aUC_oA#BI_RBkR6Q`DxJl;jk%{)%2KG3Ne@?I56b2qNUU|z7S z+LWUcL4evj#`NY~uN`CNdcVfn)mDTSno1m8^wT>%!AJ|5LG!aos$B+D5dvoylMoWW zBt_#ytcGImm=23Z8cIuwOpOYfYz`$l&YYHVH2dehvDA4JEJ^K+&ePX2#}6i?Okc^U z;q+w{e{Q4?4V2Tf{{hfYGZiQU&T)CNx$nv61t~tm*#;GR$GxEN7~Ee#KHE#kwS_6J z6`InMDXtUEE^|`-Qr#L#QP|O~B`_hA!cYkY*=03?BXKHYP_2j=_IG z)3jr7dFp`c59X&FpE?F-$AM#9itnI-ioF9TSc>{M?&g$CqNtzPIg=>PMkcADHG~dM z_C63vLu<$}*pXB4lD0jJf;J4b+Q-t_k~Nix{z<<}$Rr$ZICE0;`wun8TV9r!=&S+G z9ANeIH1MIFj{T>*GXKfQNnIAv&|y1hGtjvJHKfe!(=>zXp(Q-EID`7&8q~QT8XViw zYB__(V(yU7&fq+REjONelcPVl>?r_X3XMd0gYdk9_Qp*DaynwJA6@j5jcU>0>W%U+ z2m^4@+~6vv+#HUqOI_&q08qQsMOX4If(u+YJPBo*6hn>!MfL_72R&nbV=lUh>Ze z&T=OUSpW5bQ)uebdadM4c6P1@wd#^Gt0cQS$z4^_S+SnbI?XE9EG^ZtyIW4qq^y&& zCT7jfn*h@f{5U=vmi$gn1BdAOt*k*ltnhfOQF*Rj_fLg+)jQjA6^pdwAYZRoUtkGL9@TuKDD>@05zW68=D5kc39aX&vtUMvXqlpnVV-bIVcn9 zyrcn3dKv2Ti=iDGi;~g0(!%pdenH4Wo8Tug@Z4v{uUD#xDo}+<4dh}LdI;G_3Mlp{ zKS)mZq4wM%r}jP>QlPI20G#DPoll0Zf2!<3u4RKhaW5SNeJ}u`4eYLyJlMH#9Uc1w z9S+*I>Y71=ptDQBl)=d`0&hnchh)+5b7)cp2FSI{gVrCD+LzE5!%Wj*B$9ge1g@Z} zaH2JX@{jEu9OR%W#|@)&J07k<<@5uoBS4OILY9qj!up~VEwErnF$Gg)5KQVN9kR)K z7CurncAYfn2M)og9`-Rgd0EcDz5`K10Frn#r>75Y1A#0D8^%(?csdeh96LrrRG*A@ z+oxn@L0EwcU^Mka@&OJD6L{>f&WVt2hOkKm76#a|PD+irO5Br^AdJXkq5Dzt?&$1=U+!R9%s5^u28_a(}NHElM^z;`-19 znm=@X?gGtsJ5M?GVm8eE5rSm^KH|XU5vX&vJ+KCAVb$P%#d#CqH=X<4_G#|N+#kRO z&){sTagDr5RiQNZx6Y+*@Cf#{xOd{7?Ev;Iw1;s=d+yTE(3>>jf?p*w6z*;Hd57!- zeJ=N{u3KI9BFmLQd+yR1(0~co3ZLawxOata0LHl754s+7K~T0k+a1_E4gc&4Xodf% zj>J&4+CvU4I?3cp_=p9!$N*bVhyO^1H$f_iMeidU?_;zq6-x>^J7kG+5PLLdLx`wy>Y zTcvjhoQT-&4}gMx@Mb}y*I70b*m2zyt~<`{B{uBy43PUS$is{1N(adP7^JzjRa)+3 zEvz^?)xuaf1j?W-#bc}I28`Mbp4)f`;9=g4Xt%aPZ(GpYZ$jUjp!!x%0HQgh(2L&+ zRRWG=e3*e@&$!+Pk>oMtK9aG?2VvgiBb4F`EPyS+!T4durx}nu)SI7Ye2wkb`lu3g z&zgrG!gem(NOqPj1*WBU+c>oBJvOOw@3CJ5fb4*VWoLuNv)h5M{Y7NpURBlZn|(V$ zyL+eaVIRnN*tZXUfBz>cc(xuxBGVpEVgWy`=IAA zM9{*;n_427^O0qlw-&Ocw7CPm_1xvQGThk#xay!bIMUQW!rZrDWIT%W^$t+a0gbbX zdyli|xm})Iud~;&-L|KP zv-g68$MG%$u($JDKs@=LeCOgdu;XOez-Z6$c)ZRxmhDA;+j-%9+cVbd1ik`ESPhNW zQ{x-EYP>78@eyb|+Is+-cBiIo&@|tNPd)^3F6U`i!8(I2Kw+v_Z=gmpXY8=BzwsY5o6#bR1!4QOh*@_oHcBXUKb)$Ek zw{jQy>UFLHNxeXO!DLUbA^_HVy4jw-wr9vLPhSZ8GEX5?W_X`NN1Y|mq-#Gjo!#fp zf!Oy3?o1Gp1>0P(*RJ&VakI;l?XCAFydMBQ$7v($bGQEMwmaVKo+;3_cO@9}cSwaf zUZ)8o(J$ed;B{_ZvkQ_n&oji^!;`bi(`|00XN=bzQL8~?o@Y2npp2{scX~UUFa&ZO ziJ|Z<424|p3Qq}+$KKB7pKP+w>#VzghQeyk!d4mz;AZ;d+|Ut(9%<9a<9vA@irP+@ z?8T%$3r7;zl;v!M%myQ!ABbfxVEN9UF?saN0JV^?mqJfxJGa7=L32xg=ZMw0J8AZS zc%Fw%u5vq`KHZ_q(f2;^kQeep|0{XdgQOe?D2(qs?DsjI+_|3KOM#xtgM0(jc5_~V zW_AgUVQ0lI>be|o<967?=C+er?3v+p%3-F+gTZ8bx}&F)$&IT!&p7YFj8i~r6$>m| zJsub$UK@u7`1!;I7?$476+r$}@BZa{O<(uao!$5k3&{^od?}8LFc2Hpl%uT(8D-)n|5D9dipybaJPW=fb$FNt~nlivd0;y zEd9aR??uaod7XPNJQ?)l!EV5lG1xOKM&FY>8S`MW!+xP*=y-jTVPIoyPN$%5=iE^4 zy?Y^sAlJFcwSQd_S%#DPI?qIB^+O(eysH}=NSmwRc`0~43Ln?1m~SOos~W=b1}hqF zj#y>w^XXZxs%bHJ{wXrrs&0(JGemW5(Hg6&tbIzXzN#!7i$^NjTALzOiyP02R9NuL zQ)6u;Zbhp>aBEYzCQ{YfvMLe-VI;XKVKrAZM-mM!wQ;MiCDt5HSXE6e(R%felNE1j zNdPZAxV1Qvm>#LK;J)~9A`xpLt<6>VJQH9|byi(dxIT^s*G9rkO>o1!p>lOg%mSNh z@gXi`3CF9N!>z52(Rz?Q540_$N2sQZFwXP4Otb}RLpF_*rlbmfRx`07_U8yS79XUPomAsXpEiRuWc4!sp`iVHP|>fYDLGX`;Yd5Pp8} z%sO`!L>V+{{+7Bre9nNHHdocfA`r_JRq#ArGjg#ohzhy75*|8hiPb=GNqieTkTPa8 z^k2BSDh@82@ebG4qS_j8CPB<)?dWXPtOz{h)>yM3vI@GZ1-iPWntO0X6*yg=XrOq& zgKF3>;84}985LEFXP-U;r9&qgeHx22!!vX63^D~k$cQlZuZ8JOCfBKF{NfaK;DD&aqLI~*o{+i~v9`!!iYmGv zUKLh7*eUVA%a&MGZR1K91ZanTs1UNzNE&TKM})1F;ik5Tg}Nc?R@t&yGZs{p&!|{Z zz5t$-6nTUXI-*U>%4S$`7CEAl~y529B& zea5u%88gx9bk@e9)6p_x7~$wCYo9g~CiVnAsjDY`n18Dl>N-45SV=23Vk7?knE z*rFyL=x`dvm_jh!l*5q&c<5+BgOn=CPNN$jSI~SK;R{-#dW1K(8j}+~ie<)QDjt9m zFb~tn>0~-QmyA6L(<7))#s>Nr{)c1r6hnwV1T~IRJ9aXU2FPq45pYy$X>BLdu(K## zd3Iu_8f(ZE5J=NI9z~$vsuJOP)Sfa4;UrJa(}Y>u(gu$#gF~lzl7Y=r|7&xR_dA z9139!#2esAY?{lV7BV0bTN#0ex$)=@>kkSk9*$JzV$wD@sY4Yi!h>0~wy_xp4J2L- zR7a~|TD7XG;)!t0xm7g{=T_B)8vy`YXNH^Ny1#*mI+Kr%APn;c(-@ZuRWoBP&5O}| zm}kq{VT!3*4674ZEx>9548R1bX=;hX^Wm5%v|hl43y6tDT4@4-p@`3WLyxb3qfT5M zaKS7V3eMt!1+3zg1Gb|;Ll;n5B)b9h!(4~QRyEb78~{n4k!LCuV8((SICe#h;}QiA zKwf|VgIWf{PE5^BosX{&#aMz5Ba7jQ_DHlQqGth~>_g%BOm!GVZ+I@!I#`6CI_l>lNUsDfU5a2GgiD2@x>d1o>q^*`&7KC|bl`7*s+P8RQCk$>7*Lc5 z!??gMpHFibbs#R+%GwvS;iRS=O$M9}EfhDk%573%gI;fpSJl_R;EvW(9|D4hI}Vto zW3C4QtQFwkO(U-n)>~?U25oAA!j99cXqr-BMWPqrzyj`J0w#wT&1Eo{l#sYy9IB-= z@T;{hEex7l4cnsRA)3H*Dt4YuPBaBqc35Y@>KA4P&Qhp}!orSMU^*Tg2bh|w5_n#~ zgE|>E%sgCk@-Y=s9TEl)_m`2@i|l6U8PuRjQQ@W(0IcbxTVVEY@N$VW1mqeoIp=O*O#K zF`41$hA@z@wq(CGM)6$`?RcV8)7*+K;?zn^$Vwl-1+DCS+<*g^$lY!M#sq5!wHVVxhJHxjXE`7sqO%~i|L`C1tgxE;NbUVbRGp29y z2m)Qn82w;5B`2`nwJ0a(n%6BSFeS$~C5!H!xqx}-#(3bl#5FgkaJ@49U{-xAo=Gt|}e% z8%9bM-o52AaNQR{#&L^9$7LMsBY!D^P;{T*z5~Cf#4v6;t1mCFl2;VnA zIR@BY84tRNP2F(@yVF6Rt$z5W3hjrN{PuLwGuV%ve>%$oew4FTiML95iyOy?r-u75 z|6UDnoRM^rH)82ZwRJk~i%h9-)Du)G7!r;JPtkNy94oI26#0`k-KNw#7TnS<${4UW zATT6nr@<@J;H_!!i__rS(%`qG!S7Ck?@NQfmUdIEr6Xg}d zPEyq(CT>;DnzwN3lzCMPXU<#<*JdlGOr1BQN?tL6GwLZ_{TiT7SB*<^^8C5exp~S` zy{j|FF0K(S#$~&>UfAhMr#y4+;^bal7eKnA5QKvGaq!XjYY0L?Ik=Y4cz2jzut+=04IFLK z{L2_eIrwCl#%m3JjFrakU|h!SL4zNU-J1XR23};~Um19@foGs0P|$w7UtG%>$~fvB zY2YIm#|_>_sQJeja?E(1n?_E|kOL3mB;}l!M$RP$ZuSel;t31dIT}9Nodau;B2(Rl8n!Va{XG_&`NkrMyKP z?O)5Z-fDi-fn}50kQ_AOAk%sst@+0?zL&QeuVi|^fwL=wyl&uVzn)Kz2t2~{M+S~^ z%9#Gnz)?;E(_}d8YkOK4SMTIdILawyT)lgtgMS6%K@4PX{3f&xd-Qn?u6MEE2K~Ai2`I}2zD>dWcC-#TLB>}L{_Tvf75EOuHyJqk zrO&^vGjO!$Hs&wnEmk9bD$`~jqMRV-_a3fCemo00!nE1Hn4fzY?-XYg2E~l?1O?Hz zkN3O579Ypa1<%8=AU+sASKtm5eTIYN5JJ?KK4Z~1&be6ns15ZCn?lI(j3fUb-p36+ z%LH4*QSV;PlgY4;MdQ732g+QvN#ggiL*)Yh!J~j>0>0EG0na zsm34YQ+R#dK;u(c{v|^1`x0k4p9s7UC(aiFAH?_%X>dKy=(zoc`3iU(X*{3x4i@+(WPnm4@UJ;O zCks5T*y;QkceVTk4l*dG3H~2A{xt&shhpa!EOyBGp7|~k`~^7ZptdfHLmB+Z0@eug0R~_}QNNGfX@5^$o5O_B0y+PpmeB(ZWpU?gKq`{(4d1 zf8hAPDe&z)9`!m_`}?JG-}+YYZ(!VEJ(|CT`2qsJk;laVf#1jT-thvzkohMFT+5#! zaD5yq7x*3?UsVD>o$)4t?`6N*1%8j7R|T$bUjMnkvzY&8fq%pC*)8zXx!)fW_&+#L zo)vgCixwX`G17%FW`RD{eC~^;b4I;;PG4{ z@UvL&$pRn1{i4qcwET9KbDH4)nC+|)_^a$stH9r9ITs3CkIzd5-izg2EAVwp-zM-m z9EaZu{1DTR3H&hg9}xI8?APl8#}{W}`9R=f3*x%j~ zXZgbf{tVkQM&Mp5ytbz>C=5_XNJ1?ayX;IzB5{ z&ItnF$nlvc@Y9)pg}|TJ$60~bG5xf_qwMb|0@wZF=lZ0bZ2v@ozsv2H2>cIhKRoK0 z(vOcbevQE2WcjxU{8!BXyu>-quM2!T$Kg)`w>i(L z{J#v9_9GlFYt@Ff1eU~ zInQ4&34A8wZwvfP_UluDZ)X1Q1YX4U!&7G|@wuGinJe%G9EX7d_p{s+1iqO2eWJiO za6ioy`1KsO#R8`{pMr(U1%55(NwdJ;WclX_{3MqDGl93WoT~-?75n=uf#1Y(ek1To z6-Mh}fuF+keu1CM{ql;yZ)EyCfgfP`UkDuEbdKfk0)L6)pUHk;Hw}i*2OJ-LJwW5r zIe&%-{@*h_Qs7?h_sJ6H{Fx*06Zkk-DexfM-6Zf;9Org{zs7O9MBpcLKL1?cHp{tL z;B9QrZh=QRJ`V|eJ;zh8YjoVIng5XB$M=9>c~{_VOn)KpaU4&F{m}CBS#Ln#eK~LS z>yR}6jcm^d!9SAoAfKAQ94e1UIgzcvZHldF~1jo#Db#Zpw~l#1&;59$5JftA?)u|f$R0yLV-WWaXVAsx3c_m1g_p3 zY*{M>p2_{PPT zeFH4T0>7K{aFW3Hv7C^=^*V2fz_q{C0w2$MTLk_A_u~ZuAAtr#*(~rH&gW|d&fRGJ zPT;>|{>K@|v^1~J?-%@MaNZs=`0;lxUH&Zi^>v588T=@JEjMrl)Q*n-Vm35~acvK? zTfGE-KkkfxtiD@%VFrm$2SD1>Vl%`Duac>n3js{Cc+M zuL4(pTMAxU)gv`N`nQnd1U`%9%ocb*4qT(aPiOwM0$;^(*upr*A493{Bf3TKALabq zW#IUmr2gGykH9&c)`LR6z8>O9qbek0;c!UJ>|k#t#em5%%{#1%4jm zJ~mk9TWN_HyJqkdn)6t0zZlI zHUl3F*rPn3tTAwuvy}PQ3w#mdn+zP~yv^hNDg#G33Ff~>;H`|`VBjc6|4wj+!1eo^ z?iaXTS3P0isP{6K|Fpm_Vf>K5cQXFEz;9vvEyi`8?`MC%GWgN{KXV8F-N4bFXIPHD zWfJ=x@x6@0TPmm^9)!;fqTqdR29Eqk81EzSHyIzuxVH0SwsWMxk9N|JuCSS8;3)qq ztb=lj!2hCPYnqVnxKzb*!T)#WuNC$GJ@t+wurmUXdt}$?A{g(Z` zDGmM*<2wH8{#?s?OyF*ovp=D&||Br%>78Gqd14+5_55BR--e=ao`IvB z=b68kz@K4!FylyK+!`1kVekh5p9CK)@YX^qIx5ATj&epb|2To4!1yEs zM>%?(Fx|jW&O+u734AW&^9>y3=yk#w0@v$=X2!9*QN&1If38e}Z!_eeJvFR%yTHSY z-;_qq&NTQwA*Y$;JS%X0zv)4N>-$O%2^{`5J(afvzLD{F1-_o~PZ`(ospR;4ZSV&{ za+wluIedeG9*M_*ljl3OV|^+_?sB z9;Yrga18NOmUD%`?_>N{1IOdebr>utyA2%WyvqDf8aVRrg%6hJ4IKI3V*Ym+*TuJ3E_FK|7N4HCHSuVIYqe!PwIbF9HX z81$ctPD7a?aBb%zf$RGc&JgmCaC~BdU(30`z;PZ}&-`lzzJ~FQ299>>-%YPHaFlaB z^Z#7n+Zn&kz){Xjz8-apfukIK|IqCMzl-JE&A5)|hm1dv2LFSQb3gOHCh&V1e^5QJ!aWg7l9f}bzrSXUZ2_KUtR>Slp! zd+rzb4IGT81m2(f{Q%>-fAw<~?+Jb_|1$%}yc)rB{vz-}jQ>r@AI`X|KQxA-=R{Y8u)Yw!m_&b9EtGRDABek1drC~$o}|70P5KJzaW_!!13 z)8KI-U;i$!O5m$m&V@qGbjGhV_%R$MHI3jldt^dGcn) zb)M+wq@EP`V;s)|Y4A_e;9sY~1DIq`wBCa(zjqpZ6yq2c+}*(aK2G5J_pDRW$eEP} zuT6tDr@?>5xbDaIxnH)V!AGI9P|#nVs)^QfILhIaAv{3e9r0n3u36ze@(+Q}VkDpp zQ=26I3#N}3_&rP)3;boKM+^K1rpF6>06GF?lG-HomNGtF;PV-uEpUB(c!9tp%&+~^ z{ze(E6#VBiewM&DFkUV2%NVa0_|=Rz3H(;ZR|tF;<9gky?R=2&^9BEY#@7n`HO4mz zTt8QHsldNxe!cF{dR;t@t`_|I_n_+q-jn%n6!;LvZxuMc_X5jKwMq87zAtXKz-KbQ z&O2>q1>^S%{<9c=MBw`R-V*}X*YOT8j$vUDgy`eB#`XLbWPao|`Ns-e^MwRn%Ji86 z*X!7|0zb&~E`jUw_q_twb{-PAzApWp#Cbl~zmI9Z^t$B)&KHgA`wFb$czZLvA`rHT znA$ezJ$SQkxHy3?3NFT1v{}W~@winSYe53pM-`7sB_{xhZHNK(it+W9O#;*;yk@!{ zUY1wa0@7(eTwNWDtW2qf_V_k0)Jk#{Uo0H0hc_B>vskpgGY`Cq4PHZ{?@AKD;103?TqkBMSO>zQWR-`w{GH#!vEVP2of;#dY;z;OL<5BNfSNq zYd$Qb8 zJno@PeO%Fkwf^5|fVWz|-j)L1Rr@`>ZtA8PxxMyZ!x$#qm-g@F4%w?2xqXngdb1FA zx{CjId;r?SlLy8hmxNkBU#7Df0qaWtT4vPGe*+tpAaC`i7IwPQzxE8pv6UH7Ki(Q8 z^{)m@xJWGuaUzDYmDekZ>dYI5imvnrc;YJ^r&^+Zyp>Vv-vC%w`gb0u+Ue)T6xEp* z&riB)|7DSCaTywC6v=xP)OBTl**4Wk_Y>NWw<=2ealV!^vE_xF&?AvBisbz@)ODr5 zf%WV5s2|6^)c-JGQYJvwZq~1lw}@epya&6$kni*{_zl08@_CG+I=9E;YFGAO$M%PK zV4?ka@R9bv2^iX>{e)dAPx8X?GCn`ixVB$!KZJ^|+Aj#H7C+tGB2;xo`0P$n6b?b|o)9myVb)Gx r(): {tm_0.r()} (Exp: 20)") - - # Write - tm_0.w(99) - print(f"w(99) -> r(): {tm_0.r()} (Exp: 99)") - - # Step N - tm_0.sn(2) - print(f"sn(2) -> r(): {tm_0.r()} (Exp: 40)") # 0->1->3 (Indices: 0, 1, 2, 3) - - # Step Left - tm_0.ls() - print(f"ls() -> r(): {tm_0.r()} (Exp: 30)") - - # Bulk Write (wn) - # Current head is at index 2 (val 30) - # Write [33, 44] -> overwrites 30, 40 - tm_0.wn([33 ,44]) - print("wn([33 ,44])") - - # Bulk Read (rn) - read_back = tm_0.rn(2) - print(f"rn(2): {read_back} (Exp: [33, 44])") - - # 3. Allocation - # --------------------------------------------------------- - print("\n[3] Allocation") - - # Append Right (aR) - tm_0.aR(60) - print(f"aR(60) -> len: {tm_0.len()} (Exp: 6)") - - # Append Left (aL) - # Head is at index 2. - # aL inserts at 0. Indices shift right. - # Head should increment to 3 to stay on '33'. - print(f"Pre-aL Head: {tm_0.address()}") - tm_0.aL(0) - print(f"aL(0) -> Head: {tm_0.address()} (Exp: 3)") - print(f"Value at Head: {tm_0.r()} (Exp: 33)") - - # Check 0 index - tm_0.lsn(3) # Go to 0 - print(f"Value at 0: {tm_0.r()} (Exp: 0)") - - # 4. Deletion - # --------------------------------------------------------- - print("\n[4] Deletion") - - # Current Tape: [0, 10, 99, 33, 44, 50, 60] - # Head at 0. - - # esd (Delete Neighbor -> 10) - tm_0.esd() - print(f"esd() -> Tape[1] should be 99. r(2): {tm_0.rn(2)} (Exp: [0, 99])") - - # d (Delete Current -> 0) - tm_0.d() - # Head stays at 0, which is now 99 - print(f"d() -> Current: {tm_0.r()} (Exp: 99)") - - # 5. Cloning (Entanglement) - # --------------------------------------------------------- - print("\n[5] Cloning") - tm_clone = tm_0.e() - print("Created tm_clone from tm_0") - - # Modify tm_0, check tm_clone - tm_0.w(999) - print(f"tm_0.w(999)") - print(f"tm_clone.r(): {tm_clone.r()} (Exp: 999)") - - print("\n--- end of examples ---") - -if __name__ == "__main__": - CLI() - - diff --git a/developer/authored/example_TM_1.py b/developer/authored/example_TM_1.py deleted file mode 100755 index 73795d2..0000000 --- a/developer/authored/example_TM_1.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python3 -import sys -from TM import TM - -def CLI(): - print("--- TM Edge Cases (example_TM_1) ---") - - # 1. Entanglement Violation (Safety Check) - # --------------------------------------------------------- - print("\n[1] Entanglement Violation (Peer on Victim)") - - t1 = TM(['A' ,'B' ,'C']) - t2 = t1.e() # Entangled Clone - - # Setup: - # t1 at 0 ('A') - # t2 moves to 1 ('B') - t2.s() - print(f"Setup: t1@{t1.address()}, t2@{t2.address()}") - - print("Action: t1.esd() -> Tries to delete 'B'") - print("Expect: RuntimeError (Entanglement Violation)") - - try: - t1.esd() - print("!! FAILED: Operation succeeded (Should have failed)") - except RuntimeError as e: - print(f">> CAUGHT EXPECTED ERROR: {e}") - - # 2. Entanglement Violation (Peer on Current) - # --------------------------------------------------------- - print("\n[2] Entanglement Violation (Peer on Current)") - - # t1 at 0. t2 at 1. - # Move t2 back to 0. Both at 0. - t2.ls() - print(f"Setup: t1@{t1.address()}, t2@{t2.address()}") - - print("Action: t1.d() -> Tries to delete 'A'") - print("Expect: RuntimeError") - - try: - t1.d() - print("!! FAILED: Operation succeeded") - except RuntimeError as e: - print(f">> CAUGHT EXPECTED ERROR: {e}") - - # 3. Safe Deletion (No Peer Collision) - # --------------------------------------------------------- - print("\n[3] Safe Deletion (Peer Safe)") - - # t1 at 0 ('A'), t2 at 0 ('A'). - # Move t2 to 2 ('C'). - t2.sn(2) - print(f"Setup: t1@{t1.address()} ('A'), t2@{t2.address()} ('C')") - - # t1 deletes 'B' (neighbor). 'B' is at index 1. - # t2 is at index 2. Safe? - # Yes. t2 is not ON the cell being deleted. - # Note: t2's data will shift left index-wise, but Entanglement check - # only cares if t2 is *on* the deleted cell. - - print("Action: t1.esd() -> Delete 'B'") - t1.esd() - print(">> Success (Operation Permitted)") - print(f"Tape is now: {t1.rn(2)}") - - # 4. Map Input (Materialization) - # --------------------------------------------------------- - print("\n[4] Map Input") - data_map = {'key1': 1 , 'key2': 2} - tm_map = TM(data_map) - print(f"TM from Map keys: {tm_map.rn(2)}") - - print("\n--- Finished ---") - -if __name__ == "__main__": - CLI() - diff --git a/developer/authored/example_TM_SR_ND.py b/developer/authored/example_TM_SR_ND.py deleted file mode 100755 index fcd591f..0000000 --- a/developer/authored/example_TM_SR_ND.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -from TM import TM - -def test_base_machine(): - print("--- TM·Array_SR_ND Verification ---") - - data = [10, 20, 30] - tm = TM(data) - print(f"Created TM. Data: {data}") - - # Forward Scan - print("\n[Forward Scan]") - while True: - print(f"Read: {tm.r()}") - if tm.qR(): break - tm.s() - - # Rewind - print("\n[Rewind]") - tm.LsR() - print(f"After LsR, Read: {tm.r()} (Expected: 10)") - - # Write - tm.w(999) - print(f"Wrote 999. Read: {tm.r()} (Expected: 999)") - -if __name__ == "__main__": - test_base_machine() diff --git a/developer/authored/example_TM_SR_ND_aR.py b/developer/authored/example_TM_SR_ND_aR.py deleted file mode 100755 index 290774a..0000000 --- a/developer/authored/example_TM_SR_ND_aR.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python3 -from TM import TMS, Features - -def test_ar_machine(): - print("--- TM_ARRAY_SR_ND_aR Verification ---") - - # 1. Initialization with Feature (Mandatory Data) - data = [10, 20, 30] - t = TMS(data, features=[Features.APPEND_RIGHT]) - - print(f"Created Machine t1. Len: {t.len()}") - - # 2. Test Append on t1 - t.s() # Step to 20 - print("Executing t1.aR(99)...") - t.aR(99) - print(f"t1 Len: {t.len()} (Expected: 4)") - print(f"t1 Content from Head: {t.rn(3)} (Expected: [20, 30, 99])") - - # 3. Test Entanglement (Shared Tape) - # --------------------------------------------------------- - t2 = t.e() - print("\nCreated entangled machine t2 from t1.") - - print("Executing t2.aR(100)...") - t2.aR(100) - - # Verify t2 (The actor) - print(f"t2 Len: {t2.len()} (Expected: 5)") - - # Verify t1 (The observer) - PROOF OF ENTANGLEMENT - # t1 should see the change immediately because the tape is shared. - print(f"t1 Len: {t.len()} (Expected: 5)") - - if t.len() == 5: - print(">> SUCCESS: t1 reflects change made by t2 (Tape is shared).") - else: - print("!! FAIL: t1 did not see the change (Tape is copied?).") - - # 4. Verify Base Restrictions - try: - t.ls() - print("!! FAIL: ls() succeeded") - except AttributeError: - print(">> SUCCESS: ls() blocked.") - -if __name__ == "__main__": - test_ar_machine() diff --git a/developer/authored/example_features.py b/developer/authored/example_features.py deleted file mode 100755 index 7233dc6..0000000 --- a/developer/authored/example_features.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -from TM import TM, TMS, Features - -def test_base_machine(): - print("\n--- Test 1: Base Machine (TM_SR_ND) ---") - data = [10, 20, 30] - - # No features requested - t = TMS(data) - print(f"Created Base Machine: {t.len()} items.") - - # 1. Step & Read (Should work) - t.s() - print(f"Step -> Val: {t.r()} (Expected: 20)") - - # 2. Try Append (Should FAIL) - print("Attempting aR()...") - try: - t.aR(99) - print("!! FAIL: aR() succeeded on Base Machine") - except AttributeError: - print(">> SUCCESS: Caught expected AttributeError (Feature missing)") - -def test_ar_machine(): - print("\n--- Test 2: Feature Machine (TM_SR_ND_AR) ---") - data = [10, 20, 30] - - # Feature requested - t = TMS(data, features=[Features.APPEND_RIGHT]) - print(f"Created Feature Machine: {t.len()} items.") - - # 1. Step - t.s() - - # 2. Append (Should WORK) - print("Attempting aR(99)...") - try: - t.aR(99) - print(f">> SUCCESS: aR() completed. New Len: {t.len()}") - - # Verify data - print(f"Tape content (from head): {t.rn(5)}") - except AttributeError as e: - print(f"!! FAIL: {e}") - - # 3. Entanglement Check - print("Entangling...") - t2 = t.e() - print("Attempting aR(100) on Clone...") - try: - t2.aR(100) - print(f">> SUCCESS: Clone inherited aR feature. Len: {t2.len()}") - except AttributeError: - print("!! FAIL: Clone lost the feature!") - -if __name__ == "__main__": - test_base_machine() - test_ar_machine() - diff --git a/developer/authored/example_queries.py b/developer/authored/example_queries.py deleted file mode 100755 index 3801579..0000000 --- a/developer/authored/example_queries.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -from SymbolSpace import SymbolSpace -from Binder import Binder -from DiscreteFunction import DiscreteFunction -from Namespace import DifferentiatedSymbol ,OrderedNamespace - -def example_queries(): - print("--- Epimetheus Architecture Example ---") - - # 1. System Initialization - binder = Binder() - graph = DiscreteFunction() - - # 2. Ontology Definition (The Factories) - Frame = DifferentiatedSymbol("FrameMaterial") - Price = OrderedNamespace("Price") - - # 3. Data Ingestion (Transient Objects) - data_source = [ - ("Bike_A" ,"Carbon" ,3500), - ("Bike_B" ,"Steel" ,800), - ("Bike_C" ,"Alum" ,1200), - ("Bike_D" ,"Carbon" ,1500), - ] - - print(f"Ingesting {len(data_source)} items...") - - # Keep references to prevent GC during ingestion for this example - start_objects = [] - - for label, material, cost in data_source: - # A. Create the Python Object - obj = type("Bike", (), {"label": label})() - start_objects.append(obj) - - # B. Bind: Object -> Symbol - sym_bike = binder.get_symbol(obj) - - # C. Describe: Symbol -> Properties - graph.set(sym_bike ,Frame(material)) - graph.set(sym_bike ,Price(cost)) - - # --------------------------------------------------------- - # Example 1: Exact Query ("Find Carbon Frames") - # --------------------------------------------------------- - print("\n[Example 1] Exact Match: Frame('Carbon')") - - # We ask the Factory for the symbol representing 'Carbon' - sym_carbon = Frame("Carbon") - - # We ask the Graph for entities with that symbol - results = graph.find(sym_carbon) - print(f" -> Found {len(results)} bikes with Carbon frames.") - - # --------------------------------------------------------- - # Example 2: Range Query ("Find Price 1000..2000") - # --------------------------------------------------------- - print("\n[Example 2] Range Match: Price(1000..2000)") - - # Step A: Ask Namespace for symbols in range - # The OrderedNamespace uses bisect to find symbols efficiently - price_symbols = Price.find_range(1000 ,2000) - print(f" -> Namespace identified {len(price_symbols)} relevant price points.") - - # Step B: Ask Graph for objects having ANY of those symbols - matches = set() - for p_sym in price_symbols: - found = graph.find(p_sym) - matches.update(found) - - print(f" -> Graph resolved {len(matches)} bikes in price range.") - - # --------------------------------------------------------- - # Example 3: Hierarchy Query ("Find Priced Things") - # --------------------------------------------------------- - print("\n[Example 3] Hierarchy Match: Has Price") - - # We query the Root Symbol of the Price namespace. - # This works because the Graph automatically 'posts' up to the parent. - # FIXED: Changed .root to .root_symbol to match Namespace.py - all_priced = graph.find(Price.root_symbol) - print(f" -> Found {len(all_priced)} objects that have a price.") - -def CLI(): - example_queries() - -if __name__ == "__main__": - CLI() diff --git a/developer/authored/example_region.py b/developer/authored/example_region.py deleted file mode 100644 index 1ab3aba..0000000 --- a/developer/authored/example_region.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 -from TM import TMS, RegionMachine - -def test_region(): - print("--- Region Machine Verification ---") - - # Tape: [10, 20, 30, 40, 50] - t = TMS([10, 20, 30, 40, 50]) - - # Create Region. Initially Boundaries are at 0 (start). - # Region is [0, 0] (Single Cell). - rm = RegionMachine(t) - - print("Region Initialized [0, 0].") - print(f"qL: {rm.qL()} (Exp: True)") - print(f"qR: {rm.qR()} (Exp: True)") - - # Expand Region: Move Right Boundary to index 2 - print("Expanding Right Boundary to index 2...") - rm.t_right.sn(2) - - # Region is now [0, 2] (Indices 0, 1, 2) - print(f"qR (Active at 0): {rm.qR()} (Exp: False)") - - # Move Active Head - rm.s() # To 1 - print(f"Active at 1. Val: {rm.r()}") - rm.s() # To 2 - print(f"Active at 2. Val: {rm.r()}") - - print(f"qR (Active at 2): {rm.qR()} (Exp: True)") - - # Try to step out of region - print("Attempting to step past Right Boundary...") - try: - rm.s() - print("!! FAIL: Stepped out of region!") - except RuntimeError as e: - print(f">> SUCCESS: Blocked by Boundary. ({e})") - -if __name__ == "__main__": - test_region() - -- 2.20.1