| """
|
| Aurora Trinity-3 Trigate Implementation
|
| ======================================
|
|
|
| Fundamental logic module based on geometric coherence and ternary logic.
|
| Implements inference, learning, and deduction modes with O(1) LUT operations.
|
|
|
| Based on the principle: A + B + R = 180° (geometric triangle closure)
|
| Translated to ternary logic: {0, 1, NULL}
|
|
|
| Author: Aurora Program
|
| License: Apache-2.0 + CC-BY-4.0
|
| """
|
|
|
| from typing import List, Union, Optional, Tuple, Dict
|
| import itertools
|
|
|
|
|
|
|
| NULL = None
|
| TERNARY_VALUES = [0, 1, NULL]
|
|
|
|
|
| class Trigate:
|
| """
|
| Fundamental Aurora logic module implementing ternary operations.
|
|
|
| Supports three operational modes:
|
| 1. Inference: A + B + M -> R (given inputs and control, compute result)
|
| 2. Learning: A + B + R -> M (given inputs and result, learn control)
|
| 3. Deduction: M + R + A -> B (given control, result, and one input, deduce other)
|
|
|
| All operations are O(1) using precomputed lookup tables (LUTs).
|
| """
|
|
|
|
|
| _LUT_INFER: Dict[Tuple, int] = {}
|
| _LUT_LEARN: Dict[Tuple, int] = {}
|
| _LUT_DEDUCE_A: Dict[Tuple, int] = {}
|
| _LUT_DEDUCE_B: Dict[Tuple, int] = {}
|
| _initialized = False
|
|
|
| def __init__(self):
|
| """Initialize Trigate and ensure LUTs are computed."""
|
| if not Trigate._initialized:
|
| Trigate._initialize_luts()
|
|
|
| @classmethod
|
| def _initialize_luts(cls):
|
| """
|
| Initialize all lookup tables for O(1) operations.
|
|
|
| Based on extended XOR logic with NULL propagation:
|
| - 0 XOR 0 = 0, 0 XOR 1 = 1, 1 XOR 0 = 1, 1 XOR 1 = 0
|
| - Any operation with NULL propagates NULL
|
| - Control bit M determines XOR (1) or XNOR (0)
|
| """
|
| print("Initializing Trigate LUTs...")
|
|
|
|
|
| for a, b, m, r in itertools.product(TERNARY_VALUES, repeat=4):
|
|
|
|
|
| computed_r = cls._compute_inference(a, b, m)
|
| cls._LUT_INFER[(a, b, m)] = computed_r
|
|
|
|
|
|
|
| learned_m = cls._compute_learning(a, b, r)
|
| cls._LUT_LEARN[(a, b, r)] = learned_m
|
|
|
|
|
| deduced_b = cls._compute_deduction_b(m, r, a)
|
| deduced_a = cls._compute_deduction_a(m, r, b)
|
|
|
| cls._LUT_DEDUCE_B[(m, r, a)] = deduced_b
|
| cls._LUT_DEDUCE_A[(m, r, b)] = deduced_a
|
|
|
| cls._initialized = True
|
| print(f"Trigate LUTs initialized: {len(cls._LUT_INFER)} entries each")
|
|
|
| @staticmethod
|
| def _compute_inference(a: Union[int, None], b: Union[int, None], m: Union[int, None]) -> Union[int, None]:
|
| """
|
| Compute R given A, B, M using ternary logic.
|
|
|
| Logic:
|
| - If any input is NULL, result is NULL
|
| - If M is 1: R = A XOR B
|
| - If M is 0: R = A XNOR B (NOT(A XOR B))
|
| """
|
| if a is NULL or b is NULL or m is NULL:
|
| return NULL
|
|
|
| if m == 1:
|
| return a ^ b
|
| else:
|
| return 1 - (a ^ b)
|
|
|
| @staticmethod
|
| def _compute_learning(a: Union[int, None], b: Union[int, None], r: Union[int, None]) -> Union[int, None]:
|
| """
|
| Learn control M given A, B, R.
|
|
|
| Logic:
|
| - If any input is NULL, cannot learn -> NULL
|
| - If A XOR B == R, then M = 1 (XOR)
|
| - If A XOR B != R, then M = 0 (XNOR)
|
| """
|
| if a is NULL or b is NULL or r is NULL:
|
| return NULL
|
|
|
| xor_result = a ^ b
|
| if xor_result == r:
|
| return 1
|
| else:
|
| return 0
|
|
|
| @staticmethod
|
| def _compute_deduction_a(m: Union[int, None], r: Union[int, None], b: Union[int, None]) -> Union[int, None]:
|
| """
|
| Deduce A given M, R, B.
|
|
|
| Logic:
|
| - If any input is NULL, cannot deduce -> NULL
|
| - If M is 1: A = R XOR B (since R = A XOR B)
|
| - If M is 0: A = NOT(R) XOR B (since R = NOT(A XOR B))
|
| """
|
| if m is NULL or r is NULL or b is NULL:
|
| return NULL
|
|
|
| if m == 1:
|
| return r ^ b
|
| else:
|
| return (1 - r) ^ b
|
|
|
| @staticmethod
|
| def _compute_deduction_b(m: Union[int, None], r: Union[int, None], a: Union[int, None]) -> Union[int, None]:
|
| """
|
| Deduce B given M, R, A.
|
|
|
| Logic: Same as deduce_a but solving for B instead of A.
|
| """
|
| if m is NULL or r is NULL or a is NULL:
|
| return NULL
|
|
|
| if m == 1:
|
| return r ^ a
|
| else:
|
| return (1 - r) ^ a
|
|
|
| def infer(self, A: List[Union[int, None]], B: List[Union[int, None]], M: List[Union[int, None]]) -> List[Union[int, None]]:
|
| """
|
| Inference mode: Compute R given A, B, M.
|
|
|
| Args:
|
| A: First input vector (3 bits)
|
| B: Second input vector (3 bits)
|
| M: Control vector (3 bits)
|
|
|
| Returns:
|
| R: Result vector (3 bits)
|
|
|
| Example:
|
| >>> trigate = Trigate()
|
| >>> A = [0, 1, 0]
|
| >>> B = [1, 0, 1]
|
| >>> M = [1, 1, 0] # XOR, XOR, XNOR
|
| >>> R = trigate.infer(A, B, M)
|
| >>> print(R) # [1, 1, 1]
|
| """
|
| if not (len(A) == len(B) == len(M) == 3):
|
| raise ValueError("All vectors must have exactly 3 elements")
|
|
|
| return [self._LUT_INFER[(a, b, m)] for a, b, m in zip(A, B, M)]
|
|
|
| def learn(self, A: List[Union[int, None]], B: List[Union[int, None]], R: List[Union[int, None]]) -> List[Union[int, None]]:
|
| """
|
| Learning mode: Learn control M given A, B, R.
|
|
|
| Args:
|
| A: First input vector (3 bits)
|
| B: Second input vector (3 bits)
|
| R: Target result vector (3 bits)
|
|
|
| Returns:
|
| M: Learned control vector (3 bits)
|
|
|
| Example:
|
| >>> trigate = Trigate()
|
| >>> A = [0, 1, 0]
|
| >>> B = [1, 0, 1]
|
| >>> R = [1, 1, 1]
|
| >>> M = trigate.learn(A, B, R)
|
| >>> print(M) # [1, 1, 0]
|
| """
|
| if not (len(A) == len(B) == len(R) == 3):
|
| raise ValueError("All vectors must have exactly 3 elements")
|
|
|
| return [self._LUT_LEARN[(a, b, r)] for a, b, r in zip(A, B, R)]
|
|
|
| def deduce_a(self, M: List[Union[int, None]], R: List[Union[int, None]], B: List[Union[int, None]]) -> List[Union[int, None]]:
|
| """
|
| Deduction mode: Deduce A given M, R, B.
|
|
|
| Args:
|
| M: Control vector (3 bits)
|
| R: Result vector (3 bits)
|
| B: Known input vector (3 bits)
|
|
|
| Returns:
|
| A: Deduced input vector (3 bits)
|
| """
|
| if not (len(M) == len(R) == len(B) == 3):
|
| raise ValueError("All vectors must have exactly 3 elements")
|
|
|
| return [self._LUT_DEDUCE_A[(m, r, b)] for m, r, b in zip(M, R, B)]
|
|
|
| def deduce_b(self, M: List[Union[int, None]], R: List[Union[int, None]], A: List[Union[int, None]]) -> List[Union[int, None]]:
|
| """
|
| Deduction mode: Deduce B given M, R, A.
|
|
|
| Args:
|
| M: Control vector (3 bits)
|
| R: Result vector (3 bits)
|
| A: Known input vector (3 bits)
|
|
|
| Returns:
|
| B: Deduced input vector (3 bits)
|
| """
|
| if not (len(M) == len(R) == len(A) == 3):
|
| raise ValueError("All vectors must have exactly 3 elements")
|
|
|
| return [self._LUT_DEDUCE_B[(m, r, a)] for m, r, a in zip(M, R, A)]
|
|
|
| def validate_triangle_closure(self, A: List[Union[int, None]], B: List[Union[int, None]],
|
| M: List[Union[int, None]], R: List[Union[int, None]]) -> bool:
|
| """
|
| Validate that A, B, M, R form a valid logical triangle.
|
|
|
| This ensures geometric coherence: the triangle "closes" properly.
|
|
|
| Args:
|
| A, B, M, R: The four vectors forming the logical triangle
|
|
|
| Returns:
|
| True if triangle is valid, False otherwise
|
| """
|
|
|
| expected_R = self.infer(A, B, M)
|
|
|
|
|
| for expected, actual in zip(expected_R, R):
|
| if expected != actual:
|
| return False
|
|
|
| return True
|
|
|
| def get_truth_table(self, operation: str = "infer") -> str:
|
| """
|
| Generate human-readable truth table for debugging.
|
|
|
| Args:
|
| operation: "infer", "learn", "deduce_a", or "deduce_b"
|
|
|
| Returns:
|
| Formatted truth table string
|
| """
|
| if operation == "infer":
|
| lut = self._LUT_INFER
|
| header = "A | B | M | R"
|
| elif operation == "learn":
|
| lut = self._LUT_LEARN
|
| header = "A | B | R | M"
|
| elif operation == "deduce_a":
|
| lut = self._LUT_DEDUCE_A
|
| header = "M | R | B | A"
|
| elif operation == "deduce_b":
|
| lut = self._LUT_DEDUCE_B
|
| header = "M | R | A | B"
|
| else:
|
| raise ValueError(f"Unknown operation: {operation}")
|
|
|
| def format_val(v):
|
| return "N" if v is NULL else str(v)
|
|
|
| lines = [header, "-" * len(header)]
|
|
|
| for key, value in sorted(lut.items()):
|
| key_str = " | ".join(format_val(k) for k in key)
|
| val_str = format_val(value)
|
| lines.append(f"{key_str} | {val_str}")
|
|
|
| return "\n".join(lines)
|
|
|
| def __repr__(self) -> str:
|
| return f"Trigate(initialized={self._initialized}, lut_size={len(self._LUT_INFER)})"
|
|
|
|
|
|
|
| if __name__ == "__main__":
|
|
|
| trigate = Trigate()
|
|
|
| print("=== Aurora Trigate Implementation ===\n")
|
|
|
|
|
| print("1. Inference Test:")
|
| A = [0, 1, 0]
|
| B = [1, 0, 1]
|
| M = [1, 1, 0]
|
| R = trigate.infer(A, B, M)
|
| print(f" A={A}, B={B}, M={M} -> R={R}")
|
|
|
|
|
| print("\n2. Learning Test:")
|
| A = [0, 1, 0]
|
| B = [1, 0, 1]
|
| R = [1, 1, 1]
|
| M_learned = trigate.learn(A, B, R)
|
| print(f" A={A}, B={B}, R={R} -> M={M_learned}")
|
|
|
|
|
| print("\n3. Deduction Test:")
|
| M = [1, 1, 0]
|
| R = [1, 1, 1]
|
| A = [0, 1, 0]
|
| B_deduced = trigate.deduce_b(M, R, A)
|
| print(f" M={M}, R={R}, A={A} -> B={B_deduced}")
|
|
|
|
|
| print("\n4. NULL Propagation Test:")
|
| A_null = [0, 1, None]
|
| B_null = [1, 0, 1]
|
| M_null = [1, 1, 1]
|
| R_null = trigate.infer(A_null, B_null, M_null)
|
| print(f" A={A_null}, B={B_null}, M={M_null} -> R={R_null}")
|
|
|
|
|
| print("\n5. Triangle Closure Validation:")
|
| is_valid = trigate.validate_triangle_closure([0, 1, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1])
|
| print(f" Triangle is valid: {is_valid}")
|
|
|
| print(f"\n6. Trigate Status: {trigate}")
|
|
|