@sschepis/resolang
Version:
ResoLang - Core quantum resonance computation library for browser and Node.js
218 lines (181 loc) • 5.66 kB
text/typescript
/**
* Semantic Pipeline
*
* Pipeline for semantic encoding using Sedenion Memory Field.
* Provides text/concept encoding with entropy tracking and collapse detection.
*/
import { SedenionMemoryField, createSMFFromText, SEMANTIC_AXES } from '../smf';
import { BasePipeline, ISemanticCapable } from './base';
import { PipelineConfig, PipelineEventType, SemanticResult } from './types';
import { JSONBuilder } from '../core/serialization';
/**
* SemanticPipeline - For text and concept encoding
*
* Components:
* - SedenionMemoryField (SMF) for 16-axis semantic space
* - Entropy tracking
* - Collapse detection and handling
*/
export class SemanticPipeline extends BasePipeline implements ISemanticCapable {
private smf: SedenionMemoryField = new SedenionMemoryField(100);
private lastCoherence: f64 = 1.0;
private lastEntropy: f64 = 0.0;
private accumulatedEntropy: f64 = 0.0;
constructor(config: PipelineConfig | null = null) {
super(config);
// Re-initialize with actual config value
this.smf = new SedenionMemoryField(this.config.historyLength);
}
getName(): string {
return "SemanticPipeline";
}
protected onInitialize(): void {
this.smf = new SedenionMemoryField(this.config.historyLength);
}
protected onStart(): void {
this.lastCoherence = this.smf.getCoherence();
this.lastEntropy = this.smf.getEntropy();
}
protected onStop(): void {
// Nothing special needed
}
protected onTick(dt: f64, timestamp: i64): void {
const oldCoherence = this.lastCoherence;
const oldEntropy = this.lastEntropy;
// Evolve the SMF
this.smf.evolve(dt, timestamp);
// Track coherence/entropy changes
this.lastCoherence = this.smf.getCoherence();
this.lastEntropy = this.smf.getEntropy();
// Emit change events
this.emitCoherenceChange(oldCoherence, this.lastCoherence);
this.emitEntropyChange(oldEntropy, this.lastEntropy);
// Accumulate entropy
this.accumulatedEntropy += this.lastEntropy * dt;
// Check for collapse
const collapseProbability = this.smf.getCollapseProbability();
if (collapseProbability > this.config.collapseThreshold) {
this.handleCollapse(timestamp);
}
}
protected onReset(): void {
this.smf.reset();
this.lastCoherence = 1.0;
this.lastEntropy = 0.0;
this.accumulatedEntropy = 0.0;
}
protected collectState(): void {
this.state.coherence = this.lastCoherence;
this.state.entropy = this.lastEntropy;
this.state.collapseProbability = this.smf.getCollapseProbability();
this.state.smfState = this.smf.toJSON();
}
private handleCollapse(timestamp: i64): void {
const dominantAxis = this.smf.getDominantAxis();
const axisName = SEMANTIC_AXES[dominantAxis];
// Perform collapse
this.smf.collapse();
this.accumulatedEntropy = 0.0;
// Emit collapse event
this.emitCollapse(`{"dominantAxis":${dominantAxis},"axisName":"${axisName}","timestamp":${timestamp}}`);
}
// ISemanticCapable implementation
/**
* Encode text into the SMF
*/
encodeText(text: string): Float64Array {
// Create SMF from text
const textSMF = createSMFFromText(text);
// Blend with current state
const blended = this.smf.blend(textSMF, 0.5);
// Apply to main SMF
this.smf.perturb(blended.state);
return this.getSMFAxes();
}
/**
* Get current SMF axis values
*/
getSMFAxes(): Float64Array {
return this.smf.getAllAxes();
}
/**
* Get current coherence
*/
getCoherence(): f64 {
return this.smf.getCoherence();
}
/**
* Get current entropy
*/
getEntropy(): f64 {
return this.smf.getEntropy();
}
// Additional semantic methods
/**
* Excite a specific semantic axis
*/
exciteAxis(axisIndex: i32, amplitude: f64): void {
this.smf.excite(axisIndex, amplitude);
}
/**
* Get the dominant semantic axis
*/
getDominantAxis(): i32 {
return this.smf.getDominantAxis();
}
/**
* Get collapse probability
*/
getCollapseProbability(): f64 {
return this.smf.getCollapseProbability();
}
/**
* Get semantic result (all semantic metrics in one object)
*/
getSemanticResult(): SemanticResult {
return new SemanticResult(
this.getSMFAxes(),
this.getEntropy(),
this.getDominantAxis(),
this.getCoherence()
);
}
/**
* Calculate similarity with another text
*/
similarity(text: string): f64 {
const textSMF = createSMFFromText(text);
return this.smf.similarity(textSMF);
}
/**
* Get mean coherence over history
*/
getMeanCoherence(): f64 {
return this.smf.getMeanCoherence();
}
/**
* Get coherence variance
*/
getCoherenceVariance(): f64 {
return this.smf.getCoherenceVariance();
}
toJSON(): string {
const builder = new JSONBuilder();
builder.startObject()
.addStringField("name", this.getName())
.addBooleanField("running", this.running)
.addNumberField("coherence", this.getCoherence())
.addNumberField("entropy", this.getEntropy())
.addNumberField("collapseProbability", this.getCollapseProbability())
.addNumberField("dominantAxis", f64(this.getDominantAxis()))
.addNumberField("collapseCount", f64(this.state.collapseCount))
.endObject();
return builder.build();
}
}
// Factory function
export function createSemanticPipeline(config: PipelineConfig | null = null): SemanticPipeline {
const pipeline = new SemanticPipeline(config);
pipeline.initialize();
return pipeline;
}