Research-Stack/5-Applications/tools-scripts/utils/analyze_quaternary_tensor_logic.py

282 lines
10 KiB
Python

#!/usr/bin/env python3
"""
Analyze quaternary logic gates applied to tensor data.
Explores how quaternary transformations affect tensor compressibility and structure.
"""
import numpy as np
import zlib
import math
from collections import Counter
def calculate_entropy(data):
"""Calculate Shannon entropy of data."""
if not data:
return 0.0
freq = Counter(data)
total = len(data)
entropy = 0.0
for count in freq.values():
p = count / total
if p > 0:
entropy -= p * math.log2(p)
return entropy
def byte_to_quaternary(byte_val):
"""Convert a byte (0-255) to 4 quaternary digits (base-4)."""
quaternary = []
for _ in range(4):
quaternary.append(byte_val % 4)
byte_val //= 4
return quaternary[::-1]
def quaternary_to_byte(quad_digits):
"""Convert 4 quaternary digits back to a byte."""
byte_val = 0
for digit in quad_digits:
byte_val = byte_val * 4 + digit
return byte_val
def generate_synthetic_tensor(shape=(1000, 1000), pattern='structured'):
"""Generate synthetic tensor data for testing."""
if pattern == 'structured':
# Low-rank matrix with patterns
U = np.random.randn(shape[0], 10)
V = np.random.randn(10, shape[1])
tensor = U @ V
# Add some structure
tensor += np.sin(np.arange(shape[1]) / 100) * 10
elif pattern == 'sparse':
# Sparse tensor
tensor = np.zeros(shape)
n_nonzero = int(shape[0] * shape[1] * 0.01) # 1% nonzero
for _ in range(n_nonzero):
i, j = np.random.randint(0, shape[0]), np.random.randint(0, shape[1])
tensor[i, j] = np.random.randn() * 100
elif pattern == 'random':
# Random tensor
tensor = np.random.randn(*shape) * 100
else:
tensor = np.random.randn(*shape) * 100
# Convert to Float16 and back to bytes for realistic representation
tensor_f16 = tensor.astype(np.float16)
return tensor_f16.tobytes()
def apply_quaternary_to_tensor(tensor_bytes, method='group'):
"""Apply quaternary logic to tensor byte representation."""
tensor_array = np.frombuffer(tensor_bytes, dtype=np.float16)
if method == 'group':
# Group by quaternary digit position
streams = [[], [], [], []]
for byte_val in tensor_array.tobytes():
quad = byte_to_quaternary(byte_val)
for pos, digit in enumerate(quad):
streams[pos].append(digit)
# Pack back
result = bytearray()
for stream in streams:
if len(stream) % 2 == 1:
stream.append(0)
for i in range(0, len(stream), 2):
packed = stream[i] * 4 + stream[i+1]
result.append(packed)
return bytes(result)
elif method == 'not':
# Quaternary NOT
result = bytearray()
for byte_val in tensor_array.tobytes():
quad = byte_to_quaternary(byte_val)
transformed = [3 - d for d in quad]
result.append(quaternary_to_byte(transformed))
return bytes(result)
elif method == 'cycle':
# Cycle digits
result = bytearray()
for byte_val in tensor_array.tobytes():
quad = byte_to_quaternary(byte_val)
transformed = quad[1:] + [quad[0]]
result.append(quaternary_to_byte(transformed))
return bytes(result)
elif method == 'smooth':
# Smooth transitions
tensor_bytes = tensor_array.tobytes()
if len(tensor_bytes) < 2:
return tensor_bytes
result = bytearray()
result.append(tensor_bytes[0])
prev_quad = byte_to_quaternary(tensor_bytes[0])
for byte_val in tensor_bytes[1:]:
curr_quad = byte_to_quaternary(byte_val)
smoothed_quad = []
for i in range(4):
diff = abs(curr_quad[i] - prev_quad[i])
if diff > 1:
if curr_quad[i] > prev_quad[i]:
smoothed_quad.append(prev_quad[i] + 1)
else:
smoothed_quad.append(prev_quad[i] - 1)
else:
smoothed_quad.append(curr_quad[i])
smoothed_quad = [max(0, min(3, d)) for d in smoothed_quad]
result.append(quaternary_to_byte(smoothed_quad))
prev_quad = smoothed_quad
return bytes(result)
return tensor_bytes
def analyze_tensor_compression(tensor_bytes, method_name, preprocess_func):
"""Analyze compression of tensor data with quaternary preprocessing."""
print(f"\n{'=' * 60}")
print(f"Method: {method_name}")
print(f"{'=' * 60}")
# Apply preprocessing
preprocessed = preprocess_func(tensor_bytes)
# Calculate metrics
original_entropy = calculate_entropy(tensor_bytes)
preprocessed_entropy = calculate_entropy(preprocessed)
# Compress both
original_compressed = zlib.compress(tensor_bytes, level=9)
preprocessed_compressed = zlib.compress(preprocessed, level=9)
print(f"Original size: {len(tensor_bytes):,} bytes")
print(f"Preprocessed size: {len(preprocessed):,} bytes")
print(f"Size change: {len(preprocessed) / len(tensor_bytes):.4f}x")
print(f"\nOriginal entropy: {original_entropy:.4f} bits/byte")
print(f"Preprocessed entropy: {preprocessed_entropy:.4f} bits/byte")
print(f"Entropy change: {preprocessed_entropy - original_entropy:+.4f}")
print(f"\nOriginal compressed: {len(original_compressed):,} bytes ({len(original_compressed) / len(tensor_bytes):.4f}x)")
print(f"Preprocessed compressed: {len(preprocessed_compressed):,} bytes ({len(preprocessed_compressed) / len(preprocessed):.4f}x)")
print(f"Compression ratio change: {(len(preprocessed_compressed) / len(preprocessed)) / (len(original_compressed) / len(tensor_bytes)):+.4f}x")
return {
'method': method_name,
'size_ratio': len(preprocessed) / len(tensor_bytes),
'entropy_change': preprocessed_entropy - original_entropy,
'compression_ratio_change': (len(preprocessed_compressed) / len(preprocessed)) / (len(original_compressed) / len(tensor_bytes))
}
def main():
print("=" * 60)
print("Quaternary Logic Gates for Tensor Data")
print("=" * 60)
# Test on different tensor patterns
patterns = ['structured', 'sparse', 'random']
all_results = {}
for pattern in patterns:
print(f"\n{'=' * 60}")
print(f"Testing on {pattern.upper()} tensor (1000x1000 Float16)")
print(f"{'=' * 60}")
# Generate tensor
tensor_bytes = generate_synthetic_tensor(shape=(1000, 1000), pattern=pattern)
print(f"Tensor size: {len(tensor_bytes):,} bytes ({len(tensor_bytes) / 1024 / 1024:.2f} MB)")
# Test methods
results = []
# Method 1: Quaternary grouping
results.append(analyze_tensor_compression(
tensor_bytes,
"Quaternary Grouping",
lambda d: apply_quaternary_to_tensor(d, 'group')
))
# Method 2: Quaternary NOT
results.append(analyze_tensor_compression(
tensor_bytes,
"Quaternary NOT",
lambda d: apply_quaternary_to_tensor(d, 'not')
))
# Method 3: Quaternary Cycle
results.append(analyze_tensor_compression(
tensor_bytes,
"Quaternary Cycle",
lambda d: apply_quaternary_to_tensor(d, 'cycle')
))
# Method 4: Quaternary Smoothing
results.append(analyze_tensor_compression(
tensor_bytes,
"Quaternary Smoothing",
lambda d: apply_quaternary_to_tensor(d, 'smooth')
))
all_results[pattern] = results
# Summary for this pattern
print("\n" + "=" * 60)
print("SUMMARY - {}".format(pattern.upper()))
print("=" * 60)
print("{:<40} {:<12} {:<12} {:<12}".format('Method', 'Size Ratio', 'Entropy Δ', 'Comp Δ'))
print("-" * 76)
for r in results:
entropy_str = "{:+.4f}".format(r['entropy_change'])
comp_str = "{:+.4f}".format(r['compression_ratio_change'])
size_str = "{:.4f}".format(r['size_ratio'])
print("{:<40} {:<12} {:<12} {:<12}".format(r['method'], size_str, entropy_str, comp_str))
# Cross-pattern comparison
print("\n" + "=" * 60)
print("CROSS-PATTERN COMPARISON")
print("=" * 60)
methods = ['Quaternary Grouping', 'Quaternary NOT', 'Quaternary Cycle', 'Quaternary Smoothing']
print("{:<40} {:<12} {:<12} {:<12}".format('Method', 'Structured', 'Sparse', 'Random'))
print("-" * 76)
for method in methods:
structured = next(r['compression_ratio_change'] for r in all_results['structured'] if r['method'] == method)
sparse = next(r['compression_ratio_change'] for r in all_results['sparse'] if r['method'] == method)
random = next(r['compression_ratio_change'] for r in all_results['random'] if r['method'] == method)
structured_str = "{:+.4f}".format(structured)
sparse_str = "{:+.4f}".format(sparse)
random_str = "{:+.4f}".format(random)
print("{:<40} {:<12} {:<12} {:<12}".format(method, structured_str, sparse_str, random_str))
print("\n" + "=" * 60)
print("KEY INSIGHTS FOR TENSOR DATA")
print("=" * 60)
# Find best method for each pattern
for pattern in patterns:
best = min(all_results[pattern], key=lambda x: x['compression_ratio_change'])
print("Best for {}: {} ({:+.4f}x)".format(pattern, best['method'], best['compression_ratio_change']))
print("\n" + "=" * 60)
print("QUATERNARY TENSOR THEORY")
print("=" * 60)
print("Tensor data has different structure than text:")
print("- Structured tensors: Low-rank, smooth transitions")
print("- Sparse tensors: Many zeros, few non-zero values")
print("- Random tensors: High entropy, no patterns")
print("\nQuaternary logic may help tensor data because:")
print("- Bit plane separation reveals low-rank structure")
print("- Smoothing preserves tensor smoothness")
print("- Digit operations can exploit sparsity patterns")
if __name__ == "__main__":
main()