UNPKG

@sschepis/resolang

Version:

ResoLang - Core quantum resonance computation library for browser and Node.js

409 lines (350 loc) 10.7 kB
/** * Sedenion Memory Field (SMF) Implementation * * The SMF provides a 16-dimensional semantic space using Sedenions. * Each axis represents a fundamental semantic dimension: * * e0: coherence - Internal consistency * e1: identity - Self-reference * e2: duality - Binary distinction * e3: structure - Pattern/form * e4: change - Transformation * e5: life - Vitality * e6: harmony - Balance * e7: wisdom - Integration * e8: infinity - Unboundedness * e9: creation - Emergence * e10: truth - Correspondence * e11: love - Attraction * e12: power - Capacity * e13: time - Sequence * e14: space - Extension * e15: consciousness - Awareness * * Ported from tinyaleph/apps/sentient/lib/smf.js */ import { Sedenion } from './sedenion'; import { Serializable } from './core/interfaces'; import { JSONBuilder } from './core/serialization'; import { toFixed } from './utils'; // Semantic axis names export const SEMANTIC_AXES: string[] = [ "coherence", "identity", "duality", "structure", "change", "life", "harmony", "wisdom", "infinity", "creation", "truth", "love", "power", "time", "space", "consciousness" ]; // Axis indices for convenient access export const AXIS_COHERENCE: i32 = 0; export const AXIS_IDENTITY: i32 = 1; export const AXIS_DUALITY: i32 = 2; export const AXIS_STRUCTURE: i32 = 3; export const AXIS_CHANGE: i32 = 4; export const AXIS_LIFE: i32 = 5; export const AXIS_HARMONY: i32 = 6; export const AXIS_WISDOM: i32 = 7; export const AXIS_INFINITY: i32 = 8; export const AXIS_CREATION: i32 = 9; export const AXIS_TRUTH: i32 = 10; export const AXIS_LOVE: i32 = 11; export const AXIS_POWER: i32 = 12; export const AXIS_TIME: i32 = 13; export const AXIS_SPACE: i32 = 14; export const AXIS_CONSCIOUSNESS: i32 = 15; /** * Configuration for SMF evolution */ export class SMFConfig { decayRate: f64 = 0.001; coherenceThreshold: f64 = 0.5; resonanceStrength: f64 = 0.1; collapseThreshold: f64 = 0.8; historyLength: i32 = 100; } export const SMF_CONFIG: SMFConfig = new SMFConfig(); /** * SedenionMemoryField - Main SMF implementation * * Provides semantic state evolution via Sedenion algebra. * Tracks coherence, entropy, and collapse probability. */ export class SedenionMemoryField implements Serializable { state: Sedenion; velocity: Sedenion; coherenceHistory: Float64Array; historyIndex: i32; accumulatedEntropy: f64; collapseCount: i32; startTime: i64; lastUpdateTime: i64; constructor(historyLength: i32 = 100) { // Initialize with unit sedenion (coherent ground state) this.state = Sedenion.unit(); this.velocity = Sedenion.zero(); this.coherenceHistory = new Float64Array(historyLength); this.historyIndex = 0; this.accumulatedEntropy = 0.0; this.collapseCount = 0; this.startTime = 0; this.lastUpdateTime = 0; } /** * Get the current coherence value (e0 component) */ getCoherence(): f64 { return this.state.c0; } /** * Get a specific semantic axis value */ getAxis(index: i32): f64 { return this.state.get(index); } /** * Set a specific semantic axis value */ setAxis(index: i32, value: f64): void { this.state.set(index, value); } /** * Get entropy of the current state */ getEntropy(): f64 { return this.state.entropy(); } /** * Excite a semantic axis with given amplitude */ excite(axisIndex: i32, amplitude: f64): void { const current = this.state.get(axisIndex); this.state.set(axisIndex, current + amplitude); } /** * Apply perturbation to the field */ perturb(perturbation: Sedenion): void { this.state = this.state.add(perturbation); } /** * Evolve the field by one timestep * * @param dt - Time delta * @param timestamp - Current timestamp * @returns Current coherence */ evolve(dt: f64, timestamp: i64 = 0): f64 { this.lastUpdateTime = timestamp; // Apply velocity const scaledVelocity = this.velocity.scale(dt); this.state = this.state.add(scaledVelocity); // Apply damping to velocity this.velocity = this.velocity.scale(1.0 - SMF_CONFIG.decayRate); // Apply coherence-preserving normalization // The e0 component (coherence) tends toward 1 when stable const norm = this.state.norm(); if (norm > 1e-10) { // Soft normalization - maintain magnitude close to 1 const targetNorm = 1.0; const normFactor = 1.0 + (targetNorm - norm) * 0.1; this.state = this.state.scale(normFactor); } // Track coherence history const coherence = this.getCoherence(); this.coherenceHistory[this.historyIndex] = coherence; this.historyIndex = (this.historyIndex + 1) % i32(this.coherenceHistory.length); // Accumulate entropy this.accumulatedEntropy += this.getEntropy() * dt; // Check for collapse if (this.shouldCollapse()) { this.collapse(); } return coherence; } /** * Calculate collapse probability * P_collapse = 1 - e^(-∫S(t)dt) */ getCollapseProbability(): f64 { return 1.0 - Math.exp(-this.accumulatedEntropy); } /** * Check if the field should collapse */ shouldCollapse(): bool { return this.getCollapseProbability() > SMF_CONFIG.collapseThreshold; } /** * Perform field collapse - reset to ground state */ collapse(): void { // Measure the current state (extract dominant axis) const dominantAxis = this.getDominantAxis(); const dominantValue = this.state.get(dominantAxis); // Reset to ground state with residual from dominant axis this.state = Sedenion.unit(); this.state.set(dominantAxis, dominantValue * 0.1); // Reset accumulator this.accumulatedEntropy = 0.0; this.collapseCount++; } /** * Get the dominant (highest magnitude) axis */ getDominantAxis(): i32 { let maxVal: f64 = 0.0; let maxIdx: i32 = 0; for (let i: i32 = 0; i < 16; i++) { const val = Math.abs(this.state.get(i)); if (val > maxVal) { maxVal = val; maxIdx = i; } } return maxIdx; } /** * Get all axis values as array */ getAllAxes(): Float64Array { const result = new Float64Array(16); for (let i: i32 = 0; i < 16; i++) { result[i] = this.state.get(i); } return result; } /** * Calculate similarity with another SMF */ similarity(other: SedenionMemoryField): f64 { const norm1 = this.state.norm(); const norm2 = other.state.norm(); if (norm1 < 1e-10 || norm2 < 1e-10) return 0.0; const dot = this.state.dot(other.state); return dot / (norm1 * norm2); } /** * Blend with another SMF */ blend(other: SedenionMemoryField, ratio: f64): SedenionMemoryField { const result = new SedenionMemoryField(i32(this.coherenceHistory.length)); const scaled1 = this.state.scale(1.0 - ratio); const scaled2 = other.state.scale(ratio); result.state = scaled1.add(scaled2); return result; } /** * Apply resonance with oscillator phases * * @param phases - Array of oscillator phases * @param amplitudes - Array of oscillator amplitudes */ applyResonance(phases: Float64Array, amplitudes: Float64Array): void { const n = Math.min(phases.length, 16) as i32; for (let i: i32 = 0; i < n; i++) { const phase = phases[i]; const amplitude = amplitudes[i]; // Map oscillator to semantic axis const axisIdx = i % 16; const current = this.state.get(axisIdx); // Apply resonant coupling const resonance = Math.sin(phase) * amplitude * SMF_CONFIG.resonanceStrength; this.state.set(axisIdx, current + resonance); } } /** * Reset the field to initial state */ reset(): void { this.state = Sedenion.unit(); this.velocity = Sedenion.zero(); this.accumulatedEntropy = 0.0; this.historyIndex = 0; for (let i: i32 = 0; i < i32(this.coherenceHistory.length); i++) { this.coherenceHistory[i] = 0.0; } } /** * Get mean coherence from history */ getMeanCoherence(): f64 { let sum: f64 = 0.0; let count: i32 = 0; for (let i: i32 = 0; i < i32(this.coherenceHistory.length); i++) { if (this.coherenceHistory[i] != 0.0) { sum += this.coherenceHistory[i]; count++; } } return count > 0 ? sum / f64(count) : 0.0; } /** * Get coherence variance */ getCoherenceVariance(): f64 { const mean = this.getMeanCoherence(); let variance: f64 = 0.0; let count: i32 = 0; for (let i: i32 = 0; i < i32(this.coherenceHistory.length); i++) { if (this.coherenceHistory[i] != 0.0) { const diff = this.coherenceHistory[i] - mean; variance += diff * diff; count++; } } return count > 1 ? variance / f64(count - 1) : 0.0; } toJSON(): string { const builder = new JSONBuilder(); builder.startObject() .addNumberField("coherence", this.getCoherence()) .addNumberField("entropy", this.getEntropy()) .addNumberField("collapseProbability", this.getCollapseProbability()) .addNumberField("collapseCount", f64(this.collapseCount)) .addNumberField("dominantAxis", f64(this.getDominantAxis())); // Add semantic axes let axesJson = "{"; for (let i: i32 = 0; i < 16; i++) { if (i > 0) axesJson += ","; axesJson += `"${SEMANTIC_AXES[i]}":${toFixed(this.state.get(i), 4)}`; } axesJson += "}"; builder.addRawField("axes", axesJson); builder.endObject(); return builder.build(); } toString(): string { return this.toJSON(); } } /** * Create SMF from semantic values */ export function createSMFFromValues(values: Float64Array): SedenionMemoryField { const smf = new SedenionMemoryField(); const n = Math.min(values.length, 16) as i32; for (let i: i32 = 0; i < n; i++) { smf.state.set(i, values[i]); } return smf; } /** * Create SMF from text (using character frequencies) */ export function createSMFFromText(text: string): SedenionMemoryField { const smf = new SedenionMemoryField(); const textLen = text.length; if (textLen == 0) return smf; // Map characters to semantic axes for (let i = 0; i < textLen; i++) { const charCode = text.charCodeAt(i); const axisIdx = charCode % 16; const current = smf.state.get(axisIdx); smf.state.set(axisIdx, current + 1.0 / f64(textLen)); } // Normalize const norm = smf.state.norm(); if (norm > 1e-10) { smf.state = smf.state.scale(1.0 / norm); } return smf; }