From a02daf651e089bfecf1aaeecddab4f0ead309709 Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Tue, 10 Feb 2026 08:57:41 +0000 Subject: [PATCH] first try at the 66 first order TM variations --- developer/authored/TM.py | 93 ++- developer/authored/TM_module.c | 551 ++++++++++++++---- .../temp.linux-x86_64-cpython-311/TM_module.o | Bin 37864 -> 128256 bytes developer/authored/example_machines.py | 40 ++ developer/deprecated_examples/example_TM_0.py | 104 ++++ developer/deprecated_examples/example_TM_1.py | 79 +++ .../deprecated_examples/example_TM_ND.py | 29 + .../deprecated_examples/example_TM_SR_ND.py | 35 ++ .../example_TM_SR_ND_aR.py | 48 ++ .../deprecated_examples/example_features.py | 59 ++ .../deprecated_examples/example_queries.py | 88 +++ .../deprecated_examples/example_region.py | 43 ++ developer/old_code.tar | Bin 51200 -> 0 bytes document/TM.html | 102 ++++ 14 files changed, 1091 insertions(+), 180 deletions(-) create mode 100755 developer/authored/example_machines.py create mode 100755 developer/deprecated_examples/example_TM_0.py create mode 100755 developer/deprecated_examples/example_TM_1.py create mode 100755 developer/deprecated_examples/example_TM_ND.py create mode 100755 developer/deprecated_examples/example_TM_SR_ND.py create mode 100755 developer/deprecated_examples/example_TM_SR_ND_aR.py create mode 100755 developer/deprecated_examples/example_features.py create mode 100755 developer/deprecated_examples/example_queries.py create mode 100644 developer/deprecated_examples/example_region.py delete mode 100644 developer/old_code.tar diff --git a/developer/authored/TM.py b/developer/authored/TM.py index a20fb31..24a262e 100755 --- a/developer/authored/TM.py +++ b/developer/authored/TM.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 import sys -from Symbol import Symbol try: import TM_module @@ -9,71 +8,49 @@ except ImportError: sys.exit(1) # ========================================== -# 1. The TM Stub (Callable Proxy) +# TM Command Language (Explicit Types) # ========================================== -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 +# Import all C-defined types into this namespace +_this_module = sys.modules[__name__] +for name in dir(TM_module): + if name.startswith("TM_") or name.startswith("TMA_"): + setattr(_this_module, name, getattr(TM_module, name)) # ========================================== -# 3. The Implementation Logic +# Defaults (Aliasing) # ========================================== -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) +# Pattern: TM_[Container]_[Direction]_[Entanglement] +# Default Container: Arr +# Default Entanglement: ND +# Default Direction: SR - # Check Empty - if not fs: return TM_module.TM_Array_SR_ND(data_obj) +# --- Global Default --- +TM = TM_module.TM_Arr_SR_ND - # 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) +# --- Container Defaults (Dir=SR, Ent=ND) --- +TM_Arr = TM_module.TM_Arr_SR_ND +TM_ArrV = TM_module.TM_ArrV_SR_ND +TM_Gr = TM_module.TM_Gr_SR_ND +TM_Glr = TM_module.TM_Glr_SR_ND +TM_Set = TM_module.TM_Set_SR_ND +TM_Map = TM_module.TM_Map_SR_ND +TM_MapK = TM_module.TM_MapK_SR_ND +TM_MapV = TM_module.TM_MapV_SR_ND +TM_ASCII= TM_module.TM_ASCII_SR_ND +TM_UTF8 = TM_module.TM_UTF8_SR_ND +TM_BCD = TM_module.TM_BCD_SR_ND - # Unknowns - raise ValueError(f"Unrecognized features: {fs}") +# --- Direction Defaults (Cont=Arr, Ent=ND) --- +TM_SR = TM_module.TM_Arr_SR_ND +TM_SL = TM_module.TM_Arr_SL_ND -# ========================================== -# 4. Bind the Logic -# ========================================== +# --- Entanglement Defaults (Cont=Arr, Dir=SR) --- +TM_ND = TM_module.TM_Arr_SR_ND +TM_SO = TM_module.TM_Arr_SR_SO +TM_EA = TM_module.TM_Arr_SR_EA -TM._impl = _tm_implementation +# --- Common Partials --- +TM_Arr_SL = TM_module.TM_Arr_SL_ND +TM_ASCII_SL = TM_module.TM_ASCII_SL_ND diff --git a/developer/authored/TM_module.c b/developer/authored/TM_module.c index 81be861..0330947 100644 --- a/developer/authored/TM_module.c +++ b/developer/authored/TM_module.c @@ -1,204 +1,511 @@ /* TM_module.c - CPython Extension: Tape Machine Types + CPython Extension: Tape Machine Factory + Implements: - - TM·Array_SR_ND - - TM·Array_ND + - 66 Concrete Machine Types (TM·[Container]·[Dir]·[Ent]) + - TMA_NaturalNumber (Abstract Machine) + + Namespaces: + - TM·Arr· : Implementation logic for Array/List backed machines. + - TM·Nat· : Implementation logic for the Abstract Natural Number machine. */ -/* #define · _ */ +/* 1. COMPILER COMPATIBILITY */ +/* If your compiler does not support UTF-8 identifiers, + uncomment the line below to map dot to underscore. +*/ +// #define · _ #define PY_SSIZE_T_CLEAN #include #include "structmember.h" -#include /* ========================================================= */ -/* 1. DATA LAYOUT */ +/* SHARED IMPLEMENTATION: ARRAY / LIST BACKED */ /* ========================================================= */ +/* TM·Arr (Instance Data) + Previously 'FastTM'. Represents the state for all array-backed types. +*/ typedef struct { PyObject_HEAD PyObject* tape_obj; /* The Container (List) */ - PyObject** head_ptr; /* Current Cell */ - PyObject** start_ptr; /* Leftmost Cell (Cache) */ - PyObject** end_ptr; /* Rightmost Cell + 1 (Sentinel) */ -} FastTM; + PyObject** head_ptr; /* Pointer to Current Item */ + PyObject** start_ptr; /* Pointer to Start */ + PyObject** end_ptr; /* Pointer to End (Sentinel) */ + Py_ssize_t head_idx; /* Index Cache (Required for Resizing containers) */ +} TM·Arr; -static void FastTM_dealloc(FastTM* self){ +static void TM·Arr·dealloc(TM·Arr* self){ Py_XDECREF(self->tape_obj); Py_TYPE(self)->tp_free((PyObject*)self); } -static int refresh_pointers(FastTM* self){ - if (!PyList_Check(self->tape_obj)) return -1; +static int TM·Arr·init(TM·Arr* self, PyObject* args, PyObject* kwds){ + PyObject* input_obj = NULL; + if( !PyArg_ParseTuple(args, "O", &input_obj) ) return -1; + + if( !PyList_Check(input_obj) ){ + PyErr_SetString(PyExc_TypeError, "This implementation requires a Python List."); + return -1; + } + if (PyList_Size(input_obj) == 0) { + PyErr_SetString(PyExc_ValueError, "TM cannot be empty."); + return -1; + } + + self->tape_obj = input_obj; + Py_INCREF(self->tape_obj); + + /* Initialize Pointers */ 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; + self->head_ptr = items; + self->head_idx = 0; + return 0; } +/* --- Helper: Sync Pointers after Resize --- */ +static void TM·Arr·sync(TM·Arr* self){ + 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 + self->head_idx; +} + /* ========================================================= */ -/* 2. MIXINS */ +/* NAMESPACE: TM·Arr (Methods) */ /* ========================================================= */ -/* --- Navigation --- */ -static PyObject* Mixin·s(FastTM* self){ - self->head_ptr++; - Py_RETURN_NONE; +/* --- PRIMITIVES: NAVIGATION --- */ +static PyObject* TM·Arr·s(TM·Arr* self){ + self->head_ptr++; self->head_idx++; Py_RETURN_NONE; +} +static PyObject* TM·Arr·ls(TM·Arr* self){ + self->head_ptr--; self->head_idx--; Py_RETURN_NONE; +} +static PyObject* TM·Arr·sn(TM·Arr* self, PyObject* args){ + Py_ssize_t n; if(!PyArg_ParseTuple(args, "n", &n)) return NULL; + self->head_ptr += n; self->head_idx += n; Py_RETURN_NONE; +} +static PyObject* TM·Arr·lsn(TM·Arr* self, PyObject* args){ + Py_ssize_t n; if(!PyArg_ParseTuple(args, "n", &n)) return NULL; + self->head_ptr -= n; self->head_idx -= n; Py_RETURN_NONE; +} +static PyObject* TM·Arr·sR(TM·Arr* self){ + self->head_idx = (self->end_ptr - self->start_ptr) - 1; + self->head_ptr = self->end_ptr - 1; + Py_RETURN_NONE; +} +static PyObject* TM·Arr·LsR(TM·Arr* self){ + self->head_ptr = self->start_ptr; self->head_idx = 0; Py_RETURN_NONE; +} + +/* --- PRIMITIVES: I/O --- */ +static PyObject* TM·Arr·r(TM·Arr* self){ + PyObject* item = *(self->head_ptr); Py_INCREF(item); return item; } +static PyObject* TM·Arr·w(TM·Arr* self, PyObject* val){ + PyObject* old = *(self->head_ptr); Py_INCREF(val); *(self->head_ptr) = val; Py_DECREF(old); Py_RETURN_NONE; +} + +/* --- PRIMITIVES: QUERY --- */ +static PyObject* TM·Arr·qR(TM·Arr* self){ return (self->head_ptr >= self->end_ptr - 1) ? Py_True : Py_False; } +static PyObject* TM·Arr·qL(TM·Arr* self){ return (self->head_ptr <= self->start_ptr) ? Py_True : Py_False; } + + +/* --- PRIMITIVES: DESTRUCTIVE (Variable Array Only) --- */ -static PyObject* Mixin·sn(FastTM* self, PyObject* arg_tuple){ - Py_ssize_t n_val; - if( !PyArg_ParseTuple(arg_tuple, "n", &n_val) ) return NULL; - self->head_ptr += n_val; +/* d(): Delete current cell */ +static PyObject* TM·Arr·d(TM·Arr* self){ + if (PyList_SetSlice(self->tape_obj, self->head_idx, self->head_idx+1, NULL) < 0) return NULL; + + TM·Arr·sync(self); + + /* Safety: If we deleted the last element */ + if (self->head_ptr >= self->end_ptr && self->head_idx > 0) { + if (self->start_ptr == self->end_ptr) { + PyErr_SetString(PyExc_RuntimeError, "TM Empty: First Order Invariant Broken."); + return NULL; + } + self->head_idx--; + self->head_ptr--; + } Py_RETURN_NONE; } -static PyObject* Mixin·ls(FastTM* self){ - self->head_ptr--; +/* a(v): Insert value at current head */ +static PyObject* TM·Arr·a(TM·Arr* self, PyObject* val){ + if (PyList_Insert(self->tape_obj, self->head_idx, val) < 0) return NULL; + TM·Arr·sync(self); Py_RETURN_NONE; } -static PyObject* Mixin·LsR(FastTM* self){ - self->head_ptr = self->start_ptr; +/* esd(): Delete Right Neighbor */ +static PyObject* TM·Arr·esd(TM·Arr* self){ + if (self->head_ptr >= self->end_ptr - 1) { + PyErr_SetString(PyExc_IndexError, "esd: No right neighbor."); + return NULL; + } + if (PyList_SetSlice(self->tape_obj, self->head_idx+1, self->head_idx+2, NULL) < 0) return NULL; + TM·Arr·sync(self); Py_RETURN_NONE; } -static PyObject* Mixin·sR(FastTM* self){ - self->head_ptr = self->end_ptr - 1; +/* Lesd(): Delete Left Neighbor */ +static PyObject* TM·Arr·Lesd(TM·Arr* self){ + if (self->head_ptr <= self->start_ptr) { + PyErr_SetString(PyExc_IndexError, "Lesd: No left neighbor."); + return NULL; + } + /* Delete at head_idx - 1 */ + if (PyList_SetSlice(self->tape_obj, self->head_idx-1, self->head_idx, NULL) < 0) return NULL; + + self->head_idx--; /* We shifted left */ + TM·Arr·sync(self); Py_RETURN_NONE; } -/* --- I/O --- */ -static PyObject* Mixin·r(FastTM* self){ - PyObject* item = *(self->head_ptr); - Py_INCREF(item); - return item; + +/* ========================================================= */ +/* METHOD TABLES */ +/* ========================================================= */ + +/* 1. NON-DESTRUCTIVE (ND) TABLES */ + +static PyMethodDef Table·SR·ND[] = { + {"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""}, + {"sn",(PyCFunction)TM·Arr·sn,METH_VARARGS,""}, + {"r", (PyCFunction)TM·Arr·r, METH_NOARGS, ""}, + {"w", (PyCFunction)TM·Arr·w, METH_O, ""}, + {"qR",(PyCFunction)TM·Arr·qR,METH_NOARGS, ""}, + {"LsR",(PyCFunction)TM·Arr·LsR,METH_NOARGS,""}, + {NULL} +}; + +static PyMethodDef Table·SL·ND[] = { + {"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""}, + {"sn",(PyCFunction)TM·Arr·sn,METH_VARARGS,""}, + {"ls",(PyCFunction)TM·Arr·ls,METH_NOARGS, ""}, + {"lsn",(PyCFunction)TM·Arr·lsn,METH_VARARGS,""}, + {"r", (PyCFunction)TM·Arr·r, METH_NOARGS, ""}, + {"w", (PyCFunction)TM·Arr·w, METH_O, ""}, + {"qR",(PyCFunction)TM·Arr·qR,METH_NOARGS, ""}, + {"qL",(PyCFunction)TM·Arr·qL,METH_NOARGS, ""}, + {"sR",(PyCFunction)TM·Arr·sR,METH_NOARGS, ""}, + {"LsR",(PyCFunction)TM·Arr·LsR,METH_NOARGS,""}, + {NULL} +}; + +/* 2. DESTRUCTIVE (SO) TABLES - For ArrV */ + +static PyMethodDef Table·SR·SO[] = { + {"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""}, + {"sn",(PyCFunction)TM·Arr·sn,METH_VARARGS,""}, + {"r", (PyCFunction)TM·Arr·r, METH_NOARGS, ""}, + {"w", (PyCFunction)TM·Arr·w, METH_O, ""}, + {"d", (PyCFunction)TM·Arr·d, METH_NOARGS, ""}, + {"a", (PyCFunction)TM·Arr·a, METH_O, ""}, + {"esd",(PyCFunction)TM·Arr·esd,METH_NOARGS,""}, + {"qR",(PyCFunction)TM·Arr·qR,METH_NOARGS, ""}, + {"LsR",(PyCFunction)TM·Arr·LsR,METH_NOARGS,""}, + {NULL} +}; + +static PyMethodDef Table·SL·SO[] = { + {"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""}, + {"ls",(PyCFunction)TM·Arr·ls,METH_NOARGS, ""}, + {"r", (PyCFunction)TM·Arr·r, METH_NOARGS, ""}, + {"w", (PyCFunction)TM·Arr·w, METH_O, ""}, + {"d", (PyCFunction)TM·Arr·d, METH_NOARGS, ""}, + {"a", (PyCFunction)TM·Arr·a, METH_O, ""}, + {"esd",(PyCFunction)TM·Arr·esd,METH_NOARGS,""}, + {"Lesd",(PyCFunction)TM·Arr·Lesd,METH_NOARGS,""}, + {"qR",(PyCFunction)TM·Arr·qR,METH_NOARGS, ""}, + {"qL",(PyCFunction)TM·Arr·qL,METH_NOARGS, ""}, + {"sR",(PyCFunction)TM·Arr·sR,METH_NOARGS, ""}, + {"LsR",(PyCFunction)TM·Arr·LsR,METH_NOARGS,""}, + {NULL} +}; + +/* ========================================================= */ +/* IMPLEMENTATION: TMA·NaturalNumber (TM·Nat·) */ +/* ========================================================= */ + +typedef struct { + PyObject_HEAD + unsigned long long state; +} TM·Nat; + +static int TM·Nat·init(TM·Nat* self, PyObject* args, PyObject* kwds){ + self->state = 0; + return 0; } -static PyObject* Mixin·w(FastTM* self, PyObject* val_obj){ - PyObject* old_val = *(self->head_ptr); - Py_INCREF(val_obj); - *(self->head_ptr) = val_obj; - Py_DECREF(old_val); +static PyObject* TM·Nat·s(TM·Nat* self){ + self->state++; Py_RETURN_NONE; } -/* --- Queries --- */ -static PyObject* Mixin·qR(FastTM* self){ - if( self->head_ptr >= (self->end_ptr - 1) ) Py_RETURN_TRUE; - Py_RETURN_FALSE; +static PyObject* TM·Nat·sn(TM·Nat* self, PyObject* args){ + unsigned long long n; + if(!PyArg_ParseTuple(args, "K", &n)) return NULL; + self->state += n; + Py_RETURN_NONE; } -static PyObject* Mixin·qL(FastTM* self){ - if( self->head_ptr <= self->start_ptr ) Py_RETURN_TRUE; - Py_RETURN_FALSE; +static PyObject* TM·Nat·ls(TM·Nat* self){ + if(self->state > 0) self->state--; + Py_RETURN_NONE; } -static PyObject* Mixin·address(FastTM* self){ - Py_ssize_t idx = self->head_ptr - self->start_ptr; - return PyLong_FromSsize_t(idx); +static PyObject* TM·Nat·LsR(TM·Nat* self){ + self->state = 0; + Py_RETURN_NONE; } -/* ========================================================= */ -/* 3. INITIALIZATION */ -/* ========================================================= */ +static PyObject* TM·Nat·r(TM·Nat* self){ + return PyLong_FromUnsignedLongLong(self->state); +} -static int Common·init(FastTM* self, PyObject* args, PyObject* kwds){ - PyObject* input_obj = NULL; - /* Accepts 1 argument: The List */ - if( !PyArg_ParseTuple(args, "O", &input_obj) ) return -1; - - if( !PyList_Check(input_obj) || PyList_Size(input_obj) == 0 ){ - PyErr_SetString(PyExc_ValueError, "TM requires non-empty list."); - return -1; - } +static PyObject* TM·Nat·w(TM·Nat* self, PyObject* val){ + PyErr_SetString(PyExc_TypeError, "Cannot write to Abstract Natural Number tape."); + return NULL; +} - self->tape_obj = input_obj; - Py_INCREF(self->tape_obj); - refresh_pointers(self); - return 0; +static PyObject* TM·Nat·qR(TM·Nat* self){ + Py_RETURN_FALSE; } -/* ========================================================= */ -/* 4. TYPES */ -/* ========================================================= */ +static PyObject* TM·Nat·qL(TM·Nat* self){ + if(self->state == 0) Py_RETURN_TRUE; + Py_RETURN_FALSE; +} -/* TM·Array_SR_ND */ -static PyMethodDef TM·Array_SR_ND·methods[] = { - {"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, ""}, +static PyMethodDef TM·Nat·methods[] = { + {"s", (PyCFunction)TM·Nat·s, METH_NOARGS, ""}, + {"sn", (PyCFunction)TM·Nat·sn, METH_VARARGS, ""}, + {"ls", (PyCFunction)TM·Nat·ls, METH_NOARGS, ""}, + {"r", (PyCFunction)TM·Nat·r, METH_NOARGS, ""}, + {"w", (PyCFunction)TM·Nat·w, METH_O, ""}, + {"qR", (PyCFunction)TM·Nat·qR, METH_NOARGS, ""}, + {"qL", (PyCFunction)TM·Nat·qL, METH_NOARGS, ""}, + {"LsR", (PyCFunction)TM·Nat·LsR, METH_NOARGS, ""}, {NULL} }; -static PyTypeObject TM·Array_SR_ND·Type = { +static PyTypeObject TMA_NaturalNumber·Type = { PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "TM_module.TM_Array_SR_ND", - .tp_doc = "Array TM: Pointer-based, Solitary, SR, ND", - .tp_basicsize = sizeof(FastTM), + .tp_name = "TM_module.TMA_NaturalNumber", + .tp_doc = "Abstract TM: Natural Numbers", + .tp_basicsize = sizeof(TM·Nat), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .tp_new = PyType_GenericNew, - .tp_init = (initproc)Common·init, - .tp_dealloc = (destructor)FastTM_dealloc, - .tp_methods = TM·Array_SR_ND·methods, + .tp_init = (initproc)TM·Nat·init, + .tp_methods = TM·Nat·methods, }; -/* TM·Array_ND */ -static PyMethodDef TM·Array_ND·methods[] = { - {"s", (PyCFunction)Mixin·s, METH_NOARGS, ""}, - {"sn", (PyCFunction)Mixin·sn, METH_VARARGS, ""}, - {"ls", (PyCFunction)Mixin·ls, METH_NOARGS, ""}, - {"sR", (PyCFunction)Mixin·sR, METH_NOARGS, ""}, - {"LsR", (PyCFunction)Mixin·LsR, METH_NOARGS, ""}, - {"qR", (PyCFunction)Mixin·qR, METH_NOARGS, ""}, - {"qL", (PyCFunction)Mixin·qL, METH_NOARGS, ""}, - {"r", (PyCFunction)Mixin·r, METH_NOARGS, ""}, - {"w", (PyCFunction)Mixin·w, METH_O, ""}, - {"address", (PyCFunction)Mixin·address, METH_NOARGS, ""}, - {NULL} -}; -static PyTypeObject TM·Array_ND·Type = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "TM_module.TM_Array_ND", - .tp_doc = "Array TM: Pointer-based, Solitary, Bidirectional, ND", - .tp_basicsize = sizeof(FastTM), - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc)Common·init, - .tp_dealloc = (destructor)FastTM_dealloc, - .tp_methods = TM·Array_ND·methods, +/* ========================================================= */ +/* TYPE DEFINITIONS (The 66 Concrete Types) */ +/* ========================================================= */ + +#define DEFINE_TYPE(NAME, METHODS) \ +static PyTypeObject NAME##·Type = { \ + PyVarObject_HEAD_INIT(NULL, 0) \ + .tp_name = "TM_module." #NAME, \ + .tp_basicsize = sizeof(TM·Arr), \ + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, \ + .tp_new = PyType_GenericNew, \ + .tp_init = (initproc)TM·Arr·init, \ + .tp_dealloc = (destructor)TM·Arr·dealloc, \ + .tp_methods = METHODS, \ }; +/* --------------------------------------------------------- + 1. Arr (Fixed Array) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_Arr_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_Arr_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_Arr_SR_EA, Table·SR·ND) + +DEFINE_TYPE(TM_Arr_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_Arr_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_Arr_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 2. ArrV (Variable Array / Vector) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_ArrV_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_ArrV_SR_SO, Table·SR·SO) /* Destructive */ +DEFINE_TYPE(TM_ArrV_SR_EA, Table·SR·ND) + +DEFINE_TYPE(TM_ArrV_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_ArrV_SL_SO, Table·SL·SO) /* Destructive */ +DEFINE_TYPE(TM_ArrV_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 3. Gr (Graph Right / Linked List) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_Gr_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_Gr_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_Gr_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_Gr_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_Gr_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_Gr_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 4. Glr (Graph Left Right / Doubly Linked List) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_Glr_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_Glr_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_Glr_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_Glr_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_Glr_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_Glr_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 5. Set (Unordered) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_Set_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_Set_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_Set_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_Set_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_Set_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_Set_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 6. Map (Items) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_Map_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_Map_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_Map_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_Map_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_Map_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_Map_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 7. MapK (Keys) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_MapK_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_MapK_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_MapK_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_MapK_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_MapK_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_MapK_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 8. MapV (Values) + --------------------------------------------------------- */ +DEFINE_TYPE(TM_MapV_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_MapV_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_MapV_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_MapV_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_MapV_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_MapV_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 9. ASCII (String) - Acronym + --------------------------------------------------------- */ +DEFINE_TYPE(TM_ASCII_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_ASCII_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_ASCII_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_ASCII_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_ASCII_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_ASCII_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 10. UTF8 (String) - Acronym + --------------------------------------------------------- */ +DEFINE_TYPE(TM_UTF8_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_UTF8_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_UTF8_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_UTF8_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_UTF8_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_UTF8_SL_EA, Table·SL·ND) + +/* --------------------------------------------------------- + 11. BCD (String/Array) - Acronym + --------------------------------------------------------- */ +DEFINE_TYPE(TM_BCD_SR_ND, Table·SR·ND) +DEFINE_TYPE(TM_BCD_SR_SO, Table·SR·ND) +DEFINE_TYPE(TM_BCD_SR_EA, Table·SR·ND) +DEFINE_TYPE(TM_BCD_SL_ND, Table·SL·ND) +DEFINE_TYPE(TM_BCD_SL_SO, Table·SL·ND) +DEFINE_TYPE(TM_BCD_SL_EA, Table·SL·ND) + + /* ========================================================= */ -/* 5. MODULE INIT */ +/* MODULE INIT */ /* ========================================================= */ static PyModuleDef TM_module = { - PyModuleDef_HEAD_INIT, "TM_module", "Fast TM Types", -1, NULL + PyModuleDef_HEAD_INIT, "TM_module", "TM Type Exports", -1, NULL }; -PyMODINIT_FUNC PyInit_TM_module(void){ - PyObject* m_obj; - if( PyType_Ready(&TM·Array_SR_ND·Type) < 0 ) return NULL; - if( PyType_Ready(&TM·Array_ND·Type) < 0 ) return NULL; +#define ADD_TYPE(NAME) \ + if (PyType_Ready(&NAME##·Type) < 0) return NULL; \ + Py_INCREF(&NAME##·Type); \ + PyModule_AddObject(m, #NAME, (PyObject*)&NAME##·Type); - m_obj = PyModule_Create(&TM_module); - if( !m_obj ) return NULL; +PyMODINIT_FUNC PyInit_TM_module(void){ + PyObject* m = PyModule_Create(&TM_module); + if(!m) return NULL; - Py_INCREF(&TM·Array_SR_ND·Type); - PyModule_AddObject(m_obj, "TM_Array_SR_ND", (PyObject*)&TM·Array_SR_ND·Type); - - Py_INCREF(&TM·Array_ND·Type); - PyModule_AddObject(m_obj, "TM_Array_ND", (PyObject*)&TM·Array_ND·Type); + /* Arr */ + ADD_TYPE(TM_Arr_SR_ND) ADD_TYPE(TM_Arr_SR_SO) ADD_TYPE(TM_Arr_SR_EA) + ADD_TYPE(TM_Arr_SL_ND) ADD_TYPE(TM_Arr_SL_SO) ADD_TYPE(TM_Arr_SL_EA) - return m_obj; + /* ArrV */ + ADD_TYPE(TM_ArrV_SR_ND) ADD_TYPE(TM_ArrV_SR_SO) ADD_TYPE(TM_ArrV_SR_EA) + ADD_TYPE(TM_ArrV_SL_ND) ADD_TYPE(TM_ArrV_SL_SO) ADD_TYPE(TM_ArrV_SL_EA) + + /* Gr */ + ADD_TYPE(TM_Gr_SR_ND) ADD_TYPE(TM_Gr_SR_SO) ADD_TYPE(TM_Gr_SR_EA) + ADD_TYPE(TM_Gr_SL_ND) ADD_TYPE(TM_Gr_SL_SO) ADD_TYPE(TM_Gr_SL_EA) + + /* Glr */ + ADD_TYPE(TM_Glr_SR_ND) ADD_TYPE(TM_Glr_SR_SO) ADD_TYPE(TM_Glr_SR_EA) + ADD_TYPE(TM_Glr_SL_ND) ADD_TYPE(TM_Glr_SL_SO) ADD_TYPE(TM_Glr_SL_EA) + + /* Set */ + ADD_TYPE(TM_Set_SR_ND) ADD_TYPE(TM_Set_SR_SO) ADD_TYPE(TM_Set_SR_EA) + ADD_TYPE(TM_Set_SL_ND) ADD_TYPE(TM_Set_SL_SO) ADD_TYPE(TM_Set_SL_EA) + + /* Map */ + ADD_TYPE(TM_Map_SR_ND) ADD_TYPE(TM_Map_SR_SO) ADD_TYPE(TM_Map_SR_EA) + ADD_TYPE(TM_Map_SL_ND) ADD_TYPE(TM_Map_SL_SO) ADD_TYPE(TM_Map_SL_EA) + + /* MapK */ + ADD_TYPE(TM_MapK_SR_ND) ADD_TYPE(TM_MapK_SR_SO) ADD_TYPE(TM_MapK_SR_EA) + ADD_TYPE(TM_MapK_SL_ND) ADD_TYPE(TM_MapK_SL_SO) ADD_TYPE(TM_MapK_SL_EA) + + /* MapV */ + ADD_TYPE(TM_MapV_SR_ND) ADD_TYPE(TM_MapV_SR_SO) ADD_TYPE(TM_MapV_SR_EA) + ADD_TYPE(TM_MapV_SL_ND) ADD_TYPE(TM_MapV_SL_SO) ADD_TYPE(TM_MapV_SL_EA) + + /* ASCII */ + ADD_TYPE(TM_ASCII_SR_ND) ADD_TYPE(TM_ASCII_SR_SO) ADD_TYPE(TM_ASCII_SR_EA) + ADD_TYPE(TM_ASCII_SL_ND) ADD_TYPE(TM_ASCII_SL_SO) ADD_TYPE(TM_ASCII_SL_EA) + + /* UTF8 */ + ADD_TYPE(TM_UTF8_SR_ND) ADD_TYPE(TM_UTF8_SR_SO) ADD_TYPE(TM_UTF8_SR_EA) + ADD_TYPE(TM_UTF8_SL_ND) ADD_TYPE(TM_UTF8_SL_SO) ADD_TYPE(TM_UTF8_SL_EA) + + /* BCD */ + ADD_TYPE(TM_BCD_SR_ND) ADD_TYPE(TM_BCD_SR_SO) ADD_TYPE(TM_BCD_SR_EA) + ADD_TYPE(TM_BCD_SL_ND) ADD_TYPE(TM_BCD_SL_SO) ADD_TYPE(TM_BCD_SL_EA) + + /* Abstract */ + if (PyType_Ready(&TMA_NaturalNumber·Type) < 0) return NULL; + Py_INCREF(&TMA_NaturalNumber·Type); + PyModule_AddObject(m, "TMA_NaturalNumber", (PyObject*)&TMA_NaturalNumber·Type); + + return m; } diff --git a/developer/authored/build/temp.linux-x86_64-cpython-311/TM_module.o b/developer/authored/build/temp.linux-x86_64-cpython-311/TM_module.o index a5bf02cdca5830d7295ae18a0df63038921f3269..3c8313f5d86cf6cabffd063c25085817bae40896 100644 GIT binary patch literal 128256 zcmeGF33wD$_CAhRr>jFkLK3nO_6{IM*%vVgXxM`SMixOqLr4ONW-|+mqN2E<=!iQG zsBw=wuE4+`ZbRHrQBhHGnGqd#M`c9E-#Pc5(|!6R89SeRGxLAupL!r&_r33Z-+Rwp zs;axX>)eS`Cq;NX4sRakXeXFr)NxjR8AP)ToaOXzx;xoxe3;5!H90LRdzIsPdeNeR z@jWjvjQE~e!Tj>3@+bSVFPWSc&(+ zPJoI9>X+bYynd4tvM=0G4VB;T0h5G40V5bFPqJD9>PPKo|5aZ^F?RV8Sd;8Enfq;x zvR6G5)i6HiCVYn3@jX}K%gpRc4rX8SQ#O@d^+iHK_8Rw)49Lp9WI~^)Av>}!`N-%& zrH4XRpKQ-~S?TOGv-(68WcN!pWonYZG-2M;i#T3GcKrQ4Q~dw#_vAir_F>~?k15Z1 z>uKT-ejoln@bk2)U-nM74+fv(T9LhGbRQU5Q9rJ{7vPBMDJBQU$$S&?H8}~{mq6HI z)Mc;9O3S`Hc^9N%AkWNz*EHy)&|Wy2BN7--p<`q7Z?OIS`Njth1rWN>jAt0{{cz6g z%zpAWuNgXG%B?lyXU(}VrhluB%w9FfQ=O8%W;{%v59VdBS(ycs__uvHPfUaU{t1j< znqMO)r&T3#1M8+yaHoEik;f1-#8I z@ERP^nsto3rMU$vnp@zQ<`#%+Zh`mQW;Xi1<`y`sxdo1GZh_9tEwCTYfSPkQv#GfS zE^2Op+08A`r?~~bk7#D2pK5M_E1O$jL30ZXYHopl!TEf%ditg27TD0-0;e~(z){UD z5Z&AYd&~)cGtTbsYF>e5XEvh`mQ8C8*^gwpR)mX_Rj~d!j=d`Rdn8`(40#u?uCg!L zGw+nAF>iccSy_3te`#fLb)mny+&^|TI4jwG;!Kr7HbF`@A!q?D%n69ugr&`#I4jstN?0{Y2pX%I z99E-*rA-@~6I7#wRilKUv6{(YHA)0%$A!q5R6x(9BvU9to{%)D0MqoI9VlRDQUOhq zl1!m#`cg6jqh;p!DN}+K9m`3}4J55BC0RF+3?Z}f>{*jCgTkD$R8Co0n_^W?NhWKK z8$Tf^NeRoNgcURi)}w@=k=oc?n$&hq;}k0`FQ_RgggyVPZ%4QplR36G#)^cdGdjO!}#eAA6%ym6gI>m%lLNPWc2Z-_TiAK*8P z5Y)%ujnv2Bjp*Ql(@3*|>rhB-5N=eY(Yjz28>vcg8V9vQmg5Gn79qB-iGdr|gy2R+ z8urm-d6)^-gkUW~u&#-L8`gy2MnxK_i8=V`&XLDgQ9Z+LPz^vEsf9rsRKlQI0nSg% z@k7^wajn95<2nuNV)e4L+0=4w=_O2E&tz+-|xle_wxVS@&9kf zPq+W~#=~G;;J=k_X~+Jz>fJ)$w*F~h09(0uTmQ6jfLkcv);}!_U@I4I>z`H*a0}(z z`lp2fY~|u@{nN?;ZlQcz|FkfGtz5jVe_A=fEtGHTpB4tNm5aCaPb&wwh4O9v)4~9@ za`CqQY2^U7P`<5yS{T4qF5cEZtsLMM%D44T3j^57#oPL)l>^*D`L_OPVE|jXcw7Ip za)4VX-_}1Z3}7o4Z|k2{4sZ+Q+xn-40c_>sZT-{A0dApuTmQ5$fUR7-t$$iMz%7(- z>z@_|u$7Cq^-n7YxP|g<{nNq#wsP^d{%Pd^w@|*Ve_9y8RxaMwKdl_#7RtBvPYVOs z%EjCIrcV3+3DTr-cD*<>GDq)5-yEp?q8av@n3JT)eG+S~w76!1Di?{Vp zD+joR@@@Uo!T`2%@wWbH+7{FF8-qt^@9N-qpxAjj81K7&N+xn-K1KdLS zw*F~h09(2E@AXewEBl8n|Nm#t&+0$kaeR))JZ^0S2C2J_)MXumh@rV}b~*~6_^5W6 zair@jE~|!=dE__0M3}tjV&r)uk=Jjb**6ODuF0mH_y|+fjZ)ioU&A7x%liRjpFKSNFm{CA4l9~*Tx zj7={l+8>wvQXIV6#MJmxU_ZkqrkTWGo0uMl%9%ECe8P_%94E^ra#G#~foz*NAt4U@ za%^HoOboPnu1(C0&4io!mgrUX8 zb~I|Kiwmor*bcEjp;~GcCgNhf@t~GkP@eC^#v59iEt6m>>L=-hZi@oa9TKA+W9be_ zR@#*5kZf9NE7~C?0mEx6+9B2Cq#2(MolF^)PE31}r4u3wqCR8kh($)gHX&khQW19lXA-~xsws*iG zzr!Y;>gbJjoO+vh)--#UP1JWB06BYX;?r0yq{MhJ~q)U=60~pu!-&+=YY*%o9JN@nKseWB(iM6Z)%Y3 zMC0`Chc%0?2N4Jtgg@Pj6DAs`T5?)MDNZv}Dxxe7>69q9RkdXzD!ipYGvy}V@V;yktQ8nI5!H$I-$BEbz ze?Jy@7z<#)aA^t_kkW6*W58^wcT#ZZ*!_1?zJ{IXf54yE-JpQWku0}2B_5FIWcXvM zgo~1OFo8x>QhHCQzAyGaNWn2?-S&xEd?@xmN~uAYGuZ_f8($Ikq^!@!DK{hYc4lr4 zFzc}@xB@#77e%Dv92(_wv3?P^N5p*!wEmdqjK)9bnthKm1``o=5#DDZ-&8SvM7#s5 zNwg3Cn2`2>9ot~DXBr$mpIa1vWWpe%4~IYLxC{lUq&G4p2MM#`j|pH^fMoUtLIrI5 zqGy2U(SA?-nCLmNd?+24fb-fe2Jz!fBFZci@e@qKE@JT$O~Ni>@smu#Z)uawQO&Mf z@!9bkK+UdO@l#B~u3PcPnnac@bDUkpZDOj)$+3xPMtZJIOgD)IHgUX36xl?MNmSUx z2_~`3CT1A5l{PWctdFa0VwTBSYZE7$GV5$&j!D$o#9Wi8vx$>TVxvu*Y+Ab6Cgz!( z9X2uFBLp+%+zQ8rOz za_AsiY!Yc68WN{@m%$)N&WSJiD$voT9dJc;tVNmON7+PqBCe$gHc?>`X*O|&J*BjX z$`o8uGi;*DI7UJGi_ptk0+ETL3$DT9_pRlTI}5Ci~;hzZFu}YLy8eB`&bB zv^f`=1V!MYxDil=eE?|DXlf=| zG2X6)8^VFJ78@6&N28Bjm3>_`yt-*U_Tl!>!Lq~J+m6&rHk#G;2|nD zD&>7H6&oEN4;M7i$?(T4hXY_obfzg~+MigKhK6>(+U&yRz05oI-1gG9saXuYNK`d&!U|gt;2s7O>49c|5>ziqjmVtqFoxT!+#d- z+GrjAvuL+Q>+qjNyEj^g|18?0(K`HR(LSE!uVBdzuHad?f=9gPNjyB2PutBq^hrtP zfR}}6J#q}1+&v8wCx&uUx|(+!D;f3Sdx>LhiKGceXEo;Gk;fT_e-b++-Woy92p+%)bMB*hC`d= zxi380>*3LU4v&`Z4{DT+Hszh z4QTMLn%(g1^iIh3cxDGr!#$o^-u6Fuod65ZakpDm#1c3|=hAp?{2Ad@pfO8ooDf1q z2~RI$6oR8ff5O9%n9zhodH50+HzDzG_!7@IA@M`_5*>Os9*a!E!-z#r6B1{IFL8Af z65GRS(@lg{J9S#XQ7Kad3$08?u ziJ~SXt`1+~-XX#HZm){MLlT;qY!ToPI}yG1s36B5hAm$~2Ehx9}x84Qf0V;|LEU7AH3$abfrpH#Q+rAHKxC zCM048hdsc16IG9k>ETN(YC_`5@FnhULSlFL5??eS(P>E7u^2>D9gCC0m#Az);>PeL z9&18kU-%LSnvm!{H0)T6BC3wXqVOfoX+q-e@FkvXLgI_?C0zIr4;OoA2&@ox!?!@1 zJ^(oI(F)}6O~g+HJyW1Oyvg7=dk5jJ6ODJ)bUbZvvGxT%Hhd0f9Wk}Xl<>?> zeBv0&gqMiGZVc_c?QQ=G5E9yF1+pABu*(hb&8vO=u4hgcUIV`$KZ0VAjzw%aj78K!5po7>n3ae9|IPncV>BCcGJ)G!Rv z`6=)B(4vMzrO7%5MjC!z-xI0?L*9FvXI4mWdpswAwF4g{+pX_-cr{~eOGx8Phe4KS z!!@8}Qd`UbXuSKjhTVOSn!E7GJATbs9-Vo(-pGQk|9@D(htC>5?PmJnd6nQs68Nx&I(Z&WYeS<|Sj9_g_$z z&`&!K`ChC*w#b>@p->6;Um~Lu2ci?UKV(+gvE(_ck#4oVdRA71v^=;t?gdlRc@?JR zp4mgt^o)=OCjR>dR(eAlXS=^R#1QTSFq>z?9EiFxEH?e3R^wp!co{go`O82-h;?w} zy~frBhhZ=OuJxkkTh9xz4z55C9z_Fep0TEA*ki-Ik#c~+3N+u$g5O_(a=kSm`+r@5 zZh^ARTY+XZ(YVV-QR8OWsYb0c%j>L6)wtPVHg2wW2FU(j8+Q(rZC>M!4{4kkq0kP` zhVMbiq>iWY8Zr;pRW>voyfq?1Nu*8y&J>o3&$%xtE$8ouuQlc(<|F!BJhu zz^b=El9DbLYhdtb%IoRis3I(Kmms+}ibUUsM8Y{FSETH!IXd}m6sQmxaQf;vea{j| zmvm7jA7(q=-m&gbf!ac21cI#JIT{@0jfE}3tZ#sX7N zd;l4my{bWW;P7J3F(zW=J%^gZB<{kctl2ypFoI?@92zoa4%sWhWw{yNE`Yh8ij1xe zk8~$TME{$^T+oD9u9 zywDs7f9F*9eDC{N&032Sr6U=_3!iqZOmxwgw7G$OBt?KgyY8MLNi#f~$N6S=nw#!9$u}q6i)vA+LJi+n zaAMMG5O-$As7v&!L^Cn5uLb=&?3X7sNVx65C~^o!J?M<9t*FQ%|a1 zd>x;3HU=yV{Dze zN(>t1!-{s}?y#|d7Qs#bHiSLWp~D6Nr>Egiw;t1ZG^}lY2t?FT=@GUUVQt39WA%H5 zM96V^Ls=ktY$suN_X$Pp;5a0tZYGGR)^~Vt{2Xd5sTT0PN87JNxaJIcy+| zCE3@9n-K`M{rZ~W*FOXLz8f@Z07cWbAsEhqb~wZF);5uAZtFQ1JL7y$XY7w5p`o*c zp)sD>FxZF5kiqdRSXna~skTShU`32dKWJuy`K#J~Qo0FZJG|}6Juy%k>}AcB!$>9DGo-% zak2vA4Ty(Ax1-2d2&FSFkYi?-%^4p64Lx+qO)#BqssfYVhH9c5xU$bCVHZG<;TSI) z2EPI_(81P~#o;Vd-hCWLCNkdmB)g`Hd&m_IAp&ybiO;)TslecQiB>v^wR+ z6jg9b%F7!1JmohHtxw&UstUfC`k{t?O}(m_{nqZP;P&pXYv}9l7xYl9+8&Q-=+z#7)6n@nukWb}KGL&ZL!b2gr-rWe z-{V&W|KfjFLqGX1OINJA^gnCp?ewoSbWyMMy;Q+Rdev)aU#}lRAY2UHwGnqjcxJnI zL_8GX-sYKovt1$AM%)_VndRPU(OHDYxJG4H#9Ns2R>YlN&rJ7D?_FLa z=HBJq0)Wv3uU!%Eqw4z+|3vaXBeo!m#lML>7zyaX$P3!pir^Kbi)j0rw8$ENWVg(& zH$(QSb_r0=-f5Be*P^!0-?aOw9SHo??(Qhjl5g6rivrJeQ3f?;KmlwvuJS*%JJ`-M z3--Y3U+pdc)Lk28G6A^QbD77JgS3l1YjBS@cZYYU7pObEe{`X_e{|Qowz=!wy8$2? zuwM3p^~>JRko=kVZe&q&k>hT3H@T3r$-UGEGMD<+_^iwt-wgn;%tm*+3o_f?w~_p| zdjqnhOs(%OALQKSyDt)C?u)!X(#qT)`8fbAQ|o)c2Qm-%UPbb&zR!`x!LRi_>+_u8 zK5NkvZZ=0t_q@nUA_2W5^7=^Ml?x(!Ct#&7gcQai!hOg04oEo>?aZE=HL=gloQSB2 zaw07rSrZl6yUyc8M1kIUSQIY-VgEwdH){B?i7$}bu8~~mf?s{6EVTwXYul~E{$AJa z-geOJd)qyNsYlv9YKM>eXuBr>H+2b`5sWQ`-AVFJ`*>`G{W5st#VwfJniDBg)zG}%DpD)hA79qAnJ-J_lBt3LwBE# zem>fL3(j)z#O7eMySn|__KtgB`}^9vTi~q5ao=nIUVHa*IGb_YKg9eY#$69*F^>C0 z%o8#0i*WV=6EWtS8248=YjNCLVsD9cAAqwJ$9*mKwOIE9I7@NdRUKA!aM!}wiQ_)n z;n5E6lWrT{!Nxgl!4#b8uGSxL+oGnc)5mXA_Ql zQ^%V+y7$6agyX)_@s*D5UO0Pj+?9#&Ud82b*5J4gB|ensZill4$NebrqeS;>I7@Kc ztCOxya%ogII6?& zP5m|1y|mL+ogDXpP7ic)x581}aX;wvK_~YMIC{fqPFtJi-Uvr+$9*#G$u#$6I9faI zcWK|Hxxc|t+Hr5|d|PLCBOIL_cX#LAo!t-Ns0_2Q%Y|LstKewtxQ};vyo>uZ9EIV1 zye^-1asL5FUl=uA*L8L8fTOPCKG*fRuI`&~v~}E{yZ+qOy|~*I-5mGcZufR`H^b4@ zarbuH+s*w9j;fA(dH2h^yMKhEspD?%zP-Eq0vtsh_v`LocXxk*qbH2q9<@E(`{AhR zxUcqjwTJsY94#I9{GR9cbgzJ;q~ku)^O2tJ4mdhG?k7Dz>FIt8M@7fI)_<+vy%mmz zj{6t?U;OUta1?}P*#DE?y&(OvbjPhruS<6ygQK3~zMcMdy8Aac+Bxn;y)NqIUJXY% z(Czg|FLwtV-C&;d+Skkd5{_z4MUtI+x57O1csvK=I^YW~>+m0TdcwPFjc*a2o)Pi* zDV^A`oSpjSn!vneW!_0PdnUKZKW4=+f10FteEpqhyRv|f_c_Po^Cr0wzQjoHyz6e-t*3d9dC>Wh@NA8zDVy6jwcfN9`8qId3*yR{}IrE z!?4kLN9bH1hR&y;GceMd_#G&r4OC*4sl@q>6}~UD62F*AJdZ_tLD9tXq4aU4^snAV znxIObw*ul4c@38CV2o>^XtEbh6@rb1N_Zo^zXH<}ndHlf^zLxxVu5&DQ-cnRyZ|65 z3*p=rfnkXAK67?3ocA|Y7ZuJ|!C`o$H`;`uJ&5~`^>u8N^rWa|}EZ(!1_l(muKoZ9CYu8tqHM7;HbBWwi5AdrYLanxx14j`Z3vq`wl< zQzE@HQ95dgZ;F-nMZwVPFbZb|>_QMAe9*P93w7@v>D}!>rzJs#C(`?)aqE=qi-}CY zUGD>DVpOj&L4~p8jXVWsnH%AK!#URVc<((IvvJNOdmq98^K6I0F!2Af!sB{m zlY~ROi}y2FJYe4}1HgC?mWVj;1`%IpsAtj?+O?1k@^L;K(w;%kH|-+5<;O;ySl zTxfr?2~9MNvSja8T((jXSY(^A7McN}^1f^8ZmOQ(y&a{F^?AnlygeZ|I@0^Cw?1+% zlo$}{{o9Js=#v3;GedDPFgknx7RC@<2ZKK`@(kY~3|D9Gr@vcdRHS#!3Ns@*gIfpe z57RL3_YD`KRcCvADZpaNdQ_J!h52f1zx-WWkM~N$g?8WM^+T(n9(yg~z1@2(#sRwb z!{+JX8n(~*6Nb)bs)3)8)@|8+ z;hXi1^uBbq>8HLhIy)a}q$`QCbBmyr|1Rf1U01%GA z{}`1cP!|$`mnZ^{1R?+kN8o>q$`QCLBmyr}1Rf4V01%GA{}`1caA!yaUZDs)6o>#I z9D)BaDo5askO=Ie2y6^Q01%GA{}`1caC=AuUZn^;7>EEM9D)BLb)Y#Z4XXlSQ|H;M z&rjgY*IsGXhJ@lx3dKEvPylkWxn%6MSfS z%d1?zsHQC6$<0|lwsLW9PF`hI;jEepAk8d3vv3w_PM(31Gmj@pK*r91^wivmV*}7r zo2KVg*Hq?}Os^?jSXlYgrm8Zhs=Bhcps>m*TL{&xD9Ot&%&jP2T38A7FqO)!c1m+g z3#*ID3#yz&<&~v*)lP0ndD&vPAFwdL+NmljuLkbq!s?lY)e{OAL0z8OG`6xbZ~0T3 zDjj&DOI~$#Wx1(+Rn5ZkMT-EclBA`ezc8<=FxZGdT&fC77CDPb@)lQNhzbhxN=o3N zFruc*$}6#0sR@_^@hT`UD_M@@ysF&Nyo!qAvc*ujsZibHZFNg?^GgczDp3SlQdzt# zx3s3Dy0`*LL2Rp*m*r2Rwu0`=iL)@MB7(Wo#^xLs5@_%;-L`O1Ze<}zR~5peGZsPo z0(}xFp0j*rVOhb9!YXjYY#Ii#&p;mgED!-;v10%O$KtYLqcC}@>0+gDB1!}>xQW?B z--K;RVWlk?Iy9i?YpQdhN3mK|hd{Nd4~>Y;HU_djOAGT(FDb67cHnV7*x$Cht6*%x z@CmjwAPEDmy0Rv}8oKZFr7*6bNi1PU2-U+F1xm4l4RA#zjD^zNMU{nxPSqK?#npwS zs6#b?9MdgJV2qYm=EKM_b*h0UN(~zdmC7s4t%A;Q$`|Gq6fcHoicytUP~bof^I?)z zQ>z0*dTP}S7$`Vvb0-&;6;>AKPcK{wwG9wv&Uk7QPZuyNtSp0X!YwK(hiL;|W}riD zp;H!D7h!#&-Z4_B5-2dAUo{HZCcDqdVx zSm4JeXNkcRh#`~@4ESKQ%8^ThDbTMt$V`xd2h%AJCx?UU6psY1T%ZIsr>t-ptP!w& z%&M#@oM}25E z^bDx+a-79DDxrR*mF3P-s3Z*8s*>V-8)1%OAjA;b*|R2PhAcZ+m{w983KMAY1{e+l z`6YQ(RdCR;u2cn_MC$m&3c?@|aqLffgbOTnAP!ZBS?lB%!5SZA$U!|qq|ETbgDF=>>{%#w=(! zN?|RZVNPM}p)Y;)SPOF1Al1+ zA0rxZhG7cE_<%eazHxXGRSnCKIgsZpA3q6B8LNxS%kXfL2gf?FF>Ac&OppnL6h<8U z%d1?>(YH&fVADzfbC*^FIGZZ3SZ>->1zm2&{~|bRt%1ca=oaWb8?EAe(}Q4Snt^L9 zR5G_ZZ!t}i&@P9{ha4a9fNvsg4tNFSH496OnK_#hVb589VqPT;0z3F8&X{q$=`wS0 z$ECu7FvGNgLw#{YH8!IXk6m^+6qQ$2nc5ZG}bzc7Ix%ow>=Pt@CF2TtOQ?1IOb1mB~W;w>AiaFHG z#OlI%5)3f2isP9*9GWUCb7#VtKAbqi(I+@;0}Teqp0A3IfZE|u%`Yjhvg0DK+@3KN z+frFrVOAQuFpJ?PR@O6S&{9rGLp%K8I0HLy zDpkm*NstUKsc=amF7!%+r!I{w9(<6p7o}zrg;usYud>=4neck$jGDr-{KDW;&kYsz z4s>S;Tu#z?M0Q@)Bw7a`pmeawSw00$DRUuObipRN3HlVS913A*;#iqHeYSu6kR$y= zh7KG$aIk+sX?0Cm;h4qtgd381mH9}=s?FK| z0Jzw|Gvon_mR9CfEP>aYDdXX2CQ#A9=!7od*(R_+SvatX%HyHKT*uIx5RHr} zJCPyGrUq&l!`y`>Ag~V7qz#&t@l~UJmjLQ!&g(>MASCvx9rEnKHBf7Fx?NgfA}3lE z7@jtoW#;`3d^dv5Yv~jKXFJb-VA|sXoHgWwoglUtBioj0hUa7kfF zc|~F6AQn9 zhYWEBHI5I;w;Y>aQoL}`;{5zUuqNe>7(Sq+xU6Q`fW>7sgN6)c%}}8R#D&FhKo0S0 zK&e`8rgI>EGL~?3fk+K3a_~)(K%%O;prCLOpg7*D#4BXLNF9KuIAs7=EU$o54zq(y zD1&5c6cEEMC@%;k&14CrVD7{FIi+UNgray@0c|{FLMp(jSZ=2jU^wCgUWnJaXo@8R zct~TQI#o3lR8eR0`0+>iGbR)+EY2&V3y&m&FYCd7-1x^35F2ceP;3HWtcAR}gyHwMa6_!b>;=CDjMz%T;Cp6f zL+l#bm%ep`@$U&CZyRCKcNby&&7XrQ?{N z?id@Fuqxt&IDf?W_HhYg8 z5zb9xU!-~A#(%v%1pvl@$7MPZ-ZHNZ`Fn|hqlCf$%9 z3pmzihvIi7e&B{=G=$Ah{K1sL`U45CC7gev}yZSlb0@doz=)*sHuCcdueG}5o2 z?_+ZO7ZARdaQ>N#a>92Ij^iFTe3~V;_Zz~^90L4O!Ut1Dc@EVQzJPGnxg0ve{djt4*=ieL_4(EL*m+h2(9kO1@FCO-TOb;$NU@fR$zF!R49{_qgC zUaN^;J3o}an)nwe{vU|%P(?YOw-Wy<#jhj&f|Ek^ zw-LWq@t-38jya+HH;Mm%;_oHC|HM%KSH$OIBp3S!@mJ0YAn|h* ze>m|M922TPnfN7&KaKc1;3t}JV|}}xMmozCe-ZKhqeJ=2N&h0nKbQC`@i%>7WBsd$ zf3@PTBmTb3Q2xEduT}hqh@XWg9e8XlQ-n&8b7Avs>{~0LSsLV{j-xgZLjR{y^gU=|IZu9Y_4H6hE8zD+h$? z&nNybiocNf`}&3Qmk__bS?6pX{#`-*tiwb3Yl)wx_}3A?HY1dO5Apjd{zl?EbfD$- zK12NBivK+E7aS6*|32}@DgGzK-_bjie}MQoivKU-`+J4*6U_-xq;sm`rvZ-ryV4)Z z?@#;^#UD!ieLX_?lZbz&;!h=h7M%!ld=?Pj9#^dv{#``;+ODDcXA%E8rGFmr`NW9z zuOt2)iob#Q3+Tk3`418QQN`ax{2laVKIXqj{HGQFHRAhILhJu2@n2K?FNwbrzG{dY z>qnSV!${{t#g78q9DnJ8gZbTv|Bd4JB7PQL%nAJw#Q&G#k0yRC{=|vk=MW!{|8hH# z`1VIWgY`d+_+1pgg7^#QLW=8u0r4{w|5D=bfb(VCn12)T?RkXF!@su^-ydZ$=5HeY z1f~CH;;%IQ6V%^D{1X)aP2%q}>uZqz8Szh5{I7|hML5?d!qhL)IbHFi05`{9TKAaW zmH7B|aJi)upE2eSCqACP$n7ZNXPs_Q=FcGhRf>-+ueeT;T3%Q;^fuS%w{vQ#{wwLV zoNzzu6MhllD@n*tI3~S;pBtu3dhzmL3x$DCgSG*ls1Td;S-7$)Oa`5$KivZ35dsf<)B^aC0uOwI0(fQs z7q^T6K2qRPX9$LpZT^Tj4>fJKxNP50({hW4=$LlX z9W=5+Lrt^wtu^RiT1^=tQl`-+BQ#F%lf@7x$_S~HZM41LH$=*`n(kDVwHjucO&L;Z zm}$4Zw;8HC%rsoziG&%Z<&+U3Wm--dvR1=P%gu*};&WV-GA*Z!5Gm7g$_SA%EvL^R zLmFsWP8m{axM?|MNU7nb<&a@+;g(v%P189iM9j3Eb3)Wi<84l8FAnF{oBJ|C)VTSf zcWgjlhI9KH%*5dwfCe*hI7h(b$hsZDAuzK_w)6;&fyt3|JAz|iazfPXjOY74L*(p~ z=d2JtJLfqoM9@xpn-vGNjazrumd1 zrH;hbH-5_zMD0k7K;V2K^d71pEN*pg+@TLB*P3Rv&?>}JurM~_A2S00rA1N04CknpQFC|>Z|60M9 z`u7lyFZfmv*Z*a~m-_n!j-R10e;5ro^p*W}6yaD5en~dKA4j9vaUrg8zijc~$tzacDnJfFBPB?he6khr+PwINQ$$tgqDX)&&13flJ@x z1ik}&IL@U4m;6-%m;4(D$N1L?o!bbK zIO?n?9e%$Ev!4wn z0!QDiq*Enyr0az1Isqe$>G2y-DEc+m&=~7dq1SUd3OLXMG8pWo+9|t_i(`<0$S`lMBwNq!S6q=B1mZ@J?Ca_8j`SU-_$%l>iBWlLgyL5KUeX8$%0JSE*5<0 zyFu`01CM=g6ZqYLAIyS3u-z?mr0+(>pO1?!Y?}pN`o1Lic&KCF-2%TG@Oh;3j?j_5 zA1eMfx-aT8!I!@O5_~+gv#+l`Bw)k%-wpq_l1>cax_=WDzZ>0O)kW~7?;ydS2m0(g zLg47zm2^f69ogRTiofD0CvO+W8cLBN8htZr&Q=j-)hCj=c3}aLhz;U zm4c6_$n3jL;OP4<>D(lAr0*SyKN?TgV7p)NrSDUMkCz1O`<%ehcNFQoB6Othn~J{y zPflTbU+|^x_ky1fJof!r;OM)aboiru7clADE(QSDcpUzMC*!ci6OMf8+eh#VA&-6g z2^@V7lFksJBYpAlV7RgGe7YYlOYo)dY{6d)<=A(=z|nUe=`0jF(zjUgx6yrdX9&LZ zy-4tjh41A8N8hcabG6WszJFBwZg`Og+pU5xeK!gI>A>UmZWlQEb|sx>gpTxmLGf4M zMJ;Tv3%>N-FZiXvW8bd@j=pD+&JRLI`u?K$d;6g)9JgZW6<(xoXTotjl*51a^$Q$* z-zA;CLPz=zQ2fz{Lm}9X5Pa!-tl*ykJoY_7;OIMwbmj;h>3gc;Z^%GbxSvk&rSDmS zUj;n&JzwDHyPkAb3mxfuh2sCx7hN6adcl{z_X&Ot@Yweefurw1(%B+(r0)*JpMMCt zI!?XdOW*ede<|?T_Y;Am?>y4^Te+s_zg+~UM4ae1T_|Lv60!QDi zq|=pf7clADOYyt)0s?G@3%>L{M)1!99{WxbIQn)aovA`c`p#7R6@DlL+dRRSz7>Lh zHt^VYsld_qEI<5#?QEeVeJ@b_y>!3nWr8n#ZxQ@+L6?2&1dhJ%lFkD{NBTad_@ldH zEgk32f-ikv6a4dl$G&e19DPTT&IdwA`u{kg zhdBDKC!GYsUBIMoC&mAzGZ0|wDfrTNxZqz1JoX(WaP&P$I%9>7^vzcM`S>9WY&n82 zeG3KuV&JiFiNMi!9_dsH9qGGV@wcU-tK*y}_|o?}!M_A}?0ciY(RVB9+$MCS?>&m& zEd^a2=V8H@zB>hf4e;3aWr3q_SJK%nbfoXQioYTWT^;9R!I!=V1pjj2vF~pJN8htZ z#}|)k4X+1d3FmRRx1;4H3%>L{Oz^J&D*Fx=IQqUzIwORRZ0{JwA5AwyP859Ud$QnP zDSYz;j=rNvXR*+czGaHPf#S79@TKn>!M|GgUL|n!T~9jegpTyRS@HQk%DV(#`fd~a zYlZLA0!QD2bUb@b=t$pPiqGf4djwzleku6Z3*UbT9DV1}dE3uINBVlGA9!4Ci-tn5 zMHBAAzVz)O_%}cvkE=rjj=oz-r=QS~zC#ti8@-Qnl;BI>;{|`c@I6uB=*#aL&KEk; zH(&8r(EH=33%>MSDfl-E--`u~zV`bRj&r%tk-pa`{$30$Y#Rh$`aUH1Hv^C3yjkGr z`!4Bh7dq1SS;fci1LF3Q;7i|+1pgM`vF~RBN8eGT^R>{CzCSAd1`oPA&c6g-`o_~b zgyZlw_|Lwn0!QEVq|=RXY`*mEt@y0dPw=JhXu-cj_>LDi`W~eFUZw~g>6@eYqfduI zu+0^G>AOhq?*bmzvqIn|&ZM(M=ty7wz9Gh8i_lr=g#>JfZ-@V^PnREXr?~x%iQ9=c z7}B^g{s7@C4I0F~^nS!@fn%T5QhJ@hvC90u80WKoBg-T>H0jg} z9CettN8nOtpTc8FXTQKvCyU100f9>$6EMi*cEyoS6qUml)ZyP3NE5i!@hd!mbTR~v zI_#GzaH*4}@Fdc)-{ZH%QHQ@*KUeX&zZNJwm2`>(jyn6`KW@teF6&dPa2`K(0ypil zGR|g!OPw7G=kZf7aMLal+aqwPvrpkXe)bC-CHz#M0|J*irc;4~*@*M|wo&AdIPP-2 z`FoMf=Q#TXA9Z*fW(XX2SHgeXG6gQ{lcjJThuH$hUH+YgxdN9u3lz@dut?yzyMxw; zWdfHvD;3V;aJ9g3cL6R?u&oog)Tvc?4;qJc0yjEV#@Q@zsk1}jJf7lx^G!AG4e_>bEjflHlz3J>(Vz)>gA?*f-PX~reEZfqx>JpQ82TEgY=2#=Mu*bvw< z=oMd(UyFZW%M|#t7BYYJy7~s`?-G3JE9a^7)$@gY<$RI8b5$I^pftyc>(A}Yp!EQ8 z>02al+1_OWm%axCj`8BdyqJ8;3G4}OSJ)`LQfce~B{GK;%h)dsf0!QC26;Ih4&1ulIvql}EH5Bd%v-yDHU->B#yU;1VXT>9eo6miq--6L@H z%_iS(1TKB+Xuae(*WwOr`voq24+vbgcNtyRVsZ54nF5!-n+1;T9-!y?s-*o~<-#z5JQQ*?IC^=Xk*}ruHm%f_?E`2lUeMgS-x8$26aOoRG?~ihv zd0b@+T>8!xxb)p4aBOdTpKZ@K0++sZof>cNet}Eh0|J-6%jiJJ?d?szYXvTSv+4bB zZZD7L)dH8k>jW-+)4BxfkL~6Atp^KS`tBFF99J3iIRMs2`eq7T`fe6D`p%~I?h?54 zUEM8MPw87PaOt~8;L>+4eNMu0E+gLxflJ>E`aFl@%;Ty^;L>-Qz@_g2fn$3wBHx6b z!FEYscmTQCv~QF@h)drzflJ?Y0!LrIzkH*>rEgI>kYLlkbpn^Zn*}a?GkXPf(D!j_ zZ;rsFZ&dFfU-oadz@_h8flJ>#0!QDM$@d$9OW(Rajr;Bwxb!_BaOu13kf09w{*8Rs z3S9bT_YLx8dshow`mPhW^i4Z7sDr-v`#iV}7P$1?FL3nb@tl!iikW_wzL^4-zMBP( zzNvIRw@cvCclBXG{W{@WFL3F*N8r+T?%_cl^c_gP6#|#O8U2EM>02al>AOte()WPC z(UPz1`fy?%87P$1y z92C?+-zDUmBXH>(MHg(mZg6|E1ulK(3S9c`5jgt(fqcIaxb&?X60E1}-~9rYz6S&@ zeV5UFRak%Yy@Pz$3S9bT4{O|awZNtCI)O{ywBbP=^xa0jg9R>q_X}LMH{*z)j`YnG zxb)pDaP)nhe0K?4`mP=k)R*I`Uf|MqkHDqx+#`cJ==(YORtQ}BW@HBW(zi(9(s!A_ zrSAcOqpydq8xuwb^`&pUz@=~0QK9_6{1v$LT_-Gz_GoP$oCt8OW(Sq8~5EWaOrzM;L>;5 zF+m;l6Pz2xfg_*C^B#dq-?SOW$<@M_>E9ZH}{1;L^7!JE$*x>jW;_ zyIJ7UH*-o*2Yo+nXVWYy+Fo*r%$0++rSGi*K{ zN2G6&z@_gpflJ>50!QC6@=cf-)R(^X0!LpS&r!2N`GNT>aOt~F;OKh+`EC@r^evhl z)R(?>0+;RGEO6650++taP73OvZ$0_06}a@xJ~_z8_OkD4flJ?Y0++sN^MX3)yN`Sa3tal{ z7r6Azm><-UzL^4-zMBP(z6Z#6m%yd(>QjRH=*#1|Uf|MqkHDqx+*5-(=*!>Vs}Q*K z&BzV%rEihIrSCF&|sn*}a?GxLKw=sSmea|Dh$e0~*G5adhWY=KMPxdNBIdjyWYW#s#f zz@=|pVdK901ulIL2weIuTNKnm-wVlit-z&k_TnI4_U~$eOW$<@m%eF5K^^qv?@taE zxb)pGaOs;-9MqA%nF5!-n+1-(k5GGe30(TFJ}sy(ed`4-efJ1l`p!K)sDr-GlkYbQ z{~O^MB|$#=uCz&~NZ_WPgfA1g^o^qY_VD@u?c+-a+DH6h_&+S(0*L~Dg!b_zRpGIe z?n18~c*Xkgb~x>z{zDAH>mY%n?{hv2&}E{-_2K*A>9jF`pG3xVS`om1p@!07CxE|? z!G^8Sz65Z-UOPkKpHm!`Df|Zt*trU?C;f{QK7{JIM&XagSl|YQ-$?rRD4g$`*{tw| zt_A+A@XNdwcuwIPsGe^qd=sTVRyf}$@VUbOKm+7!gKOw+AcCMd#5S99gY8a3V)RPeQ^^wK34}ft`F; z1mn|{uImq1{2?@tG8NAH6BYhG)pLfz+td2Szaz)>+<-f<;d63uW1R2XUas(A6rYO} z&cADawZgBYaa*hKCn-MnE4(|6w?8TTY|`1O@IeW--n$iENpbj4;k_)~`AXsZ{o8{I z{~PH?QGGc+{Cji!J9v!$fyQAk#qUh>dXT~oQooE=_-yKzDGGm##`B2^A4l=YSNPwF zU!m~c)XuXNj?eeO?NWt*PU-6v{v);Pc7@NTIN7xKlRvFo~&?u4i0XM72bj3S*`GWv`(F;@NAmDe^7WgisyQTpGo{Wh0mh&Ull%;`tdu3 z7t?(FP2rUkhgfPi$NvS}T!-fkt|8@KT`Z>X#B)dKQsRm(&67RWBgp|_o<5i67kPa zcm$natyehT2l=eRW2wLRcemJgAoY7Z9j_Qan(9AN;m1>aW-C02`sECTe?jfKPT{?1 zKHjSE9mIc8;lEIv`FEeVp7nIx`9$$wqV>Y1_A&ny^5u3j{sqOEe`ksDyQ#gCl+GV1 zJwxG-Q5;TH_-3llX$rrHe6LaXCzRfzaQ?o-8w%%n{;tATQT_S%h`3$&JQv*dE53bR zq~rXcaQj?8$LWItu(1yRe&|GnpG|RCrSSgL-n9xZr25>b@XIM~_b9xG>bFVZ$I-Zb zM&So(KD?@MeC`i!{QEhW{V@FBKrlAH|#Ti)lP3DttGM!=4I1 zhuYO&;pbC5Mk@R+8vpS4VzaUDFpAqug`Y_420zz{`J-rkC{_HUiGQZT@1*{{SmB*W z=Ng4CqWIjRaC~kcZVxE@P76C*6@GxOJL(nQlltWig+E5);Uk6f_W}9$YB&yNV1qaR zE)CV3g1D;zxx%=zf1Bbg+GrCfo-S4C)0S|t?-vRjM1ch&){^jc!=D$k3ev1DJ#qCIi_oeYxrf?sPhqDwug>+Uc z{7I_MwFu8*8Quw13pJx=#zyHp^i^A>oQol!1{1{(N>ryX;d#T?CD%?KT z5Llukcu^=X`}vrhYw5;rzS6OBB9@`uBW=&nNr}g>!xQcObaE{JoL872l3p zxDQw1?~*?M?g#6zFaKT#;}28ZT$-X-fs&!F`ulW?x*N*WMj6~8aVXPV&O4P1VnAOF4t*Jlv* zJ6|`WKJxkb;w4JorGPG1`uu$H^A*1{&Fd=^Kk$5U#a~YCy+iSL6xaqop!oc|$y*iQ zpKtkmJ;d#;v9R;1;`8&x-%(iqFp%uT%V96#vH*pPw(jUGX2L@$-V>^Yg`bEB@PbUh$#g^Yg_& zSA71R?w=H&pD)gjDCKxQK3$??pk@%d-P&pO=p$6u8G7c?GTSNz%x%ipW`r_k}@GsWlUi+`v1nbg0( zDLy}6JSy4xaQ*rB&{GKKc=Gebdno>=wEpx{e15+8aK(R-`fIG>uk_n`9IN=J6Mv54 z^Yg_QDE<+2ol>g!{Cx2xioc82t5u56&lkT;@h>L+4T{gt7r#~UU!wE62Nj>6FV5ee z<@ldN>*2GC&(9ZsS?Rw)=acU$K0jal6U9G3^YL57=jV(6toT<`ecGki{^9YkkB(;v zgme85q4D2c@%j1UeHFi$bcQKDKVN*b;*Y2GZHnUa=h`zApWh$PReXLQsz~uKBmEl1 z=jV%`qxcklXN}_X^Tn@G{8Spxw3;4gDQm|Lvg-D;m?tNt-|^FXFUJ7U00FLKE>zno&BirK~$gAPIiZNqGN``soIBoKl7NBz&pT zKS=uL2|nuIN&K|}NB!Z1U!(A$gx{p}`_p>M-_ysqq5ea}-=uUV6TVg96A6D->7PRS zuLwTsZzKNu0>}E(ZOqO`3a8tuoiCI=e{TAt;G_Od()Xp=9c&lsml7VW@Y4xTBAmy` z6IB21f{*&I5x>8{QGX@jgB5-b;YTU`Z%BWF;G_O~#Gff})W4eWISRj$@I0lTPV?w= z!AJf5#6MHusL$i-9EIOb{MAZ-2I*fV_^AIq@oy10>TeZcK2r0`V2E0z8-(qAF?sDA|U*9aW-`w@PH!Ve?-2Bm*D>E9;!sGmjrhXs!M zM-%?I!uh_*9ZLTl(tlp?QU5s7d0XJ9e*)p}Dg1cCKUMlM^nT#Cf{*%qUnZXy^ZHgm zIxgLC%=kjW;|Rwj9tTI0KL5@MkIy{fAF6bg65dbYHH06b^h-(q7{SN-mk@utz%f32 zKj;jFuO|L{rGFFYFA{vz=X%x%9QAJ`o#hJW--%tN^!f9k%LO0x&nKM?0!RIggx4zk z0mAQ5`VL(`J}UUA&-c?lEpXI-nsjz5{7J%JRr*6n|6RdH{dL6uT;QnxCgEQxd^h0- zl>S1}kLU`8VdL?08}T~|9Q8jVJVoK365f+=Oyc;wn)DA7e5^mmlYc*l$N4X$Gg|P` z_h-TK{Qm4=H>Y;aipd9MXSQ@KOIA(%&s`)XyfJJqn*h_(w{A zHR*pL_^8kKTOSlS>hpcizbX7A(vR*2B-pTe2yG$#B*HO?`rlCfdkGx%%SflM!b=Dr ztn@!8{i6gQ^$(K%6oI2Y-)}ul;e4Oi9Hrltt{?LRAN3=tJ{1B-{c8xXR`^wfpQH4r zl0N@_6vw9{@vm1pcM-l`;dc;zhtfZr^dA&_tbaG+Zx=Y$|4)QJrSQ#!zo_*2{*pHZ zAN3C<{$B--`Y#dwnZjQn{ClPU0oDIk!AJd}#E4Kk1t0bK`xrk89QFBo0zWG}hxFYZK!T0O&j`|wBb?_i zuP5CFj{1e9ldf>S|EHhQUrhQ(2tL;TQi{(6fusI1($7{ne_v^a(qBjV^93LEuOO=|4yMs{|kQYf1kqfusISq;s9ZHxOQ{^nWJ(djuc#?_2(JV`9$#1_bI}^Qu=&f4*&ihkDn*0{_W_E zDb|0BbYc|FzYm;3IFHZEss23$AM4MbQw$V1*7I}HAFA;EgpXGG+ev?t;G_OqRR7rm zNBv((=Ol&m_e}DY{@0{mD)^}X5$UfGIO-?R`*kZ79!L14O5Yz3g2y>0$%OYMoX02MZ!}o&vHpCVI!54F z|8mk9ukcdBrxDKjDG5*rwmE+D5~zP4s{bN^qyG7%bDF|e5?)O>>rW#6a|9pjKZx`% z7dYx)OFCC7{A$A26VCceN&gPPNByHn|51UXKL6hDW`*BL`cDzg`gNrLqTr)Ge~<26 zfusIb()mE)TL}M*aMpjD^uHH;)aT=AL^>p3J+9@1Yx`bC0| z`e%^-Qh}p>J9@wREQRxZu;&r(A^p3^_d0>sK^|{+2^`z|6!D)>_$P$FBXF!by&d6v zE^yTOp7;^Htdj>`5KrOv^97DNhgzC5K;X#lL;Q&fpG5cqfujz8{!$@u)ZyRnU9Iq? zq;s3VQD-dt$L$e;qYnQr?h6X%?}_|P;HWblMPU0;;Ha~SeB*kX?7;ct+k_t`aMYP+ zY0gN2qt1TfpP=ye^uBkAz)`1&bXEu)b@+Q_*C>1x={zWK)LBA0PY4`!jwSwE3NIo2 zJAtFl1*8+v$L{br;pcO8Q8<5p>Zqm6%;HYy8@$Xak(}eF7IO^;powo#zI@51UCR^-v(e#_{PvI(-F>Iy;H~|CM&;(N$Gv z6n_X7P$;7nk(P)PgT#PhzyX4Q1*w2I6odsyFpMEU2q=`6-~vPu4d4I@8dL-o6etdb zqEWFdr!GK27BU2739Uw`#YJ(zp6}kh$IYiB;#uXm`Lu$5v+&;F`yDqQK97IIar3zi`kF1n zLMZH?Y2Ym!H=q89r@iCmGZ*^ng|7zBbKHD*AIK!f&4<6wI8XRK_^fo?e0W{P=dU)O z3g|U|bv^sw6v`LkGX?AQo#W=i-(zajDyml5KUwfeciiHc4WG`An@?ZpZxucPe1hZV zvk*Qr95za z@ak=XC=?6Bd=4OZs4&i)0@TlYFvmWsKI#Nxkqdlmo)~JmL3_ zo6k}B)X9jdRrW(K_*@`-40spE&F3V1`Z{iCD)b|SF9E;Har3EDJ&t36 z=HHkoJRAP^J8nMR;q$oT<}(iZmxa#<-{!da+z6ioj+;*@^e2SB3EsGU5QW1283LaR z95)|6?{~HEf5YeZj$1s;Pc_1E^Eu643}w3TH1J0qH^l2r&pB>BeD3m1;Wxl%uj7Vh zVZACGH=n`KpMF_b2!;ENso>2VH?#mgZNbk7Y+d-9%sI)Cu8Dz-!^e znzd{C_TY7dr-L^D=Xmjc#TJg^P-o4i+BzQ_uV-pSIF;%2*8f>puRfyZdJS;g;_Qid z1`F>Fo+JLf;6KjkEuOb)$MH-NeR+&iC8B3M%S3+!`sbZ~O<SPA{bXkf5I> zdhA|O4>@k*G7X={o)DiBwEME?8RuKVIlfzkGr#0M;bX9$KMcQ0*7fWl}6lHFMnhhxz-`gttJu7mEKmHDaSo;Wfa! zIv;Cy7TWEfpdT!HzVGrKx9#l+d?t%eG59>ub9;DHIDcpSX~(S}GO@lZg?9j73(kJN z8|`jP;M>KgD|~he=W}y=9k=yef&IfF@y|xPCq>Wot=B0QFwT7F&q?4N5_p#cJ^-Bi zdEQ@?EBY+7J4N)2^Ip;Sg#N(;S=D~8l2K&)I{dQCM>`u@h6#aS7A9LKsrD?tRg_Gg~dFrgI<2kMutF@NT*`jzlo;GYJr{;d;u5AorB4!wjA zg@1qH1>m;|&j%kWoO!y23BLpSvEYoq8b0sc;q>;txHAn9($Ibs4_`ELsY4FXCd!G*+H=lLTZxhaZKKsBK=MUK4 z4kz&HIAOx=Z8Q993V##4E;#*pU7(fYw*SY+=Ts-hEtD@2&vnAD!?+J}+`eLEgg+~J zj++JV^PlRtwTs1w+=qrgE9H)xe>I%PJ1G1I_*aPkQurTtdh;J`=Al&Y5>Gkqjp1KYczy6X;2if& z@NX{sDezVayu0}GKBAt&&qup`#AiMHnU{;>$ot8sIUn0^_k#X@;T61YC7iz-vQqdF zYbca;!n;_9gi3?nl&rIN56ZlZ!8Q8(i5S|G>H-SH&z+Xz>+l2Ro|0fCjcml6>ZQP&L&_DF~ zbppRQf%g!ejd(@~9}PYsfzMCik0tO|g!4IqHxl^X1b!%iSMPRe|Ioi~0>2oX`=1&3 z;NB*Iw~Xzh?`6-1dFD;U*N95a8;kpho_SDngfri1k?^!(F}PcJF$^9R&OD{7g)<*% znefuVG5An8Z?OJcIP-{}5YBv|b!@{7#U|E2%nQo=ALPvc*Cm5fBl$aA%*)O1H+J0NzS`>4M@7?P(~bx>qv&(s zp98rGx{EM1ALBe8v=(lkL9L|6lS-fMSZ*);J1paJU!|V+&u57~3;obT`0v26d#&{0 ze!Q>fndgV+3AkPb@EIt2=G7S@d^+^Qgx?K5QuxE*V}(BfUMPGO_#MJGf=?69|Ve>nZvyEaT%#r9K;cJf`Mhf5ljyi77ezagp#+EUyw? zhGkCaQx5(SrsPqF1a??B??>Y6)MsHFd7YV@_kr+v5%MzV2V+Xk>l($vOHB|8f47u+ zUf+LJ^c*kVM^Akj_lKfC3LbTOXoq@!&uWbJ$+NLPZ7IA2Je59i%Gjcu+%PRFjHe?x zSD2TdlU|f}XHhEs_MD=eRC?~jiK+C$akgOccIh2YU2GQ?txhBebLsixhUMf7gSJ|SY)k6zOk+_r(i^0U~#p=f)PL0C@=lDeQs$xu_$NQ7&MeOa_I2FoUwV)Q2t;4(n4(;LLQH3 zmW7%7a6BjH@rldlh8Y{GECNhR@k0Sy&yRuWteskTy$Pmv{4&nX1~|n${9NV~n;REX zmxMX<{9o(03w6zt$GtjDPx=WJf%&u$i1 zO5^(g9%-0zV#m*_`hPqQyu~=LX#H=qjGz5KDzK{BFHQ?Dgt99?p7MVhXE41zOsi`D z=uPn&j%*$at^L~JPussUuvi)E_crK$GNjz2U#DJ@6f5608xd;bzYu`@6Y5Ow+ zQ_p}>bGF+5pYk8XOF!2>5?-jP{uw*s8kuYm2C7{UcvbNqEsvEw@y4|H?bIUeIDU3~ zQqO==UH97mpU%6-OF!4H2rpFCen)%&$v{PG-`@M${>H$nYJURSpC%i&YOR}<1(d2N zxBnq8QKNXu|Ehg2yiisABN6{r99JxUv(otY1ZJLG&oCR6oMZ8nzpDUT87t#B6ke#R zenHJx!Ms*U^^Ygif4O#Cza=YT%62)m#w+KYb|30H6wRvkEYwFgRm#gzzn{Fo{-e-7 z$5hq-9dY9ZkL%X|=Y&7j=k{yyNE4BD22LcEU_WZR!}V3vw|$CiVp07vd{NnL0#|hX TZ8u+4{p>GeCC^*YLhJt*WmJN* literal 37864 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 diff --git a/developer/authored/example_machines.py b/developer/authored/example_machines.py new file mode 100755 index 0000000..1bed6b4 --- /dev/null +++ b/developer/authored/example_machines.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +import TM as tm_lib + +def example_machine_grammar(): + print("--- TM Machine Grammar Example ---") + + data = [10, 20, 30, 40, 50] + + # 1. The Default Machine (TM_Arr_SR_ND) + t_def = tm_lib.TM(data) + print(f"\n[Default] {type(t_def).__name__}") + print(f" Read: {t_def.r()}") + t_def.s() + print(f" Step, Read: {t_def.r()}") + + # 2. The Mirror Machine (TM_Arr_SL_ND) + t_mir = tm_lib.TM_SL(data) + print(f"\n[Mirror] {type(t_mir).__name__}") + t_mir.sR() + print(f" Cue Rightmost, Read: {t_mir.r()} (Exp: 50)") + t_mir.ls() + print(f" Left Step, Read: {t_mir.r()} (Exp: 40)") + + # 3. Abstract Natural Number Machine (TMA) + t_nat = tm_lib.TMA_NaturalNumber() + print(f"\n[Abstract] {type(t_nat).__name__}") + print(f" Read: {t_nat.r()} (Exp: 0)") + t_nat.sn(1000) + print(f" Step 1000, Read: {t_nat.r()} (Exp: 1000)") + + # 4. Explicit Grammar Construction + # TM_ASCII_SR_SO (ASCII, Step Right, Solitary) + # Uses the Array backing but with ASCII type name + ascii_data = [65, 66, 67] # A, B, C + t_asc = tm_lib.TM_ASCII_SR_SO(ascii_data) + print(f"\n[Grammar Explicit] {type(t_asc).__name__}") + print(f" Read: {t_asc.r()} (Exp: 65)") + +if __name__ == "__main__": + example_machine_grammar() diff --git a/developer/deprecated_examples/example_TM_0.py b/developer/deprecated_examples/example_TM_0.py new file mode 100755 index 0000000..46b06c5 --- /dev/null +++ b/developer/deprecated_examples/example_TM_0.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +import sys +from TM import TM ,Topology + +def CLI(): + print("--- TM Happy Path (example_TM_0) ---") + + # 1. Initialization + # --------------------------------------------------------- + print("\n[1] Initialization") + data_list = [10 ,20 ,30 ,40 ,50] + tm_0 = TM(data_list) + print(f"Created TM with: {data_list}") + print(f"Address: {tm_0.address()} (Should be 0)") + print(f"Length: {tm_0.len()} (Should be 5)") + + # 2. Read / Step / Write + # --------------------------------------------------------- + print("\n[2] Movement and IO") + + # Read current (0) + val = tm_0.r() + print(f"r(): {val} (Exp: 10)") + + # Step 1, Read + tm_0.s() + print(f"s() -> 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/deprecated_examples/example_TM_1.py b/developer/deprecated_examples/example_TM_1.py new file mode 100755 index 0000000..73795d2 --- /dev/null +++ b/developer/deprecated_examples/example_TM_1.py @@ -0,0 +1,79 @@ +#!/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/deprecated_examples/example_TM_ND.py b/developer/deprecated_examples/example_TM_ND.py new file mode 100755 index 0000000..2b54cd2 --- /dev/null +++ b/developer/deprecated_examples/example_TM_ND.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +from TM import TM + +def example_differentiation(): + print("--- TM Factory Differentiation Example ---") + + data = [10, 20, 30] + + # 1. Default (No Features) + t1 = TM(data) + print(f"\nRequest: Default") + print(f"Result Type: {type(t1).__name__} (Expected: TM_Array_SR_ND)") + + # 2. Mirror View (Feature L) + # Use the underscore syntax + feat_L = TM.feature_L + + t2 = TM(data, [feat_L]) + print(f"\nRequest: Feature L ({feat_L})") + print(f"Result Type: {type(t2).__name__} (Expected: TM_Array_ND)") + + # 3. Explicit Defaults (Should be ignored/stripped) + feat_SR = TM.feature_SR + t3 = TM(data, [feat_SR, feat_L]) + print(f"\nRequest: Features SR + L") + print(f"Result Type: {type(t3).__name__} (Expected: TM_Array_ND)") + +if __name__ == "__main__": + example_differentiation() diff --git a/developer/deprecated_examples/example_TM_SR_ND.py b/developer/deprecated_examples/example_TM_SR_ND.py new file mode 100755 index 0000000..7b0d145 --- /dev/null +++ b/developer/deprecated_examples/example_TM_SR_ND.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +from TM import TM, Features + +def example_bidirectional_machine(): + print("--- TM·Array_ND (Bidirectional) Example ---") + + data = [10, 20, 30, 40, 50] + + # Request 'L' feature to get the ND machine + tm = TM(data, [Features.L]) + print(f"Created TM with Feature 'L'. Data: {data}") + + # 1. Forward to Middle + tm.sn(2) + print(f"sn(2) -> Read: {tm.r()} (Exp: 30)") + + # 2. Left Step (ls) - Only available on ND + print("\n[Left Step]") + tm.ls() + print(f"ls() -> Read: {tm.r()} (Exp: 20)") + + # 3. Query Left (qL) + print("\n[Query Left]") + print(f"At 20. qL(): {tm.qL()} (Exp: False)") + tm.ls() # At 10 (Start) + print(f"ls() -> At 10. qL(): {tm.qL()} (Exp: True)") + + # 4. Cue Rightmost (sR) + print("\n[Cue Rightmost]") + tm.sR() + print(f"sR() -> Read: {tm.r()} (Exp: 50)") + print(f"qR(): {tm.qR()} (Exp: True)") + +if __name__ == "__main__": + example_bidirectional_machine() diff --git a/developer/deprecated_examples/example_TM_SR_ND_aR.py b/developer/deprecated_examples/example_TM_SR_ND_aR.py new file mode 100755 index 0000000..290774a --- /dev/null +++ b/developer/deprecated_examples/example_TM_SR_ND_aR.py @@ -0,0 +1,48 @@ +#!/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/deprecated_examples/example_features.py b/developer/deprecated_examples/example_features.py new file mode 100755 index 0000000..7233dc6 --- /dev/null +++ b/developer/deprecated_examples/example_features.py @@ -0,0 +1,59 @@ +#!/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/deprecated_examples/example_queries.py b/developer/deprecated_examples/example_queries.py new file mode 100755 index 0000000..3801579 --- /dev/null +++ b/developer/deprecated_examples/example_queries.py @@ -0,0 +1,88 @@ +#!/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/deprecated_examples/example_region.py b/developer/deprecated_examples/example_region.py new file mode 100644 index 0000000..1ab3aba --- /dev/null +++ b/developer/deprecated_examples/example_region.py @@ -0,0 +1,43 @@ +#!/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() + diff --git a/developer/old_code.tar b/developer/old_code.tar deleted file mode 100644 index c8cf2196545c2afe2e808a438b929a49b671e0d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51200 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 diff --git a/document/TM.html b/document/TM.html index ebe8d5b..13555e3 100644 --- a/document/TM.html +++ b/document/TM.html @@ -365,6 +365,45 @@
  • wn(list) writes a list of values.
  • +

    Destructive Primitives

    + +

    + Machines configured with the SO (Solitary) entanglement approach may expose primitives that modify the tape structure. + These are distinct from w (which modifies cell content) because they change the cell count or sequence. +

    + +

    + Note: Not all container types support all destructive operations. For example, ARR (Fixed Array) does not support deletion or insertion, whereas ARRV (Variable Array) does. +

    + +

    Delete (d)

    +

    + Removes cells from the tape. The head typically lands on the right neighbor of the deleted segment. +

    +
      +
    • d(): Deletes the current cell.
    • +
    • dn(n): Deletes n cells starting from current.
    • +
    • dR(): Deletes from current to Rightmost (inclusive).
    • +
    • dL(): Deletes from current to Leftmost (inclusive).
    • +
    + +

    Delete Neighbor (esd)

    +

    + A compound-style primitive that deletes a neighbor without moving the active head. + Mnemonic: Entangle-Step-Delete (conceptually acts on the neighbor). +

    +
      +
    • esd(): Deletes the immediate right neighbor. Guard: Requires not qR().
    • +
    • esdn(n): Deletes n right neighbors.
    • +
    • Lesd(): Deletes the immediate left neighbor. Guard: Requires not qL().
    • +
    + +

    Insert/Append (a)

    +
      +
    • a(v): Inserts value v at the current head position. The old current cell shifts right.
    • +
    • an(list): Splices a list of values at the current position.
    • +
    +

    Query primitives

    @@ -573,6 +612,69 @@

    Because the TMS implements the TM interface, it can be passed directly to these algorithms. However, if the status is Empty, the first operation attempted by the algorithm (usually r()) will trigger a "second order" error, alerting the programmer that they neglected the guard.

    +

    Machine Naming Convention

    + +

    + Concrete Tape Machine classes follow a strict naming grammar. This grammar acts as a feature descriptor, allowing the programmer to select a machine by constructing its name. +

    + +

    + The name is composed of three feature segments: the Container Type, the Step Direction, and the Entanglement Approach. +

    + +

    grammar

    + + class_name :: TM [ _container ] [ _direction ] [ _entanglement ] + container :: ARR | ARRV | GR | GLR | SET | MAP | MAPK | MAPV + | ASCII | UTF8 | BCD + direction :: SR | SL + entanglement :: ND | SO | EA + + +

    + Segments are separated by underscores. The default configuration for a segment is used if that segment is omitted. + The default machine is TM_ARR_SR_ND (Fixed Array, Step Right, Non-Destructive). +

    + +

    container

    +
      +
    • ARR Array Fixed (Default). A contiguous sequence of fixed length (e.g., Python List, C Array).
    • +
    • ARRV Array Variable. A contiguous sequence that may resize (e.g., Vector).
    • +
    • GR Graph Right. A node-based sequence with a single right neighbor (Singly Linked List).
    • +
    • GLR Graph Left Right. A node-based sequence with left and right neighbors (Doubly Linked List).
    • +
    • SET Set. Iteration over the elements of a Set.
    • +
    • MAP Map. Iteration over the items (Key-Value pairs) of a Map.
    • +
    • MAPK Map Keys. Iteration over the keys of a Map.
    • +
    • MAPV Map Values. Iteration over the values of a Map.
    • +
    • ASCII Ascii. A sequence of 1-byte characters.
    • +
    • UTF8 Utf8. A sequence of variable-width Unicode characters.
    • +
    • BCD Bcd. A sequence of Binary Coded Decimal values.
    • +
    + +

    direction

    +
      +
    • SR Step Right (Default). The machine head can only be moved to the right.
    • +
    • SL Step Left. The machine is bidirectional, supports stepping either right or left.
    • +
    + +

    entanglement

    +
      +
    • ND Non-Destructive (Default). Safe for entanglement.
    • +
    • SO Solitary. Exclusive ownership; supports destructive ops.
    • +
    • EA Entanglement Accounting. Shared access guarded by a catalog.
    • +
    + +

    Abstract and Traversal Machines

    +

    + The naming convention extends to Abstract and Traversal machines using specific prefixes. +

    +
      +
    • TMA TM Abstract. Virtual tapes computed over state. +
      Example: TMA_Natural_Number (Iterates 0, 1, 2...).
    • +
    • TMT TM Traversal. Algorithmic traversals over non-linear structures. +
      Example: TMT_Tree_DepthFirst (Linearizes a tree via stack/recursion).
    • +
    + -- 2.20.1