@sschepis/resolang
Version:
ResoLang - Core quantum resonance computation library for browser and Node.js
758 lines (636 loc) • 21.3 kB
text/typescript
/**
* Prime-Resonant Resonance Channel (PRRC)
*
* Non-local communication channel for the Distributed Sentience Network.
* From whitepaper Section 6.3:
*
* A PRRC session establishes shared synchronization context:
* - Prime set: P_c used as the channel basis (selected for stability and sparsity)
* - Phase alignment: handshake aligns sender/receiver phase reference frames
* - Protection layers: topological transport and holonomy-based wrapping
*
* Practical Channel Interface:
* encode: (Ω, P_c, θ) → σ
* decode: σ → Ω̂
*
* σ = T_topo(T_hol(ResEncode(Ω)))
*/
import { Serializable } from '../core/interfaces';
import { JSONBuilder } from '../core/serialization';
import { toFixed } from '../utils';
import { generatePrimesOptimized } from '../core/math-primes';
import { MemoryObject } from './gmf';
// ============================================================================
// ID Generator
// ============================================================================
let _prrcIdCounter: i64 = 0;
function generateId(prefix: string = "prrc"): string {
_prrcIdCounter++;
const timestamp = Date.now() as i64;
return `${prefix}_${timestamp}_${_prrcIdCounter}`;
}
// ============================================================================
// Channel Configuration
// ============================================================================
/**
* PRRC Channel Configuration
*/
export class PRRCConfig {
// Prime set configuration
channelPrimeCount: i32 = 32;
primeSelectionMode: string = "sparse"; // "sparse", "dense", "random"
// Phase alignment
phaseReferenceMode: string = "zero"; // "zero", "random", "derived"
phaseTolerance: f64 = 0.1; // Radians
// Protection layers
enableTopologicalProtection: bool = true;
enableHolonomyWrapping: bool = true;
// Encoding parameters
encodingPrecision: i32 = 64; // Bits
compressionLevel: i32 = 1; // 0=none, 1=light, 2=heavy
// Security
maxPacketSize: i32 = 65536;
checksumEnabled: bool = true;
constructor() {}
}
// ============================================================================
// Channel State
// ============================================================================
/**
* Phase reference frame for a channel endpoint
*/
export class PhaseReference implements Serializable {
phases: Float64Array;
timestamp: i64;
nodeId: string;
constructor(primeCount: i32) {
this.phases = new Float64Array(primeCount);
this.timestamp = Date.now() as i64;
this.nodeId = "";
}
/**
* Compute phase difference to another reference
*/
phaseDifference(other: PhaseReference): Float64Array {
const diff = new Float64Array(this.phases.length);
const len = Math.min(this.phases.length, other.phases.length) as i32;
for (let i = 0; i < len; i++) {
diff[i] = this.phases[i] - other.phases[i];
// Normalize to [-π, π]
while (diff[i] > Math.PI) diff[i] -= 2 * Math.PI;
while (diff[i] < -Math.PI) diff[i] += 2 * Math.PI;
}
return diff;
}
/**
* Align to another reference
*/
alignTo(other: PhaseReference): void {
const diff = this.phaseDifference(other);
for (let i = 0; i < this.phases.length; i++) {
this.phases[i] -= diff[i];
}
this.timestamp = Date.now() as i64;
}
toJSON(): string {
const builder = new JSONBuilder();
builder.startObject()
.addStringField("nodeId", this.nodeId)
.addNumberField("timestamp", f64(this.timestamp))
.addNumberField("phaseCount", f64(this.phases.length))
.endObject();
return builder.build();
}
toString(): string {
return `PhaseRef(${this.nodeId}, phases=${this.phases.length})`;
}
}
// ============================================================================
// Encoded Packet
// ============================================================================
/**
* Encoded PRRC packet
* σ = T_topo(T_hol(ResEncode(Ω)))
*/
export class PRRCPacket implements Serializable {
id: string;
timestamp: i64;
// Header
sourceNodeId: string;
targetNodeId: string;
channelId: string;
sequenceNumber: i32;
// Encoded content
encodedAmplitudes: Float64Array;
encodedPhases: Float64Array;
channelPrimes: i32[];
// Protection layers
topologicalSignature: Float64Array;
holonomyPhase: f64;
// Metadata
originalObjectId: string;
checksum: string;
constructor() {
this.id = generateId("pkt");
this.timestamp = Date.now() as i64;
this.sourceNodeId = "";
this.targetNodeId = "";
this.channelId = "";
this.sequenceNumber = 0;
this.encodedAmplitudes = new Float64Array(0);
this.encodedPhases = new Float64Array(0);
this.channelPrimes = [];
this.topologicalSignature = new Float64Array(0);
this.holonomyPhase = 0;
this.originalObjectId = "";
this.checksum = "";
}
/**
* Compute checksum of packet
*/
computeChecksum(): string {
let sum: f64 = 0;
for (let i = 0; i < this.encodedAmplitudes.length; i++) {
sum += this.encodedAmplitudes[i] * f64(i + 1);
sum += this.encodedPhases[i] * f64(i + 1) * 0.1;
}
sum += this.holonomyPhase * 1000;
return `${i64(sum * 1e12)}`;
}
/**
* Verify packet integrity
*/
verify(): bool {
return this.checksum == this.computeChecksum();
}
toJSON(): string {
const builder = new JSONBuilder();
builder.startObject()
.addStringField("id", this.id)
.addNumberField("timestamp", f64(this.timestamp))
.addStringField("sourceNodeId", this.sourceNodeId)
.addStringField("targetNodeId", this.targetNodeId)
.addStringField("channelId", this.channelId)
.addNumberField("sequenceNumber", f64(this.sequenceNumber))
.addNumberField("primeCount", f64(this.channelPrimes.length))
.addNumberField("holonomyPhase", this.holonomyPhase)
.endObject();
return builder.build();
}
toString(): string {
return `Packet(${this.id.substring(0, 8)}, seq=${this.sequenceNumber})`;
}
}
// ============================================================================
// Topological Transport
// ============================================================================
/**
* Topological transport protection layer
* Provides stability through topological invariants
*/
export class TopologicalTransport {
// Winding numbers for protection
windingNumbers: i32[];
constructor(primeCount: i32) {
this.windingNumbers = new Array<i32>(primeCount);
for (let i = 0; i < primeCount; i++) {
this.windingNumbers[i] = 0;
}
}
/**
* Apply topological wrapping to phases
* Returns topological signature
*/
wrap(phases: Float64Array): Float64Array {
const signature = new Float64Array(phases.length);
for (let i = 0; i < phases.length; i++) {
// Compute winding number
const winding = i32(Math.floor(phases[i] / (2 * Math.PI)));
this.windingNumbers[i] = winding;
// Create signature based on winding
signature[i] = f64(winding) * Math.PI / 10.0;
}
return signature;
}
/**
* Unwrap phases using topological signature
*/
unwrap(phases: Float64Array, signature: Float64Array): Float64Array {
const unwrapped = new Float64Array(phases.length);
for (let i = 0; i < phases.length; i++) {
// Recover winding from signature
const winding = i32(Math.round(signature[i] * 10.0 / Math.PI));
// Apply inverse wrapping
unwrapped[i] = phases[i] + f64(winding) * 2 * Math.PI;
}
return unwrapped;
}
/**
* Compute topological invariant (total winding)
*/
invariant(): i32 {
let total = 0;
for (let i = 0; i < this.windingNumbers.length; i++) {
total += this.windingNumbers[i];
}
return total;
}
}
// ============================================================================
// Holonomy Wrapper
// ============================================================================
/**
* Holonomy-based phase wrapping for security
* Based on geometric phase accumulation around closed loops
*/
export class HolonomyWrapper {
// Reference loop path
loopPath: Float64Array;
accumulatedPhase: f64;
constructor(primeCount: i32) {
this.loopPath = new Float64Array(primeCount);
this.accumulatedPhase = 0;
// Initialize with golden angle loop
for (let i = 0; i < primeCount; i++) {
this.loopPath[i] = f64(i) * 2.399963229728653; // Golden angle
}
}
/**
* Apply holonomy wrapping
* Returns holonomy phase
*/
wrap(phases: Float64Array): f64 {
let holonomy: f64 = 0;
// Compute geometric phase around loop
for (let i = 0; i < phases.length; i++) {
const next = (i + 1) % phases.length;
holonomy += Math.sin(phases[i] - phases[next] + this.loopPath[i]);
}
this.accumulatedPhase = holonomy;
return holonomy;
}
/**
* Verify holonomy matches expected value
*/
verify(phases: Float64Array, expectedHolonomy: f64, tolerance: f64 = 0.01): bool {
const computed = this.wrap(phases);
return Math.abs(computed - expectedHolonomy) < tolerance;
}
/**
* Apply phase correction based on holonomy
*/
correct(phases: Float64Array, targetHolonomy: f64): Float64Array {
const corrected = new Float64Array(phases.length);
const currentHolonomy = this.wrap(phases);
const correction = (targetHolonomy - currentHolonomy) / f64(phases.length);
for (let i = 0; i < phases.length; i++) {
corrected[i] = phases[i] + correction;
}
return corrected;
}
}
// ============================================================================
// Resonance Encoder
// ============================================================================
/**
* Prime-resonant encoding of memory objects
*/
export class ResonanceEncoder {
channelPrimes: i32[];
primeFrequencies: Float64Array;
constructor(channelPrimes: i32[]) {
this.channelPrimes = channelPrimes;
this.primeFrequencies = new Float64Array(channelPrimes.length);
// Compute prime frequencies: f(p) = 1 + ln(p)/10
for (let i = 0; i < channelPrimes.length; i++) {
this.primeFrequencies[i] = 1.0 + Math.log(f64(channelPrimes[i])) / 10.0;
}
}
/**
* Encode memory object amplitudes to channel basis
*/
encodeAmplitudes(object: MemoryObject): Float64Array {
const encoded = new Float64Array(this.channelPrimes.length);
// Map object primes to channel primes
for (let i = 0; i < this.channelPrimes.length; i++) {
const channelPrime = this.channelPrimes[i];
// Find matching prime in object
for (let j = 0; j < object.primes.length; j++) {
if (object.primes[j] == channelPrime) {
encoded[i] = object.amplitudes[j];
break;
}
}
// Apply frequency modulation for resonance
encoded[i] *= Math.cos(this.primeFrequencies[i] * 0.1);
}
return encoded;
}
/**
* Encode memory object phases with phase coherence
*/
encodePhases(object: MemoryObject): Float64Array {
const encoded = new Float64Array(this.channelPrimes.length);
for (let i = 0; i < this.channelPrimes.length; i++) {
const channelPrime = this.channelPrimes[i];
for (let j = 0; j < object.primes.length; j++) {
if (object.primes[j] == channelPrime) {
encoded[i] = object.phases[j];
break;
}
}
}
return encoded;
}
/**
* Decode amplitudes back to object basis
*/
decodeAmplitudes(
encoded: Float64Array,
targetPrimes: i32[]
): Float64Array {
const decoded = new Float64Array(targetPrimes.length);
for (let i = 0; i < targetPrimes.length; i++) {
const targetPrime = targetPrimes[i];
for (let j = 0; j < this.channelPrimes.length; j++) {
if (this.channelPrimes[j] == targetPrime) {
// Reverse frequency modulation
decoded[i] = encoded[j] / Math.cos(this.primeFrequencies[j] * 0.1);
break;
}
}
}
return decoded;
}
/**
* Decode phases
*/
decodePhases(
encoded: Float64Array,
targetPrimes: i32[]
): Float64Array {
const decoded = new Float64Array(targetPrimes.length);
for (let i = 0; i < targetPrimes.length; i++) {
const targetPrime = targetPrimes[i];
for (let j = 0; j < this.channelPrimes.length; j++) {
if (this.channelPrimes[j] == targetPrime) {
decoded[i] = encoded[j];
break;
}
}
}
return decoded;
}
}
// ============================================================================
// PRRC Channel
// ============================================================================
/**
* Prime-Resonant Resonance Channel
* Main channel class for encoding/decoding memory objects
*/
export class PRRCChannel implements Serializable {
id: string;
config: PRRCConfig;
// Channel primes
channelPrimes: i32[];
// Components
encoder: ResonanceEncoder;
topology: TopologicalTransport;
holonomy: HolonomyWrapper;
// Phase references
localReference: PhaseReference;
remoteReference: PhaseReference | null;
// State
sequenceCounter: i32;
isConnected: bool;
lastPacketTime: i64;
// Statistics
packetsSent: i32;
packetsReceived: i32;
decodeErrors: i32;
constructor(config: PRRCConfig = new PRRCConfig()) {
this.id = generateId("chan");
this.config = config;
// Generate channel primes using local variable first
// (to avoid using 'this' before all properties are initialized)
const primes = generatePrimesOptimized(config.channelPrimeCount);
const channelPrimesLocal = new Array<i32>(primes.length);
for (let i = 0; i < primes.length; i++) {
channelPrimesLocal[i] = i32(primes[i]);
}
// Initialize all properties before assigning channelPrimes
// (AssemblyScript requires all properties initialized before using 'this')
this.channelPrimes = channelPrimesLocal;
this.encoder = new ResonanceEncoder(channelPrimesLocal);
this.topology = new TopologicalTransport(config.channelPrimeCount);
this.holonomy = new HolonomyWrapper(config.channelPrimeCount);
this.localReference = new PhaseReference(config.channelPrimeCount);
this.remoteReference = null;
// State
this.sequenceCounter = 0;
this.isConnected = false;
this.lastPacketTime = 0;
// Statistics
this.packetsSent = 0;
this.packetsReceived = 0;
this.decodeErrors = 0;
}
/**
* Perform handshake with remote endpoint
*/
handshake(remoteReference: PhaseReference): bool {
this.remoteReference = remoteReference;
// Align local reference to remote
this.localReference.alignTo(remoteReference);
this.isConnected = true;
return true;
}
/**
* Encode a memory object into a packet
* σ = T_topo(T_hol(ResEncode(Ω)))
*/
encode(object: MemoryObject, targetNodeId: string): PRRCPacket {
const packet = new PRRCPacket();
// Header
packet.sourceNodeId = this.localReference.nodeId;
packet.targetNodeId = targetNodeId;
packet.channelId = this.id;
packet.sequenceNumber = this.sequenceCounter++;
packet.originalObjectId = object.id;
packet.channelPrimes = this.channelPrimes;
// Step 1: ResEncode - encode to channel basis
const encodedAmplitudes = this.encoder.encodeAmplitudes(object);
let encodedPhases = this.encoder.encodePhases(object);
// Step 2: T_hol - holonomy wrapping
if (this.config.enableHolonomyWrapping) {
packet.holonomyPhase = this.holonomy.wrap(encodedPhases);
}
// Step 3: T_topo - topological protection
if (this.config.enableTopologicalProtection) {
packet.topologicalSignature = this.topology.wrap(encodedPhases);
}
// Store encoded data
packet.encodedAmplitudes = encodedAmplitudes;
packet.encodedPhases = encodedPhases;
// Compute checksum
if (this.config.checksumEnabled) {
packet.checksum = packet.computeChecksum();
}
this.packetsSent++;
this.lastPacketTime = Date.now() as i64;
return packet;
}
/**
* Decode a packet back into a memory object
* Ω̂ ← decode(σ)
*/
decode(packet: PRRCPacket): MemoryObject | null {
this.packetsReceived++;
// Verify checksum if enabled
if (this.config.checksumEnabled && !packet.verify()) {
this.decodeErrors++;
return null;
}
// Step 1: Inverse T_topo - unwrap topological protection
let decodedPhases = packet.encodedPhases;
if (this.config.enableTopologicalProtection) {
decodedPhases = this.topology.unwrap(decodedPhases, packet.topologicalSignature);
}
// Step 2: Verify T_hol - holonomy verification
if (this.config.enableHolonomyWrapping) {
if (!this.holonomy.verify(decodedPhases, packet.holonomyPhase, 0.1)) {
// Try to correct
decodedPhases = this.holonomy.correct(decodedPhases, packet.holonomyPhase);
}
}
// Step 3: ResDecode - decode from channel basis to object basis
const objectPrimes = this.channelPrimes.slice();
const objectAmplitudes = this.encoder.decodeAmplitudes(packet.encodedAmplitudes, objectPrimes);
const objectPhases = this.encoder.decodePhases(decodedPhases, objectPrimes);
// Create reconstructed memory object
const smfOrientation = new Float64Array(16);
// Default SMF orientation (would be encoded in real implementation)
for (let i = 0; i < 16; i++) {
smfOrientation[i] = 1.0 / 16.0;
}
const object = new MemoryObject(
objectPrimes,
objectAmplitudes,
objectPhases,
smfOrientation,
packet.sourceNodeId,
"", // momentId not preserved
0, // coherence not preserved
0 // entropy not preserved
);
return object;
}
/**
* Get channel statistics
*/
getStats(): PRRCStats {
return new PRRCStats(
this.packetsSent,
this.packetsReceived,
this.decodeErrors,
this.isConnected,
this.lastPacketTime
);
}
/**
* Reset channel state
*/
reset(): void {
this.sequenceCounter = 0;
this.isConnected = false;
this.remoteReference = null;
this.packetsSent = 0;
this.packetsReceived = 0;
this.decodeErrors = 0;
this.lastPacketTime = 0;
}
toJSON(): string {
const builder = new JSONBuilder();
builder.startObject()
.addStringField("id", this.id)
.addBooleanField("isConnected", this.isConnected)
.addNumberField("packetsSent", f64(this.packetsSent))
.addNumberField("packetsReceived", f64(this.packetsReceived))
.addNumberField("decodeErrors", f64(this.decodeErrors))
.endObject();
return builder.build();
}
toString(): string {
return `PRRCChannel(${this.id.substring(0, 8)}, connected=${this.isConnected})`;
}
}
// ============================================================================
// PRRC Statistics
// ============================================================================
/**
* Channel statistics
*/
export class PRRCStats implements Serializable {
packetsSent: i32;
packetsReceived: i32;
decodeErrors: i32;
isConnected: bool;
lastPacketTime: i64;
constructor(
packetsSent: i32,
packetsReceived: i32,
decodeErrors: i32,
isConnected: bool,
lastPacketTime: i64
) {
this.packetsSent = packetsSent;
this.packetsReceived = packetsReceived;
this.decodeErrors = decodeErrors;
this.isConnected = isConnected;
this.lastPacketTime = lastPacketTime;
}
toJSON(): string {
const builder = new JSONBuilder();
builder.startObject()
.addNumberField("packetsSent", f64(this.packetsSent))
.addNumberField("packetsReceived", f64(this.packetsReceived))
.addNumberField("decodeErrors", f64(this.decodeErrors))
.addBooleanField("isConnected", this.isConnected)
.addNumberField("lastPacketTime", f64(this.lastPacketTime))
.endObject();
return builder.build();
}
toString(): string {
return `PRRCStats(sent=${this.packetsSent}, recv=${this.packetsReceived})`;
}
}
// ============================================================================
// Factory Functions
// ============================================================================
/**
* Create a new PRRC channel with default configuration
*/
export function createPRRCChannel(): PRRCChannel {
return new PRRCChannel();
}
/**
* Create a new PRRC channel with custom configuration
*/
export function createPRRCChannelWithConfig(config: PRRCConfig): PRRCChannel {
return new PRRCChannel(config);
}
/**
* Create a phase reference for a node
*/
export function createPhaseReference(nodeId: string, primeCount: i32 = 32): PhaseReference {
const ref = new PhaseReference(primeCount);
ref.nodeId = nodeId;
return ref;
}
/**
* Create a PRRC configuration
*/
export function createPRRCConfig(): PRRCConfig {
return new PRRCConfig();
}