Research-Stack/5-Applications/scripts/couch_forest_exploration.py

390 lines
16 KiB
Python

#!/usr/bin/env python3
"""
COUCH Forest Region Exploration
Explores the Entropy-Dominant Region around COUCH's Genome18 address (512).
Analyzes neighborhood structure, patterns, and transitions in the 262,144-state space.
"""
import numpy as np
from typing import Dict, List, Tuple, Any
from dataclasses import dataclass
import json
@dataclass
class Genome18Bin:
"""Genome18 3-bit bin (6 bins total = 18 bits)."""
muBin: int # mutation/drift (routing load) - 3 bits
rhoBin: int # verification pressure (routing efficiency) - 3 bits
cBin: int # connectance (geometry/route neighborhood) - 3 bits
mBin: int # compression residue (entropy) - 3 bits
neBin: int # effective sample (entropy) - 3 bits
sigmaBin: int # fitness proxy (entropy) - 3 bits
class ForestExplorer:
"""Explores the Equation Forest around a given address."""
def __init__(self, center_address: int = 512, radius: int = 1000):
self.center_address = center_address
self.radius = radius
self.total_states = 262144
def address_to_bins(self, address: int) -> Genome18Bin:
"""Convert Genome18 address to bins."""
# Reverse of address calculation
# addr = muBin * 32768 + rhoBin * 4096 + cBin * 512 + mBin * 64 + neBin * 8 + sigmaBin
sigmaBin = address % 8
remainder = address // 8
neBin = remainder % 8
remainder = remainder // 8
mBin = remainder % 8
remainder = remainder // 8
cBin = remainder % 8
remainder = remainder // 8
rhoBin = remainder % 8
muBin = remainder // 8
return Genome18Bin(
muBin=muBin,
rhoBin=rhoBin,
cBin=cBin,
mBin=mBin,
neBin=neBin,
sigmaBin=sigmaBin
)
def bins_to_address(self, bins: Genome18Bin) -> int:
"""Convert bins to Genome18 address."""
return (bins.muBin * 32768 +
bins.rhoBin * 4096 +
bins.cBin * 512 +
bins.mBin * 64 +
bins.neBin * 8 +
bins.sigmaBin)
def get_neighbors(self, address: int, distance: int = 1) -> List[int]:
"""Get neighboring addresses within bounded bin-offset distance."""
bins = self.address_to_bins(address)
neighbors = []
# Generate all addresses within Chebyshev distance in Genome18 bin space.
for mu_offset in range(-distance, distance + 1):
for rho_offset in range(-distance, distance + 1):
for c_offset in range(-distance, distance + 1):
for m_offset in range(-distance, distance + 1):
for ne_offset in range(-distance, distance + 1):
for sigma_offset in range(-distance, distance + 1):
new_bins = Genome18Bin(
muBin=np.clip(bins.muBin + mu_offset, 0, 7),
rhoBin=np.clip(bins.rhoBin + rho_offset, 0, 7),
cBin=np.clip(bins.cBin + c_offset, 0, 7),
mBin=np.clip(bins.mBin + m_offset, 0, 7),
neBin=np.clip(bins.neBin + ne_offset, 0, 7),
sigmaBin=np.clip(bins.sigmaBin + sigma_offset, 0, 7)
)
new_address = self.bins_to_address(new_bins)
if new_address != address and 0 <= new_address < self.total_states:
neighbors.append(new_address)
return list(set(neighbors)) # Remove duplicates
def analyze_region(self, addresses: List[int]) -> Dict[str, Any]:
"""Analyze characteristics of a region of the forest."""
region_data = {
"addresses": addresses,
"count": len(addresses),
"bins_list": [],
"entropy_bins": [],
"thermodynamic_bins": [],
"geometric_bins": [],
"cognitive_bins": [],
"region_distribution": {}
}
for addr in addresses:
bins = self.address_to_bins(addr)
region_data["bins_list"].append({
"muBin": bins.muBin,
"rhoBin": bins.rhoBin,
"cBin": bins.cBin,
"mBin": bins.mBin,
"neBin": bins.neBin,
"sigmaBin": bins.sigmaBin
})
# Categorize by dominant bin type
entropy_score = bins.mBin + bins.neBin + bins.sigmaBin
thermodynamic_score = (bins.muBin + bins.rhoBin) / 2 # Approximation
geometric_score = bins.cBin
cognitive_score = (bins.muBin + bins.rhoBin + bins.cBin) / 3
scores = {
"entropy": entropy_score,
"thermodynamic": thermodynamic_score,
"geometric": geometric_score,
"cognitive": cognitive_score
}
dominant = max(scores, key=scores.get)
region_data["region_distribution"][dominant] = region_data["region_distribution"].get(dominant, 0) + 1
if dominant == "entropy":
region_data["entropy_bins"].append(addr)
elif dominant == "thermodynamic":
region_data["thermodynamic_bins"].append(addr)
elif dominant == "geometric":
region_data["geometric_bins"].append(addr)
elif dominant == "cognitive":
region_data["cognitive_bins"].append(addr)
return region_data
def find_transitions(self, address: int, steps: int = 5, max_paths: int = 256) -> List[Dict[str, Any]]:
"""Find possible transition paths from a starting address."""
paths = []
def dfs(current_addr, depth, visited, path):
if len(paths) >= max_paths:
return
if depth == 0:
paths.append({
"path": path.copy(),
"final_address": current_addr,
"length": len(path)
})
return
neighbors = self.get_neighbors(current_addr, distance=1)
for neighbor in neighbors:
if len(paths) >= max_paths:
break
if neighbor not in visited:
bins = self.address_to_bins(neighbor)
visited.add(neighbor)
path.append({
"address": neighbor,
"bins": {
"muBin": bins.muBin,
"rhoBin": bins.rhoBin,
"cBin": bins.cBin,
"mBin": bins.mBin,
"neBin": bins.neBin,
"sigmaBin": bins.sigmaBin
},
"binary": format(neighbor, '018b')
})
dfs(neighbor, depth - 1, visited, path)
path.pop()
visited.remove(neighbor)
dfs(address, steps, set(), [])
return paths
def calculate_region_density(self, center_address: int, radius: int) -> Dict[str, Any]:
"""Calculate density metrics for a region."""
# Deterministic bounded interval; avoids duplicate-heavy random samples.
lo = max(0, center_address - radius)
hi = min(self.total_states - 1, center_address + radius)
sample_addresses = list(range(lo, hi + 1))
# Analyze the sample
region_data = self.analyze_region(sample_addresses)
# Calculate density
density = len(sample_addresses) / (2 * radius + 1)
# Calculate clustering coefficient
# (how many neighbors of neighbors are also neighbors)
clustering_coeff = 0.0
if sample_addresses:
neighbor_counts = []
for addr in sample_addresses[:50]: # Sample subset for efficiency
neighbors = self.get_neighbors(addr, distance=1)
neighbor_counts.append(len(neighbors))
if neighbor_counts:
avg_neighbors = np.mean(neighbor_counts)
max_possible = (2 * 1 + 1) ** 6 - 1
clustering_coeff = avg_neighbors / max_possible
return {
"center_address": center_address,
"radius": radius,
"sample_size": len(sample_addresses),
"density": density,
"clustering_coefficient": clustering_coeff,
"region_distribution": region_data["region_distribution"]
}
def visualize_region(self, addresses: List[int]) -> Dict[str, Any]:
"""Create a visualization summary of the region."""
# Calculate statistics
addresses_array = np.array(addresses)
# Bin statistics
bins_list = [self.address_to_bins(addr) for addr in addresses]
mu_bins = [b.muBin for b in bins_list]
rho_bins = [b.rhoBin for b in bins_list]
c_bins = [b.cBin for b in bins_list]
m_bins = [b.mBin for b in bins_list]
ne_bins = [b.neBin for b in bins_list]
sigma_bins = [b.sigmaBin for b in bins_list]
# Convert to native types
mu_bins = [int(x) for x in mu_bins]
rho_bins = [int(x) for x in rho_bins]
c_bins = [int(x) for x in c_bins]
m_bins = [int(x) for x in m_bins]
ne_bins = [int(x) for x in ne_bins]
sigma_bins = [int(x) for x in sigma_bins]
return {
"address_range": {
"min": int(np.min(addresses_array)),
"max": int(np.max(addresses_array)),
"mean": float(np.mean(addresses_array)),
"std": float(np.std(addresses_array))
},
"bin_statistics": {
"muBin": {"min": min(mu_bins), "max": max(mu_bins), "mean": float(np.mean(mu_bins))},
"rhoBin": {"min": min(rho_bins), "max": max(rho_bins), "mean": float(np.mean(rho_bins))},
"cBin": {"min": min(c_bins), "max": max(c_bins), "mean": float(np.mean(c_bins))},
"mBin": {"min": min(m_bins), "max": max(m_bins), "mean": float(np.mean(m_bins))},
"neBin": {"min": min(ne_bins), "max": max(ne_bins), "mean": float(np.mean(ne_bins))},
"sigmaBin": {"min": min(sigma_bins), "max": max(sigma_bins), "mean": float(np.mean(sigma_bins))}
},
"dominant_patterns": {
"most_common_mu": max(set(mu_bins), key=mu_bins.count),
"most_common_rho": max(set(rho_bins), key=rho_bins.count),
"most_common_c": max(set(c_bins), key=c_bins.count),
"most_common_m": max(set(m_bins), key=m_bins.count),
"most_common_ne": max(set(ne_bins), key=ne_bins.count),
"most_common_sigma": max(set(sigma_bins), key=sigma_bins.count)
}
}
def main():
"""Run forest region exploration."""
print("=" * 70)
print("COUCH FOREST REGION EXPLORATION")
print("=" * 70)
print("\n[*] Exploring Entropy-Dominant Region around address 512")
print("[*] Genome18 space: 262,144 states")
# Initialize explorer
explorer = ForestExplorer(center_address=512, radius=2000)
# Get center bins
center_bins = explorer.address_to_bins(512)
print(f"\n[*] Center Address: 512")
print(f" Binary: {format(512, '018b')}")
print(f" Bins: muBin={center_bins.muBin}, rhoBin={center_bins.rhoBin}, cBin={center_bins.cBin}, mBin={center_bins.mBin}, neBin={center_bins.neBin}, sigmaBin={center_bins.sigmaBin}")
# Get neighbors
print(f"\n[*] Finding neighbors (distance=1)...")
neighbors = explorer.get_neighbors(512, distance=1)
print(f" Neighbors found: {len(neighbors)}")
# Analyze region
print(f"\n[*] Analyzing region (radius=2000)...")
region_density = explorer.calculate_region_density(512, radius=2000)
print(f" Sample size: {region_density['sample_size']}")
print(f" Density: {region_density['density']:.4f}")
print(f" Clustering coefficient: {region_density['clustering_coefficient']:.4f}")
print(f"\n[*] Region distribution:")
for region, count in region_density['region_distribution'].items():
pct = count / region_density['sample_size'] * 100
print(f" {region}: {count} ({pct:.1f}%)")
# Visualize region
print(f"\n[*] Visualizing region...")
sample_addresses = [512 + i for i in range(-100, 101) if 0 <= 512 + i < 262144]
viz_data = explorer.visualize_region(sample_addresses)
print(f"\n[*] Address range:")
print(f" Min: {viz_data['address_range']['min']}")
print(f" Max: {viz_data['address_range']['max']}")
print(f" Mean: {viz_data['address_range']['mean']:.2f}")
print(f" Std: {viz_data['address_range']['std']:.2f}")
print(f"\n[*] Dominant patterns:")
for bin_name, value in viz_data['dominant_patterns'].items():
print(f" {bin_name}: {value}")
# Find transitions
print(f"\n[*] Finding transition paths (steps=3)...")
transitions = explorer.find_transitions(512, steps=3, max_paths=256)
print(f" Paths found: {len(transitions)}")
# Show sample paths
if transitions:
print(f"\n[*] Sample transition paths:")
for i, path in enumerate(transitions[:5]):
print(f" Path {i+1}: {path['path'][0]['address']}{path['final_address']} (length {path['length']})")
# Explore entropy-dominant neighbors
print(f"\n[*] Exploring entropy-dominant neighbors...")
entropy_dominant = []
for addr in neighbors[:50]: # Sample subset
bins = explorer.address_to_bins(addr)
entropy_score = bins.mBin + bins.neBin + bins.sigmaBin
if entropy_score > (bins.muBin + bins.rhoBin + bins.cBin) / 3:
entropy_dominant.append(addr)
print(f" Entropy-dominant neighbors: {len(entropy_dominant)}")
if entropy_dominant:
print(f" Sample addresses: {entropy_dominant[:5]}")
# Save results (convert numpy types to native Python)
def convert_to_native(obj):
"""Convert numpy types to native Python types for JSON serialization."""
if isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.bool_):
return bool(obj)
elif isinstance(obj, dict):
return {k: convert_to_native(v) for k, v in obj.items()}
elif isinstance(obj, list):
return [convert_to_native(item) for item in obj]
else:
return obj
results = {
"center_address": 512,
"center_bins": {
"muBin": center_bins.muBin,
"rhoBin": center_bins.rhoBin,
"cBin": center_bins.cBin,
"mBin": center_bins.mBin,
"neBin": center_bins.neBin,
"sigmaBin": center_bins.sigmaBin
},
"neighbors": convert_to_native(neighbors[:100]), # Sample
"neighbor_count": len(neighbors),
"region_density": convert_to_native(region_density),
"visualization": convert_to_native(viz_data),
"transition_paths": convert_to_native(transitions[:10]), # Sample
"entropy_dominant_neighbors": convert_to_native(entropy_dominant)
}
output_path = "/home/allaun/Documents/Research Stack/data/couch_forest_exploration.json"
with open(output_path, 'w') as f:
json.dump(results, f, indent=2)
print(f"\n[*] Results saved to: {output_path}")
print("\n" + "=" * 70)
print("✅ COUCH FOREST REGION EXPLORATION COMPLETE")
print("=" * 70)
if __name__ == "__main__":
main()