From e5fc6c7e36e12b3415e7b832fcbb5d7fa1fdcffd Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Mon, 9 Feb 2026 09:31:29 +0000 Subject: [PATCH] =?utf8?q?working=20TM=C2=B7Array=5FSR=5FND,=20revamping?= =?utf8?q?=20Symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- developer/authored/DiscreteFunction.py | 61 ---- developer/authored/SymbolSpace.py | 84 ----- developer/authored/Synbol.py | 66 ++++ developer/authored/TM.py | 73 +---- developer/authored/TM_module.c | 291 +++++++----------- developer/authored/TM_old.py | 151 +++++++++ .../temp.linux-x86_64-cpython-311/TM_module.o | Bin 0 -> 40584 bytes developer/authored/example_TM_SR_ND.py | 28 ++ developer/authored/example_TM_SR_ND_aR.py | 48 +++ developer/authored/example_region.py | 43 +++ developer/old_code.tar | Bin 0 -> 51200 bytes 11 files changed, 443 insertions(+), 402 deletions(-) delete mode 100755 developer/authored/DiscreteFunction.py delete mode 100755 developer/authored/SymbolSpace.py create mode 100644 developer/authored/Synbol.py create mode 100644 developer/authored/TM_old.py create mode 100644 developer/authored/build/temp.linux-x86_64-cpython-311/TM_module.o create mode 100755 developer/authored/example_TM_SR_ND.py create mode 100755 developer/authored/example_TM_SR_ND_aR.py create mode 100644 developer/authored/example_region.py create mode 100644 developer/old_code.tar diff --git a/developer/authored/DiscreteFunction.py b/developer/authored/DiscreteFunction.py deleted file mode 100755 index f11ad4d..0000000 --- a/developer/authored/DiscreteFunction.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -from SymbolSpace import SymbolSpace - -# ========================================== -# THE GRAPH (Discrete Function) -# ========================================== - -class DiscreteFunction: - """ - The Knowledge Store. - Supports 'Smart Postings' to Parent Symbols. - """ - def __init__(self): - self._rev = {} # reverse map: Symbol -> Set of Objects - - def _add_posting(self ,sym ,obj): - if sym not in self._rev: self._rev[sym] = set() - self._rev[sym].add(obj) - - def set(self ,obj_sym ,prop_sym): - """ - Assigns a property. Updates indexes for the specific property - AND its namespace (Parent). - """ - # 1. Index Specific (e.g., #105 'Red') - self._add_posting(prop_sym ,obj_sym) - - # 2. Index General (e.g., #50 'Color') - parent = SymbolSpace.get_parent(prop_sym) - if parent: - self._add_posting(parent ,obj_sym) - - def find(self ,sym): - """Returns the set of objects associated with this symbol.""" - return self._rev.get(sym ,set()) - -# --- Work Function --- - -def verify_graph(): - print("--- DiscreteFunction Verification ---") - # 1. Create Symbols - sym_obj = SymbolSpace.alloc() - sym_prop = SymbolSpace.alloc() - sym_parent = SymbolSpace.alloc() - - # 2. Setup Hierarchy - SymbolSpace.set_parent(sym_prop, sym_parent) - - # 3. Set Fact - df = DiscreteFunction() - df.set(sym_obj, sym_prop) - - # 4. Check Smart Posting - print(f"Finding specific property: {len(df.find(sym_prop))} (Expected 1)") - print(f"Finding parent category: {len(df.find(sym_parent))} (Expected 1)") - -def CLI(): - verify_graph() - -if __name__ == "__main__": - CLI() diff --git a/developer/authored/SymbolSpace.py b/developer/authored/SymbolSpace.py deleted file mode 100755 index e363e3e..0000000 --- a/developer/authored/SymbolSpace.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python3 -from collections import deque as FIFO - -class SymbolSpace: - """ - The manager of the Epimetheus integer namespace. - """ - - _counter = 0 - _dealloc_queue = FIFO() - - # HIERARCHY SUPPORT (Added) - _parents = {} # Map: Child_Sym -> Parent_Sym - - class Instance: - """The handle for a symbol.""" - __slots__ = ('_value' ,) - - def __init__(self ,value): - self._value = value - - def __eq__(self ,other): - # Compare value, not identity - if isinstance(other ,SymbolSpace.Instance): return self._value == other._value - return False - - def __hash__(self): - return hash(self._value) - - def __repr__(self): - return f"" - - @classmethod - def alloc(cls) -> 'SymbolSpace.Instance': - val = 0 - if cls._dealloc_queue: - val = cls._dealloc_queue.popleft() - else: - cls._counter += 1 - val = cls._counter - return cls.Instance(val) - - @classmethod - def dealloc(cls ,sym: 'SymbolSpace.Instance'): - val = sym._value - if val == 0: raise ValueError("Null symbol (0) cannot be deallocated.") - - if val == cls._counter: - cls._counter -= 1 - while cls._counter > 0 and cls._counter in cls._dealloc_queue: - cls._dealloc_queue.remove(cls._counter) - cls._counter -= 1 - else: - cls._dealloc_queue.append(val) - - @classmethod - def get_null(cls) -> 'SymbolSpace.Instance': - return cls.Instance(0) - - # --- Hierarchy Methods --- - - @classmethod - def set_parent(cls ,child ,parent): - cls._parents[child] = parent - - @classmethod - def get_parent(cls ,child): - return cls._parents.get(child) - -def verify(): - print(f"Allocating 3 symbols...") - s1 = SymbolSpace.alloc() - s2 = SymbolSpace.alloc() - - # Test Hierarchy - SymbolSpace.set_parent(s2, s1) - assert SymbolSpace.get_parent(s2) == s1 - print("Hierarchy check passed.") - -def CLI(): - verify() - -if __name__ == "__main__": - CLI() diff --git a/developer/authored/Synbol.py b/developer/authored/Synbol.py new file mode 100644 index 0000000..8234e18 --- /dev/null +++ b/developer/authored/Synbol.py @@ -0,0 +1,66 @@ +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 9af7de4..3fff29a 100755 --- a/developer/authored/TM.py +++ b/developer/authored/TM.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 import sys -from enum import Enum, auto try: import TM_module @@ -8,73 +7,9 @@ except ImportError: print("Error: Import failed. Run 'python3 setup.py build_ext --inplace'") sys.exit(1) -# ========================================== -# 1. Enums & Features -# ========================================== - class Features: - APPEND_RIGHT = "aR" - -class Status(Enum): - ABANDONED = auto() - ACTIVE = auto() - EMPTY = auto() - -class Topology(Enum): - CIRCLE = auto() - LINEAR_RIGHT = auto() - LINEAR_OPEN = auto() - NULL = auto() - SEGMENT = auto() - -# ========================================== -# 2. The Machine (Factory) -# ========================================== - -# TM is now the Factory Function from the C module -TM = TM_module.FastTM - -# ========================================== -# 3. Status Wrapper (TMS) -# ========================================== - -class TMS: - def __init__(self, data_obj=None, features=None): - """ - TMS Constructor. - Args: - data_obj: Initial data container (list). - features: List of feature symbols (e.g. [Features.APPEND_RIGHT]). - """ - if data_obj: - # Factory Call: C determines the underlying type based on features - self.tm = TM(data_obj, features) - self._stat = Status.ACTIVE - else: - self.tm = None - self._stat = Status.EMPTY - - # --- Base Methods (SR_ND) --- - def r(self): return self.tm.r() - def rn(self, n): return self.tm.rn(n) - def w(self, v): return self.tm.w(v) - def wn(self, v): return self.tm.wn(v) - def s(self): return self.tm.s() - def sn(self, n): return self.tm.sn(n) - - def address(self): return 0 if self.empty() else self.tm.address() - def len(self): return 0 if self.empty() else self.tm.len() - - # --- Feature Methods (Delegated) --- - # If the C-Type doesn't have these, Python raises AttributeError. - def aR(self, v): return self.tm.aR(v) - - # --- Meta --- - def e(self): - # Cloning preserves the underlying C-Type (and thus features) - return TMS(self.tm.e()) if not self.empty() else TMS(None) + # No features currently supported for Array TM + pass - def empty(self): return self._stat == Status.EMPTY - def rightmost(self): return True if self.empty() else self.tm.rightmost() - def leftmost(self): return True if self.empty() else (self.tm.head == 0) - def topology(self): return Topology.NULL if self.empty() else Topology.SEGMENT +# The First Order TM Factory +TM = TM_module.TM diff --git a/developer/authored/TM_module.c b/developer/authored/TM_module.c index b0e7524..4056135 100644 --- a/developer/authored/TM_module.c +++ b/developer/authored/TM_module.c @@ -2,8 +2,11 @@ TM_module.c CPython Extension: Tape Machine Factory Implements: - - TM_SR_ND (Base: Step Right, Non-Destructive) - - TM_SR_ND_AR (Feature: Append Right) + - 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. */ #define PY_SSIZE_T_CLEAN @@ -12,268 +15,188 @@ #include /* ========================================================= */ -/* 1. DATA LAYOUT (Shared) */ +/* 1. DATA LAYOUT */ /* ========================================================= */ typedef struct { PyObject_HEAD - PyObject* tape_obj; /* The Python List (Shared) */ - PyObject* peer_list; /* List of WeakRefs (Shared) */ - Py_ssize_t head; /* Raw Instruction Pointer */ - PyObject* weakreflist; /* Required for WeakRefs */ + 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; static void FastTM_dealloc(FastTM* self){ - if( self->weakreflist != NULL ){ - PyObject_ClearWeakRefs((PyObject*)self); - } Py_XDECREF(self->tape_obj); - Py_XDECREF(self->peer_list); Py_TYPE(self)->tp_free((PyObject*)self); } -/* Helper: Register Entanglement */ -static int register_entanglement(FastTM* self, PyObject* existing_peer_list){ - PyObject* weak_ref = NULL; - if( existing_peer_list ){ - self->peer_list = existing_peer_list; - Py_INCREF(self->peer_list); - } else { - self->peer_list = PyList_New(0); - if( !self->peer_list ) return -1; - } - weak_ref = PyWeakref_NewRef((PyObject*)self, NULL); - if( !weak_ref ) return -1; - if( PyList_Append(self->peer_list, weak_ref) < 0 ){ - Py_DECREF(weak_ref); - return -1; - } - Py_DECREF(weak_ref); +/* 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 */ + return 0; } /* ========================================================= */ -/* 2. THE MIXIN LIBRARY (Static C Functions) */ +/* 2. TM·Array_SR_ND Methods (Static Implementation) */ /* ========================================================= */ -/* --- Navigation --- */ -static PyObject* mixin_s(FastTM* self){ - self->head++; +/* TM·Array_SR_ND·s: Step Right */ +static PyObject* TM·Array_SR_ND·s(FastTM* self){ + self->head_ptr++; Py_RETURN_NONE; } -static PyObject* mixin_sn(FastTM* self, PyObject* arg_tuple){ +/* TM·Array_SR_ND·sn: Step N */ +static PyObject* TM·Array_SR_ND·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, "Machine supports positive steps only."); + PyErr_SetString(PyExc_ValueError, "Step Right machine supports positive steps only."); return NULL; } - self->head += n_val; + self->head_ptr += n_val; Py_RETURN_NONE; } -/* --- I/O --- */ -static PyObject* mixin_r(FastTM* self){ - PyObject* item_obj = PyList_GetItem(self->tape_obj, self->head); - if( !item_obj ) return NULL; - Py_INCREF(item_obj); - return item_obj; -} - -static PyObject* mixin_rn(FastTM* self, PyObject* arg_tuple){ - Py_ssize_t n_val; - if( !PyArg_ParseTuple(arg_tuple, "n", &n_val) ) return NULL; - return PyList_GetSlice(self->tape_obj, self->head, self->head + n_val); -} - -static PyObject* mixin_w(FastTM* self, PyObject* val_obj){ - Py_INCREF(val_obj); - if( PyList_SetItem(self->tape_obj, self->head, val_obj) < 0 ) return NULL; +/* TM·Array_SR_ND·LsR: Rewind */ +static PyObject* TM·Array_SR_ND·LsR(FastTM* self){ + self->head_ptr = self->start_ptr; Py_RETURN_NONE; } -static PyObject* mixin_wn(FastTM* self, PyObject* arg_tuple){ - PyObject* val_list; - if( !PyArg_ParseTuple(arg_tuple, "O", &val_list) ) return NULL; - Py_ssize_t len_val = PySequence_Size(val_list); - if( PyList_SetSlice(self->tape_obj, self->head, self->head + len_val, val_list) < 0 ) return NULL; - Py_RETURN_NONE; +/* TM·Array_SR_ND·r: Read */ +static PyObject* TM·Array_SR_ND·r(FastTM* self){ + PyObject* item = *(self->head_ptr); + Py_INCREF(item); + return item; } -/* --- Features --- */ - -/* Feature: aR (Append Right) */ -static PyObject* mixin_aR(FastTM* self, PyObject* val_obj){ - /* aR typically appends to the END of the tape, - regardless of head position, in non-destructive contexts? - Or at the head? - Standard definition: Append to end of container. */ - if( PyList_Append(self->tape_obj, val_obj) < 0 ) return NULL; +/* TM·Array_SR_ND·w: Write */ +static PyObject* TM·Array_SR_ND·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); Py_RETURN_NONE; } -/* --- Meta --- */ -static PyObject* mixin_e(FastTM* self){ - /* Factory-aware Entanglement: - We call the type's constructor. Since Py_TYPE(self) is the specific - machine type (e.g. TM_SR_ND_AR), the clone will inherit the same features. */ - PyObject* arg_tuple = PyTuple_Pack(1, self); - PyObject* new_obj = PyObject_CallObject((PyObject*)Py_TYPE(self), arg_tuple); - Py_DECREF(arg_tuple); - return new_obj; -} - -static PyObject* mixin_address(FastTM* self){ - return PyLong_FromSsize_t(self->head); -} - -static PyObject* mixin_len(FastTM* self){ - return PyLong_FromSsize_t(PyList_Size(self->tape_obj)); +/* TM·Array_SR_ND·qR: Query Rightmost */ +static PyObject* TM·Array_SR_ND·qR(FastTM* self){ + if( self->head_ptr >= (self->end_ptr - 1) ) Py_RETURN_TRUE; + Py_RETURN_FALSE; } -static PyObject* mixin_rightmost(FastTM* self){ - Py_ssize_t len = PyList_Size(self->tape_obj); - if( self->head >= len - 1 ) Py_RETURN_TRUE; - Py_RETURN_FALSE; +/* TM·Array_SR_ND·address: Get Index */ +static PyObject* TM·Array_SR_ND·address(FastTM* self){ + Py_ssize_t idx = self->head_ptr - self->start_ptr; + return PyLong_FromSsize_t(idx); } /* ========================================================= */ -/* 3. TYPE DEFINITIONS */ +/* 3. TM·Array_SR_ND Init */ /* ========================================================= */ -/* Generic Init (Used by all types) */ -static int GenericTM_init(FastTM* self, PyObject* args, PyObject* kwds){ +static int TM·Array_SR_ND·init(FastTM* self, PyObject* args, PyObject* kwds){ PyObject* input_obj = NULL; - PyObject* features_obj = NULL; /* Ignored here, consumed by Factory */ + PyObject* features_obj = NULL; if( !PyArg_ParseTuple(args, "O|O", &input_obj, &features_obj) ) return -1; - if( PyObject_TypeCheck(input_obj, Py_TYPE(self)) ){ - /* Clone/Entangle */ - FastTM* source_tm = (FastTM*)input_obj; - self->tape_obj = source_tm->tape_obj; - Py_INCREF(self->tape_obj); - self->head = source_tm->head; - if( register_entanglement(self, source_tm->peer_list) < 0 ) return -1; - } else { - /* New */ - if( PyList_Check(input_obj) ){ - self->tape_obj = input_obj; - Py_INCREF(self->tape_obj); - } else { - self->tape_obj = PySequence_List(input_obj); - if( !self->tape_obj ) return -1; - } - if (PyList_Size(self->tape_obj) == 0) { - PyErr_SetString(PyExc_ValueError, "First Order TM cannot be empty."); - return -1; - } - self->head = 0; - if( register_entanglement(self, NULL) < 0 ) 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."); + return -1; } + + self->tape_obj = input_obj; + Py_INCREF(self->tape_obj); + + refresh_pointers(self); + return 0; } -/* --- Type 1: TM_SR_ND (Base) --- */ -static PyMethodDef TM_SR_ND_methods[] = { - {"r", (PyCFunction)mixin_r, METH_NOARGS, ""}, - {"rn", (PyCFunction)mixin_rn, METH_VARARGS, ""}, - {"w", (PyCFunction)mixin_w, METH_O, ""}, - {"wn", (PyCFunction)mixin_wn, METH_VARARGS, ""}, - {"s", (PyCFunction)mixin_s, METH_NOARGS, ""}, - {"sn", (PyCFunction)mixin_sn, METH_VARARGS, ""}, - {"e", (PyCFunction)mixin_e, METH_NOARGS, ""}, - {"address", (PyCFunction)mixin_address, METH_NOARGS, ""}, - {"len", (PyCFunction)mixin_len, METH_NOARGS, ""}, - {"rightmost", (PyCFunction)mixin_rightmost, METH_NOARGS, ""}, - {NULL} -}; - -static PyTypeObject TM_SR_ND_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "TM_module.TM_SR_ND", - .tp_doc = "Step Right, Non-Destructive", - .tp_basicsize = sizeof(FastTM), - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc)GenericTM_init, - .tp_dealloc = (destructor)FastTM_dealloc, - .tp_methods = TM_SR_ND_methods, - .tp_weaklistoffset = offsetof(FastTM, weakreflist) -}; +/* ========================================================= */ +/* 4. TYPE DEFINITION */ +/* ========================================================= */ -/* --- Type 2: TM_SR_ND_AR (Base + aR) --- */ -static PyMethodDef TM_SR_ND_AR_methods[] = { - /* Copy Base Methods */ - {"r", (PyCFunction)mixin_r, METH_NOARGS, ""}, - {"rn", (PyCFunction)mixin_rn, METH_VARARGS, ""}, - {"w", (PyCFunction)mixin_w, METH_O, ""}, - {"wn", (PyCFunction)mixin_wn, METH_VARARGS, ""}, - {"s", (PyCFunction)mixin_s, METH_NOARGS, ""}, - {"sn", (PyCFunction)mixin_sn, METH_VARARGS, ""}, - {"e", (PyCFunction)mixin_e, METH_NOARGS, ""}, - {"address", (PyCFunction)mixin_address, METH_NOARGS, ""}, - {"len", (PyCFunction)mixin_len, METH_NOARGS, ""}, - {"rightmost", (PyCFunction)mixin_rightmost, METH_NOARGS, ""}, - /* Add Feature */ - {"aR", (PyCFunction)mixin_aR, METH_O, "Append Right"}, +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"}, {NULL} }; -static PyTypeObject TM_SR_ND_AR_Type = { +static PyTypeObject TM·Array_SR_ND·Type = { PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "TM_module.TM_SR_ND_AR", - .tp_doc = "Step Right, Non-Destructive, Append Right", + .tp_name = "TM_module.TM_Array_SR_ND", + .tp_doc = "Array TM: Pointer-based, Solitary, SR, ND", .tp_basicsize = sizeof(FastTM), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .tp_new = PyType_GenericNew, - .tp_init = (initproc)GenericTM_init, + .tp_init = (initproc)TM·Array_SR_ND·init, .tp_dealloc = (destructor)FastTM_dealloc, - .tp_methods = TM_SR_ND_AR_methods, - .tp_weaklistoffset = offsetof(FastTM, weakreflist) + .tp_methods = TM·Array_SR_ND·methods, }; /* ========================================================= */ -/* 4. THE FACTORY */ +/* 5. FACTORY */ /* ========================================================= */ -static PyObject* FastTM_Factory(PyObject* self, PyObject* args, PyObject* kwds){ +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 for "aR" in features */ - int has_aR = 0; + /* 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; i Active + # We must assume implicit list container for now + self.tm = TM([v]) + self._stat = Status.ACTIVE + else: + self.tm.aR(v) + + # --- Meta --- + def e(self): + return TMS(self.tm.e()) if not self.empty() else TMS([]) + + def empty(self): return self._stat == Status.EMPTY + def rightmost(self): return True if self.empty() else self.tm.rightmost() + +# ========================================== +# 4. Region Machine +# ========================================== + +class RegionMachine: + def __init__(self, t_active): + """ + Constructs a Region Machine from a single Active TM. + Initializes Left/Right boundaries to the current Active position. + """ + self.t_active = t_active + self.t_left = t_active.e() # Left Boundary + self.t_right = t_active.e() # Right Boundary + + # --- Bounds Management --- + def qL(self): + return TM_workspace.head_on_same_cell(self.t_active, self.t_left) + + def qR(self): + return TM_workspace.head_on_same_cell(self.t_active, self.t_right) + + def sR(self): + # Cue to Right Boundary (Simulated via address copying or step loop) + # Since we lack random access 'cue' in SR_ND, we might need 's' loop + # or direct address manipulation if supported. + # For now, we rely on the implementation matching the head. + pass # Todo: Implement cue via delta steps + + # --- Navigation (Guarded) --- + def s(self): + if self.qR(): + raise RuntimeError("Region Boundary Violation: Cannot step past Right Bound.") + self.t_active.s() + + def r(self): + return self.t_active.r() 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 new file mode 100644 index 0000000000000000000000000000000000000000..948af5a2ffa85f142b192f99c530f3c5fc21bc59 GIT binary patch literal 40584 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 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_region.py b/developer/authored/example_region.py new file mode 100644 index 0000000..1ab3aba --- /dev/null +++ b/developer/authored/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 new file mode 100644 index 0000000000000000000000000000000000000000..c8cf2196545c2afe2e808a438b929a49b671e0d9 GIT binary patch literal 51200 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 literal 0 HcmV?d00001 -- 2.20.1