|
/** |
|
* Universal Object Reference System (UORS) and Semantic Addressing Engine |
|
* Reference Implementation |
|
* |
|
* This implementation provides a complete, coherent system for addressing objects |
|
* across domains, languages, and representation formats using a mathematically |
|
* principled approach based on Clifford algebras, manifold structures, and |
|
* coherence metrics. |
|
*/ |
|
|
|
// ============================================================================= |
|
// 1. Mathematical Foundation |
|
// ============================================================================= |
|
|
|
/** |
|
* Clifford Algebra implementation |
|
* Provides geometric algebra operations for multivector calculations |
|
*/ |
|
class CliffordAlgebra { |
|
/** |
|
* Creates a new Clifford algebra with given signature and dimension |
|
* @param {number[]} |
|
|
|
// ============================================================================= |
|
// 6. Neural Mechanisms |
|
// ============================================================================= |
|
|
|
/** |
|
* Coherence Neural Network (CNN) |
|
* Continuously monitors system coherence |
|
*/ |
|
class CoherenceNeuralNetwork { |
|
/** |
|
* Create a new coherence neural network |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.layers = []; |
|
this.weights = []; |
|
this.biases = []; |
|
this.activationFns = []; |
|
|
|
// Initialize with coherence-specific architecture |
|
this._initializeNetwork(config); |
|
} |
|
|
|
/** |
|
* Initialize the neural network |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_initializeNetwork(config) { |
|
const inputDim = config.inputDim || 64; |
|
const hiddenDims = config.hiddenDims || [32, 16]; |
|
const outputDim = config.outputDim || 8; |
|
|
|
// Layer dimensions |
|
this.layers = [inputDim, ...hiddenDims, outputDim]; |
|
|
|
// Initialize weights with Xavier initialization |
|
this.weights = []; |
|
for (let i = 0; i < this.layers.length - 1; i++) { |
|
const layer = []; |
|
const scale = Math.sqrt(6 / (this.layers[i] + this.layers[i + 1])); |
|
|
|
for (let j = 0; j < this.layers[i + 1]; j++) { |
|
const weights = []; |
|
for (let k = 0; k < this.layers[i]; k++) { |
|
weights.push(scale * (Math.random() * 2 - 1)); |
|
} |
|
layer.push(weights); |
|
} |
|
|
|
this.weights.push(layer); |
|
} |
|
|
|
// Initialize biases to zero |
|
this.biases = []; |
|
for (let i = 0; i < this.layers.length - 1; i++) { |
|
const biases = new Array(this.layers[i + 1]).fill(0); |
|
this.biases.push(biases); |
|
} |
|
|
|
// Activation functions |
|
this.activationFns = []; |
|
for (let i = 0; i < this.layers.length - 1; i++) { |
|
// Use ReLU for hidden layers, sigmoid for output |
|
if (i < this.layers.length - 2) { |
|
this.activationFns.push(x => Math.max(0, x)); // ReLU |
|
} else { |
|
this.activationFns.push(x => 1 / (1 + Math.exp(-x))); // Sigmoid |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Evaluate system state coherence |
|
* @param {Object} systemState - System state to evaluate |
|
* @returns {Object} Coherence evaluation |
|
*/ |
|
evaluate(systemState) { |
|
// Transform state into input vector |
|
const input = this._stateToVector(systemState); |
|
|
|
// Forward pass through the network |
|
const output = this._forwardPass(input); |
|
|
|
// Extract coherence information |
|
return { |
|
coherenceScore: output[0], |
|
violations: this._extractViolations(output, systemState), |
|
corrections: this._suggestCorrections(output, systemState) |
|
}; |
|
} |
|
|
|
/** |
|
* Forward pass through the neural network |
|
* @private |
|
* @param {number[]} input - Input vector |
|
* @returns {number[]} Output vector |
|
*/ |
|
_forwardPass(input) { |
|
let activation = input; |
|
|
|
for (let i = 0; i < this.layers.length - 1; i++) { |
|
// Linear transformation: W*a + b |
|
const linear = new Array(this.layers[i + 1]).fill(0); |
|
|
|
for (let j = 0; j < this.layers[i + 1]; j++) { |
|
linear[j] = this.biases[i][j]; |
|
|
|
for (let k = 0; k < activation.length; k++) { |
|
linear[j] += this.weights[i][j][k] * activation[k]; |
|
} |
|
} |
|
|
|
// Apply activation function |
|
activation = linear.map(this.activationFns[i]); |
|
} |
|
|
|
return activation; |
|
} |
|
|
|
/** |
|
* Convert system state to an input vector |
|
* @private |
|
* @param {Object} state - System state |
|
* @returns {number[]} Input vector |
|
*/ |
|
_stateToVector(state) { |
|
const inputDim = this.layers[0]; |
|
const vector = new Array(inputDim).fill(0); |
|
|
|
// Simple feature extraction for reference implementation |
|
|
|
// Extract general state features |
|
if (state.operation) { |
|
// Encode operation type |
|
const opTypes = ['allocate', 'release', 'query', 'create', 'update', 'delete']; |
|
const opIndex = opTypes.indexOf(state.operation.name); |
|
if (opIndex >= 0 && opIndex < 6) { |
|
vector[opIndex] = 1.0; |
|
} |
|
|
|
// Encode state modification |
|
vector[6] = state.operation.modifiesState ? 1.0 : 0.0; |
|
} |
|
|
|
// Extract metric features |
|
if (state.metricValues) { |
|
const startIndex = 10; |
|
const metrics = state.metricValues; |
|
|
|
for (let i = 0; i < Math.min(metrics.length, 10); i++) { |
|
vector[startIndex + i] = metrics[i]; |
|
} |
|
} |
|
|
|
// Extract coherence feature |
|
if (state.coherence !== undefined) { |
|
vector[25] = state.coherence; |
|
} |
|
|
|
// Fill remaining slots with random noise for testing |
|
// In a real implementation, we'd extract more meaningful features |
|
for (let i = 30; i < inputDim; i++) { |
|
vector[i] = Math.random() * 0.1; |
|
} |
|
|
|
return vector; |
|
} |
|
|
|
/** |
|
* Extract specific coherence violations |
|
* @private |
|
* @param {number[]} output - Network output |
|
* @param {Object} systemState - System state |
|
* @returns {Object[]} Detected violations |
|
*/ |
|
_extractViolations(output, systemState) { |
|
const violations = []; |
|
|
|
// Define violation types |
|
const violationTypes = [ |
|
'resourceOverallocation', |
|
'memoryLeak', |
|
'addressIncoherence', |
|
'securityBoundaryViolation', |
|
'dataInconsistency', |
|
'referentialIntegrity', |
|
'deadlock' |
|
]; |
|
|
|
// Output encoding represents different types of coherence violations |
|
// Skip the first element (overall coherence score) |
|
for (let i = 1; i < Math.min(output.length, violationTypes.length + 1); i++) { |
|
if (output[i] > 0.5) { |
|
violations.push({ |
|
type: violationTypes[i - 1], |
|
severity: output[i], |
|
location: this._locateViolation(i - 1, systemState) |
|
}); |
|
} |
|
} |
|
|
|
return violations; |
|
} |
|
|
|
/** |
|
* Locate the source of a violation |
|
* @private |
|
* @param {number} violationIndex - Violation type index |
|
* @param {Object} systemState - System state |
|
* @returns {string} Violation location |
|
*/ |
|
_locateViolation(violationIndex, systemState) { |
|
// Simple location identification for reference implementation |
|
|
|
switch (violationIndex) { |
|
case 0: // resourceOverallocation |
|
return 'ResourceManager'; |
|
|
|
case 1: // memoryLeak |
|
return 'MemoryService'; |
|
|
|
case 2: // addressIncoherence |
|
return 'AddressingModel'; |
|
|
|
case 3: // securityBoundaryViolation |
|
return 'SecurityManager'; |
|
|
|
case 4: // dataInconsistency |
|
return 'Storage'; |
|
|
|
case 5: // referentialIntegrity |
|
return 'ObjectManifold'; |
|
|
|
case 6: // deadlock |
|
return 'SynchronizationManager'; |
|
|
|
default: |
|
return 'Unknown'; |
|
} |
|
} |
|
|
|
/** |
|
* Suggest corrections for violations |
|
* @private |
|
* @param {number[]} output - Network output |
|
* @param {Object} systemState - System state |
|
* @returns {Object[]} Suggested corrections |
|
*/ |
|
_suggestCorrections(output, systemState) { |
|
const corrections = []; |
|
|
|
// Generate correction for each violation |
|
const violations = this._extractViolations(output, systemState); |
|
|
|
for (const violation of violations) { |
|
corrections.push({ |
|
violationType: violation.type, |
|
action: this._correctionActionForViolation(violation, systemState), |
|
priority: violation.severity |
|
}); |
|
} |
|
|
|
return corrections; |
|
} |
|
|
|
/** |
|
* Determine correction action for a violation |
|
* @private |
|
* @param {Object} violation - Detected violation |
|
* @param {Object} systemState - System state |
|
* @returns {string} Correction action |
|
*/ |
|
_correctionActionForViolation(violation, systemState) { |
|
// Specific correction actions by violation type |
|
|
|
switch (violation.type) { |
|
case 'resourceOverallocation': |
|
return 'Release unused resources and increase allocation thresholds'; |
|
|
|
case 'memoryLeak': |
|
return 'Identify and release orphaned memory allocations'; |
|
|
|
case 'addressIncoherence': |
|
return 'Rebuild address indexes and validate address integrity'; |
|
|
|
case 'securityBoundaryViolation': |
|
return 'Verify depth calculations and reinforce boundary checks'; |
|
|
|
case 'dataInconsistency': |
|
return 'Run consistency check and repair inconsistent data'; |
|
|
|
case 'referentialIntegrity': |
|
return 'Scan for dangling references and rebuild relation indexes'; |
|
|
|
case 'deadlock': |
|
return 'Identify resource cycles and release locked resources'; |
|
|
|
default: |
|
return 'Run general system coherence check'; |
|
} |
|
} |
|
|
|
/** |
|
* Train the network with a batch of examples |
|
* @param {Object[]} examples - Training examples |
|
* @param {Object} options - Training options |
|
* @returns {Object} Training results |
|
*/ |
|
train(examples, options = {}) { |
|
// This is a placeholder for a proper training implementation |
|
// For the reference implementation, we're using pre-initialized weights |
|
|
|
console.log(`Training CNN with ${examples.length} examples`); |
|
|
|
// Return mock training statistics |
|
return { |
|
iterations: 1, |
|
loss: 0.1, |
|
accuracy: 0.9, |
|
trained: true |
|
}; |
|
} |
|
} |
|
|
|
/** |
|
* Invariant-Preserving Transformation (IPT) |
|
* Guarantees that critical properties remain invariant under transformation |
|
*/ |
|
class InvariantPreservingTransformation { |
|
/** |
|
* Create a new invariant-preserving transformation |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.invariants = config.invariants || []; |
|
this.transformer = config.transformer; |
|
this.tolerance = config.tolerance || 1e-10; |
|
this.name = config.name || 'genericIPT'; |
|
} |
|
|
|
/** |
|
* Transform the input while preserving invariants |
|
* @param {*} input - Input to transform |
|
* @returns {*} Transformed output |
|
*/ |
|
transform(input) { |
|
// Measure invariants before transformation |
|
const preValues = this._measureInvariants(input); |
|
|
|
// Apply the transformation |
|
const output = this.transformer(input); |
|
|
|
// Measure invariants after transformation |
|
const postValues = this._measureInvariants(output); |
|
|
|
// Verify invariants within tolerance |
|
for (let i = 0; i < this.invariants.length; i++) { |
|
const invariant = this.invariants[i]; |
|
const pre = preValues[i]; |
|
const post = postValues[i]; |
|
|
|
if (Math.abs(pre - post) > this.tolerance) { |
|
throw new Error( |
|
`Transformation violated invariant ${invariant.name}: ` + |
|
`${pre} ≠ ${post} (diff: ${Math.abs(pre - post)})` |
|
); |
|
} |
|
} |
|
|
|
return output; |
|
} |
|
|
|
/** |
|
* Measure all invariants for an input |
|
* @private |
|
* @param {*} input - Input to measure |
|
* @returns {number[]} Invariant values |
|
*/ |
|
_measureInvariants(input) { |
|
return this.invariants.map(invariant => invariant.measure(input)); |
|
} |
|
|
|
/** |
|
* Create an IPT for a specific transformation |
|
* @static |
|
* @param {function} transformer - Transformation function |
|
* @param {Object[]} invariants - Invariants to preserve |
|
* @param {number} tolerance - Tolerance for invariant preservation |
|
* @returns {InvariantPreservingTransformation} New IPT |
|
*/ |
|
static create(transformer, invariants, tolerance = 1e-10) { |
|
return new InvariantPreservingTransformation({ |
|
transformer, |
|
invariants, |
|
tolerance |
|
}); |
|
} |
|
} |
|
|
|
/** |
|
* Invariant for use with IPTs |
|
*/ |
|
class Invariant { |
|
/** |
|
* Create a new invariant |
|
* @param {string} name - Invariant name |
|
* @param {function} measure - Measurement function |
|
* @param {function} validate - Validation function |
|
* @param {number} tolerance - Tolerance for validation |
|
*/ |
|
constructor(name, measure, validate = null, tolerance = 1e-10) { |
|
this.name = name; |
|
this.measure = measure; |
|
this.validate = validate || ((before, after) => { |
|
return Math.abs(this.measure(before) - this.measure(after)) <= tolerance; |
|
}); |
|
this.tolerance = tolerance; |
|
} |
|
} |
|
|
|
/** |
|
* SystemCoherenceMonitor |
|
* Higher-level coherence monitoring system |
|
*/ |
|
class SystemCoherenceMonitor { |
|
/** |
|
* Create a new system coherence monitor |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.cnn = new CoherenceNeuralNetwork(config.cnn || {}); |
|
this.observers = new Set(); |
|
this.monitoringInterval = config.monitoringInterval || 30000; // 30 seconds |
|
this.alertThreshold = config.alertThreshold || 0.7; |
|
this.history = []; |
|
this.historyLimit = config.historyLimit || 100; |
|
|
|
// Current system state |
|
this.currentState = { |
|
coherence: 1.0, |
|
violations: [], |
|
lastCheck: Date.now() |
|
}; |
|
|
|
// Start monitoring if auto-start is enabled |
|
if (config.autoStart !== false) { |
|
this.startMonitoring(); |
|
} |
|
} |
|
|
|
/** |
|
* Start continuous coherence monitoring |
|
* @returns {SystemCoherenceMonitor} This monitor for chaining |
|
*/ |
|
startMonitoring() { |
|
if (this._monitoringInterval) { |
|
clearInterval(this._monitoringInterval); |
|
} |
|
|
|
// Set up monitoring interval |
|
this._monitoringInterval = setInterval(() => { |
|
this.checkCoherence(); |
|
}, this.monitoringInterval); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Stop continuous coherence monitoring |
|
* @returns {SystemCoherenceMonitor} This monitor for chaining |
|
*/ |
|
stopMonitoring() { |
|
if (this._monitoringInterval) { |
|
clearInterval(this._monitoringInterval); |
|
this._monitoringInterval = null; |
|
} |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Register coherence observer |
|
* @param {function} observer - Observer function |
|
* @returns {SystemCoherenceMonitor} This monitor for chaining |
|
*/ |
|
addObserver(observer) { |
|
if (typeof observer === 'function') { |
|
this.observers.add(observer); |
|
} |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Remove coherence observer |
|
* @param {function} observer - Observer to remove |
|
* @returns {SystemCoherenceMonitor} This monitor for chaining |
|
*/ |
|
removeObserver(observer) { |
|
this.observers.delete(observer); |
|
return this; |
|
} |
|
|
|
/** |
|
* Check system coherence |
|
* @returns {Promise<Object>} Coherence evaluation |
|
*/ |
|
async checkCoherence() { |
|
try { |
|
// Collect system state |
|
const state = await this._collectSystemState(); |
|
|
|
// Evaluate coherence using CNN |
|
const evaluation = this.cnn.evaluate(state); |
|
|
|
// Update current state |
|
this.currentState = { |
|
coherence: evaluation.coherenceScore, |
|
violations: evaluation.violations, |
|
corrections: evaluation.corrections, |
|
lastCheck: Date.now() |
|
}; |
|
|
|
// Add to history |
|
this.history.push({ |
|
timestamp: Date.now(), |
|
coherence: evaluation.coherenceScore, |
|
violations: evaluation.violations.length |
|
}); |
|
|
|
// Trim history if needed |
|
if (this.history.length > this.historyLimit) { |
|
this.history = this.history.slice(-this.historyLimit); |
|
} |
|
|
|
// Notify observers if coherence is below threshold |
|
if (evaluation.coherenceScore < this.alertThreshold) { |
|
this._notifyObservers(evaluation); |
|
} |
|
|
|
return evaluation; |
|
} catch (error) { |
|
console.error("Error checking coherence:", error); |
|
|
|
// Return default value on error |
|
return { |
|
coherenceScore: 0.5, |
|
violations: [{ |
|
type: 'monitoringError', |
|
severity: 1.0, |
|
location: 'SystemCoherenceMonitor' |
|
}], |
|
corrections: [{ |
|
violationType: 'monitoringError', |
|
action: 'Restart coherence monitoring system', |
|
priority: 1.0 |
|
}] |
|
}; |
|
} |
|
} |
|
|
|
/** |
|
* Collect system state for coherence evaluation |
|
* @private |
|
* @returns {Promise<Object>} System state |
|
*/ |
|
async _collectSystemState() { |
|
// In a real implementation, this would collect actual system state |
|
// For the reference implementation, we create a mock state |
|
|
|
// Generate random coherence value (mostly high for demonstration) |
|
const baseCoherence = 0.85 + (Math.random() * 0.15); |
|
const coherence = Math.random() < 0.1 ? baseCoherence * 0.7 : baseCoherence; |
|
|
|
// Random operation |
|
const operations = ['allocate', 'release', 'query', 'create', 'update', 'delete']; |
|
const operation = { |
|
name: operations[Math.floor(Math.random() * operations.length)], |
|
modifiesState: Math.random() < 0.3 |
|
}; |
|
|
|
// Random metric values |
|
const metricValues = Array(10).fill(0).map(() => Math.random()); |
|
|
|
return { |
|
coherence, |
|
operation, |
|
metricValues, |
|
timestamp: Date.now() |
|
}; |
|
} |
|
|
|
/** |
|
* Notify observers of coherence issues |
|
* @private |
|
* @param {Object} evaluation - Coherence evaluation |
|
*/ |
|
_notifyObservers(evaluation) { |
|
for (const observer of this.observers) { |
|
try { |
|
observer(evaluation); |
|
} catch (error) { |
|
console.error("Error in coherence observer:", error); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Get coherence history |
|
* @param {Object} options - History options |
|
* @returns {Object[]} Coherence history |
|
*/ |
|
getHistory(options = {}) { |
|
let history = [...this.history]; |
|
|
|
// Apply time filter |
|
if (options.startTime) { |
|
history = history.filter(entry => entry.timestamp >= options.startTime); |
|
} |
|
|
|
if (options.endTime) { |
|
history = history.filter(entry => entry.timestamp <= options.endTime); |
|
} |
|
|
|
// Apply limit |
|
if (options.limit && options.limit > 0) { |
|
history = history.slice(-options.limit); |
|
} |
|
|
|
return history; |
|
} |
|
|
|
/** |
|
* Get current coherence state |
|
* @returns {Object} Current coherence state |
|
*/ |
|
getCurrentState() { |
|
return { ...this.currentState }; |
|
} |
|
} |
|
|
|
/** |
|
* InvariantRegistry |
|
* Registry of system invariants |
|
*/ |
|
class InvariantRegistry { |
|
/** |
|
* Create a new invariant registry |
|
*/ |
|
constructor() { |
|
this.invariants = new Map(); |
|
} |
|
|
|
/** |
|
* Register an invariant |
|
* @param {string} name - Invariant name |
|
* @param {function} measure - Measurement function |
|
* @param {function} validate - Validation function |
|
* @param {Object} options - Invariant options |
|
* @returns {InvariantRegistry} This registry for chaining |
|
*/ |
|
register(name, measure, validate = null, options = {}) { |
|
const invariant = new Invariant( |
|
name, |
|
measure, |
|
validate, |
|
options.tolerance || 1e-10 |
|
); |
|
|
|
this.invariants.set(name, invariant); |
|
return this; |
|
} |
|
|
|
/** |
|
* Get an invariant by name |
|
* @param {string} name - Invariant name |
|
* @returns {Invariant} Invariant object |
|
*/ |
|
get(name) { |
|
if (!this.invariants.has(name)) { |
|
throw new Error(`Invariant not found: ${name}`); |
|
} |
|
|
|
return this.invariants.get(name); |
|
} |
|
|
|
/** |
|
* Get all invariants |
|
* @returns {Invariant[]} All invariants |
|
*/ |
|
getAll() { |
|
return Array.from(this.invariants.values()); |
|
} |
|
|
|
/** |
|
* Remove an invariant |
|
* @param {string} name - Invariant name |
|
* @returns {boolean} True if removed |
|
*/ |
|
remove(name) { |
|
return this.invariants.delete(name); |
|
} |
|
|
|
/** |
|
* Create a standard invariant registry |
|
* @static |
|
* @returns {InvariantRegistry} Standard registry |
|
*/ |
|
static createStandard() { |
|
const registry = new InvariantRegistry(); |
|
|
|
// Register standard invariants |
|
|
|
// Norm preservation |
|
registry.register( |
|
'normPreservation', |
|
obj => { |
|
if (obj instanceof MultivectorRepresentation) { |
|
return obj.norm(); |
|
} else if (Array.isArray(obj)) { |
|
return Math.sqrt(obj.reduce((sum, x) => sum + x * x, 0)); |
|
} else { |
|
return 1.0; |
|
} |
|
} |
|
); |
|
|
|
// Type preservation |
|
registry.register( |
|
'typePreservation', |
|
obj => typeof obj, |
|
(before, after) => typeof before === typeof after |
|
); |
|
|
|
// Structure preservation |
|
registry.register( |
|
'structurePreservation', |
|
obj => { |
|
if (typeof obj !== 'object' || obj === null) { |
|
return null; |
|
} |
|
|
|
return Object.keys(obj).sort().join(','); |
|
}, |
|
(before, after) => { |
|
const beforeStruct = registry.get('structurePreservation').measure(before); |
|
const afterStruct = registry.get('structurePreservation').measure(after); |
|
|
|
return beforeStruct === afterStruct; |
|
} |
|
); |
|
|
|
// ID preservation |
|
registry.register( |
|
'idPreservation', |
|
obj => { |
|
if (typeof obj !== 'object' || obj === null) { |
|
return null; |
|
} |
|
|
|
return obj.id || null; |
|
}, |
|
(before, after) => { |
|
const beforeId = registry.get('idPreservation').measure(before); |
|
const afterId = registry.get('idPreservation').measure(after); |
|
|
|
return beforeId === afterId; |
|
} |
|
); |
|
|
|
return registry; |
|
} |
|
} |
|
|
|
// ============================================================================= |
|
// 7. Security Model Implementation |
|
// ============================================================================= |
|
|
|
/** |
|
* SecurityValidationEngine |
|
* Validates security properties using coherence principles |
|
*/ |
|
class SecurityValidationEngine { |
|
/** |
|
* Create a new security validation engine |
|
* @param {Base0} base0 - Base0 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(base0, config = {}) { |
|
this.base0 = base0; |
|
this.depthCalculator = new ManifoldDepthCalculator(); |
|
this.cnn = new CoherenceNeuralNetwork(config.cnn || {}); |
|
this.threshold = config.threshold || 0.8; |
|
this.validators = new Map(); |
|
|
|
// Initialize standard validators |
|
this._initializeValidators(); |
|
} |
|
|
|
/** |
|
* Initialize standard validators |
|
* @private |
|
*/ |
|
_initializeValidators() { |
|
// Depth validator |
|
this.registerValidator('depth', { |
|
validate: (object, context) => { |
|
const depth = this.depthCalculator.calculate(object); |
|
|
|
// Get required depth from context |
|
const requiredDepth = context.requiredDepth || 1.0; |
|
|
|
return { |
|
valid: depth >= requiredDepth, |
|
score: Math.min(1.0, depth / requiredDepth), |
|
depth, |
|
requiredDepth |
|
}; |
|
} |
|
}); |
|
|
|
// Coherence validator |
|
this.registerValidator('coherence', { |
|
validate: (object, context) => { |
|
const embedding = this.base0.embeddingModel.embed(object); |
|
const coherence = CoherenceMetrics.normalizedCoherence(embedding); |
|
|
|
// Get required coherence from context |
|
const requiredCoherence = context.requiredCoherence || this.threshold; |
|
|
|
return { |
|
valid: coherence >= requiredCoherence, |
|
score: coherence, |
|
coherence, |
|
requiredCoherence |
|
}; |
|
} |
|
}); |
|
|
|
// Integrity validator |
|
this.registerValidator('integrity', { |
|
validate: (object, context) => { |
|
// Simple integrity check for reference implementation |
|
|
|
if (typeof object !== 'object' || object === null) { |
|
return { |
|
valid: false, |
|
score: 0.0, |
|
reason: 'Object is not an object' |
|
}; |
|
} |
|
|
|
// Check for required fields |
|
const requiredFields = context.requiredFields || ['id']; |
|
const missingFields = requiredFields.filter(field => object[field] === undefined); |
|
|
|
if (missingFields.length > 0) { |
|
return { |
|
valid: false, |
|
score: 1 - missingFields.length / requiredFields.length, |
|
reason: `Missing required fields: ${missingFields.join(', ')}` |
|
}; |
|
} |
|
|
|
// Check for relationships if specified |
|
if (context.relationships) { |
|
for (const [field, relatedField] of Object.entries(context.relationships)) { |
|
if (object[field] && !object[relatedField]) { |
|
return { |
|
valid: false, |
|
score: 0.5, |
|
reason: `Incomplete relationship: ${field} exists but ${relatedField} is missing` |
|
}; |
|
} |
|
} |
|
} |
|
|
|
return { |
|
valid: true, |
|
score: 1.0 |
|
}; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a security validator |
|
* @param {string} name - Validator name |
|
* @param {Object} validator - Validator object |
|
* @returns {SecurityValidationEngine} This engine for chaining |
|
*/ |
|
registerValidator(name, validator) { |
|
if (typeof validator.validate !== 'function') { |
|
throw new Error(`Validator must have a validate function`); |
|
} |
|
|
|
this.validators.set(name, validator); |
|
return this; |
|
} |
|
|
|
/** |
|
* Validate security of an object |
|
* @param {*} object - Object to validate |
|
* @param {Object} context - Validation context |
|
* @returns {Promise<Object>} Validation result |
|
*/ |
|
async validate(object, context = {}) { |
|
const results = {}; |
|
let totalScore = 0; |
|
let validatorCount = 0; |
|
|
|
// Get validators to apply |
|
const validatorNames = context.validators || Array.from(this.validators.keys()); |
|
|
|
// Apply each validator |
|
for (const name of validatorNames) { |
|
const validator = this.validators.get(name); |
|
if (!validator) continue; |
|
|
|
try { |
|
const result = await validator.validate(object, context); |
|
results[name] = result; |
|
|
|
// Add to total score |
|
totalScore += result.score; |
|
validatorCount++; |
|
} catch (error) { |
|
console.error(`Error in validator ${name}:`, error); |
|
results[name] = { |
|
valid: false, |
|
score: 0, |
|
error: error.message |
|
}; |
|
} |
|
} |
|
|
|
// Calculate overall score |
|
const overallScore = validatorCount > 0 ? totalScore / validatorCount : 0; |
|
|
|
// Use CNN for additional validation |
|
const cnnEvaluation = this.cnn.evaluate({ |
|
object, |
|
validationResults: results, |
|
context |
|
}); |
|
|
|
return { |
|
valid: overallScore >= this.threshold, |
|
score: overallScore, |
|
results, |
|
cnnEvaluation |
|
}; |
|
} |
|
|
|
/** |
|
* Validate security properties |
|
* @param {*} component - Component to validate |
|
* @param {Object[]} properties - Security properties |
|
* @returns {Promise<Object>} Validation result |
|
*/ |
|
async validateProperties(component, properties) { |
|
const results = {}; |
|
let totalScore = 0; |
|
|
|
for (const property of properties) { |
|
// Formulate property as coherence constraint |
|
const constraint = this._propertyToConstraint(property); |
|
|
|
// Check coherence constraint |
|
const coherence = await this._evaluateConstraint(constraint, component); |
|
|
|
results[property.name] = { |
|
valid: coherence >= this.threshold, |
|
score: coherence |
|
}; |
|
|
|
totalScore += coherence; |
|
} |
|
|
|
const overallScore = properties.length > 0 ? totalScore / properties.length : 1.0; |
|
|
|
return { |
|
valid: overallScore >= this.threshold, |
|
score: overallScore, |
|
results |
|
}; |
|
} |
|
|
|
/** |
|
* Convert security property to constraint |
|
* @private |
|
* @param {Object} property - Security property |
|
* @returns {Object} Coherence constraint |
|
*/ |
|
_propertyToConstraint(property) { |
|
// Simple conversion for reference implementation |
|
|
|
return { |
|
name: property.name, |
|
validator: component => { |
|
// Convert property conditions to validator |
|
if (property.depth) { |
|
const depth = this.depthCalculator.calculate(component); |
|
return depth >= property.depth ? 1.0 : depth / property.depth; |
|
} |
|
|
|
if (property.type) { |
|
return typeof component === property.type ? 1.0 : 0.0; |
|
} |
|
|
|
if (property.hasProperty) { |
|
return component && component[property.hasProperty] !== undefined ? 1.0 : 0.0; |
|
} |
|
|
|
// Default coherence check |
|
const embedding = this.base0.embeddingModel.embed(component); |
|
return CoherenceMetrics.normalizedCoherence(embedding); |
|
} |
|
}; |
|
} |
|
|
|
/** |
|
* Evaluate a constraint on a component |
|
* @private |
|
* @param {Object} constraint - Coherence constraint |
|
* @param {*} component - Component to evaluate |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async _evaluateConstraint(constraint, component) { |
|
try { |
|
return constraint.validator(component); |
|
} catch (error) { |
|
console.error(`Error evaluating constraint ${constraint.name}:`, error); |
|
return 0.0; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* SecurityBoundary |
|
* Defines a security boundary at a specific manifold depth |
|
*/ |
|
class SecurityBoundary { |
|
/** |
|
* Create a new security boundary |
|
* @param {number} depth - Boundary depth |
|
* @param {Object} options - Boundary options |
|
*/ |
|
constructor(depth, options = {}) { |
|
this.depth = depth; |
|
this.name = options.name || `boundary-${depth}`; |
|
this.description = options.description || 'Security boundary'; |
|
this.depthCalculator = new ManifoldDepthCalculator(); |
|
this.mda = new ManifoldDepthAttention(); |
|
|
|
// Custom verifier function |
|
this.customVerifier = options.verifier || null; |
|
} |
|
|
|
/** |
|
* Verify if a component can cross the boundary |
|
* @param {*} component - Component to verify |
|
* @returns {Object} Verification result |
|
*/ |
|
verify(component) { |
|
// Calculate component depth |
|
const componentDepth = this.depthCalculator.calculate(component); |
|
|
|
// Check if component depth is sufficient |
|
const depthPermitted = componentDepth >= this.depth; |
|
|
|
// Use custom verifier if provided |
|
let customPermitted = true; |
|
if (this.customVerifier) { |
|
try { |
|
customPermitted = this.customVerifier(component); |
|
} catch (error) { |
|
console.error(`Error in custom verifier for boundary ${this.name}:`, error); |
|
customPermitted = false; |
|
} |
|
} |
|
|
|
// Only permitted if both checks pass |
|
const permitted = depthPermitted && customPermitted; |
|
|
|
// Calculate attention |
|
const attention = this.mda.calculateAttention( |
|
{ depth: componentDepth }, |
|
{ depth: this.depth } |
|
); |
|
|
|
return { |
|
permitted, |
|
componentDepth, |
|
boundaryDepth: this.depth, |
|
attention, |
|
boundaryName: this.name |
|
}; |
|
} |
|
|
|
/** |
|
* Get attention between component and boundary |
|
* @param {*} component - Component to check |
|
* @returns {number} Attention value |
|
*/ |
|
getAttention(component) { |
|
const componentDepth = this.depthCalculator.calculate(component); |
|
|
|
return this.mda.calculateAttention( |
|
{ depth: componentDepth }, |
|
{ depth: this.depth } |
|
); |
|
} |
|
} |
|
|
|
/** |
|
* AccessControlMatrix |
|
* Enforces access control through a capability matrix |
|
*/ |
|
class AccessControlMatrix { |
|
/** |
|
* Create a new access control matrix |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.subjects = new Map(); |
|
this.objects = new Map(); |
|
this.capabilities = new Map(); |
|
this.securityBoundaries = new Map(); |
|
this.depthCalculator = new ManifoldDepthCalculator(); |
|
|
|
// Default policies |
|
this.defaultAllow = config.defaultAllow === true; |
|
|
|
// Initialize from config if provided |
|
if (config.subjects) { |
|
for (const subject of config.subjects) { |
|
this.addSubject(subject.id, subject); |
|
} |
|
} |
|
|
|
if (config.objects) { |
|
for (const object of config.objects) { |
|
this.addObject(object.id, object); |
|
} |
|
} |
|
|
|
if (config.capabilities) { |
|
for (const [subjectId, objectId, permissions] of config.capabilities) { |
|
this.grant(subjectId, objectId, permissions); |
|
} |
|
} |
|
|
|
if (config.boundaries) { |
|
for (const boundary of config.boundaries) { |
|
this.addBoundary(boundary.name, boundary.depth, boundary); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Add a subject to the matrix |
|
* @param {string} subjectId - Subject ID |
|
* @param {Object} attributes - Subject attributes |
|
* @returns {AccessControlMatrix} This matrix for chaining |
|
*/ |
|
addSubject(subjectId, attributes = {}) { |
|
this.subjects.set(subjectId, { |
|
id: subjectId, |
|
...attributes, |
|
depth: attributes.depth || this.depthCalculator.calculate(attributes) |
|
}); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Add an object to the matrix |
|
* @param {string} objectId - Object ID |
|
* @param {Object} attributes - Object attributes |
|
* @returns {AccessControlMatrix} This matrix for chaining |
|
*/ |
|
addObject(objectId, attributes = {}) { |
|
this.objects.set(objectId, { |
|
id: objectId, |
|
...attributes, |
|
depth: attributes.depth || this.depthCalculator.calculate(attributes) |
|
}); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Add a security boundary |
|
* @param {string} name - Boundary name |
|
* @param {number} depth - Boundary depth |
|
* @param {Object} options - Boundary options |
|
* @returns {AccessControlMatrix} This matrix for chaining |
|
*/ |
|
addBoundary(name, depth, options = {}) { |
|
this.securityBoundaries.set(name, new SecurityBoundary(depth, { |
|
...options, |
|
name |
|
})); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Grant permissions to a subject |
|
* @param {string} subjectId - Subject ID |
|
* @param {string} objectId - Object ID |
|
* @param {string|string[]} permissions - Permissions to grant |
|
* @returns {AccessControlMatrix} This matrix for chaining |
|
*/ |
|
grant(subjectId, objectId, permissions) { |
|
const key = `${subjectId}|${objectId}`; |
|
|
|
if (!this.capabilities.has(key)) { |
|
this.capabilities.set(key, new Set()); |
|
} |
|
|
|
const caps = this.capabilities.get(key); |
|
|
|
if (Array.isArray(permissions)) { |
|
for (const perm of permissions) { |
|
caps.add(perm); |
|
} |
|
} else { |
|
caps.add(permissions); |
|
} |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Revoke permissions from a subject |
|
* @param {string} subjectId - Subject ID |
|
* @param {string} objectId - Object ID |
|
* @param {string|string[]} permissions - Permissions to revoke |
|
* @returns {AccessControlMatrix} This matrix for chaining |
|
*/ |
|
revoke(subjectId, objectId, permissions) { |
|
const key = `${subjectId}|${objectId}`; |
|
|
|
if (!this.capabilities.has(key)) { |
|
return this; |
|
} |
|
|
|
const caps = this.capabilities.get(key); |
|
|
|
if (Array.isArray(permissions)) { |
|
for (const perm of permissions) { |
|
caps.delete(perm); |
|
} |
|
} else { |
|
caps.delete(permissions); |
|
} |
|
|
|
// Remove empty capability set |
|
if (caps.size === 0) { |
|
this.capabilities.delete(key); |
|
} |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Check if a subject has a permission on an object |
|
* @param {string} subjectId - Subject ID |
|
* @param {string} objectId - Object ID |
|
* @param {string} permission - Permission to check |
|
* @returns {Object} Check result |
|
*/ |
|
check(subjectId, objectId, permission) { |
|
// Check if subject and object exist |
|
const subject = this.subjects.get(subjectId); |
|
const object = this.objects.get(objectId); |
|
|
|
if (!subject || !object) { |
|
return { |
|
allowed: false, |
|
reason: !subject ? `Subject not found: ${subjectId}` : `Object not found: ${objectId}` |
|
}; |
|
} |
|
|
|
// Check capability |
|
const key = `${subjectId}|${objectId}`; |
|
const caps = this.capabilities.get(key); |
|
|
|
if (caps && (caps.has(permission) || caps.has('*'))) { |
|
// Direct capability granted |
|
return { |
|
allowed: true, |
|
reason: 'Explicit permission', |
|
method: 'capability' |
|
}; |
|
} |
|
|
|
// Check depth-based access |
|
if (subject.depth >= object.depth) { |
|
// Depth allows access |
|
return { |
|
allowed: true, |
|
reason: 'Depth-based permission', |
|
method: 'depth', |
|
subjectDepth: subject.depth, |
|
objectDepth: object.depth |
|
}; |
|
} |
|
|
|
// Check boundary crossing |
|
for (const [name, boundary] of this.securityBoundaries.entries()) { |
|
// Check if object is protected by this boundary |
|
if (object.depth <= boundary.depth && subject.depth < boundary.depth) { |
|
return { |
|
allowed: false, |
|
reason: `Cannot cross security boundary: ${name}`, |
|
method: 'boundary', |
|
boundary: name |
|
}; |
|
} |
|
} |
|
|
|
// Default policy |
|
return { |
|
allowed: this.defaultAllow, |
|
reason: this.defaultAllow ? 'Default allow policy' : 'Default deny policy', |
|
method: 'default' |
|
}; |
|
} |
|
|
|
/** |
|
* Get all permissions for a subject on an object |
|
* @param {string} subjectId - Subject ID |
|
* @param {string} objectId - Object ID |
|
* @returns {string[]} Permissions |
|
*/ |
|
getPermissions(subjectId, objectId) { |
|
const key = `${subjectId}|${objectId}`; |
|
const caps = this.capabilities.get(key); |
|
|
|
if (!caps) return []; |
|
|
|
return Array.from(caps); |
|
} |
|
|
|
/** |
|
* Get all subjects with access to an object |
|
* @param {string} objectId - Object ID |
|
* @returns {Object[]} Subjects with access |
|
*/ |
|
getSubjectsWithAccess(objectId) { |
|
const results = []; |
|
|
|
for (const [subjectId, subject] of this.subjects.entries()) { |
|
// Check capability-based access |
|
const key = `${subjectId}|${objectId}`; |
|
const caps = this.capabilities.get(key); |
|
|
|
if (caps && caps.size > 0) { |
|
results.push({ |
|
subject, |
|
permissions: Array.from(caps), |
|
method: 'capability' |
|
}); |
|
continue; |
|
} |
|
|
|
// Check depth-based access |
|
const object = this.objects.get(objectId); |
|
if (object && subject.depth >= object.depth) { |
|
results.push({ |
|
subject, |
|
permissions: ['*'], |
|
method: 'depth' |
|
}); |
|
continue; |
|
} |
|
} |
|
|
|
return results; |
|
} |
|
} |
|
|
|
// ============================================================================= |
|
// 8. Advanced Usage Examples |
|
// ============================================================================= |
|
|
|
/** |
|
* Advanced examples demonstrating UORS capabilities |
|
*/ |
|
async function advancedExamples() { |
|
console.log("=== Advanced UORS Examples ==="); |
|
|
|
// Create UORS instance |
|
const uors = createUORS({ |
|
languages: ['en', 'es', 'fr', 'de', 'zh'], |
|
coherenceThreshold: 0.75 |
|
}); |
|
|
|
// Example 1: Cross-linguistic semantic addressing |
|
console.log("\n--- Example 1: Cross-linguistic semantics ---"); |
|
|
|
// Define concepts in multiple languages |
|
const concepts = { |
|
en: { |
|
"database": "A structured collection of data stored and accessed electronically", |
|
"server": "A computer program or device that provides functionality for other programs or devices", |
|
"network": "A group of interconnected computers and devices that can communicate with each other" |
|
}, |
|
es: { |
|
"base de datos": "Una colección estructurada de datos almacenados y accedidos electrónicamente", |
|
"servidor": "Un programa o dispositivo informático que proporciona funcionalidad para otros programas o dispositivos", |
|
"red": "Un grupo de computadoras y dispositivos interconectados que pueden comunicarse entre sí" |
|
}, |
|
fr: { |
|
"base de données": "Une collection structurée de données stockées et consultées par voie électronique", |
|
"serveur": "Un programme ou appareil informatique qui fournit des fonctionnalités à d'autres programmes ou appareils", |
|
"réseau": "Un groupe d'ordinateurs et de périphériques interconnectés qui peuvent communiquer entre eux" |
|
} |
|
}; |
|
|
|
// Register concept mappings |
|
for (const concept of ["database", "server", "network"]) { |
|
const mapping = { |
|
domain: "computing", |
|
concepts: {} |
|
}; |
|
|
|
for (const [lang, conceptMap] of Object.entries(concepts)) { |
|
const conceptKey = lang === 'en' ? concept : Object.keys(conceptMap)[Object.keys(concepts.en).indexOf(concept)]; |
|
mapping.concepts[lang] = conceptKey; |
|
} |
|
|
|
await uors.registerConceptMapping(mapping); |
|
console.log(`Registered mapping for '${concept}'`); |
|
} |
|
|
|
// Find equivalent concepts |
|
const dbEquivalent = await uors.findEquivalentConcept("database", "en", "fr"); |
|
console.log(`Equivalent of 'database' in French: ${dbEquivalent.concept}`); |
|
|
|
const serverEquivalent = await uors.findEquivalentConcept("servidor", "es", "en"); |
|
console.log(`Equivalent of 'servidor' in English: ${serverEquivalent.concept}`); |
|
|
|
// Example 2: Manifold relations with depth security |
|
console.log("\n--- Example 2: Manifold relations with depth security ---"); |
|
|
|
// Create objects at different depths |
|
const adminConfig = await uors.store({ |
|
name: "admin-security-config", |
|
accessLevel: "high", |
|
permissions: { |
|
read: true, |
|
write: true, |
|
execute: true, |
|
admin: true |
|
} |
|
}, { |
|
description: "Administrative security configuration with elevated privileges", |
|
namespace: "system.security", |
|
context: "admin" |
|
}); |
|
|
|
const userConfig = await uors.store({ |
|
name: "user-security-config", |
|
accessLevel: "medium", |
|
permissions: { |
|
read: true, |
|
write: true, |
|
execute: false, |
|
admin: false |
|
} |
|
}, { |
|
description: "User-level security configuration with standard privileges", |
|
namespace: "system.security", |
|
context: "user" |
|
}); |
|
|
|
const guestConfig = await uors.store({ |
|
name: "guest-security-config", |
|
accessLevel: "low", |
|
permissions: { |
|
read: true, |
|
write: false, |
|
execute: false, |
|
admin: false |
|
} |
|
}, { |
|
description: "Guest-level security configuration with minimal privileges", |
|
namespace: "system.security", |
|
context: "guest" |
|
}); |
|
|
|
console.log("Created configuration objects at different depths"); |
|
|
|
// Try to create relations |
|
try { |
|
// Admin can refer to user (higher depth to lower depth) |
|
const adminToUser = await uors.createRelation( |
|
adminConfig.id, |
|
userConfig.id, |
|
"manages", |
|
{ description: "Admin manages user configuration" } |
|
); |
|
console.log("Admin to user relation created successfully"); |
|
|
|
// User can refer to guest (higher depth to lower depth) |
|
const userToGuest = await uors.createRelation( |
|
userConfig.id, |
|
guestConfig.id, |
|
"manages", |
|
{ description: "User manages guest configuration" } |
|
); |
|
console.log("User to guest relation created successfully"); |
|
|
|
// Guest cannot refer to user (lower depth to higher depth) |
|
try { |
|
const guestToUser = await uors.createRelation( |
|
guestConfig.id, |
|
userConfig.id, |
|
"manages", |
|
{ description: "Guest tries to manage user configuration" } |
|
); |
|
console.log("Guest to user relation created (unexpected)"); |
|
} catch (error) { |
|
console.log("Guest to user relation failed (expected):", error.message); |
|
} |
|
} catch (error) { |
|
console.error("Error creating relations:", error); |
|
} |
|
|
|
// Example 3: Invariant-preserving transformations |
|
console.log("\n--- Example 3: Invariant-preserving transformations ---"); |
|
|
|
// Create invariant registry |
|
const registry = InvariantRegistry.createStandard(); |
|
|
|
// Create a sample object |
|
const original = { |
|
id: "test-object", |
|
name: "Test Object", |
|
data: [1, 2, 3, 4, 5], |
|
metadata: { |
|
created: Date.now(), |
|
version: "1.0.0" |
|
} |
|
}; |
|
|
|
console.log("Original object:", original); |
|
|
|
// Create a valid transformation |
|
const validTransformation = InvariantPreservingTransformation.create( |
|
obj => { |
|
// Valid transformation: preserves ID and structure |
|
return { |
|
...obj, |
|
data: obj.data.map(x => x * 2), // Transform data |
|
metadata: { |
|
...obj.metadata, |
|
updated: Date.now() // Add updated timestamp |
|
} |
|
}; |
|
}, |
|
[registry.get('idPreservation'), registry.get('structurePreservation')] |
|
); |
|
|
|
// Apply valid transformation |
|
try { |
|
const transformed = validTransformation.transform(original); |
|
console.log("Valid transformation applied:", transformed); |
|
} catch (error) { |
|
console.error("Valid transformation failed (unexpected):", error); |
|
} |
|
|
|
// Create an invalid transformation |
|
const invalidTransformation = InvariantPreservingTransformation.create( |
|
obj => { |
|
// Invalid transformation: changes ID |
|
return { |
|
...obj, |
|
id: "modified-id", // Change ID (violates idPreservation) |
|
data: obj.data.map(x => x * 2) |
|
}; |
|
}, |
|
[registry.get('idPreservation'), registry.get('structurePreservation')] |
|
); |
|
|
|
// Apply invalid transformation |
|
try { |
|
const transformed = invalidTransformation.transform(original); |
|
console.log("Invalid transformation applied (unexpected):", transformed); |
|
} catch (error) { |
|
console.log("Invalid transformation failed (expected):", error.message); |
|
} |
|
|
|
// Example 4: Security boundaries and access control |
|
console.log("\n--- Example 4: Security boundaries and access control ---"); |
|
|
|
// Create access control matrix |
|
const acm = new AccessControlMatrix({ |
|
defaultAllow: false // Default deny policy |
|
}); |
|
|
|
// Add subjects (users) |
|
acm.addSubject("admin", { role: "admin", depth: 5.0 }); |
|
acm.addSubject("powerUser", { role: "power-user", depth: 4.0 }); |
|
acm.addSubject("regularUser", { role: "user", depth: 3.0 }); |
|
acm.addSubject("guest", { role: "guest", depth: 1.0 }); |
|
|
|
// Add objects (resources) |
|
acm.addObject("systemConfig", { type: "configuration", depth: 4.5 }); |
|
acm.addObject("userDatabase", { type: "database", depth: 3.5 }); |
|
acm.addObject("publicContent", { type: "content", depth: 1.0 }); |
|
|
|
// Add security boundaries |
|
acm.addBoundary("systemBoundary", 4.0, { description: "System level security boundary" }); |
|
acm.addBoundary("userBoundary", 2.0, { description: "User level security boundary" }); |
|
|
|
// Grant specific permissions |
|
acm.grant("regularUser", "userDatabase", ["read", "write"]); |
|
acm.grant("guest", "publicContent", "read"); |
|
|
|
// Check permissions |
|
const checks = [ |
|
{ subject: "admin", object: "systemConfig", permission: "write" }, |
|
{ subject: "powerUser", object: "systemConfig", permission: "read" }, |
|
{ subject: "regularUser", object: "systemConfig", permission: "read" }, |
|
{ subject: "regularUser", object: "userDatabase", permission: "write" }, |
|
{ subject: "guest", object: "userDatabase", permission: "read" }, |
|
{ subject: "guest", object: "publicContent", permission: "write" } |
|
]; |
|
|
|
for (const check of checks) { |
|
const result = acm.check(check.subject, check.object, check.permission); |
|
console.log( |
|
`${check.subject} -> ${check.permission} -> ${check.object}: ` + |
|
`${result.allowed ? 'ALLOWED' : 'DENIED'} (${result.reason})` |
|
); |
|
} |
|
|
|
// Example 5: Coherence monitoring |
|
console.log("\n--- Example 5: Coherence monitoring ---"); |
|
|
|
// Create coherence monitor |
|
const monitor = new SystemCoherenceMonitor({ |
|
monitoringInterval: 1000, // 1 second for demonstration |
|
alertThreshold: 0.7, |
|
autoStart: false // Don't start automatically |
|
}); |
|
|
|
// Add observer |
|
monitor.addObserver(evaluation => { |
|
console.log(`Coherence alert: ${evaluation.coherenceScore.toFixed(2)}`); |
|
if (evaluation.violations.length > 0) { |
|
console.log(` Violations detected: ${evaluation.violations.length}`); |
|
for (const violation of evaluation.violations) { |
|
console.log(` - ${violation.type} (severity: ${violation.severity.toFixed(2)}) at ${violation.location}`); |
|
} |
|
} |
|
}); |
|
|
|
// Run a manual coherence check |
|
const coherenceResult = await monitor.checkCoherence(); |
|
console.log("Coherence check result:", coherenceResult.coherenceScore.toFixed(2)); |
|
|
|
return { |
|
concepts, |
|
dbEquivalent, |
|
serverEquivalent, |
|
adminConfig, |
|
userConfig, |
|
guestConfig, |
|
coherenceResult |
|
}; |
|
} |
|
|
|
/** |
|
* Example of a complete workflow using UORS |
|
*/ |
|
async function completeWorkflowExample() { |
|
console.log("=== Complete UORS Workflow Example ==="); |
|
|
|
// Create UORS instance |
|
const uors = createUORS({ |
|
languages: ['en', 'es', 'fr'], |
|
coherenceThreshold: 0.75 |
|
}); |
|
|
|
// Step 1: Create database configuration |
|
console.log("\nStep 1: Creating database configuration"); |
|
const dbConfig = await uors.store({ |
|
name: "production-database", |
|
host: "db.example.com", |
|
port: 5432, |
|
username: "app_user", |
|
password: "********", |
|
database: "customer_data", |
|
options: { |
|
poolSize: 10, |
|
ssl: true, |
|
timeout: 30000 |
|
} |
|
}, { |
|
namespace: "config.database", |
|
language: "en", |
|
context: "production", |
|
description: "Production database configuration for customer data" |
|
}); |
|
|
|
console.log(`Database configuration stored with ID: ${dbConfig.id}`); |
|
console.log(`Address coherence: ${dbConfig.address.coherence.toFixed(2)}`); |
|
|
|
// Step 2: Create application configuration |
|
console.log("\nStep 2: Creating application configuration"); |
|
const appConfig = await uors.store({ |
|
name: "customer-portal", |
|
version: "2.5.0", |
|
environment: "production", |
|
features: { |
|
userManagement: true, |
|
reporting: true, |
|
billing: true, |
|
analytics: true |
|
}, |
|
scaling: { |
|
minInstances: 3, |
|
maxInstances: 10, |
|
targetCpuUtilization: 70 |
|
}, |
|
security: { |
|
authentication: "oauth2", |
|
authorization: "rbac", |
|
dataEncryption: true |
|
} |
|
}, { |
|
namespace: "config.application", |
|
language: "en", |
|
context: "production", |
|
description: "Production configuration for customer portal application" |
|
}); |
|
|
|
console.log(`Application configuration stored with ID: ${appConfig.id}`); |
|
|
|
// Step 3: Create relation between configurations |
|
console.log("\nStep 3: Creating relation between configurations"); |
|
const relation = await uors.createRelation( |
|
appConfig.id, |
|
dbConfig.id, |
|
"uses", |
|
{ |
|
description: "Application uses this database for customer data", |
|
critical: true, |
|
created: Date.now() |
|
} |
|
); |
|
|
|
console.log(`Relation created: ${relation.id}`); |
|
|
|
// Step 4: Create Spanish translation of configurations |
|
console.log("\nStep 4: Creating Spanish translations"); |
|
|
|
// Register concept mappings for database terms |
|
await uors.registerConceptMapping({ |
|
domain: "database", |
|
concepts: { |
|
"en": "database configuration", |
|
"es": "configuración de base de datos", |
|
"fr": "configuration de base de données" |
|
} |
|
}); |
|
|
|
await uors.registerConceptMapping({ |
|
domain: "application", |
|
concepts: { |
|
"en": "application configuration", |
|
"es": "configuración de aplicación", |
|
"fr": "configuration d'application" |
|
} |
|
}); |
|
|
|
// Create Spanish version of database config |
|
const dbConfigEs = await uors.store({ |
|
name: "base-de-datos-produccion", |
|
host: "db.example.com", |
|
port: 5432, |
|
username: "app_user", |
|
password: "********", |
|
database: "customer_data", |
|
options: { |
|
poolSize: 10, |
|
ssl: true, |
|
timeout: 30000 |
|
} |
|
}, { |
|
namespace: "config.database", |
|
language: "es", |
|
context: "produccion", |
|
description: "Configuración de base de datos de producción para datos de clientes" |
|
}); |
|
|
|
console.log(`Spanish database configuration stored with ID: ${dbConfigEs.id}`); |
|
|
|
// Step 5: Find semantically similar configurations |
|
console.log("\nStep 5: Finding semantically similar configurations"); |
|
const similarConfigs = await uors.findSimilarObjects(dbConfig.id, { |
|
threshold: 0.7, |
|
limit: 3 |
|
}); |
|
|
|
console.log(`Found ${similarConfigs.length} similar configurations:`); |
|
for (const similar of similarConfigs) { |
|
console.log( |
|
` - ${similar.address.name.name} (${similar.address.name.namespace}): ` + |
|
`${similar.similarity.toFixed(2)} similarity` |
|
); |
|
} |
|
|
|
// Step 6: Create and apply invariant-preserving transformation |
|
console.log("\nStep 6: Creating and applying invariant-preserving transformation"); |
|
|
|
// Create invariant registry |
|
const registry = InvariantRegistry.createStandard(); |
|
|
|
// Create custom invariant for database configuration |
|
registry.register( |
|
'databaseConnectivity', |
|
config => { |
|
// Measure contains key connection parameters |
|
if (!config || typeof config !== 'object') return false; |
|
|
|
const hasHost = config.host !== undefined; |
|
const hasPort = config.port !== undefined; |
|
const hasDatabase = config.database !== undefined; |
|
|
|
return hasHost && hasPort && hasDatabase; |
|
}, |
|
(before, after) => { |
|
// Connection parameters must be preserved |
|
if (!before || !after) return false; |
|
|
|
return ( |
|
before.host === after.host && |
|
before.port === after.port && |
|
before.database === after.database |
|
); |
|
} |
|
); |
|
|
|
// Create transformation to update database configuration |
|
const dbTransform = InvariantPreservingTransformation.create( |
|
config => { |
|
// Update configuration while preserving invariants |
|
return { |
|
...config, |
|
options: { |
|
...config.options, |
|
poolSize: 20, // Double pool size |
|
timeout: 60000 // Double timeout |
|
}, |
|
lastUpdated: Date.now() |
|
}; |
|
}, |
|
[ |
|
registry.get('databaseConnectivity'), |
|
registry.get('idPreservation') |
|
] |
|
); |
|
|
|
// Get original configuration |
|
const originalConfig = (await uors.retrieve(dbConfig.id)).object; |
|
console.log("Original configuration:", originalConfig.options); |
|
|
|
// Apply transformation |
|
const transformedConfig = dbTransform.transform(originalConfig); |
|
console.log("Transformed configuration:", transformedConfig.options); |
|
|
|
// Step 7: Store updated configuration |
|
console.log("\nStep 7: Storing updated configuration"); |
|
const updatedConfig = await uors.store(transformedConfig, { |
|
namespace: "config.database", |
|
language: "en", |
|
context: "production", |
|
description: "Updated production database configuration with optimized settings" |
|
}); |
|
|
|
console.log(`Updated configuration stored with ID: ${updatedConfig.id}`); |
|
|
|
// Step 8: Set up security validation |
|
console.log("\nStep 8: Setting up security validation"); |
|
|
|
const securityEngine = new SecurityValidationEngine(uors.base0, { |
|
threshold: 0.8 |
|
}); |
|
|
|
// Add custom validator |
|
securityEngine.registerValidator('configSecurity', { |
|
validate: (config, context) => { |
|
// Check security-specific properties |
|
if (!config || typeof config !== 'object') { |
|
return { |
|
valid: false, |
|
score: 0.0, |
|
reason: 'Not an object' |
|
}; |
|
} |
|
|
|
// For database config, check for encryption |
|
if (config.options && config.options.ssl === true) { |
|
return { |
|
valid: true, |
|
score: 1.0, |
|
reason: 'SSL enabled' |
|
}; |
|
} |
|
|
|
// For application config, check for authentication |
|
if (config.security && config.security.authentication) { |
|
return { |
|
valid: true, |
|
score: 1.0, |
|
reason: 'Authentication configured' |
|
}; |
|
} |
|
|
|
return { |
|
valid: false, |
|
score: 0.5, |
|
reason: 'Missing security features' |
|
}; |
|
} |
|
}); |
|
|
|
// Validate database config |
|
const dbValidation = await securityEngine.validate(transformedConfig, { |
|
validators: ['depth', 'coherence', 'configSecurity'], |
|
requiredDepth: 2.0 |
|
}); |
|
|
|
console.log("Database config validation:", |
|
dbValidation.valid ? "PASSED" : "FAILED", |
|
`(Score: ${dbValidation.score.toFixed(2)})` |
|
); |
|
|
|
for (const [name, result] of Object.entries(dbValidation.results)) { |
|
console.log(` - ${name}: ${result.valid ? "Valid" : "Invalid"} (${result.score.toFixed(2)})`); |
|
} |
|
|
|
// Validate application config |
|
const appObject = (await uors.retrieve(appConfig.id)).object; |
|
const appValidation = await securityEngine.validate(appObject, { |
|
validators: ['depth', 'coherence', 'configSecurity'], |
|
requiredDepth: 2.0 |
|
}); |
|
|
|
console.log("Application config validation:", |
|
appValidation.valid ? "PASSED" : "FAILED", |
|
`(Score: ${appValidation.score.toFixed(2)})` |
|
); |
|
|
|
return { |
|
dbConfig, |
|
appConfig, |
|
relation, |
|
dbConfigEs, |
|
similarConfigs, |
|
transformedConfig, |
|
updatedConfig, |
|
dbValidation, |
|
appValidation |
|
}; |
|
} |
|
|
|
// ============================================================================= |
|
// 9. Export UORS for use in other environments |
|
// ============================================================================= |
|
|
|
// Export as global in browser environments |
|
if (typeof window !== 'undefined') { |
|
window.UORS = { |
|
createUORS, |
|
UORS, |
|
Base0, |
|
Base1, |
|
Base2, |
|
Base3, |
|
MultivectorRepresentation, |
|
CliffordAlgebra, |
|
CoherenceMetrics, |
|
exampleUsage, |
|
advancedExamples, |
|
completeWorkflowExample |
|
}; |
|
} |
|
|
|
// Export for Node.js environments |
|
if (typeof module !== 'undefined' && module.exports) { |
|
module.exports = { |
|
createUORS, |
|
UORS, |
|
Base0, |
|
Base1, |
|
Base2, |
|
Base3, |
|
MultivectorRepresentation, |
|
CliffordAlgebra, |
|
CoherenceMetrics, |
|
UniversalAddressingModel, |
|
ObjectManifold, |
|
CoherenceAwareStorage, |
|
CrossLinguisticSemanticEngine, |
|
CoherenceNeuralNetwork, |
|
InvariantPreservingTransformation, |
|
Invariant, |
|
SystemCoherenceMonitor, |
|
InvariantRegistry, |
|
SecurityValidationEngine, |
|
SecurityBoundary, |
|
AccessControlMatrix, |
|
exampleUsage, |
|
advancedExamples, |
|
completeWorkflowExample |
|
}; |
|
} |
|
|
|
|
|
/** |
|
* Coherence-Aware Storage |
|
* Validates coherence for all storage operations |
|
*/ |
|
class CoherenceAwareStorage { |
|
/** |
|
* Create a new coherence-aware storage |
|
* @param {Base0} base0 - Base0 instance |
|
*/ |
|
constructor(base0) { |
|
this.base0 = base0; |
|
this.stores = new Map(); |
|
this.coherenceValidators = new Map(); |
|
this.invariants = new Map(); |
|
this.coherenceThreshold = 0.8; |
|
|
|
// Initialize standard stores |
|
this._initializeStores(); |
|
} |
|
|
|
/** |
|
* Initialize standard stores |
|
* @private |
|
*/ |
|
_initializeStores() { |
|
// Object store |
|
this.registerStore('objects', new ObjectStore()); |
|
|
|
// Set coherence validator for objects |
|
this.registerCoherenceValidator('objects', async (key, value) => { |
|
// Basic coherence check |
|
if (!value) return 0; |
|
|
|
// Use Base0 embedding model for coherence |
|
const embedding = this.base0.embeddingModel.embed(value); |
|
return CoherenceMetrics.normalizedCoherence(embedding); |
|
}); |
|
|
|
// Register invariants for objects |
|
this.registerInvariant('objects', { |
|
name: 'hasId', |
|
validate: value => !!value && !!value.id |
|
}); |
|
|
|
// Metadata store |
|
this.registerStore('metadata', new MetadataStore()); |
|
|
|
// Addresses store |
|
this.registerStore('addresses', new AddressStore()); |
|
|
|
// Relations store |
|
this.registerStore('relations', new RelationStore()); |
|
} |
|
|
|
/** |
|
* Register a store |
|
* @param {string} id - Store ID |
|
* @param {Object} store - Store object |
|
* @returns {CoherenceAwareStorage} This storage for chaining |
|
*/ |
|
registerStore(id, store) { |
|
if (!store.get || !store.put || !store.delete) { |
|
throw new Error(`Store must implement get, put, and delete methods`); |
|
} |
|
|
|
this.stores.set(id, store); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a coherence validator |
|
* @param {string} storeId - Store ID |
|
* @param {function} validator - Validator function |
|
* @returns {CoherenceAwareStorage} This storage for chaining |
|
*/ |
|
registerCoherenceValidator(storeId, validator) { |
|
this.coherenceValidators.set(storeId, validator); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register an invariant |
|
* @param {string} storeId - Store ID |
|
* @param {Object} invariant - Invariant object |
|
* @returns {CoherenceAwareStorage} This storage for chaining |
|
*/ |
|
registerInvariant(storeId, invariant) { |
|
if (!this.invariants.has(storeId)) { |
|
this.invariants.set(storeId, []); |
|
} |
|
|
|
this.invariants.get(storeId).push(invariant); |
|
return this; |
|
} |
|
|
|
/** |
|
* Store an object with coherence validation |
|
* @param {string} storeId - Store ID |
|
* @param {string} key - Storage key |
|
* @param {*} value - Value to store |
|
* @param {Object} options - Storage options |
|
* @returns {Promise<Object>} Storage result |
|
*/ |
|
async store(storeId, key, value, options = {}) { |
|
// Get store |
|
const store = this.getStore(storeId); |
|
|
|
// Get coherence validator |
|
const validator = this.coherenceValidators.get(storeId); |
|
|
|
if (validator) { |
|
// Validate coherence |
|
const coherence = await validator(key, value); |
|
|
|
if (coherence < (options.threshold || this.coherenceThreshold)) { |
|
throw new Error( |
|
`Object failed coherence validation for store ${storeId}: ${coherence}` |
|
); |
|
} |
|
} |
|
|
|
// Validate invariants |
|
const storeInvariants = this.invariants.get(storeId) || []; |
|
for (const invariant of storeInvariants) { |
|
if (!invariant.validate(value)) { |
|
throw new Error( |
|
`Object violated invariant ${invariant.name} for store ${storeId}` |
|
); |
|
} |
|
} |
|
|
|
// Store the value |
|
return store.put(key, value, options); |
|
} |
|
|
|
/** |
|
* Retrieve an object |
|
* @param {string} storeId - Store ID |
|
* @param {string} key - Storage key |
|
* @param {Object} options - Retrieval options |
|
* @returns {Promise<*>} Retrieved value |
|
*/ |
|
async retrieve(storeId, key, options = {}) { |
|
// Get store |
|
const store = this.getStore(storeId); |
|
|
|
// Retrieve value |
|
const value = await store.get(key); |
|
|
|
// Apply transformations if needed |
|
if (options.transform) { |
|
return this._applyTransform(value, options.transform); |
|
} |
|
|
|
return value; |
|
} |
|
|
|
/** |
|
* Delete an object |
|
* @param {string} storeId - Store ID |
|
* @param {string} key - Storage key |
|
* @param {Object} options - Deletion options |
|
* @returns {Promise<boolean>} True if deleted |
|
*/ |
|
async delete(storeId, key, options = {}) { |
|
// Get store |
|
const store = this.getStore(storeId); |
|
|
|
// Delete value |
|
return store.delete(key, options); |
|
} |
|
|
|
/** |
|
* Apply a transform to a value |
|
* @private |
|
* @param {*} value - Value to transform |
|
* @param {string|function} transform - Transform name or function |
|
* @returns {*} Transformed value |
|
*/ |
|
_applyTransform(value, transform) { |
|
if (typeof transform === 'function') { |
|
return transform(value); |
|
} |
|
|
|
// Handle standard transforms |
|
switch (transform) { |
|
case 'toJSON': |
|
return JSON.stringify(value); |
|
|
|
case 'fromJSON': |
|
return typeof value === 'string' ? JSON.parse(value) : value; |
|
|
|
case 'compress': |
|
// Simple placeholder for compression |
|
return value; |
|
|
|
case 'decompress': |
|
// Simple placeholder for decompression |
|
return value; |
|
|
|
default: |
|
return value; |
|
} |
|
} |
|
|
|
/** |
|
* Get a store by ID |
|
* @param {string} storeId - Store ID |
|
* @returns {Object} Store object |
|
*/ |
|
getStore(storeId) { |
|
const store = this.stores.get(storeId); |
|
if (!store) { |
|
throw new Error(`Store not found: ${storeId}`); |
|
} |
|
|
|
return store; |
|
} |
|
} |
|
|
|
/** |
|
* Object Store |
|
* Stores arbitrary objects |
|
*/ |
|
class ObjectStore { |
|
/** |
|
* Create a new object store |
|
*/ |
|
constructor() { |
|
this.objects = new Map(); |
|
} |
|
|
|
/** |
|
* Store an object |
|
* @param {string} key - Object key |
|
* @param {*} value - Object value |
|
* @param {Object} options - Storage options |
|
* @returns {Promise<Object>} Storage result |
|
*/ |
|
async put(key, value, options = {}) { |
|
this.objects.set(key, { |
|
value, |
|
metadata: { |
|
stored: Date.now(), |
|
version: options.version || 1 |
|
} |
|
}); |
|
|
|
return { |
|
key, |
|
stored: true, |
|
timestamp: Date.now() |
|
}; |
|
} |
|
|
|
/** |
|
* Retrieve an object |
|
* @param {string} key - Object key |
|
* @returns {Promise<*>} Retrieved object |
|
*/ |
|
async get(key) { |
|
const entry = this.objects.get(key); |
|
if (!entry) return null; |
|
|
|
return entry.value; |
|
} |
|
|
|
/** |
|
* Delete an object |
|
* @param {string} key - Object key |
|
* @returns {Promise<boolean>} True if deleted |
|
*/ |
|
async delete(key) { |
|
return this.objects.delete(key); |
|
} |
|
|
|
/** |
|
* List objects matching a prefix |
|
* @param {string} prefix - Key prefix |
|
* @returns {Promise<string[]>} Matching keys |
|
*/ |
|
async list(prefix) { |
|
const keys = []; |
|
|
|
for (const key of this.objects.keys()) { |
|
if (key.startsWith(prefix)) { |
|
keys.push(key); |
|
} |
|
} |
|
|
|
return keys; |
|
} |
|
} |
|
|
|
/** |
|
* Metadata Store |
|
* Stores metadata for objects |
|
*/ |
|
class MetadataStore { |
|
/** |
|
* Create a new metadata store |
|
*/ |
|
constructor() { |
|
this.metadata = new Map(); |
|
} |
|
|
|
/** |
|
* Store metadata |
|
* @param {string} key - Metadata key |
|
* @param {Object} value - Metadata value |
|
* @returns {Promise<Object>} Storage result |
|
*/ |
|
async put(key, value) { |
|
this.metadata.set(key, { |
|
...value, |
|
updated: Date.now() |
|
}); |
|
|
|
return { |
|
key, |
|
stored: true, |
|
timestamp: Date.now() |
|
}; |
|
} |
|
|
|
/** |
|
* Retrieve metadata |
|
* @param {string} key - Metadata key |
|
* @returns {Promise<Object>} Retrieved metadata |
|
*/ |
|
async get(key) { |
|
return this.metadata.get(key) || null; |
|
} |
|
|
|
/** |
|
* Delete metadata |
|
* @param {string} key - Metadata key |
|
* @returns {Promise<boolean>} True if deleted |
|
*/ |
|
async delete(key) { |
|
return this.metadata.delete(key); |
|
} |
|
|
|
/** |
|
* List metadata matching a prefix |
|
* @param {string} prefix - Key prefix |
|
* @returns {Promise<string[]>} Matching keys |
|
*/ |
|
async list(prefix) { |
|
const keys = []; |
|
|
|
for (const key of this.metadata.keys()) { |
|
if (key.startsWith(prefix)) { |
|
keys.push(key); |
|
} |
|
} |
|
|
|
return keys; |
|
} |
|
} |
|
|
|
/** |
|
* Address Store |
|
* Stores object addresses |
|
*/ |
|
class AddressStore { |
|
/** |
|
* Create a new address store |
|
*/ |
|
constructor() { |
|
this.addresses = new Map(); |
|
this.nameIndex = new Map(); |
|
this.contentIndex = new Map(); |
|
this.semanticIndex = new Map(); |
|
this.attributeIndex = new Map(); |
|
} |
|
|
|
/** |
|
* Store an address |
|
* @param {string} key - Address key |
|
* @param {Object} address - Address object |
|
* @returns {Promise<Object>} Storage result |
|
*/ |
|
async put(key, address) { |
|
// Store main address |
|
this.addresses.set(key, address); |
|
|
|
// Update indexes |
|
if (address.name && address.name.id) { |
|
this.nameIndex.set(address.name.id, key); |
|
} |
|
|
|
if (address.content && address.content.id) { |
|
this.contentIndex.set(address.content.id, key); |
|
} |
|
|
|
if (address.semantic && address.semantic.id) { |
|
this.semanticIndex.set(address.semantic.id, key); |
|
} |
|
|
|
if (address.attribute && address.attribute.id) { |
|
this.attributeIndex.set(address.attribute.id, key); |
|
} |
|
|
|
return { |
|
key, |
|
stored: true, |
|
timestamp: Date.now() |
|
}; |
|
} |
|
|
|
/** |
|
* Retrieve an address |
|
* @param {string} key - Address key |
|
* @returns {Promise<Object>} Retrieved address |
|
*/ |
|
async get(key) { |
|
return this.addresses.get(key) || null; |
|
} |
|
|
|
/** |
|
* Find address by any component |
|
* @param {string} addressId - Component address ID |
|
* @returns {Promise<Object>} Found address |
|
*/ |
|
async find(addressId) { |
|
// Try each index |
|
let key = null; |
|
|
|
if (addressId.startsWith('name://')) { |
|
key = this.nameIndex.get(addressId); |
|
} else if (addressId.startsWith('content://')) { |
|
key = this.contentIndex.get(addressId); |
|
} else if (addressId.startsWith('semantic://')) { |
|
key = this.semanticIndex.get(addressId); |
|
} else if (addressId.startsWith('attr://')) { |
|
key = this.attributeIndex.get(addressId); |
|
} else { |
|
// Try direct lookup |
|
key = addressId; |
|
} |
|
|
|
if (!key) return null; |
|
|
|
return this.addresses.get(key); |
|
} |
|
|
|
/** |
|
* Delete an address |
|
* @param {string} key - Address key |
|
* @returns {Promise<boolean>} True if deleted |
|
*/ |
|
async delete(key) { |
|
const address = this.addresses.get(key); |
|
if (!address) return false; |
|
|
|
// Remove from indexes |
|
if (address.name && address.name.id) { |
|
this.nameIndex.delete(address.name.id); |
|
} |
|
|
|
if (address.content && address.content.id) { |
|
this.contentIndex.delete(address.content.id); |
|
} |
|
|
|
if (address.semantic && address.semantic.id) { |
|
this.semanticIndex.delete(address.semantic.id); |
|
} |
|
|
|
if (address.attribute && address.attribute.id) { |
|
this.attributeIndex.delete(address.attribute.id); |
|
} |
|
|
|
// Remove main address |
|
return this.addresses.delete(key); |
|
} |
|
} |
|
|
|
/** |
|
* Relation Store |
|
* Stores relations between objects |
|
*/ |
|
class RelationStore { |
|
/** |
|
* Create a new relation store |
|
*/ |
|
constructor() { |
|
this.relations = new Map(); |
|
this.sourceIndex = new Map(); |
|
this.targetIndex = new Map(); |
|
this.typeIndex = new Map(); |
|
} |
|
|
|
/** |
|
* Store a relation |
|
* @param {string} key - Relation key |
|
* @param {Object} relation - Relation object |
|
* @returns {Promise<Object>} Storage result |
|
*/ |
|
async put(key, relation) { |
|
// Store main relation |
|
this.relations.set(key, relation); |
|
|
|
// Update source index |
|
if (!this.sourceIndex.has(relation.sourceId)) { |
|
this.sourceIndex.set(relation.sourceId, new Set()); |
|
} |
|
this.sourceIndex.get(relation.sourceId).add(key); |
|
|
|
// Update target index |
|
if (!this.targetIndex.has(relation.targetId)) { |
|
this.targetIndex.set(relation.targetId, new Set()); |
|
} |
|
this.targetIndex.get(relation.targetId).add(key); |
|
|
|
// Update type index |
|
if (!this.typeIndex.has(relation.type)) { |
|
this.typeIndex.set(relation.type, new Set()); |
|
} |
|
this.typeIndex.get(relation.type).add(key); |
|
|
|
return { |
|
key, |
|
stored: true, |
|
timestamp: Date.now() |
|
}; |
|
} |
|
|
|
/** |
|
* Retrieve a relation |
|
* @param {string} key - Relation key |
|
* @returns {Promise<Object>} Retrieved relation |
|
*/ |
|
async get(key) { |
|
return this.relations.get(key) || null; |
|
} |
|
|
|
/** |
|
* Find relations by source, target, or type |
|
* @param {Object} query - Query object |
|
* @returns {Promise<Object[]>} Found relations |
|
*/ |
|
async find(query) { |
|
const candidates = new Set(); |
|
let initialized = false; |
|
|
|
// Apply source filter |
|
if (query.sourceId) { |
|
const sourceRelations = this.sourceIndex.get(query.sourceId); |
|
if (!sourceRelations) return []; |
|
|
|
if (!initialized) { |
|
for (const key of sourceRelations) { |
|
candidates.add(key); |
|
} |
|
initialized = true; |
|
} else { |
|
// Intersect with current candidates |
|
for (const key of candidates) { |
|
if (!sourceRelations.has(key)) { |
|
candidates.delete(key); |
|
} |
|
} |
|
} |
|
} |
|
|
|
// Apply target filter |
|
if (query.targetId) { |
|
const targetRelations = this.targetIndex.get(query.targetId); |
|
if (!targetRelations) return []; |
|
|
|
if (!initialized) { |
|
for (const key of targetRelations) { |
|
candidates.add(key); |
|
} |
|
initialized = true; |
|
} else { |
|
// Intersect with current candidates |
|
for (const key of candidates) { |
|
if (!targetRelations.has(key)) { |
|
candidates.delete(key); |
|
} |
|
} |
|
} |
|
} |
|
|
|
// Apply type filter |
|
if (query.type) { |
|
const typeRelations = this.typeIndex.get(query.type); |
|
if (!typeRelations) return []; |
|
|
|
if (!initialized) { |
|
for (const key of typeRelations) { |
|
candidates.add(key); |
|
} |
|
initialized = true; |
|
} else { |
|
// Intersect with current candidates |
|
for (const key of candidates) { |
|
if (!typeRelations.has(key)) { |
|
candidates.delete(key); |
|
} |
|
} |
|
} |
|
} |
|
|
|
// If no filters applied, return all relations |
|
if (!initialized) { |
|
return Array.from(this.relations.values()); |
|
} |
|
|
|
// Retrieve relations |
|
const results = []; |
|
for (const key of candidates) { |
|
results.push(this.relations.get(key)); |
|
} |
|
|
|
return results; |
|
} |
|
|
|
/** |
|
* Delete a relation |
|
* @param {string} key - Relation key |
|
* @returns {Promise<boolean>} True if deleted |
|
*/ |
|
async delete(key) { |
|
const relation = this.relations.get(key); |
|
if (!relation) return false; |
|
|
|
// Remove from indexes |
|
if (this.sourceIndex.has(relation.sourceId)) { |
|
this.sourceIndex.get(relation.sourceId).delete(key); |
|
} |
|
|
|
if (this.targetIndex.has(relation.targetId)) { |
|
this.targetIndex.get(relation.targetId).delete(key); |
|
} |
|
|
|
if (this.typeIndex.has(relation.type)) { |
|
this.typeIndex.get(relation.type).delete(key); |
|
} |
|
|
|
// Remove main relation |
|
return this.relations.delete(key); |
|
} |
|
} |
|
|
|
/** |
|
* Cross-Linguistic Semantic Engine |
|
* Handles concepts across languages |
|
*/ |
|
class CrossLinguisticSemanticEngine { |
|
/** |
|
* Create a new cross-linguistic semantic engine |
|
* @param {Base0} base0 - Base0 instance |
|
*/ |
|
constructor(base0) { |
|
this.base0 = base0; |
|
this.languages = new Set(['en']); // Default to English |
|
this.conceptMappings = new Map(); |
|
this.semanticCache = new Map(); |
|
} |
|
|
|
/** |
|
* Add supported language |
|
* @param {string} languageCode - ISO language code |
|
* @returns {CrossLinguisticSemanticEngine} This engine for chaining |
|
*/ |
|
addLanguage(languageCode) { |
|
this.languages.add(languageCode); |
|
return this; |
|
} |
|
|
|
/** |
|
* Create semantic address for a concept |
|
* @param {string} concept - Concept text |
|
* @param {string} language - Language code |
|
* @param {string} context - Optional context |
|
* @returns {Promise<Object>} Semantic address |
|
*/ |
|
async createSemanticAddress(concept, language = 'en', context = null) { |
|
// Check if language is supported |
|
if (!this.languages.has(language)) { |
|
throw new Error(`Language not supported: ${language}`); |
|
} |
|
|
|
// Create cache key |
|
const cacheKey = `${concept}|${language}|${context || ''}`; |
|
|
|
// Check cache |
|
if (this.semanticCache.has(cacheKey)) { |
|
return this.semanticCache.get(cacheKey); |
|
} |
|
|
|
// Create embedding using Clifford algebra |
|
const embedding = this.base0.embeddingModel.embed({ |
|
text: concept, |
|
language, |
|
context |
|
}); |
|
|
|
// Create semantic identity from embedding |
|
const semanticId = this._createSemanticId(embedding); |
|
|
|
// Calculate coherence |
|
const coherence = CoherenceMetrics.normalizedCoherence(embedding); |
|
|
|
// Create address object |
|
const address = { |
|
id: semanticId, |
|
concept, |
|
language, |
|
context: context || null, |
|
embedding: this._encodeEmbedding(embedding), |
|
coherence, |
|
created: Date.now() |
|
}; |
|
|
|
// Cache the address |
|
this.semanticCache.set(cacheKey, address); |
|
|
|
return address; |
|
} |
|
|
|
/** |
|
* Register concept mapping across languages |
|
* @param {Object} mapping - Concept mapping |
|
* @returns {Promise<Object>} Registration result |
|
*/ |
|
async registerConceptMapping(mapping) { |
|
if (!mapping.concepts || typeof mapping.concepts !== 'object') { |
|
throw new Error('Mapping must include concepts object'); |
|
} |
|
|
|
const languages = Object.keys(mapping.concepts); |
|
if (languages.length < 2) { |
|
throw new Error('Mapping must include at least two languages'); |
|
} |
|
|
|
// Check that all languages are supported |
|
for (const lang of languages) { |
|
if (!this.languages.has(lang)) { |
|
throw new Error(`Language not supported: ${lang}`); |
|
} |
|
} |
|
|
|
// Create mapping ID |
|
const mappingId = mapping.id || `mapping-${Date.now()}-${Math.floor(Math.random() * 10000)}`; |
|
|
|
// Store mapping |
|
this.conceptMappings.set(mappingId, { |
|
id: mappingId, |
|
concepts: mapping.concepts, |
|
languages, |
|
domain: mapping.domain || 'general', |
|
created: Date.now() |
|
}); |
|
|
|
// Create semantic addresses for each concept |
|
const addresses = {}; |
|
|
|
for (const [lang, concept] of Object.entries(mapping.concepts)) { |
|
addresses[lang] = await this.createSemanticAddress( |
|
concept, |
|
lang, |
|
mapping.domain |
|
); |
|
} |
|
|
|
return { |
|
id: mappingId, |
|
addresses |
|
}; |
|
} |
|
|
|
/** |
|
* Find equivalent concept in another language |
|
* @param {string} concept - Source concept |
|
* @param {string} sourceLanguage - Source language |
|
* @param {string} targetLanguage - Target language |
|
* @param {Object} options - Search options |
|
* @returns {Promise<Object>} Equivalent concept |
|
*/ |
|
async findEquivalentConcept(concept, sourceLanguage, targetLanguage, options = {}) { |
|
// Check if both languages are supported |
|
if (!this.languages.has(sourceLanguage)) { |
|
throw new Error(`Source language not supported: ${sourceLanguage}`); |
|
} |
|
|
|
if (!this.languages.has(targetLanguage)) { |
|
throw new Error(`Target language not supported: ${targetLanguage}`); |
|
} |
|
|
|
// Create semantic address for source concept |
|
const sourceAddress = await this.createSemanticAddress( |
|
concept, |
|
sourceLanguage, |
|
options.context |
|
); |
|
|
|
// First try direct mappings |
|
const directMapping = await this._findDirectMapping( |
|
concept, |
|
sourceLanguage, |
|
targetLanguage |
|
); |
|
|
|
if (directMapping) { |
|
const targetAddress = await this.createSemanticAddress( |
|
directMapping, |
|
targetLanguage, |
|
options.context |
|
); |
|
|
|
return { |
|
concept: directMapping, |
|
language: targetLanguage, |
|
similarity: 1.0, // Direct mapping has perfect similarity |
|
address: targetAddress, |
|
method: 'direct' |
|
}; |
|
} |
|
|
|
// Get threshold |
|
const threshold = options.threshold || 0.85; |
|
|
|
// Get all concept mappings |
|
const candidates = []; |
|
|
|
for (const mapping of this.conceptMappings.values()) { |
|
// Skip mappings that don't include both languages |
|
if (!mapping.concepts[sourceLanguage] || !mapping.concepts[targetLanguage]) { |
|
continue; |
|
} |
|
|
|
// Calculate similarity to source concept |
|
const similarity = this._calculateConceptSimilarity( |
|
concept, |
|
mapping.concepts[sourceLanguage] |
|
); |
|
|
|
if (similarity >= threshold) { |
|
const targetConcept = mapping.concepts[targetLanguage]; |
|
const targetAddress = await this.createSemanticAddress( |
|
targetConcept, |
|
targetLanguage, |
|
options.context |
|
); |
|
|
|
candidates.push({ |
|
concept: targetConcept, |
|
language: targetLanguage, |
|
similarity, |
|
address: targetAddress, |
|
method: 'mapping' |
|
}); |
|
} |
|
} |
|
|
|
// If no candidates found, try semantic matching |
|
if (candidates.length === 0 && options.useEmbedding !== false) { |
|
// This would typically use an embedding model to find semantically similar concepts |
|
// For the reference implementation, we'll just return a placeholder |
|
|
|
return null; |
|
} |
|
|
|
// Sort by similarity (descending) |
|
candidates.sort((a, b) => b.similarity - a.similarity); |
|
|
|
// Return best match |
|
return candidates[0] || null; |
|
} |
|
|
|
/** |
|
* Create semantic ID from embedding |
|
* @private |
|
* @param {MultivectorRepresentation} embedding - Semantic embedding |
|
* @returns {string} Semantic ID |
|
*/ |
|
_createSemanticId(embedding) { |
|
// Get key components of the embedding |
|
const keyComponents = this._extractKeyComponents(embedding); |
|
|
|
// Create hash from key components |
|
const bytes = new Uint8Array(keyComponents.length * 4); |
|
const view = new DataView(bytes.buffer); |
|
|
|
for (let i = 0; i < keyComponents.length; i++) { |
|
view.setFloat32(i * 4, keyComponents[i], true); |
|
} |
|
|
|
// Simple hash for reference implementation |
|
let hash = 0; |
|
for (let i = 0; i < bytes.length; i++) { |
|
hash = ((hash << 5) - hash) + bytes[i]; |
|
hash |= 0; |
|
} |
|
|
|
// Create a 16-character hexadecimal hash |
|
return Math.abs(hash).toString(16).padStart(8, '0') + |
|
Date.now().toString(16).substr(-8); |
|
} |
|
|
|
/** |
|
* Extract key components from embedding |
|
* @private |
|
* @param {MultivectorRepresentation} embedding - Semantic embedding |
|
* @returns {number[]} Key components |
|
*/ |
|
_extractKeyComponents(embedding) { |
|
// For the reference implementation, use the most significant components |
|
const components = Array.from(embedding.components); |
|
|
|
// Sort components by absolute magnitude |
|
const indices = components.map((val, idx) => [idx, Math.abs(val)]); |
|
indices.sort((a, b) => b[1] - a[1]); |
|
|
|
// Take top components |
|
return indices.slice(0, 16).map(([idx, _]) => components[idx]); |
|
} |
|
|
|
/** |
|
* Encode embedding for storage |
|
* @private |
|
* @param {MultivectorRepresentation} embedding - Semantic embedding |
|
* @returns {string} Encoded embedding |
|
*/ |
|
_encodeEmbedding(embedding) { |
|
// Simple base64 encoding for the reference implementation |
|
const jsonStr = JSON.stringify(Array.from(embedding.components)); |
|
return `base64:${btoa(jsonStr)}`; |
|
} |
|
|
|
/** |
|
* Find direct mapping between concepts |
|
* @private |
|
* @param {string} concept - Source concept |
|
* @param {string} sourceLanguage - Source language |
|
* @param {string} targetLanguage - Target language |
|
* @returns {Promise<string>} Target concept or null |
|
*/ |
|
async _findDirectMapping(concept, sourceLanguage, targetLanguage) { |
|
// Look for exact match in mappings |
|
for (const mapping of this.conceptMappings.values()) { |
|
// Skip mappings that don't include both languages |
|
if (!mapping.concepts[sourceLanguage] || !mapping.concepts[targetLanguage]) { |
|
continue; |
|
} |
|
|
|
// Check for exact match |
|
if (mapping.concepts[sourceLanguage] === concept) { |
|
return mapping.concepts[targetLanguage]; |
|
} |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/** |
|
* Calculate similarity between concepts |
|
* @private |
|
* @param {string} concept1 - First concept |
|
* @param {string} concept2 - Second concept |
|
* @returns {number} Similarity (0-1) |
|
*/ |
|
_calculateConceptSimilarity(concept1, concept2) { |
|
// Simple string similarity for reference implementation |
|
// In a real implementation, this would use semantic embeddings |
|
|
|
if (concept1 === concept2) return 1.0; |
|
|
|
// Normalize concepts |
|
const norm1 = concept1.toLowerCase().trim(); |
|
const norm2 = concept2.toLowerCase().trim(); |
|
|
|
if (norm1 === norm2) return 1.0; |
|
|
|
// Check for substring |
|
if (norm1.includes(norm2) || norm2.includes(norm1)) { |
|
const ratio = Math.min(norm1.length, norm2.length) / Math.max(norm1.length, norm2.length); |
|
return 0.8 * ratio; |
|
} |
|
|
|
// Calculate Levenshtein distance |
|
const distance = this._levenshteinDistance(norm1, norm2); |
|
const maxLength = Math.max(norm1.length, norm2.length); |
|
|
|
// Convert to similarity (0-1) |
|
return 1.0 - (distance / maxLength); |
|
} |
|
|
|
/** |
|
* Calculate Levenshtein distance between strings |
|
* @private |
|
* @param {string} s1 - First string |
|
* @param {string} s2 - Second string |
|
* @returns {number} Levenshtein distance |
|
*/ |
|
_levenshteinDistance(s1, s2) { |
|
const m = s1.length; |
|
const n = s2.length; |
|
|
|
// Create distance matrix |
|
const d = Array(m + 1).fill().map(() => Array(n + 1).fill(0)); |
|
|
|
// Initialize first row and column |
|
for (let i = 0; i <= m; i++) { |
|
d[i][0] = i; |
|
} |
|
|
|
for (let j = 0; j <= n; j++) { |
|
d[0][j] = j; |
|
} |
|
|
|
// Fill the matrix |
|
for (let j = 1; j <= n; j++) { |
|
for (let i = 1; i <= m; i++) { |
|
const cost = s1[i - 1] === s2[j - 1] ? 0 : 1; |
|
d[i][j] = Math.min( |
|
d[i - 1][j] + 1, // deletion |
|
d[i][j - 1] + 1, // insertion |
|
d[i - 1][j - 1] + cost // substitution |
|
); |
|
} |
|
} |
|
|
|
return d[m][n]; |
|
} |
|
} |
|
|
|
/** |
|
* Universal Object Reference System (UORS) |
|
* Main class combining all components |
|
*/ |
|
class UORS { |
|
/** |
|
* Create a new UORS instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
// Create Base0 (Neural Network Specification) |
|
this.base0 = new Base0(config.base0 || {}); |
|
|
|
// Create UniversalAddressingModel |
|
this.addressingModel = new UniversalAddressingModel(this.base0); |
|
|
|
// Create ObjectManifold |
|
this.objectManifold = new ObjectManifold(this.base0); |
|
|
|
// Create CoherenceAwareStorage |
|
this.storage = new CoherenceAwareStorage(this.base0); |
|
|
|
// Create CrossLinguisticSemanticEngine |
|
this.semanticEngine = new CrossLinguisticSemanticEngine(this.base0); |
|
|
|
// Configure system |
|
this._configure(config); |
|
} |
|
|
|
/** |
|
* Configure the system |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_configure(config) { |
|
// Add supported languages |
|
if (config.languages) { |
|
for (const language of config.languages) { |
|
this.semanticEngine.addLanguage(language); |
|
} |
|
} |
|
|
|
// Set coherence threshold |
|
if (config.coherenceThreshold) { |
|
this.storage.coherenceThreshold = config.coherenceThreshold; |
|
} |
|
} |
|
|
|
/** |
|
* Create a universal address for an object |
|
* @param {*} object - Object to address |
|
* @param {Object} options - Addressing options |
|
* @returns {Promise<Object>} Universal address |
|
*/ |
|
async createAddress(object, options = {}) { |
|
return this.addressingModel.createAddress(object, options); |
|
} |
|
|
|
/** |
|
* Store an object |
|
* @param {*} object - Object to store |
|
* @param {Object} options - Storage options |
|
* @returns {Promise<Object>} Storage result |
|
*/ |
|
async store(object, options = {}) { |
|
// Create address |
|
const address = await this.createAddress(object, options); |
|
|
|
// Store in storage |
|
await this.storage.store('objects', address.universal.id, object); |
|
|
|
// Store address |
|
await this.storage.store('addresses', address.universal.id, address); |
|
|
|
// Add to manifold |
|
await this.objectManifold.addObject(object, address); |
|
|
|
return { |
|
id: address.universal.id, |
|
address, |
|
stored: true, |
|
timestamp: Date.now() |
|
}; |
|
} |
|
|
|
/** |
|
* Retrieve an object |
|
* @param {string} id - Object ID or address |
|
* @param {Object} options - Retrieval options |
|
* @returns {Promise<Object>} Retrieved object |
|
*/ |
|
async retrieve(id, options = {}) { |
|
// Find the universal ID if not provided |
|
let universalId = id; |
|
|
|
if (!id.startsWith('usaf://')) { |
|
// Try to find address |
|
const addressStore = this.storage.getStore('addresses'); |
|
const address = await addressStore.find(id); |
|
|
|
if (!address) { |
|
throw new Error(`Object not found: ${id}`); |
|
} |
|
|
|
universalId = address.universal.id; |
|
} |
|
|
|
// Retrieve object |
|
const object = await this.storage.retrieve('objects', universalId); |
|
|
|
if (!object) { |
|
throw new Error(`Object not found: ${universalId}`); |
|
} |
|
|
|
// Retrieve address |
|
const address = await this.storage.retrieve('addresses', universalId); |
|
|
|
return { |
|
id: universalId, |
|
object, |
|
address |
|
}; |
|
} |
|
|
|
/** |
|
* Create a relation between objects |
|
* @param {string} sourceId - Source object ID |
|
* @param {string} targetId - Target object ID |
|
* @param {string} relationType - Relation type |
|
* @param {Object} properties - Relation properties |
|
* @returns {Promise<Object>} Created relation |
|
*/ |
|
async createRelation(sourceId, targetId, relationType, properties = {}) { |
|
// Create relation in manifold |
|
const relation = await this.objectManifold.createRelation( |
|
sourceId, |
|
targetId, |
|
relationType, |
|
properties |
|
); |
|
|
|
// Store relation |
|
await this.storage.store('relations', relation.id, relation); |
|
|
|
return relation; |
|
} |
|
|
|
/** |
|
* Find objects by query |
|
* @param {Object} query - Query parameters |
|
* @returns {Promise<Object[]>} Found objects |
|
*/ |
|
async findObjects(query) { |
|
return this.objectManifold.findObjects(query); |
|
} |
|
|
|
/** |
|
* Find similar objects |
|
* @param {string} id - Object ID |
|
* @param {Object} options - Search options |
|
* @returns {Promise<Object[]>} Similar objects |
|
*/ |
|
async findSimilarObjects(id, options = {}) { |
|
return this.objectManifold.findSimilarObjects(id, options); |
|
} |
|
|
|
/** |
|
* Find equivalent concept in another language |
|
* @param {string} concept - Source concept |
|
* @param {string} sourceLanguage - Source language |
|
* @param {string} targetLanguage - Target language |
|
* @param {Object} options - Search options |
|
* @returns {Promise<Object>} Equivalent concept |
|
*/ |
|
async findEquivalentConcept(concept, sourceLanguage, targetLanguage, options = {}) { |
|
return this.semanticEngine.findEquivalentConcept( |
|
concept, |
|
sourceLanguage, |
|
targetLanguage, |
|
options |
|
); |
|
} |
|
|
|
/** |
|
* Register concept mapping |
|
* @param {Object} mapping - Concept mapping |
|
* @returns {Promise<Object>} Registration result |
|
*/ |
|
async registerConceptMapping(mapping) { |
|
return this.semanticEngine.registerConceptMapping(mapping); |
|
} |
|
} |
|
|
|
// ============================================================================= |
|
// 4. UORS Factory Function |
|
// ============================================================================= |
|
|
|
/** |
|
* Create a new UORS instance |
|
* @param {Object} config - Configuration options |
|
* @returns {UORS} UORS instance |
|
*/ |
|
function createUORS(config = {}) { |
|
return new UORS(config); |
|
} |
|
|
|
// Export the factory function for Node.js environments |
|
if (typeof module !== 'undefined' && module.exports) { |
|
module.exports = { |
|
createUORS, |
|
UORS, |
|
Base0, |
|
Base1, |
|
Base2, |
|
Base3, |
|
UniversalAddressingModel, |
|
ObjectManifold, |
|
CoherenceAwareStorage, |
|
CrossLinguisticSemanticEngine, |
|
CliffordAlgebra, |
|
MultivectorRepresentation, |
|
CoherenceMetrics |
|
}; |
|
} |
|
|
|
// ============================================================================= |
|
// 5. Example Usage |
|
// ============================================================================= |
|
|
|
/** |
|
* Example usage of the UORS system |
|
*/ |
|
async function exampleUsage() { |
|
// Create UORS instance |
|
const uors = createUORS({ |
|
languages: ['en', 'es', 'fr', 'de', 'zh'], |
|
coherenceThreshold: 0.75 |
|
}); |
|
|
|
// Create an address for an object |
|
const address = await uors.createAddress("Database server configuration", { |
|
language: "en", |
|
namespace: "system.config", |
|
name: "database-config", |
|
version: "1.0.0", |
|
context: "computing" |
|
}); |
|
|
|
console.log("Created address:", address); |
|
|
|
// Store an object |
|
const storedObject = await uors.store({ |
|
name: "database-config", |
|
host: "localhost", |
|
port: 5432, |
|
username: "admin", |
|
password: "********", |
|
database: "app_data", |
|
maxConnections: 100 |
|
}, { |
|
namespace: "system.config", |
|
language: "en", |
|
context: "computing" |
|
}); |
|
|
|
console.log("Stored object:", storedObject); |
|
|
|
// Retrieve the object |
|
const retrievedObject = await uors.retrieve(storedObject.id); |
|
|
|
console.log("Retrieved object:", retrievedObject); |
|
|
|
// Create another object |
|
const secondObject = await uors.store({ |
|
name: "application-config", |
|
environment: "production", |
|
features: { |
|
logging: true, |
|
metrics: true, |
|
caching: true |
|
}, |
|
scaling: { |
|
minInstances: 2, |
|
maxInstances: 10 |
|
} |
|
}, { |
|
namespace: "system.config", |
|
language: "en", |
|
context: "computing" |
|
}); |
|
|
|
console.log("Second object:", secondObject); |
|
|
|
// Create a relation between objects |
|
const relation = await uors.createRelation( |
|
storedObject.id, |
|
secondObject.id, |
|
"references", |
|
{ |
|
description: "Database used by application", |
|
priority: "high" |
|
} |
|
); |
|
|
|
console.log("Created relation:", relation); |
|
|
|
// Register concept mapping |
|
const mapping = await uors.registerConceptMapping({ |
|
domain: "computing", |
|
concepts: { |
|
"en": "database server", |
|
"es": "servidor de base de datos", |
|
"fr": "serveur de base de données", |
|
"de": "Datenbankserver", |
|
"zh": "数据库服务器" |
|
} |
|
}); |
|
|
|
console.log("Registered concept mapping:", mapping); |
|
|
|
// Find equivalent concept |
|
const equivalent = await uors.findEquivalentConcept( |
|
"database server", |
|
"en", |
|
"es" |
|
); |
|
|
|
console.log("Equivalent concept:", equivalent); |
|
|
|
// Find similar objects |
|
const similarObjects = await uors.findSimilarObjects(storedObject.id, { |
|
threshold: 0.7, |
|
limit: 5 |
|
}); |
|
|
|
console.log("Similar objects:", similarObjects); |
|
|
|
return { |
|
address, |
|
storedObject, |
|
retrievedObject, |
|
secondObject, |
|
relation, |
|
mapping, |
|
equivalent, |
|
similarObjects |
|
}; |
|
} |
|
|
|
// ============================================================================= |
|
// 3. Universal Object Reference System Integration |
|
// ============================================================================= |
|
|
|
/** |
|
* Universal Addressing Model |
|
* Integrates the four addressing types (name, content, semantic, attribute) |
|
*/ |
|
class UniversalAddressingModel { |
|
/** |
|
* Create a new universal addressing model |
|
* @param {Base0} base0 - Base0 instance |
|
*/ |
|
constructor(base0) { |
|
this.base0 = base0; |
|
this.hashAlgorithm = 'SHA-256'; |
|
this.addressPrefixes = { |
|
name: 'name://', |
|
content: 'content://', |
|
semantic: 'semantic://', |
|
attribute: 'attr://' |
|
}; |
|
this.cache = new Map(); |
|
} |
|
|
|
/** |
|
* Create a universal address for an object |
|
* @param {*} object - Object to address |
|
* @param {Object} options - Addressing options |
|
* @returns {Promise<Object>} Universal address |
|
*/ |
|
async createAddress(object, options = {}) { |
|
// Create addresses of all supported types |
|
const [nameAddress, contentAddress, semanticAddress, attributeAddress] = await Promise.all([ |
|
this._createNameAddress(object, options), |
|
this._createContentAddress(object, options), |
|
this._createSemanticAddress(object, options), |
|
this._createAttributeAddress(object, options) |
|
]); |
|
|
|
// Combine into universal address object |
|
const address = { |
|
universal: { |
|
id: this._createUniversalId(nameAddress, contentAddress, semanticAddress), |
|
created: Date.now() |
|
}, |
|
name: nameAddress, |
|
content: contentAddress, |
|
semantic: semanticAddress, |
|
attribute: attributeAddress, |
|
coherence: this._calculateAddressCoherence( |
|
nameAddress, contentAddress, semanticAddress, attributeAddress |
|
) |
|
}; |
|
|
|
// Cache the address |
|
if (options.cache !== false) { |
|
const cacheKey = this._getCacheKey(object); |
|
this.cache.set(cacheKey, address); |
|
} |
|
|
|
return address; |
|
} |
|
|
|
/** |
|
* Create name-based address (FQDN-style) |
|
* @private |
|
* @param {*} object - Object to address |
|
* @param {Object} options - Addressing options |
|
* @returns {Promise<Object>} Name address |
|
*/ |
|
async _createNameAddress(object, options) { |
|
let name; |
|
|
|
if (options.name) { |
|
name = options.name; |
|
} else if (object.name) { |
|
name = object.name; |
|
} else if (object.id) { |
|
name = object.id; |
|
} else { |
|
name = `obj-${Date.now()}-${Math.floor(Math.random() * 10000)}`; |
|
} |
|
|
|
// Sanitize name (only allow alphanumeric, dots, hyphens, and underscores) |
|
name = name.replace(/[^a-zA-Z0-9._-]/g, '-'); |
|
|
|
// Add namespace if provided |
|
const namespace = options.namespace || 'default'; |
|
|
|
// Create FQDN-style address |
|
const address = `${namespace}.${name}`; |
|
|
|
return { |
|
type: 'name', |
|
id: `${this.addressPrefixes.name}${address}`, |
|
name, |
|
namespace, |
|
version: options.version || '1.0.0' |
|
}; |
|
} |
|
|
|
/** |
|
* Create content-based address (hash-based) |
|
* @private |
|
* @param {*} object - Object to address |
|
* @param {Object} options - Addressing options |
|
* @returns {Promise<Object>} Content address |
|
*/ |
|
async _createContentAddress(object, options) { |
|
// Serialize object to bytes |
|
const bytes = this._serializeObject(object); |
|
|
|
// Hash the content |
|
const hash = await this._hashBytes(bytes); |
|
|
|
return { |
|
type: 'content', |
|
id: `${this.addressPrefixes.content}${this.hashAlgorithm.toLowerCase()}:${hash}`, |
|
algorithm: this.hashAlgorithm, |
|
size: bytes.length |
|
}; |
|
} |
|
|
|
/** |
|
* Create semantic address using Clifford algebra embedding |
|
* @private |
|
* @param {*} object - Object to address |
|
* @param {Object} options - Addressing options |
|
* @returns {Promise<Object>} Semantic address |
|
*/ |
|
async _createSemanticAddress(object, options) { |
|
// Extract description text |
|
const text = this._extractDescription(object, options); |
|
|
|
// Determine language |
|
const language = options.language || 'en'; |
|
|
|
// Create semantic embedding |
|
const embedding = this.base0.embeddingModel.embed({ |
|
text, |
|
language, |
|
context: options.context |
|
}); |
|
|
|
// Create semantic ID from embedding |
|
const semanticId = this._createSemanticId(embedding); |
|
|
|
return { |
|
type: 'semantic', |
|
id: `${this.addressPrefixes.semantic}${semanticId}`, |
|
language, |
|
embedding: this._encodeEmbedding(embedding), |
|
coherence: CoherenceMetrics.normalizedCoherence(embedding) |
|
}; |
|
} |
|
|
|
/** |
|
* Create attribute-based address |
|
* @private |
|
* @param {*} object - Object to address |
|
* @param {Object} options - Addressing options |
|
* @returns {Promise<Object>} Attribute address |
|
*/ |
|
async _createAttributeAddress(object, options) { |
|
// Extract key attributes |
|
const attributes = this._extractAttributes(object, options); |
|
|
|
// Create attribute signature |
|
const signature = this._createAttributeSignature(attributes); |
|
|
|
return { |
|
type: 'attribute', |
|
id: `${this.addressPrefixes.attribute}${signature}`, |
|
attributes, |
|
query: this._createAttributeQuery(attributes) |
|
}; |
|
} |
|
|
|
/** |
|
* Create universal ID from component addresses |
|
* @private |
|
* @param {Object} nameAddress - Name address |
|
* @param {Object} contentAddress - Content address |
|
* @param {Object} semanticAddress - Semantic address |
|
* @returns {string} Universal ID |
|
*/ |
|
_createUniversalId(nameAddress, contentAddress, semanticAddress) { |
|
// Use semantic ID as the universal ID |
|
// This ensures semantically equivalent objects get the same ID |
|
if (semanticAddress && semanticAddress.id) { |
|
return semanticAddress.id.replace(this.addressPrefixes.semantic, 'usaf://'); |
|
} |
|
|
|
// Fallback to content ID |
|
if (contentAddress && contentAddress.id) { |
|
const hash = contentAddress.id.replace(this.addressPrefixes.content, ''); |
|
return `usaf://content:${hash}`; |
|
} |
|
|
|
// Fallback to name ID |
|
if (nameAddress && nameAddress.id) { |
|
const name = nameAddress.id.replace(this.addressPrefixes.name, ''); |
|
return `usaf://name:${name}`; |
|
} |
|
|
|
// Last resort - generate a random ID |
|
return `usaf://gen:${Date.now()}-${Math.floor(Math.random() * 10000000)}`; |
|
} |
|
|
|
/** |
|
* Calculate coherence of an address |
|
* @private |
|
* @param {Object} nameAddress - Name address |
|
* @param {Object} contentAddress - Content address |
|
* @param {Object} semanticAddress - Semantic address |
|
* @param {Object} attributeAddress - Attribute address |
|
* @returns {number} Address coherence |
|
*/ |
|
_calculateAddressCoherence(nameAddress, contentAddress, semanticAddress, attributeAddress) { |
|
// Each address contributes to overall coherence |
|
let totalScore = 0; |
|
let count = 0; |
|
|
|
// Name address coherence |
|
if (nameAddress) { |
|
totalScore += 1.0; |
|
count++; |
|
} |
|
|
|
// Content address coherence |
|
if (contentAddress) { |
|
totalScore += 1.0; |
|
count++; |
|
} |
|
|
|
// Semantic address coherence (weighted higher) |
|
if (semanticAddress) { |
|
const semanticCoherence = semanticAddress.coherence || 0.8; |
|
totalScore += semanticCoherence * 2; |
|
count += 2; // Higher weight |
|
} |
|
|
|
// Attribute address coherence |
|
if (attributeAddress) { |
|
totalScore += 1.0; |
|
count++; |
|
} |
|
|
|
return count > 0 ? totalScore / count : 0.5; |
|
} |
|
|
|
/** |
|
* Serialize an object to bytes |
|
* @private |
|
* @param {*} object - Object to serialize |
|
* @returns {Uint8Array} Serialized bytes |
|
*/ |
|
_serializeObject(object) { |
|
let serialized; |
|
|
|
try { |
|
// Try to JSON stringify the object |
|
serialized = JSON.stringify(object); |
|
} catch (error) { |
|
// Fallback for non-JSON serializable objects |
|
serialized = String(object); |
|
} |
|
|
|
// Convert string to bytes |
|
return new TextEncoder().encode(serialized); |
|
} |
|
|
|
/** |
|
* Hash bytes using the configured algorithm |
|
* @private |
|
* @param {Uint8Array} bytes - Bytes to hash |
|
* @returns {Promise<string>} Hex hash |
|
*/ |
|
async _hashBytes(bytes) { |
|
// Simple hash implementation for reference |
|
// In a real implementation, use crypto APIs |
|
|
|
// Simplified SHA-256 for reference |
|
let hash = 0; |
|
for (let i = 0; i < bytes.length; i++) { |
|
hash = ((hash << 5) - hash) + bytes[i]; |
|
hash |= 0; // Convert to 32-bit integer |
|
} |
|
|
|
// Convert to hex |
|
const hexHash = (hash >>> 0).toString(16).padStart(8, '0'); |
|
|
|
// For a more realistic hash, append some pseudo-random bytes |
|
const randomPart = Array.from( |
|
{ length: 24 }, |
|
() => Math.floor(Math.random() * 256).toString(16).padStart(2, '0') |
|
).join(''); |
|
|
|
return hexHash + randomPart; |
|
} |
|
|
|
/** |
|
* Extract description text from an object |
|
* @private |
|
* @param {*} object - Source object |
|
* @param {Object} options - Extraction options |
|
* @returns {string} Description text |
|
*/ |
|
_extractDescription(object, options) { |
|
// Use explicit description if provided |
|
if (options.description) { |
|
return options.description; |
|
} |
|
|
|
// Extract from object properties |
|
if (typeof object === 'object' && object !== null) { |
|
// Try common description properties |
|
for (const prop of ['description', 'desc', 'summary', 'text', 'content', 'name', 'title']) { |
|
if (object[prop] && typeof object[prop] === 'string') { |
|
return object[prop]; |
|
} |
|
} |
|
|
|
// Fallback to JSON representation |
|
return JSON.stringify(object); |
|
} |
|
|
|
// Fallback to string representation |
|
return String(object); |
|
} |
|
|
|
/** |
|
* Extract attributes from an object |
|
* @private |
|
* @param {*} object - Source object |
|
* @param {Object} options - Extraction options |
|
* @returns {Object} Attribute map |
|
*/ |
|
_extractAttributes(object, options) { |
|
// Use explicit attributes if provided |
|
if (options.attributes) { |
|
return options.attributes; |
|
} |
|
|
|
const attributes = {}; |
|
|
|
// Extract from object properties |
|
if (typeof object === 'object' && object !== null) { |
|
// Extract common attributes |
|
for (const prop of ['type', 'category', 'kind', 'language', 'format', 'version']) { |
|
if (object[prop] !== undefined) { |
|
attributes[prop] = object[prop]; |
|
} |
|
} |
|
|
|
// Extract domain-specific attributes if available |
|
if (object.attributes) { |
|
Object.assign(attributes, object.attributes); |
|
} |
|
} |
|
|
|
// Add namespace from options |
|
if (options.namespace) { |
|
attributes.namespace = options.namespace; |
|
} |
|
|
|
return attributes; |
|
} |
|
|
|
/** |
|
* Create a signature from attributes |
|
* @private |
|
* @param {Object} attributes - Attribute map |
|
* @returns {string} Attribute signature |
|
*/ |
|
_createAttributeSignature(attributes) { |
|
// Sort attribute keys for consistent signature |
|
const keys = Object.keys(attributes).sort(); |
|
|
|
// Create signature by joining key-value pairs |
|
const signature = keys.map(key => { |
|
const value = attributes[key]; |
|
if (typeof value === 'string') { |
|
return `${key}:${value}`; |
|
} else { |
|
return `${key}:${JSON.stringify(value)}`; |
|
} |
|
}).join(';'); |
|
|
|
// Use a simple hash for the reference implementation |
|
let hash = 0; |
|
for (let i = 0; i < signature.length; i++) { |
|
hash = ((hash << 5) - hash) + signature.charCodeAt(i); |
|
hash |= 0; |
|
} |
|
|
|
return hash.toString(36); |
|
} |
|
|
|
/** |
|
* Create an attribute query string |
|
* @private |
|
* @param {Object} attributes - Attribute map |
|
* @returns {string} Query string |
|
*/ |
|
_createAttributeQuery(attributes) { |
|
// Sort attribute keys for consistent query |
|
const keys = Object.keys(attributes).sort(); |
|
|
|
// Create query string |
|
return keys.map(key => { |
|
const value = attributes[key]; |
|
if (typeof value === 'string') { |
|
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`; |
|
} else { |
|
return `${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(value))}`; |
|
} |
|
}).join('&'); |
|
} |
|
|
|
/** |
|
* Create a semantic ID from an embedding |
|
* @private |
|
* @param {MultivectorRepresentation} embedding - Semantic embedding |
|
* @returns {string} Semantic ID |
|
*/ |
|
_createSemanticId(embedding) { |
|
// Get key components of the embedding |
|
const keyComponents = this._extractKeyComponents(embedding); |
|
|
|
// Create hash from key components |
|
const bytes = new Uint8Array(keyComponents.length * 4); |
|
const view = new DataView(bytes.buffer); |
|
|
|
for (let i = 0; i < keyComponents.length; i++) { |
|
view.setFloat32(i * 4, keyComponents[i], true); |
|
} |
|
|
|
// Simple hash for reference implementation |
|
let hash = 0; |
|
for (let i = 0; i < bytes.length; i++) { |
|
hash = ((hash << 5) - hash) + bytes[i]; |
|
hash |= 0; |
|
} |
|
|
|
// Create a 16-character hexadecimal hash |
|
return Math.abs(hash).toString(16).padStart(8, '0') + |
|
Date.now().toString(16).substr(-8); |
|
} |
|
|
|
/** |
|
* Extract key components from embedding |
|
* @private |
|
* @param {MultivectorRepresentation} embedding - Semantic embedding |
|
* @returns {number[]} Key components |
|
*/ |
|
_extractKeyComponents(embedding) { |
|
// For the reference implementation, use the most significant components |
|
const components = Array.from(embedding.components); |
|
|
|
// Sort components by absolute magnitude |
|
const indices = components.map((val, idx) => [idx, Math.abs(val)]); |
|
indices.sort((a, b) => b[1] - a[1]); |
|
|
|
// Take top components |
|
return indices.slice(0, 16).map(([idx, _]) => components[idx]); |
|
} |
|
|
|
/** |
|
* Encode embedding for storage |
|
* @private |
|
* @param {MultivectorRepresentation} embedding - Semantic embedding |
|
* @returns {string} Encoded embedding |
|
*/ |
|
_encodeEmbedding(embedding) { |
|
// Simple base64 encoding for the reference implementation |
|
const jsonStr = JSON.stringify(Array.from(embedding.components)); |
|
return `base64:${btoa(jsonStr)}`; |
|
} |
|
|
|
/** |
|
* Decode embedding from storage |
|
* @private |
|
* @param {string} encoded - Encoded embedding |
|
* @returns {MultivectorRepresentation} Decoded embedding |
|
*/ |
|
_decodeEmbedding(encoded) { |
|
if (!encoded.startsWith('base64:')) { |
|
throw new Error('Invalid encoding format'); |
|
} |
|
|
|
// Remove prefix |
|
const base64 = encoded.substring(7); |
|
|
|
// Decode base64 |
|
const jsonStr = atob(base64); |
|
|
|
// Parse JSON |
|
const components = JSON.parse(jsonStr); |
|
|
|
// Create multivector |
|
const dimension = Math.log2(components.length); |
|
const multivector = new MultivectorRepresentation(dimension); |
|
|
|
// Copy components |
|
for (let i = 0; i < components.length; i++) { |
|
multivector.components[i] = components[i]; |
|
} |
|
|
|
return multivector; |
|
} |
|
|
|
/** |
|
* Get a cache key for an object |
|
* @private |
|
* @param {*} object - Object to get key for |
|
* @returns {string} Cache key |
|
*/ |
|
_getCacheKey(object) { |
|
if (typeof object === 'string') { |
|
return `str:${object}`; |
|
} else if (typeof object === 'number') { |
|
return `num:${object}`; |
|
} else if (typeof object === 'object' && object !== null) { |
|
if (object.id) { |
|
return `obj:${object.id}`; |
|
} else { |
|
try { |
|
return `obj:${JSON.stringify(object)}`; |
|
} catch (error) { |
|
return `obj:${Date.now()}`; |
|
} |
|
} |
|
} else { |
|
return `other:${String(object)}`; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Object Manifold |
|
* Organizes objects in a manifold structure |
|
*/ |
|
class ObjectManifold { |
|
/** |
|
* Create a new object manifold |
|
* @param {Base0} base0 - Base0 instance |
|
*/ |
|
constructor(base0) { |
|
this.base0 = base0; |
|
this.objects = new Map(); |
|
this.relations = new Map(); |
|
this.metrics = new Map(); |
|
this.depthCalculator = new ManifoldDepthCalculator(); |
|
|
|
// Initialize standard metrics |
|
this._initializeMetrics(); |
|
} |
|
|
|
/** |
|
* Initialize standard metrics |
|
* @private |
|
*/ |
|
_initializeMetrics() { |
|
// Euclidean metric |
|
this.registerMetric('euclidean', (p1, p2) => { |
|
let sum = 0; |
|
for (let i = 0; i < p1.length; i++) { |
|
const diff = p1[i] - p2[i]; |
|
sum += diff * diff; |
|
} |
|
return Math.sqrt(sum); |
|
}); |
|
|
|
// Cosine similarity metric |
|
this.registerMetric('cosine', (p1, p2) => { |
|
let dotProduct = 0; |
|
let norm1 = 0; |
|
let norm2 = 0; |
|
|
|
for (let i = 0; i < p1.length; i++) { |
|
dotProduct += p1[i] * p2[i]; |
|
norm1 += p1[i] * p1[i]; |
|
norm2 += p2[i] * p2[i]; |
|
} |
|
|
|
norm1 = Math.sqrt(norm1); |
|
norm2 = Math.sqrt(norm2); |
|
|
|
if (norm1 === 0 || norm2 === 0) return 0; |
|
|
|
return dotProduct / (norm1 * norm2); |
|
}); |
|
|
|
// Manhattan metric |
|
this.registerMetric('manhattan', (p1, p2) => { |
|
let sum = 0; |
|
for (let i = 0; i < p1.length; i++) { |
|
sum += Math.abs(p1[i] - p2[i]); |
|
} |
|
return sum; |
|
}); |
|
} |
|
|
|
/** |
|
* Register a metric |
|
* @param {string} name - Metric name |
|
* @param {function} metricFn - Metric function |
|
* @returns {ObjectManifold} This manifold for chaining |
|
*/ |
|
registerMetric(name, metricFn) { |
|
this.metrics.set(name, metricFn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Add an object to the manifold |
|
* @param {*} object - Object to add |
|
* @param {Object} address - Universal address |
|
* @returns {Promise<Object>} Manifold point |
|
*/ |
|
async addObject(object, address) { |
|
// Calculate object manifold coordinates |
|
const coordinates = await this._calculateCoordinates(object, address); |
|
|
|
// Calculate manifold depth |
|
const depth = this.depthCalculator.calculate(object); |
|
|
|
// Create manifold point |
|
const point = { |
|
object, |
|
address, |
|
coordinates, |
|
depth, |
|
relations: new Set() |
|
}; |
|
|
|
// Add to manifold |
|
this.objects.set(address.universal.id, point); |
|
|
|
return point; |
|
} |
|
|
|
/** |
|
* Create a relation between objects |
|
* @param {string} sourceId - Source object ID |
|
* @param {string} targetId - Target object ID |
|
* @param {string} type - Relation type |
|
* @param {Object} properties - Relation properties |
|
* @returns {Promise<Object>} Relation object |
|
*/ |
|
async createRelation(sourceId, targetId, type, properties = {}) { |
|
// Verify objects exist |
|
if (!this.objects.has(sourceId)) { |
|
throw new Error(`Source object not found: ${sourceId}`); |
|
} |
|
|
|
if (!this.objects.has(targetId)) { |
|
throw new Error(`Target object not found: ${targetId}`); |
|
} |
|
|
|
// Get manifold points |
|
const source = this.objects.get(sourceId); |
|
const target = this.objects.get(targetId); |
|
|
|
// Verify depth constraints |
|
if (!this._verifyDepthAccess(source, target, type)) { |
|
throw new Error( |
|
`Depth violation: ${sourceId} cannot relate to ${targetId} with type ${type}` |
|
); |
|
} |
|
|
|
// Create relation ID |
|
const relationId = `${sourceId}|${type}|${targetId}`; |
|
|
|
// Create relation object |
|
const relation = { |
|
id: relationId, |
|
sourceId, |
|
targetId, |
|
type, |
|
properties, |
|
created: Date.now() |
|
}; |
|
|
|
// Add to relations |
|
this.relations.set(relationId, relation); |
|
|
|
// Update object relation sets |
|
source.relations.add(relationId); |
|
target.relations.add(relationId); |
|
|
|
return relation; |
|
} |
|
|
|
/** |
|
* Find objects by attribute query |
|
* @param {Object} query - Query parameters |
|
* @returns {Promise<Object[]>} Found objects |
|
*/ |
|
async findObjects(query) { |
|
const results = []; |
|
|
|
// Get initial search region in manifold |
|
const searchRegion = await this._calculateSearchRegion(query); |
|
|
|
// Find candidate objects in region |
|
const candidates = this._findCandidatesInRegion(searchRegion); |
|
|
|
// Filter candidates by query |
|
for (const object of candidates) { |
|
if (this._matchesQuery(object, query)) { |
|
results.push(object); |
|
} |
|
} |
|
|
|
return results; |
|
} |
|
|
|
/** |
|
* Find similar objects by universal ID |
|
* @param {string} universalId - Universal ID |
|
* @param {Object} options - Search options |
|
* @returns {Promise<Object[]>} Similar objects |
|
*/ |
|
async findSimilarObjects(universalId, options = {}) { |
|
// Get source object |
|
if (!this.objects.has(universalId)) { |
|
throw new Error(`Object not found: ${universalId}`); |
|
} |
|
|
|
const source = this.objects.get(universalId); |
|
|
|
// Get limit and threshold |
|
const limit = options.limit || 10; |
|
const threshold = options.threshold || 0.7; |
|
|
|
// Select metric |
|
const metricName = options.metric || 'cosine'; |
|
if (!this.metrics.has(metricName)) { |
|
throw new Error(`Unknown metric: ${metricName}`); |
|
} |
|
|
|
const metricFn = this.metrics.get(metricName); |
|
|
|
// Find similar objects by coordinate proximity |
|
const similarities = []; |
|
|
|
for (const [id, target] of this.objects.entries()) { |
|
if (id === universalId) continue; |
|
|
|
// Calculate similarity |
|
const similarity = metricFn(source.coordinates, target.coordinates); |
|
|
|
if (similarity >= threshold) { |
|
similarities.push({ |
|
id, |
|
similarity, |
|
object: target.object, |
|
address: target.address |
|
}); |
|
} |
|
} |
|
|
|
// Sort by similarity (descending) |
|
similarities.sort((a, b) => b.similarity - a.similarity); |
|
|
|
// Return top matches |
|
return similarities.slice(0, limit); |
|
} |
|
|
|
/** |
|
* Retrieve object by ID |
|
* @param {string} id - Object ID |
|
* @returns {Object} Object data |
|
*/ |
|
getObject(id) { |
|
const point = this.objects.get(id); |
|
if (!point) { |
|
throw new Error(`Object not found: ${id}`); |
|
} |
|
|
|
return { |
|
id, |
|
object: point.object, |
|
address: point.address, |
|
depth: point.depth, |
|
relationCount: point.relations.size |
|
}; |
|
} |
|
|
|
/** |
|
* Find relations for an object |
|
* @param {string} objectId - Object ID |
|
* @param {Object} options - Filter options |
|
* @returns {Object[]} Relations |
|
*/ |
|
findRelations(objectId, options = {}) { |
|
const point = this.objects.get(objectId); |
|
if (!point) { |
|
throw new Error(`Object not found: ${objectId}`); |
|
} |
|
|
|
const results = []; |
|
|
|
for (const relationId of point.relations) { |
|
const relation = this.relations.get(relationId); |
|
|
|
// Apply type filter |
|
if (options.type && relation.type !== options.type) { |
|
continue; |
|
} |
|
|
|
// Apply direction filter |
|
if (options.direction === 'outgoing' && relation.sourceId !== objectId) { |
|
continue; |
|
} |
|
|
|
if (options.direction === 'incoming' && relation.targetId !== objectId) { |
|
continue; |
|
} |
|
|
|
// Add related object info |
|
const relatedId = relation.sourceId === objectId ? relation.targetId : relation.sourceId; |
|
const relatedPoint = this.objects.get(relatedId); |
|
|
|
results.push({ |
|
relation, |
|
object: relatedPoint ? relatedPoint.object : null, |
|
address: relatedPoint ? relatedPoint.address : null, |
|
isSource: relation.sourceId === objectId |
|
}); |
|
} |
|
|
|
// Apply limit |
|
if (options.limit && options.limit > 0) { |
|
return results.slice(0, options.limit); |
|
} |
|
|
|
return results; |
|
} |
|
|
|
/** |
|
* Calculate coordinates for an object |
|
* @private |
|
* @param {*} object - Object to calculate coordinates for |
|
* @param {Object} address - Universal address |
|
* @returns {Promise<number[]>} Manifold coordinates |
|
*/ |
|
async _calculateCoordinates(object, address) { |
|
// Default coordinates dimension |
|
const dimension = 8; |
|
const coordinates = new Array(dimension).fill(0); |
|
|
|
// Use semantic embedding if available |
|
if (address.semantic && address.semantic.embedding) { |
|
try { |
|
// Decode embedding |
|
const embedding = this._decodeEmbedding(address.semantic.embedding); |
|
|
|
// Project to target dimension using spectral operator |
|
const projection = this.base0.spectralOperator.project(embedding); |
|
|
|
// Use projection for coordinates |
|
for (let i = 0; i < dimension; i++) { |
|
if (i < projection.length) { |
|
coordinates[i] = projection[i]; |
|
} |
|
} |
|
|
|
return coordinates; |
|
} catch (error) { |
|
console.error("Error using semantic embedding for coordinates:", error); |
|
} |
|
} |
|
|
|
// Fallback: hash-based coordinates |
|
// Use content address hash if available |
|
if (address.content && address.content.id) { |
|
const hashPart = address.content.id.split(':').pop(); |
|
|
|
// Convert first bytes of hash to coordinates |
|
for (let i = 0; i < Math.min(dimension, hashPart.length / 2); i++) { |
|
const byte = parseInt(hashPart.substr(i * 2, 2), 16); |
|
coordinates[i] = (byte / 255) * 2 - 1; // Scale to [-1, 1] |
|
} |
|
} |
|
|
|
return coordinates; |
|
} |
|
|
|
/** |
|
* Decode embedding from storage |
|
* @private |
|
* @param {string} encoded - Encoded embedding |
|
* @returns {MultivectorRepresentation} Decoded embedding |
|
*/ |
|
_decodeEmbedding(encoded) { |
|
if (!encoded.startsWith('base64:')) { |
|
throw new Error('Invalid encoding format'); |
|
} |
|
|
|
// Remove prefix |
|
const base64 = encoded.substring(7); |
|
|
|
// Decode base64 |
|
const jsonStr = atob(base64); |
|
|
|
// Parse JSON |
|
const components = JSON.parse(jsonStr); |
|
|
|
// Create multivector |
|
const dimension = Math.log2(components.length); |
|
const multivector = new MultivectorRepresentation(dimension); |
|
|
|
// Copy components |
|
for (let i = 0; i < components.length; i++) { |
|
multivector.components[i] = components[i]; |
|
} |
|
|
|
return multivector; |
|
} |
|
|
|
/** |
|
* Calculate search region |
|
* @private |
|
* @param {Object} query - Search query |
|
* @returns {Object} Search region |
|
*/ |
|
_calculateSearchRegion(query) { |
|
// Default region is entire manifold |
|
const region = { |
|
center: null, |
|
radius: Infinity, |
|
bounds: null |
|
}; |
|
|
|
// If semantic search is specified |
|
if (query.semantic) { |
|
// Use semantic vector as center |
|
// For the reference implementation, we'd need an embedding model |
|
|
|
// Set a reasonable radius for semantic search |
|
region.radius = 0.5; |
|
} |
|
|
|
// If attribute search is specified |
|
if (query.attributes) { |
|
// Currently, we don't adjust the region for attributes |
|
// In a real implementation, we'd use attribute indexes |
|
} |
|
|
|
return region; |
|
} |
|
|
|
/** |
|
* Find candidates in a region |
|
* @private |
|
* @param {Object} region - Search region |
|
* @returns {Object[]} Candidate objects |
|
*/ |
|
_findCandidatesInRegion(region) { |
|
const candidates = []; |
|
|
|
// If no center specified, return all objects |
|
if (!region.center) { |
|
return Array.from(this.objects.values()); |
|
} |
|
|
|
// Select metric |
|
const metricFn = this.metrics.get('euclidean'); |
|
|
|
// Filter objects by distance |
|
for (const point of this.objects.values()) { |
|
const distance = metricFn(region.center, point.coordinates); |
|
|
|
if (distance <= region.radius) { |
|
candidates.push(point); |
|
} |
|
} |
|
|
|
return candidates; |
|
} |
|
|
|
/** |
|
* Check if an object matches a query |
|
* @private |
|
* @param {Object} point - Manifold point |
|
* @param {Object} query - Search query |
|
* @returns {boolean} True if matches |
|
*/ |
|
_matchesQuery(point, query) { |
|
// Check attribute constraints |
|
if (query.attributes) { |
|
const attrs = point.address.attribute.attributes; |
|
|
|
for (const [key, value] of Object.entries(query.attributes)) { |
|
if (attrs[key] !== value) { |
|
return false; |
|
} |
|
} |
|
} |
|
|
|
// Check semantic constraints |
|
if (query.semantic && query.embedding) { |
|
// Calculate semantic similarity |
|
// For the reference implementation, we'd need an embedding model |
|
|
|
// Placeholder for real implementation |
|
return true; |
|
} |
|
|
|
// Check depth constraints |
|
if (query.minDepth !== undefined && point.depth < query.minDepth) { |
|
return false; |
|
} |
|
|
|
if (query.maxDepth !== undefined && point.depth > query.maxDepth) { |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* Verify depth access constraints |
|
* @private |
|
* @param {Object} source - Source object |
|
* @param {Object} target - Target object |
|
* @param {string} relationType - Relation type |
|
* @returns {boolean} True if access is allowed |
|
*/ |
|
_verifyDepthAccess(source, target, relationType) { |
|
// Get relation constraints |
|
const constraints = this._getRelationConstraints(relationType); |
|
|
|
// Check depth constraints |
|
if (constraints.requiresEqualDepth) { |
|
return Math.abs(source.depth - target.depth) < 0.001; |
|
} |
|
|
|
if (constraints.requiresSourceDeeper) { |
|
return source.depth > target.depth; |
|
} |
|
|
|
if (constraints.requiresTargetDeeper) { |
|
return target.depth > source.depth; |
|
} |
|
|
|
// Default constraint: source must be at least as deep as target |
|
return source.depth >= target.depth; |
|
} |
|
|
|
/** |
|
* Get constraints for a relation type |
|
* @private |
|
* @param {string} relationType - Relation type |
|
* @returns {Object} Relation constraints |
|
*/ |
|
_getRelationConstraints(relationType) { |
|
// Default constraints |
|
const constraints = { |
|
requiresEqualDepth: false, |
|
requiresSourceDeeper: false, |
|
requiresTargetDeeper: false |
|
}; |
|
|
|
// Apply type-specific constraints |
|
switch (relationType) { |
|
case 'equals': |
|
constraints.requiresEqualDepth = true; |
|
break; |
|
|
|
case 'contains': |
|
constraints.requiresSourceDeeper = true; |
|
break; |
|
|
|
case 'partOf': |
|
constraints.requiresTargetDeeper = true; |
|
break; |
|
|
|
case 'references': |
|
// No special constraints |
|
break; |
|
} |
|
|
|
return constraints; |
|
} |
|
} |
|
|
|
/** |
|
* Base 3: Application (Userspace) |
|
* Represents the user-space of the system |
|
*/ |
|
class Base3 extends Base2 { |
|
/** |
|
* Create a new Base3 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
super(config); |
|
|
|
// Create behavior model (similar to JavaScript) |
|
this.behaviorModel = new BehaviorModel(this, config.behavior || {}); |
|
|
|
// Create framework model (similar to CSS) |
|
this.frameworkModel = new FrameworkModel(this, config.framework || {}); |
|
|
|
// Create structure model (similar to HTML) |
|
this.structureModel = new StructureModel(this, config.structure || {}); |
|
} |
|
|
|
/** |
|
* Create application interface |
|
* @param {Object} spec - Application specification |
|
* @returns {Promise<Object>} Application interface |
|
*/ |
|
async createApplication(spec) { |
|
// Validate specification coherence |
|
const coherence = await this._validateSpecCoherence(spec); |
|
if (coherence < this.config.coherenceThreshold) { |
|
throw new Error( |
|
`Application specification failed coherence validation: ${coherence}` |
|
); |
|
} |
|
|
|
// Create structure from specification |
|
const structure = await this.structureModel.createFromSpec(spec.structure); |
|
|
|
// Apply framework to structure |
|
const styledStructure = await this.frameworkModel.applyToStructure( |
|
structure, |
|
spec.framework |
|
); |
|
|
|
// Attach behavior to structure |
|
const application = await this.behaviorModel.attachToStructure( |
|
styledStructure, |
|
spec.behavior |
|
); |
|
|
|
// Return the assembled application |
|
return { |
|
id: application.id, |
|
interface: application.interface, |
|
execute: (action, params) => this.executeApplication(application.id, action, params) |
|
}; |
|
} |
|
|
|
/** |
|
* Validate specification coherence |
|
* @private |
|
* @param {Object} spec - Application specification |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async _validateSpecCoherence(spec) { |
|
if (!spec) return 0; |
|
|
|
const scores = []; |
|
|
|
// Check structure validity |
|
if (spec.structure && typeof spec.structure === 'object') { |
|
scores.push(1.0); |
|
} else { |
|
scores.push(0.0); |
|
} |
|
|
|
// Check framework validity |
|
if (spec.framework && typeof spec.framework === 'object') { |
|
scores.push(1.0); |
|
} else { |
|
scores.push(0.5); // Optional |
|
} |
|
|
|
// Check behavior validity |
|
if (spec.behavior && typeof spec.behavior === 'object') { |
|
scores.push(1.0); |
|
} else { |
|
scores.push(0.5); // Optional |
|
} |
|
|
|
// Calculate average score |
|
const total = scores.reduce((sum, score) => sum + score, 0); |
|
return total / scores.length; |
|
} |
|
|
|
/** |
|
* Execute application action |
|
* @param {string} appId - Application ID |
|
* @param {string} action - Action to execute |
|
* @param {Object} params - Action parameters |
|
* @returns {Promise<Object>} Action result |
|
*/ |
|
async executeApplicationAction(appId, action, params = {}) { |
|
return this.executeApplication(appId, action, params); |
|
} |
|
} |
|
|
|
/** |
|
* Behavior Model for Base3 |
|
* Controls application behavior |
|
*/ |
|
class BehaviorModel { |
|
/** |
|
* Create a new behavior model |
|
* @param {Base3} base - Base3 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(base, config = {}) { |
|
this.base = base; |
|
this.scriptEngine = new ScriptEngine(config.script || {}); |
|
this.eventSystem = new EventSystem(config.events || {}); |
|
this.globalScope = config.globalScope || {}; |
|
} |
|
|
|
/** |
|
* Attach behavior to structure |
|
* @param {Object} structure - Structure to attach behavior to |
|
* @param {Object} behavior - Behavior specification |
|
* @returns {Promise<Object>} Structure with behavior |
|
*/ |
|
async attachToStructure(structure, behavior) { |
|
if (!behavior) { |
|
return structure; |
|
} |
|
|
|
// Create a copy of the structure |
|
const result = JSON.parse(JSON.stringify(structure)); |
|
|
|
// Add event handlers |
|
if (behavior.eventHandlers) { |
|
for (const [eventName, handler] of Object.entries(behavior.eventHandlers)) { |
|
this.eventSystem.registerHandler( |
|
result.id, |
|
eventName, |
|
this.scriptEngine.compile(handler) |
|
); |
|
} |
|
} |
|
|
|
// Add methods |
|
if (behavior.methods) { |
|
result.methods = {}; |
|
|
|
for (const [methodName, methodCode] of Object.entries(behavior.methods)) { |
|
result.methods[methodName] = this.scriptEngine.compile(methodCode); |
|
} |
|
} |
|
|
|
// Add a reference to the script engine and event system |
|
result._scriptEngine = this.scriptEngine; |
|
result._eventSystem = this.eventSystem; |
|
|
|
// Create public interface |
|
result.interface = this._createInterface(result, behavior); |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Create application interface |
|
* @private |
|
* @param {Object} structure - Structure with behavior |
|
* @param {Object} behavior - Behavior specification |
|
* @returns {Object} Application interface |
|
*/ |
|
_createInterface(structure, behavior) { |
|
const interface = {}; |
|
|
|
// Add exported methods to interface |
|
if (behavior.exports && behavior.methods) { |
|
for (const methodName of behavior.exports) { |
|
if (structure.methods[methodName]) { |
|
interface[methodName] = async (...args) => { |
|
const context = { |
|
structure, |
|
base: this.base, |
|
globals: this.globalScope |
|
}; |
|
|
|
return structure.methods[methodName](context, ...args); |
|
}; |
|
} |
|
} |
|
} |
|
|
|
// Add event triggering to interface |
|
interface.trigger = async (eventName, eventData) => { |
|
return this.eventSystem.trigger(structure.id, eventName, { |
|
structure, |
|
eventData, |
|
base: this.base, |
|
globals: this.globalScope |
|
}); |
|
}; |
|
|
|
return interface; |
|
} |
|
} |
|
|
|
/** |
|
* Script Engine for Behavior Model |
|
* Compiles and executes scripts |
|
*/ |
|
class ScriptEngine { |
|
/** |
|
* Create a new script engine |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.sandbox = config.sandbox !== false; |
|
this.enabledApis = config.enabledApis || ['math', 'json', 'date', 'string']; |
|
this.disabledGlobals = config.disabledGlobals || ['process', 'require', 'module', 'eval']; |
|
} |
|
|
|
/** |
|
* Compile a script into a function |
|
* @param {string} code - Script code |
|
* @returns {function} Compiled function |
|
*/ |
|
compile(code) { |
|
if (typeof code === 'function') { |
|
return code; // Already a function |
|
} |
|
|
|
// Validate code |
|
this._validateCode(code); |
|
|
|
// Create function using the code |
|
try { |
|
return new Function('context', ...this._extractParams(code), code); |
|
} catch (error) { |
|
throw new Error(`Script compilation error: ${error.message}`); |
|
} |
|
} |
|
|
|
/** |
|
* Execute a compiled script |
|
* @param {function} script - Compiled script |
|
* @param {Object} context - Execution context |
|
* @param {...*} args - Script arguments |
|
* @returns {*} Script result |
|
*/ |
|
execute(script, context, ...args) { |
|
if (typeof script !== 'function') { |
|
throw new Error('Invalid script: must be a function'); |
|
} |
|
|
|
// Prepare sandbox if enabled |
|
if (this.sandbox) { |
|
context = this._createSandbox(context); |
|
} |
|
|
|
// Execute the script |
|
try { |
|
return script(context, ...args); |
|
} catch (error) { |
|
throw new Error(`Script execution error: ${error.message}`); |
|
} |
|
} |
|
|
|
/** |
|
* Validate script code |
|
* @private |
|
* @param {string} code - Script code |
|
*/ |
|
_validateCode(code) { |
|
if (typeof code !== 'string') { |
|
throw new Error('Invalid code: must be a string'); |
|
} |
|
|
|
// Check for disallowed constructs |
|
for (const disallowed of this.disabledGlobals) { |
|
if (code.includes(disallowed)) { |
|
throw new Error(`Disallowed construct in code: ${disallowed}`); |
|
} |
|
} |
|
|
|
// Advanced validation would use a JavaScript parser |
|
// For the reference implementation, this simple check is sufficient |
|
} |
|
|
|
/** |
|
* Extract parameter names from function code |
|
* @private |
|
* @param {string} code - Function code |
|
* @returns {string[]} Parameter names |
|
*/ |
|
_extractParams(code) { |
|
// Simple regex to extract parameter names |
|
const match = code.match(/^\s*function\s*\(([^)]*)\)/); |
|
if (match) { |
|
return match[1].split(',').map(p => p.trim()).filter(p => p.length > 0); |
|
} |
|
|
|
return []; |
|
} |
|
|
|
/** |
|
* Create a sandbox for script execution |
|
* @private |
|
* @param {Object} context - Execution context |
|
* @returns {Object} Sandboxed context |
|
*/ |
|
_createSandbox(context) { |
|
// Create a restricted context |
|
const sandbox = { |
|
...context, |
|
console: { |
|
log: (...args) => console.log('[ScriptEngine]', ...args), |
|
warn: (...args) => console.warn('[ScriptEngine]', ...args), |
|
error: (...args) => console.error('[ScriptEngine]', ...args) |
|
} |
|
}; |
|
|
|
// Add enabled APIs |
|
if (this.enabledApis.includes('math')) { |
|
sandbox.Math = Math; |
|
} |
|
|
|
if (this.enabledApis.includes('json')) { |
|
sandbox.JSON = JSON; |
|
} |
|
|
|
if (this.enabledApis.includes('date')) { |
|
sandbox.Date = Date; |
|
} |
|
|
|
if (this.enabledApis.includes('string')) { |
|
sandbox.String = String; |
|
} |
|
|
|
return sandbox; |
|
} |
|
} |
|
|
|
/** |
|
* Event System for Behavior Model |
|
* Manages event registration and triggering |
|
*/ |
|
class EventSystem { |
|
/** |
|
* Create a new event system |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.handlers = new Map(); |
|
this.maxHandlers = config.maxHandlers || 100; |
|
} |
|
|
|
/** |
|
* Register an event handler |
|
* @param {string} objectId - Object ID |
|
* @param {string} eventName - Event name |
|
* @param {function} handler - Event handler |
|
* @returns {EventSystem} This event system for chaining |
|
*/ |
|
registerHandler(objectId, eventName, handler) { |
|
const key = `${objectId}:${eventName}`; |
|
|
|
if (!this.handlers.has(key)) { |
|
this.handlers.set(key, []); |
|
} |
|
|
|
const handlers = this.handlers.get(key); |
|
|
|
// Check for handler limit |
|
if (handlers.length >= this.maxHandlers) { |
|
throw new Error(`Maximum number of handlers (${this.maxHandlers}) reached for ${key}`); |
|
} |
|
|
|
handlers.push(handler); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Unregister event handlers |
|
* @param {string} objectId - Object ID |
|
* @param {string} eventName - Event name |
|
* @param {function} [handler] - Specific handler to unregister |
|
* @returns {boolean} True if handlers were removed |
|
*/ |
|
unregisterHandler(objectId, eventName, handler = null) { |
|
const key = `${objectId}:${eventName}`; |
|
|
|
if (!this.handlers.has(key)) { |
|
return false; |
|
} |
|
|
|
if (handler === null) { |
|
// Remove all handlers |
|
this.handlers.delete(key); |
|
return true; |
|
} |
|
|
|
// Remove specific handler |
|
const handlers = this.handlers.get(key); |
|
const initialLength = handlers.length; |
|
|
|
for (let i = handlers.length - 1; i >= 0; i--) { |
|
if (handlers[i] === handler) { |
|
handlers.splice(i, 1); |
|
} |
|
} |
|
|
|
// Clean up empty arrays |
|
if (handlers.length === 0) { |
|
this.handlers.delete(key); |
|
} |
|
|
|
return initialLength > handlers.length; |
|
} |
|
|
|
/** |
|
* Trigger an event |
|
* @param {string} objectId - Object ID |
|
* @param {string} eventName - Event name |
|
* @param {Object} context - Event context |
|
* @returns {Promise<Array>} Array of handler results |
|
*/ |
|
async trigger(objectId, eventName, context) { |
|
const key = `${objectId}:${eventName}`; |
|
|
|
if (!this.handlers.has(key)) { |
|
return []; |
|
} |
|
|
|
const handlers = this.handlers.get(key); |
|
const results = []; |
|
|
|
// Add event information to context |
|
const eventContext = { |
|
...context, |
|
event: { |
|
name: eventName, |
|
target: objectId, |
|
timestamp: Date.now() |
|
} |
|
}; |
|
|
|
// Execute handlers |
|
for (const handler of handlers) { |
|
try { |
|
results.push(await handler(eventContext)); |
|
} catch (error) { |
|
console.error(`Error in event handler for ${key}:`, error); |
|
results.push({ error: error.message }); |
|
} |
|
} |
|
|
|
return results; |
|
} |
|
} |
|
|
|
/** |
|
* Framework Model for Base3 |
|
* Manages styling and layout |
|
*/ |
|
class FrameworkModel { |
|
/** |
|
* Create a new framework model |
|
* @param {Base3} base - Base3 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(base, config = {}) { |
|
this.base = base; |
|
this.styleEngine = new StyleEngine(config.style || {}); |
|
this.layouts = new Map(); |
|
|
|
// Initialize standard layouts |
|
this._initializeLayouts(); |
|
} |
|
|
|
/** |
|
* Initialize standard layouts |
|
* @private |
|
*/ |
|
_initializeLayouts() { |
|
// Standard flow layout |
|
this.registerLayout('flow', { |
|
apply: (container, children) => { |
|
if (!container.style) { |
|
container.style = {}; |
|
} |
|
|
|
container.style.display = 'flex'; |
|
container.style.flexDirection = 'column'; |
|
|
|
return container; |
|
} |
|
}); |
|
|
|
// Grid layout |
|
this.registerLayout('grid', { |
|
apply: (container, children, options = {}) => { |
|
if (!container.style) { |
|
container.style = {}; |
|
} |
|
|
|
container.style.display = 'grid'; |
|
container.style.gridTemplateColumns = options.columns || 'repeat(1, 1fr)'; |
|
container.style.gridTemplateRows = options.rows || 'auto'; |
|
container.style.gridGap = options.gap || '0'; |
|
|
|
return container; |
|
} |
|
}); |
|
|
|
// Flex layout |
|
this.registerLayout('flex', { |
|
apply: (container, children, options = {}) => { |
|
if (!container.style) { |
|
container.style = {}; |
|
} |
|
|
|
container.style.display = 'flex'; |
|
container.style.flexDirection = options.direction || 'row'; |
|
container.style.justifyContent = options.justify || 'flex-start'; |
|
container.style.alignItems = options.align || 'stretch'; |
|
container.style.flexWrap = options.wrap || 'nowrap'; |
|
|
|
return container; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a layout |
|
* @param {string} name - Layout name |
|
* @param {Object} layout - Layout object |
|
* @returns {FrameworkModel} This framework model for chaining |
|
*/ |
|
registerLayout(name, layout) { |
|
if (typeof layout.apply !== 'function') { |
|
throw new Error(`Layout must implement apply method`); |
|
} |
|
|
|
this.layouts.set(name, layout); |
|
return this; |
|
} |
|
|
|
/** |
|
* Apply framework to structure |
|
* @param {Object} structure - Structure to style |
|
* @param {Object} framework - Framework specification |
|
* @returns {Promise<Object>} Styled structure |
|
*/ |
|
async applyToStructure(structure, framework) { |
|
if (!framework) { |
|
return structure; |
|
} |
|
|
|
// Create a copy of the structure |
|
const result = JSON.parse(JSON.stringify(structure)); |
|
|
|
// Apply styles |
|
if (framework.styles) { |
|
this._applyStylesToNode(result, framework.styles); |
|
} |
|
|
|
// Apply layouts |
|
if (framework.layouts) { |
|
this._applyLayoutsToNode(result, framework.layouts); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Apply styles to a node |
|
* @private |
|
* @param {Object} node - Node to style |
|
* @param {Object} styles - Style definitions |
|
*/ |
|
_applyStylesToNode(node, styles) { |
|
// Apply style to current node |
|
if (styles.default) { |
|
node.style = this.styleEngine.applyStyle(node.style || {}, styles.default); |
|
} |
|
|
|
// Apply style by node type |
|
if (node.type && styles[node.type]) { |
|
node.style = this.styleEngine.applyStyle(node.style || {}, styles[node.type]); |
|
} |
|
|
|
// Apply style by node ID |
|
if (node.id && styles[`#${node.id}`]) { |
|
node.style = this.styleEngine.applyStyle(node.style || {}, styles[`#${node.id}`]); |
|
} |
|
|
|
// Apply style by node class |
|
if (node.class) { |
|
const classes = node.class.split(' '); |
|
for (const cls of classes) { |
|
if (styles[`.${cls}`]) { |
|
node.style = this.styleEngine.applyStyle(node.style || {}, styles[`.${cls}`]); |
|
} |
|
} |
|
} |
|
|
|
// Apply styles to children |
|
if (node.children) { |
|
for (const child of node.children) { |
|
this._applyStylesToNode(child, styles); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Apply layouts to a node |
|
* @private |
|
* @param {Object} node - Node to apply layout to |
|
* @param {Object} layouts - Layout definitions |
|
*/ |
|
_applyLayoutsToNode(node, layouts) { |
|
// Apply layout to current node |
|
if (node.id && layouts[node.id]) { |
|
const layoutConfig = layouts[node.id]; |
|
const layout = this.layouts.get(layoutConfig.type); |
|
|
|
if (layout) { |
|
layout.apply(node, node.children, layoutConfig.options); |
|
} |
|
} |
|
|
|
// Apply layout by node type |
|
if (node.type && layouts[node.type]) { |
|
const layoutConfig = layouts[node.type]; |
|
const layout = this.layouts.get(layoutConfig.type); |
|
|
|
if (layout) { |
|
layout.apply(node, node.children, layoutConfig.options); |
|
} |
|
} |
|
|
|
// Apply layouts to children |
|
if (node.children) { |
|
for (const child of node.children) { |
|
this._applyLayoutsToNode(child, layouts); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Style Engine for Framework Model |
|
* Manages style application |
|
*/ |
|
class StyleEngine { |
|
/** |
|
* Create a new style engine |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.preprocessors = new Map(); |
|
this.propertyHandlers = new Map(); |
|
|
|
// Initialize standard preprocessors |
|
this._initializePreprocessors(); |
|
|
|
// Initialize standard property handlers |
|
this._initializePropertyHandlers(); |
|
} |
|
|
|
/** |
|
* Initialize standard preprocessors |
|
* @private |
|
*/ |
|
_initializePreprocessors() { |
|
// Variables preprocessor |
|
this.registerPreprocessor('variables', (style, context) => { |
|
// Replace variables in style properties |
|
for (const [key, value] of Object.entries(style)) { |
|
if (typeof value === 'string' && value.includes('var(')) { |
|
style[key] = this._replaceVariables(value, context.variables || {}); |
|
} |
|
} |
|
|
|
return style; |
|
}); |
|
|
|
// Units preprocessor |
|
this.registerPreprocessor('units', (style, context) => { |
|
// Add default units to numeric properties |
|
const unitProperties = [ |
|
'width', 'height', 'margin', 'padding', 'top', 'right', 'bottom', 'left', |
|
'font-size', 'line-height', 'border-width' |
|
]; |
|
|
|
for (const prop of unitProperties) { |
|
if (style[prop] !== undefined && typeof style[prop] === 'number') { |
|
style[prop] = `${style[prop]}px`; |
|
} |
|
} |
|
|
|
return style; |
|
}); |
|
} |
|
|
|
/** |
|
* Initialize standard property handlers |
|
* @private |
|
*/ |
|
_initializePropertyHandlers() { |
|
// Margin handler |
|
this.registerPropertyHandler('margin', (value, style) => { |
|
if (typeof value === 'string') { |
|
// Parse CSS-style margin |
|
const parts = value.split(/\s+/); |
|
|
|
if (parts.length === 1) { |
|
style['margin-top'] = parts[0]; |
|
style['margin-right'] = parts[0]; |
|
style['margin-bottom'] = parts[0]; |
|
style['margin-left'] = parts[0]; |
|
} else if (parts.length === 2) { |
|
style['margin-top'] = parts[0]; |
|
style['margin-right'] = parts[1]; |
|
style['margin-bottom'] = parts[0]; |
|
style['margin-left'] = parts[1]; |
|
} else if (parts.length === 3) { |
|
style['margin-top'] = parts[0]; |
|
style['margin-right'] = parts[1]; |
|
style['margin-bottom'] = parts[2]; |
|
style['margin-left'] = parts[1]; |
|
} else if (parts.length === 4) { |
|
style['margin-top'] = parts[0]; |
|
style['margin-right'] = parts[1]; |
|
style['margin-bottom'] = parts[2]; |
|
style['margin-left'] = parts[3]; |
|
} |
|
} else { |
|
style['margin-top'] = value; |
|
style['margin-right'] = value; |
|
style['margin-bottom'] = value; |
|
style['margin-left'] = value; |
|
} |
|
}); |
|
|
|
// Padding handler |
|
this.registerPropertyHandler('padding', (value, style) => { |
|
if (typeof value === 'string') { |
|
// Parse CSS-style padding |
|
const parts = value.split(/\s+/); |
|
|
|
if (parts.length === 1) { |
|
style['padding-top'] = parts[0]; |
|
style['padding-right'] = parts[0]; |
|
style['padding-bottom'] = parts[0]; |
|
style['padding-left'] = parts[0]; |
|
} else if (parts.length === 2) { |
|
style['padding-top'] = parts[0]; |
|
style['padding-right'] = parts[1]; |
|
style['padding-bottom'] = parts[0]; |
|
style['padding-left'] = parts[1]; |
|
} else if (parts.length === 3) { |
|
style['padding-top'] = parts[0]; |
|
style['padding-right'] = parts[1]; |
|
style['padding-bottom'] = parts[2]; |
|
style['padding-left'] = parts[1]; |
|
} else if (parts.length === 4) { |
|
style['padding-top'] = parts[0]; |
|
style['padding-right'] = parts[1]; |
|
style['padding-bottom'] = parts[2]; |
|
style['padding-left'] = parts[3]; |
|
} |
|
} else { |
|
style['padding-top'] = value; |
|
style['padding-right'] = value; |
|
style['padding-bottom'] = value; |
|
style['padding-left'] = value; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a style preprocessor |
|
* @param {string} name - Preprocessor name |
|
* @param {function} processor - Preprocessor function |
|
* @returns {StyleEngine} This style engine for chaining |
|
*/ |
|
registerPreprocessor(name, processor) { |
|
this.preprocessors.set(name, processor); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a property handler |
|
* @param {string} property - Property name |
|
* @param {function} handler - Property handler |
|
* @returns {StyleEngine} This style engine for chaining |
|
*/ |
|
registerPropertyHandler(property, handler) { |
|
this.propertyHandlers.set(property, handler); |
|
return this; |
|
} |
|
|
|
/** |
|
* Apply a style to a node |
|
* @param {Object} baseStyle - Base style object |
|
* @param {Object} newStyle - Style to apply |
|
* @param {Object} context - Style context |
|
* @returns {Object} Combined style |
|
*/ |
|
applyStyle(baseStyle = {}, newStyle = {}, context = {}) { |
|
// Create a copy of the base style |
|
const result = { ...baseStyle }; |
|
|
|
// Apply preprocessors to new style |
|
let processedStyle = { ...newStyle }; |
|
|
|
for (const processor of this.preprocessors.values()) { |
|
processedStyle = processor(processedStyle, context); |
|
} |
|
|
|
// Apply property handlers |
|
for (const [prop, value] of Object.entries(processedStyle)) { |
|
if (this.propertyHandlers.has(prop)) { |
|
// Use property handler |
|
this.propertyHandlers.get(prop)(value, result); |
|
} else { |
|
// Direct assignment |
|
result[prop] = value; |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Replace variable references in a string |
|
* @private |
|
* @param {string} value - String with variable references |
|
* @param {Object} variables - Variable definitions |
|
* @returns {string} String with variables replaced |
|
*/ |
|
_replaceVariables(value, variables) { |
|
return value.replace(/var\(--([a-zA-Z0-9-_]+)(?:,\s*([^)]+))?\)/g, (match, name, fallback) => { |
|
if (variables[name] !== undefined) { |
|
return variables[name]; |
|
} |
|
return fallback || ''; |
|
}); |
|
} |
|
} |
|
|
|
/** |
|
* Structure Model for Base3 |
|
* Manages component structure |
|
*/ |
|
class StructureModel { |
|
/** |
|
* Create a new structure model |
|
* @param {Base3} base - Base3 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(base, config = {}) { |
|
this.base = base; |
|
this.componentTypes = new Map(); |
|
this.templates = new Map(); |
|
|
|
// Initialize standard component types |
|
this._initializeComponentTypes(); |
|
} |
|
|
|
/** |
|
* Initialize standard component types |
|
* @private |
|
*/ |
|
_initializeComponentTypes() { |
|
// Container component |
|
this.registerComponentType('container', { |
|
create: (spec) => ({ |
|
type: 'container', |
|
id: spec.id, |
|
class: spec.class, |
|
children: [], |
|
style: spec.style || {} |
|
}) |
|
}); |
|
|
|
// Text component |
|
this.registerComponentType('text', { |
|
create: (spec) => ({ |
|
type: 'text', |
|
id: spec.id, |
|
class: spec.class, |
|
content: spec.content || '', |
|
style: spec.style || {} |
|
}) |
|
}); |
|
|
|
// Input component |
|
this.registerComponentType('input', { |
|
create: (spec) => ({ |
|
type: 'input', |
|
id: spec.id, |
|
class: spec.class, |
|
inputType: spec.inputType || 'text', |
|
value: spec.value || '', |
|
placeholder: spec.placeholder || '', |
|
style: spec.style || {} |
|
}) |
|
}); |
|
|
|
// Button component |
|
this.registerComponentType('button', { |
|
create: (spec) => ({ |
|
type: 'button', |
|
id: spec.id, |
|
class: spec.class, |
|
label: spec.label || '', |
|
disabled: spec.disabled || false, |
|
style: spec.style || {} |
|
}) |
|
}); |
|
|
|
// Image component |
|
this.registerComponentType('image', { |
|
create: (spec) => ({ |
|
type: 'image', |
|
id: spec.id, |
|
class: spec.class, |
|
src: spec.src || '', |
|
alt: spec.alt || '', |
|
style: spec.style || {} |
|
}) |
|
}); |
|
} |
|
|
|
/** |
|
* Register a component type |
|
* @param {string} name - Component type name |
|
* @param {Object} factory - Component factory |
|
* @returns {StructureModel} This structure model for chaining |
|
*/ |
|
registerComponentType(name, factory) { |
|
if (typeof factory.create !== 'function') { |
|
throw new Error(`Component factory must implement create method`); |
|
} |
|
|
|
this.componentTypes.set(name, factory); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a template |
|
* @param {string} name - Template name |
|
* @param {Object} template - Template specification |
|
* @returns {StructureModel} This structure model for chaining |
|
*/ |
|
registerTemplate(name, template) { |
|
this.templates.set(name, template); |
|
return this; |
|
} |
|
|
|
/** |
|
* Create structure from specification |
|
* @param {Object} spec - Structure specification |
|
* @returns {Promise<Object>} Created structure |
|
*/ |
|
async createFromSpec(spec) { |
|
if (!spec) { |
|
throw new Error('Invalid structure specification'); |
|
} |
|
|
|
// Check if using a template |
|
if (typeof spec === 'string' && this.templates.has(spec)) { |
|
return this.createFromSpec(this.templates.get(spec)); |
|
} |
|
|
|
// Create the component |
|
const result = await this._createComponent(spec); |
|
|
|
// Process children if any |
|
if (spec.children && Array.isArray(spec.children)) { |
|
result.children = []; |
|
|
|
for (const childSpec of spec.children) { |
|
const child = await this.createFromSpec(childSpec); |
|
result.children.push(child); |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Create a component |
|
* @private |
|
* @param {Object} spec - Component specification |
|
* @returns {Promise<Object>} Created component |
|
*/ |
|
async _createComponent(spec) { |
|
// Validate component type |
|
if (!spec.type) { |
|
throw new Error('Component specification must include a type'); |
|
} |
|
|
|
if (!this.componentTypes.has(spec.type)) { |
|
throw new Error(`Unknown component type: ${spec.type}`); |
|
} |
|
|
|
// Create component using factory |
|
const factory = this.componentTypes.get(spec.type); |
|
return factory.create(spec); |
|
} |
|
} |
|
|
|
/** |
|
* Security Manager for Base2 |
|
* Manages access control and security policies |
|
*/ |
|
class SecurityManager { |
|
/** |
|
* Create a new security manager |
|
* @param {Base2} kernel - Kernel instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(kernel, config = {}) { |
|
this.kernel = kernel; |
|
this.bundles = new Map(); |
|
this.policies = new Map(); |
|
this.depthCalculator = new ManifoldDepthCalculator(); |
|
this.mda = new ManifoldDepthAttention(); |
|
|
|
// Initialize standard security policies |
|
this._initializePolicies(config); |
|
} |
|
|
|
/** |
|
* Initialize standard security policies |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_initializePolicies(config) { |
|
// System policy - system bundles have elevated privileges |
|
this.registerPolicy('system', { |
|
validate: async (bundleId, action) => { |
|
// System bundles start with "system." |
|
if (bundleId.startsWith('system.')) { |
|
return { |
|
allowed: true, |
|
reason: 'System bundle' |
|
}; |
|
} |
|
|
|
return null; // Not applicable |
|
} |
|
}); |
|
|
|
// Manifest policy - check bundle manifest for allowed actions |
|
this.registerPolicy('manifest', { |
|
validate: async (bundleId, action) => { |
|
const bundle = this.bundles.get(bundleId); |
|
if (!bundle) return null; // Not applicable |
|
|
|
// Check if action is in the declared interfaces |
|
if (bundle.meta.interfaces && bundle.meta.interfaces[action]) { |
|
return { |
|
allowed: true, |
|
reason: 'Action in manifest' |
|
}; |
|
} |
|
|
|
return { |
|
allowed: false, |
|
reason: 'Action not in manifest' |
|
}; |
|
} |
|
}); |
|
|
|
// Depth policy - check manifold depth for access |
|
this.registerPolicy('depth', { |
|
validate: async (bundleId, action) => { |
|
const bundle = this.bundles.get(bundleId); |
|
if (!bundle) return null; // Not applicable |
|
|
|
// Get bundle depth |
|
const bundleDepth = this.depthCalculator.calculate(bundle); |
|
|
|
// System actions require deep manifold depth |
|
if (action.startsWith('system.') && bundleDepth < 3.0) { |
|
return { |
|
allowed: false, |
|
reason: 'Insufficient depth for system action' |
|
}; |
|
} |
|
|
|
// Resource actions require moderate depth |
|
if (action.startsWith('resource.') && bundleDepth < 2.0) { |
|
return { |
|
allowed: false, |
|
reason: 'Insufficient depth for resource action' |
|
}; |
|
} |
|
|
|
return null; // Not applicable |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a security policy |
|
* @param {string} name - Policy name |
|
* @param {Object} policy - Policy object |
|
* @returns {SecurityManager} This manager for chaining |
|
*/ |
|
registerPolicy(name, policy) { |
|
if (typeof policy.validate !== 'function') { |
|
throw new Error(`Policy must implement validate method`); |
|
} |
|
|
|
this.policies.set(name, policy); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a bundle with the security manager |
|
* @param {Object} bundle - Application bundle |
|
* @returns {Promise<Object>} Registration result |
|
*/ |
|
async registerBundle(bundle) { |
|
// Store bundle security information |
|
this.bundles.set(bundle.id, { |
|
id: bundle.id, |
|
meta: bundle.meta, |
|
depth: this._calculateBundleDepth(bundle), |
|
registered: Date.now(), |
|
permissions: bundle.meta.permissions || {} |
|
}); |
|
|
|
return { |
|
id: bundle.id, |
|
registered: true |
|
}; |
|
} |
|
|
|
/** |
|
* Unregister a bundle from the security manager |
|
* @param {string} bundleId - Bundle ID |
|
* @returns {Promise<boolean>} True if unregistered |
|
*/ |
|
async unregisterBundle(bundleId) { |
|
return this.bundles.delete(bundleId); |
|
} |
|
|
|
/** |
|
* Verify access permission |
|
* @param {string} bundleId - Bundle ID |
|
* @param {string} action - Action to verify |
|
* @returns {Promise<Object>} Verification result |
|
*/ |
|
async verifyAccess(bundleId, action) { |
|
// Check if bundle is registered |
|
if (!this.bundles.has(bundleId)) { |
|
throw new Error(`Bundle not registered: ${bundleId}`); |
|
} |
|
|
|
const bundle = this.bundles.get(bundleId); |
|
|
|
// Apply security policies |
|
let allowed = true; |
|
let reason = 'Default allow'; |
|
|
|
for (const [name, policy] of this.policies.entries()) { |
|
try { |
|
const result = await policy.validate(bundleId, action); |
|
|
|
// Skip non-applicable policies |
|
if (!result) continue; |
|
|
|
// If any policy explicitly denies, access is denied |
|
if (!result.allowed) { |
|
allowed = false; |
|
reason = `Policy '${name}': ${result.reason}`; |
|
break; |
|
} |
|
|
|
// Record reason for latest allowing policy |
|
if (result.allowed) { |
|
reason = `Policy '${name}': ${result.reason}`; |
|
} |
|
} catch (error) { |
|
console.error(`Error in security policy ${name}:`, error); |
|
} |
|
} |
|
|
|
// If access is denied, throw error |
|
if (!allowed) { |
|
throw new Error(`Access denied: ${reason}`); |
|
} |
|
|
|
// Return verification result |
|
return { |
|
bundleId, |
|
action, |
|
allowed, |
|
reason |
|
}; |
|
} |
|
|
|
/** |
|
* Create a security boundary at a specified depth |
|
* @param {number} depth - Boundary depth |
|
* @param {Object} options - Boundary options |
|
* @returns {Object} Boundary object |
|
*/ |
|
createBoundary(depth, options = {}) { |
|
return { |
|
depth, |
|
name: options.name || `boundary-${depth}`, |
|
|
|
// Verifier function |
|
verifier: (source) => { |
|
const sourceDepth = this.depthCalculator.calculate(source); |
|
return sourceDepth >= depth; |
|
}, |
|
|
|
// Attention calculator |
|
attention: (source) => { |
|
const sourceDepth = this.depthCalculator.calculate(source); |
|
return this.mda.calculateAttention( |
|
{ depth: sourceDepth }, |
|
{ depth } |
|
); |
|
} |
|
}; |
|
} |
|
|
|
/** |
|
* Verify a component can cross a boundary |
|
* @param {Object} component - Component to check |
|
* @param {Object} boundary - Security boundary |
|
* @returns {Object} Verification result |
|
*/ |
|
verifyBoundaryCrossing(component, boundary) { |
|
const componentDepth = this.depthCalculator.calculate(component); |
|
|
|
// Component can cross boundary if its depth is sufficient |
|
const permitted = componentDepth >= boundary.depth; |
|
|
|
if (!permitted) { |
|
throw new Error( |
|
`Boundary violation: component at depth ${componentDepth} ` + |
|
`cannot cross boundary at depth ${boundary.depth}` |
|
); |
|
} |
|
|
|
return { |
|
permitted, |
|
componentDepth, |
|
boundaryDepth: boundary.depth, |
|
attention: boundary.attention(component) |
|
}; |
|
} |
|
|
|
/** |
|
* Calculate bundle security depth |
|
* @private |
|
* @param {Object} bundle - Application bundle |
|
* @returns {number} Bundle depth |
|
*/ |
|
_calculateBundleDepth(bundle) { |
|
// System bundles have maximum depth |
|
if (bundle.id.startsWith('system.')) { |
|
return 5.0; |
|
} |
|
|
|
// Calculate depth based on bundle characteristics |
|
let depth = 1.0; // Default depth |
|
|
|
// Add depth for signing |
|
if (bundle.meta.signed) { |
|
depth += 1.0; |
|
} |
|
|
|
// Add depth for verification |
|
if (bundle.meta.verified) { |
|
depth += 1.0; |
|
} |
|
|
|
// Add depth for interface completeness |
|
if (bundle.meta.interfaces) { |
|
const interfaceCount = Object.keys(bundle.meta.interfaces).length; |
|
depth += Math.min(1.0, interfaceCount / 5); |
|
} |
|
|
|
// System interfaces add depth |
|
if (bundle.meta.interfaces && |
|
Object.keys(bundle.meta.interfaces).some(i => i.startsWith('system.'))) { |
|
depth += 1.0; |
|
} |
|
|
|
return depth; |
|
} |
|
} |
|
|
|
/** |
|
* Manifold Depth Calculator |
|
* Calculates manifold depth for objects |
|
*/ |
|
class ManifoldDepthCalculator { |
|
/** |
|
* Create a new manifold depth calculator |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.defaultDepth = config.defaultDepth || 1.0; |
|
this.depthCache = new Map(); |
|
} |
|
|
|
/** |
|
* Calculate manifold depth for an object |
|
* @param {Object} obj - Object to calculate depth for |
|
* @returns {number} Manifold depth |
|
*/ |
|
calculate(obj) { |
|
if (!obj) return 0; |
|
|
|
// Use object ID as cache key if available |
|
const cacheKey = obj.id || JSON.stringify(obj); |
|
|
|
// Check cache |
|
if (this.depthCache.has(cacheKey)) { |
|
return this.depthCache.get(cacheKey); |
|
} |
|
|
|
// Calculate depth based on object type |
|
let depth; |
|
|
|
if (typeof obj === 'number') { |
|
depth = this._calculateNumberDepth(obj); |
|
} else if (typeof obj === 'string') { |
|
depth = this._calculateStringDepth(obj); |
|
} else if (Array.isArray(obj)) { |
|
depth = this._calculateArrayDepth(obj); |
|
} else if (obj instanceof MultivectorRepresentation) { |
|
depth = this._calculateMultivectorDepth(obj); |
|
} else if (typeof obj === 'object') { |
|
depth = this._calculateObjectDepth(obj); |
|
} else { |
|
depth = this.defaultDepth; |
|
} |
|
|
|
// Cache the result |
|
if (cacheKey) { |
|
this.depthCache.set(cacheKey, depth); |
|
} |
|
|
|
return depth; |
|
} |
|
|
|
/** |
|
* Calculate depth for a number |
|
* @private |
|
* @param {number} num - Number to calculate depth for |
|
* @returns {number} Manifold depth |
|
*/ |
|
_calculateNumberDepth(num) { |
|
// Integers have higher depth than floating point |
|
if (Number.isInteger(num)) { |
|
return 1.0 + Math.min(1.0, Math.abs(num) / 1000); |
|
} |
|
|
|
return 0.8 + Math.min(0.5, Math.abs(num) / 1000); |
|
} |
|
|
|
/** |
|
* Calculate depth for a string |
|
* @private |
|
* @param {string} str - String to calculate depth for |
|
* @returns {number} Manifold depth |
|
*/ |
|
_calculateStringDepth(str) { |
|
// Empty strings have zero depth |
|
if (!str) return 0; |
|
|
|
// System identifiers have higher depth |
|
if (str.startsWith('system.')) { |
|
return 3.0; |
|
} |
|
|
|
// Calculate entropy as a measure of depth |
|
const entropy = this._calculateStringEntropy(str); |
|
|
|
// Scale entropy to a reasonable depth range |
|
return 0.5 + Math.min(1.5, entropy / 4); |
|
} |
|
|
|
/** |
|
* Calculate entropy of a string |
|
* @private |
|
* @param {string} str - String to calculate entropy for |
|
* @returns {number} Shannon entropy |
|
*/ |
|
_calculateStringEntropy(str) { |
|
const len = str.length; |
|
const counts = new Map(); |
|
|
|
// Count character frequencies |
|
for (let i = 0; i < len; i++) { |
|
const char = str[i]; |
|
counts.set(char, (counts.get(char) || 0) + 1); |
|
} |
|
|
|
// Calculate Shannon entropy |
|
let entropy = 0; |
|
for (const count of counts.values()) { |
|
const p = count / len; |
|
entropy -= p * Math.log2(p); |
|
} |
|
|
|
return entropy; |
|
} |
|
|
|
/** |
|
* Calculate depth for an array |
|
* @private |
|
* @param {Array} arr - Array to calculate depth for |
|
* @returns {number} Manifold depth |
|
*/ |
|
_calculateArrayDepth(arr) { |
|
if (arr.length === 0) return 0.5; |
|
|
|
// Calculate average element depth |
|
let totalDepth = 0; |
|
|
|
for (const item of arr) { |
|
totalDepth += this.calculate(item); |
|
} |
|
|
|
const avgDepth = totalDepth / arr.length; |
|
|
|
// Arrays add 0.3 to their contents' depth, up to 3.0 total |
|
return Math.min(3.0, avgDepth + 0.3); |
|
} |
|
|
|
/** |
|
* Calculate depth for a multivector |
|
* @private |
|
* @param {MultivectorRepresentation} mv - Multivector to calculate depth for |
|
* @returns {number} Manifold depth |
|
*/ |
|
_calculateMultivectorDepth(mv) { |
|
// Higher grades have higher depth |
|
let maxGrade = 0; |
|
let maxGradeNorm = 0; |
|
|
|
for (let i = 0; i < mv.bladeCount; i++) { |
|
if (Math.abs(mv.components[i]) > 1e-10) { |
|
const grade = mv._gradeOfIndex(i); |
|
if (grade > maxGrade) { |
|
maxGrade = grade; |
|
maxGradeNorm = Math.abs(mv.components[i]); |
|
} |
|
} |
|
} |
|
|
|
// Calculate coherence |
|
const coherence = CoherenceMetrics.normalizedCoherence(mv); |
|
|
|
// Combine grade and coherence for depth |
|
return 1.0 + maxGrade * 0.5 + coherence; |
|
} |
|
|
|
/** |
|
* Calculate depth for an object |
|
* @private |
|
* @param {Object} obj - Object to calculate depth for |
|
* @returns {number} Manifold depth |
|
*/ |
|
_calculateObjectDepth(obj) { |
|
// Check for explicit depth property |
|
if (typeof obj.depth === 'number') { |
|
return obj.depth; |
|
} |
|
|
|
// Check for depth calculation function |
|
if (typeof obj.calculateDepth === 'function') { |
|
try { |
|
return obj.calculateDepth(); |
|
} catch (error) { |
|
console.error("Error calculating object depth:", error); |
|
} |
|
} |
|
|
|
// Calculate based on object properties |
|
const keys = Object.keys(obj); |
|
|
|
if (keys.length === 0) return 0.5; |
|
|
|
// Simple calculation based on number of properties and nesting |
|
let depthScore = Math.min(1.0, keys.length / 10); |
|
|
|
// Check for nesting |
|
let nestedObjects = 0; |
|
for (const key of keys) { |
|
if (typeof obj[key] === 'object' && obj[key] !== null) { |
|
nestedObjects++; |
|
} |
|
} |
|
|
|
depthScore += Math.min(1.0, nestedObjects / 5); |
|
|
|
// Special handling for common properties that indicate depth |
|
if (obj.id && typeof obj.id === 'string') { |
|
if (obj.id.startsWith('system.')) { |
|
depthScore += 1.0; |
|
} |
|
} |
|
|
|
if (obj.secure === true) { |
|
depthScore += 0.5; |
|
} |
|
|
|
if (obj.permission === 'admin' || obj.role === 'admin') { |
|
depthScore += 1.0; |
|
} |
|
|
|
return 1.0 + depthScore; |
|
} |
|
} |
|
|
|
/** |
|
* Manifold Depth Attention |
|
* Determines interaction strength based on manifold depth |
|
*/ |
|
class ManifoldDepthAttention { |
|
/** |
|
* Create a new manifold depth attention calculator |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.alpha = config.alpha || 1.0; |
|
this.depthCalculator = new ManifoldDepthCalculator(config.depth || {}); |
|
} |
|
|
|
/** |
|
* Calculate attention between components |
|
* @param {Object} component1 - First component |
|
* @param {Object} component2 - Second component |
|
* @returns {number} Attention value |
|
*/ |
|
calculateAttention(component1, component2) { |
|
// Get manifold depths |
|
const depth1 = component1.depth || this.depthCalculator.calculate(component1); |
|
const depth2 = component2.depth || this.depthCalculator.calculate(component2); |
|
|
|
// Calculate attention using exponential decay with depth difference |
|
return Math.exp(-this.alpha * Math.abs(depth1 - depth2)); |
|
} |
|
|
|
/** |
|
* Calculate multi-head attention |
|
* @param {Object} component1 - First component |
|
* @param {Object} component2 - Second component |
|
* @param {number} heads - Number of attention heads |
|
* @returns {number[]} Attention values for each head |
|
*/ |
|
calculateMultiHeadAttention(component1, component2, heads = 4) { |
|
const attentions = []; |
|
|
|
// Get manifold depths |
|
const depth1 = component1.depth || this.depthCalculator.calculate(component1); |
|
const depth2 = component2.depth || this.depthCalculator.calculate(component2); |
|
const depthDiff = Math.abs(depth1 - depth2); |
|
|
|
// Calculate attention with different alpha values |
|
for (let i = 0; i < heads; i++) { |
|
const headAlpha = this.alpha * (0.5 + i * 0.5); |
|
attentions.push(Math.exp(-headAlpha * depthDiff)); |
|
} |
|
|
|
return attentions; |
|
} |
|
|
|
/** |
|
* Check if access is permitted based on depth |
|
* @param {Object} source - Source component |
|
* @param {Object} target - Target component |
|
* @returns {boolean} True if access is permitted |
|
*/ |
|
checkAccess(source, target) { |
|
// Get manifold depths |
|
const sourceDepth = source.depth || this.depthCalculator.calculate(source); |
|
const targetDepth = target.depth || this.depthCalculator.calculate(target); |
|
|
|
// Access is permitted if source is at least as deep as target |
|
return sourceDepth >= targetDepth; |
|
} |
|
|
|
/** |
|
* Calculate attention matrix for multiple components |
|
* @param {Object[]} components - Components to calculate attention for |
|
* @returns {number[][]} Attention matrix |
|
*/ |
|
calculateAttentionMatrix(components) { |
|
const n = components.length; |
|
const matrix = new Array(n); |
|
|
|
// Precalculate depths |
|
const depths = components.map(c => |
|
c.depth || this.depthCalculator.calculate(c) |
|
); |
|
|
|
// Calculate attention for each pair |
|
for (let i = 0; i < n; i++) { |
|
matrix[i] = new Array(n); |
|
|
|
for (let j = 0; j < n; j++) { |
|
if (i === j) { |
|
matrix[i][j] = 1.0; // Self-attention is 1.0 |
|
} else { |
|
const depthDiff = Math.abs(depths[i] - depths[j]); |
|
matrix[i][j] = Math.exp(-this.alpha * depthDiff); |
|
} |
|
} |
|
} |
|
|
|
return matrix; |
|
} |
|
} |
|
|
|
/** |
|
* Resource Manager for Base2 |
|
* Handles resource allocation and optimization |
|
*/ |
|
class ResourceManager { |
|
/** |
|
* Create a new resource manager |
|
* @param {Base2} kernel - Kernel instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(kernel, config = {}) { |
|
this.kernel = kernel; |
|
this.allocations = new Map(); |
|
this.resourcePools = new Map(); |
|
this.coherenceOptimizer = new ResourceCoherenceOptimizer(config.optimization || {}); |
|
|
|
// Initialize resource pools |
|
this._initializeResourcePools(config); |
|
} |
|
|
|
/** |
|
* Initialize standard resource pools |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_initializeResourcePools(config) { |
|
// CPU resources |
|
this.registerResourcePool('cpu', { |
|
total: config.cpu?.total || 100, |
|
available: config.cpu?.available || 100, |
|
|
|
allocate: async (amount) => { |
|
const pool = this.resourcePools.get('cpu'); |
|
|
|
if (pool.available < amount) { |
|
throw new Error(`Insufficient CPU resources: ${pool.available} < ${amount}`); |
|
} |
|
|
|
pool.available -= amount; |
|
|
|
return { |
|
id: `cpu-${Date.now()}-${Math.floor(Math.random() * 1000)}`, |
|
amount, |
|
resourceType: 'cpu' |
|
}; |
|
}, |
|
|
|
release: async (resource) => { |
|
const pool = this.resourcePools.get('cpu'); |
|
pool.available += resource.amount; |
|
return true; |
|
} |
|
}); |
|
|
|
// Memory resources |
|
this.registerResourcePool('memory', { |
|
total: config.memory?.total || 1024, |
|
available: config.memory?.available || 1024, |
|
|
|
allocate: async (amount) => { |
|
const pool = this.resourcePools.get('memory'); |
|
|
|
if (pool.available < amount) { |
|
throw new Error(`Insufficient memory resources: ${pool.available} < ${amount}`); |
|
} |
|
|
|
pool.available -= amount; |
|
|
|
return { |
|
id: `memory-${Date.now()}-${Math.floor(Math.random() * 1000)}`, |
|
amount, |
|
resourceType: 'memory' |
|
}; |
|
}, |
|
|
|
release: async (resource) => { |
|
const pool = this.resourcePools.get('memory'); |
|
pool.available += resource.amount; |
|
return true; |
|
} |
|
}); |
|
|
|
// Storage resources |
|
this.registerResourcePool('storage', { |
|
total: config.storage?.total || 10240, |
|
available: config.storage?.available || 10240, |
|
|
|
allocate: async (amount) => { |
|
const pool = this.resourcePools.get('storage'); |
|
|
|
if (pool.available < amount) { |
|
throw new Error(`Insufficient storage resources: ${pool.available} < ${amount}`); |
|
} |
|
|
|
pool.available -= amount; |
|
|
|
return { |
|
id: `storage-${Date.now()}-${Math.floor(Math.random() * 1000)}`, |
|
amount, |
|
resourceType: 'storage' |
|
}; |
|
}, |
|
|
|
release: async (resource) => { |
|
const pool = this.resourcePools.get('storage'); |
|
pool.available += resource.amount; |
|
return true; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a resource pool |
|
* @param {string} type - Resource type |
|
* @param {Object} pool - Resource pool object |
|
* @returns {ResourceManager} This manager for chaining |
|
*/ |
|
registerResourcePool(type, pool) { |
|
if (!pool.allocate || !pool.release) { |
|
throw new Error(`Resource pool must implement allocate and release methods`); |
|
} |
|
|
|
this.resourcePools.set(type, pool); |
|
return this; |
|
} |
|
|
|
/** |
|
* Allocate resources for application execution |
|
* @param {Object} bundle - Application bundle |
|
* @param {string} action - Action to execute |
|
* @returns {Promise<Object>} Allocation result |
|
*/ |
|
async allocateForExecution(bundle, action) { |
|
// Determine resource requirements |
|
const requirements = this._determineRequirements(bundle, action); |
|
|
|
// Optimize allocation for coherence |
|
const allocation = await this.coherenceOptimizer.optimize(requirements, { |
|
bundle, |
|
action, |
|
pools: this.resourcePools |
|
}); |
|
|
|
// Perform actual allocation |
|
const resources = {}; |
|
const usage = {}; |
|
|
|
for (const [type, amount] of Object.entries(allocation)) { |
|
const pool = this.resourcePools.get(type); |
|
if (!pool) { |
|
throw new Error(`Resource pool not found: ${type}`); |
|
} |
|
|
|
const allocated = await pool.allocate(amount); |
|
resources[type] = allocated; |
|
usage[type] = amount; |
|
} |
|
|
|
// Generate allocation ID |
|
const id = `alloc-${Date.now()}-${Math.floor(Math.random() * 10000)}`; |
|
|
|
// Record allocation |
|
this.allocations.set(id, { |
|
id, |
|
resources, |
|
usage, |
|
timestamp: Date.now(), |
|
bundle: bundle.id, |
|
action |
|
}); |
|
|
|
return { |
|
id, |
|
resources, |
|
usage |
|
}; |
|
} |
|
|
|
/** |
|
* Release allocated resources |
|
* @param {string} allocationId - Allocation ID |
|
* @returns {Promise<boolean>} True if released |
|
*/ |
|
async release(allocationId) { |
|
const allocation = this.allocations.get(allocationId); |
|
if (!allocation) { |
|
throw new Error(`Allocation not found: ${allocationId}`); |
|
} |
|
|
|
// Release each resource |
|
for (const [type, resource] of Object.entries(allocation.resources)) { |
|
const pool = this.resourcePools.get(type); |
|
await pool.release(resource); |
|
} |
|
|
|
// Remove allocation record |
|
this.allocations.delete(allocationId); |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* Get resource usage statistics |
|
* @returns {Object} Resource usage stats |
|
*/ |
|
getResourceUsage() { |
|
const usage = {}; |
|
|
|
for (const [type, pool] of this.resourcePools.entries()) { |
|
usage[type] = { |
|
total: pool.total, |
|
available: pool.available, |
|
used: pool.total - pool.available, |
|
utilization: ((pool.total - pool.available) / pool.total) * 100 |
|
}; |
|
} |
|
|
|
return usage; |
|
} |
|
|
|
/** |
|
* Determine resource requirements for an action |
|
* @private |
|
* @param {Object} bundle - Application bundle |
|
* @param {string} action - Action to execute |
|
* @returns {Object} Resource requirements |
|
*/ |
|
_determineRequirements(bundle, action) { |
|
// Check for explicit requirements in bundle metadata |
|
if (bundle.meta.resources && bundle.meta.resources[action]) { |
|
return bundle.meta.resources[action]; |
|
} |
|
|
|
// Default requirements based on action complexity |
|
const actionFn = bundle.actions[action]; |
|
const complexity = this._estimateComplexity(actionFn); |
|
|
|
return { |
|
cpu: 5 + complexity * 5, // 5-25 CPU units |
|
memory: 10 + complexity * 20, // 10-110 memory units |
|
storage: 5 + complexity * 10 // 5-55 storage units |
|
}; |
|
} |
|
|
|
/** |
|
* Estimate complexity of an action |
|
* @private |
|
* @param {function} actionFn - Action function |
|
* @returns {number} Complexity estimate (0-4) |
|
*/ |
|
_estimateComplexity(actionFn) { |
|
// In a reference implementation, we can't analyze function code |
|
// In a real implementation, this would analyze the function to estimate complexity |
|
|
|
// For this reference, just return a random complexity between 0 and 4 |
|
return Math.floor(Math.random() * 5); |
|
} |
|
} |
|
|
|
/** |
|
* Resource Coherence Optimizer |
|
* Optimizes resource allocation for coherence |
|
*/ |
|
class ResourceCoherenceOptimizer { |
|
/** |
|
* Create a new resource coherence optimizer |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.strategies = new Map(); |
|
this.defaultStrategy = config.defaultStrategy || 'balanced'; |
|
|
|
// Initialize standard optimization strategies |
|
this._initializeStrategies(); |
|
} |
|
|
|
/** |
|
* Initialize standard optimization strategies |
|
* @private |
|
*/ |
|
_initializeStrategies() { |
|
// Minimal strategy - allocate minimum resources |
|
this.registerStrategy('minimal', async (requirements, context) => { |
|
const result = {}; |
|
|
|
for (const [type, amount] of Object.entries(requirements)) { |
|
// Allocate minimum resources (80% of requested) |
|
result[type] = Math.ceil(amount * 0.8); |
|
} |
|
|
|
return result; |
|
}); |
|
|
|
// Balanced strategy - allocate requested resources |
|
this.registerStrategy('balanced', async (requirements, context) => { |
|
return { ...requirements }; |
|
}); |
|
|
|
// Performance strategy - allocate extra resources |
|
this.registerStrategy('performance', async (requirements, context) => { |
|
const result = {}; |
|
|
|
for (const [type, amount] of Object.entries(requirements)) { |
|
// Allocate extra resources (120% of requested) |
|
result[type] = Math.ceil(amount * 1.2); |
|
} |
|
|
|
return result; |
|
}); |
|
|
|
// Adaptive strategy - allocate based on system load |
|
this.registerStrategy('adaptive', async (requirements, context) => { |
|
const result = {}; |
|
|
|
for (const [type, amount] of Object.entries(requirements)) { |
|
const pool = context.pools.get(type); |
|
if (!pool) { |
|
result[type] = amount; |
|
continue; |
|
} |
|
|
|
// Calculate utilization |
|
const utilization = (pool.total - pool.available) / pool.total; |
|
|
|
if (utilization > 0.8) { |
|
// High load - allocate minimum |
|
result[type] = Math.ceil(amount * 0.8); |
|
} else if (utilization > 0.5) { |
|
// Medium load - allocate requested |
|
result[type] = amount; |
|
} else { |
|
// Low load - allocate extra |
|
result[type] = Math.ceil(amount * 1.2); |
|
} |
|
} |
|
|
|
return result; |
|
}); |
|
} |
|
|
|
/** |
|
* Register an optimization strategy |
|
* @param {string} name - Strategy name |
|
* @param {function} strategyFn - Strategy function |
|
* @returns {ResourceCoherenceOptimizer} This optimizer for chaining |
|
*/ |
|
registerStrategy(name, strategyFn) { |
|
this.strategies.set(name, strategyFn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Optimize resource allocation |
|
* @param {Object} requirements - Resource requirements |
|
* @param {Object} context - Optimization context |
|
* @returns {Promise<Object>} Optimized allocation |
|
*/ |
|
async optimize(requirements, context) { |
|
// Determine which strategy to use |
|
let strategyName = this.defaultStrategy; |
|
|
|
// Check if bundle specifies a preferred strategy |
|
if (context.bundle.meta.resourceStrategy) { |
|
strategyName = context.bundle.meta.resourceStrategy; |
|
} |
|
|
|
// Check if strategy exists |
|
if (!this.strategies.has(strategyName)) { |
|
strategyName = this.defaultStrategy; |
|
} |
|
|
|
// Apply the strategy |
|
const strategy = this.strategies.get(strategyName); |
|
const allocation = await strategy(requirements, context); |
|
|
|
// Validate allocation |
|
this._validateAllocation(allocation, context); |
|
|
|
return allocation; |
|
} |
|
|
|
/** |
|
* Validate an allocation |
|
* @private |
|
* @param {Object} allocation - Resource allocation |
|
* @param {Object} context - Optimization context |
|
*/ |
|
_validateAllocation(allocation, context) { |
|
// Check that all required resource types are allocated |
|
for (const type of Object.keys(context.pools)) { |
|
if (!allocation[type]) { |
|
allocation[type] = 1; // Default minimum allocation |
|
} |
|
} |
|
|
|
// Check for sufficient resources |
|
for (const [type, amount] of Object.entries(allocation)) { |
|
const pool = context.pools.get(type); |
|
if (!pool) continue; |
|
|
|
if (amount > pool.available) { |
|
throw new Error(`Insufficient ${type} resources: ${pool.available} < ${amount}`); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Application Manager for Base2 |
|
* Handles application bundles |
|
*/ |
|
class ApplicationManager { |
|
/** |
|
* Create a new application manager |
|
* @param {Base2} kernel - Kernel instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(kernel, config = {}) { |
|
this.kernel = kernel; |
|
this.bundles = new Map(); |
|
this.coherenceValidator = new ApplicationCoherenceValidator(config.validation || {}); |
|
this.storage = config.storage || this._createDefaultStorage(); |
|
} |
|
|
|
/** |
|
* Create default storage backend |
|
* @private |
|
* @returns {Object} Storage interface |
|
*/ |
|
_createDefaultStorage() { |
|
// In-memory storage for reference implementation |
|
const bundleStorage = new Map(); |
|
|
|
return { |
|
load: async (bundleId) => { |
|
if (bundleStorage.has(bundleId)) { |
|
return bundleStorage.get(bundleId); |
|
} |
|
return null; |
|
}, |
|
|
|
store: async (bundleId, bundleData) => { |
|
bundleStorage.set(bundleId, bundleData); |
|
return true; |
|
}, |
|
|
|
remove: async (bundleId) => { |
|
return bundleStorage.delete(bundleId); |
|
}, |
|
|
|
list: async () => { |
|
return Array.from(bundleStorage.keys()); |
|
} |
|
}; |
|
} |
|
|
|
/** |
|
* Get application bundle by ID |
|
* @param {string} bundleId - Bundle ID |
|
* @param {boolean} skipValidation - Skip coherence validation |
|
* @returns {Promise<Object>} Application bundle |
|
*/ |
|
async getBundle(bundleId, skipValidation = false) { |
|
// Check in-memory cache |
|
if (this.bundles.has(bundleId)) { |
|
return this.bundles.get(bundleId); |
|
} |
|
|
|
// Load from storage |
|
try { |
|
const bundleData = await this.storage.load(bundleId); |
|
|
|
if (!bundleData) { |
|
return null; |
|
} |
|
|
|
// Parse and validate bundle |
|
const bundle = this._parseBundle(bundleData); |
|
|
|
// Validate bundle coherence |
|
if (!skipValidation) { |
|
const coherence = await this.coherenceValidator.validateBundle(bundle); |
|
if (coherence < this.kernel.config.coherenceThreshold) { |
|
throw new Error( |
|
`Bundle ${bundleId} failed coherence validation: ${coherence}` |
|
); |
|
} |
|
} |
|
|
|
// Cache bundle |
|
this.bundles.set(bundleId, bundle); |
|
|
|
return bundle; |
|
} catch (error) { |
|
throw new Error(`Failed to load bundle ${bundleId}: ${error.message}`); |
|
} |
|
} |
|
|
|
/** |
|
* Create a new application bundle |
|
* @param {Object} bundleSpec - Bundle specification |
|
* @returns {Promise<Object>} Created bundle |
|
*/ |
|
async createBundle(bundleSpec) { |
|
// Validate bundle specification |
|
this._validateBundleSpec(bundleSpec); |
|
|
|
// Create bundle object |
|
const bundle = new ApplicationBundle(bundleSpec.id, bundleSpec); |
|
|
|
// Validate bundle coherence |
|
const coherence = await this.coherenceValidator.validateBundle(bundle); |
|
if (coherence < this.kernel.config.coherenceThreshold) { |
|
throw new Error( |
|
`Bundle ${bundleSpec.id} failed coherence validation: ${coherence}` |
|
); |
|
} |
|
|
|
// Store bundle |
|
await this.storage.store(bundleSpec.id, this._serializeBundle(bundle)); |
|
|
|
// Cache bundle |
|
this.bundles.set(bundleSpec.id, bundle); |
|
|
|
return bundle; |
|
} |
|
|
|
/** |
|
* Remove an application bundle |
|
* @param {string} bundleId - Bundle ID |
|
* @returns {Promise<boolean>} True if removed |
|
*/ |
|
async removeBundle(bundleId) { |
|
// Remove from cache |
|
this.bundles.delete(bundleId); |
|
|
|
// Remove from storage |
|
return await this.storage.remove(bundleId); |
|
} |
|
|
|
/** |
|
* Execute an action within an application bundle |
|
* @param {Object} bundle - Application bundle |
|
* @param {string} action - Action to execute |
|
* @param {Object} parameters - Action parameters |
|
* @param {Object} resources - Allocated resources |
|
* @returns {Promise<*>} Action result |
|
*/ |
|
async executeAction(bundle, action, parameters, resources) { |
|
// Validate action exists |
|
if (!bundle.actions || !bundle.actions[action]) { |
|
throw new Error(`Action not found in bundle: ${action}`); |
|
} |
|
|
|
// Prepare execution context |
|
const context = this._createExecutionContext(bundle, resources); |
|
|
|
// Execute the action |
|
return await bundle.actions[action](parameters, context); |
|
} |
|
|
|
/** |
|
* Create execution context for an action |
|
* @private |
|
* @param {Object} bundle - Application bundle |
|
* @param {Object} resources - Allocated resources |
|
* @returns {Object} Execution context |
|
*/ |
|
_createExecutionContext(bundle, resources) { |
|
return { |
|
bundleId: bundle.id, |
|
meta: bundle.meta, |
|
resources: bundle.invariant.resources, |
|
state: bundle.variant.state, |
|
schemas: bundle.invariant.schemas, |
|
allocatedResources: resources, |
|
|
|
// System services |
|
services: { |
|
storage: { |
|
get: async (key) => { |
|
const fullKey = `${bundle.id}:${key}`; |
|
const storageService = this.kernel.systemManager.getService('storage'); |
|
return await storageService.read(fullKey); |
|
}, |
|
put: async (key, value) => { |
|
const fullKey = `${bundle.id}:${key}`; |
|
const storageService = this.kernel.systemManager.getService('storage'); |
|
return await storageService.write(fullKey, value); |
|
}, |
|
remove: async (key) => { |
|
const fullKey = `${bundle.id}:${key}`; |
|
const storageService = this.kernel.systemManager.getService('storage'); |
|
return await storageService.delete(fullKey); |
|
}, |
|
list: async (prefix) => { |
|
const fullPrefix = `${bundle.id}:${prefix}`; |
|
const storageService = this.kernel.systemManager.getService('storage'); |
|
const keys = await storageService.list(fullPrefix); |
|
|
|
// Remove bundle ID prefix from keys |
|
return keys.map(key => key.substring(bundle.id.length + 1)); |
|
} |
|
}, |
|
coherence: { |
|
measure: async () => { |
|
const coherenceService = this.kernel.systemManager.getService('coherence'); |
|
return await coherenceService.measure(); |
|
}, |
|
validate: async (obj, threshold) => { |
|
const coherenceService = this.kernel.systemManager.getService('coherence'); |
|
return await coherenceService.validate(obj, threshold); |
|
} |
|
} |
|
} |
|
}; |
|
} |
|
|
|
/** |
|
* Parse a bundle from serialized data |
|
* @private |
|
* @param {Object} bundleData - Serialized bundle data |
|
* @returns {Object} Application bundle |
|
*/ |
|
_parseBundle(bundleData) { |
|
if (!bundleData || !bundleData.id) { |
|
throw new Error("Invalid bundle data"); |
|
} |
|
|
|
// Create bundle object from serialized data |
|
return new ApplicationBundle(bundleData.id, bundleData); |
|
} |
|
|
|
/** |
|
* Serialize a bundle for storage |
|
* @private |
|
* @param {Object} bundle - Application bundle |
|
* @returns {Object} Serialized bundle |
|
*/ |
|
_serializeBundle(bundle) { |
|
// Basic serialization for reference implementation |
|
// In a real implementation, this would handle code serialization better |
|
|
|
return { |
|
id: bundle.id, |
|
meta: bundle.meta, |
|
invariant: { |
|
resources: bundle.invariant.resources, |
|
schemas: bundle.invariant.schemas, |
|
// Code is not easily serializable, so we'd handle this differently |
|
// in a real implementation |
|
codeSignatures: Object.keys(bundle.invariant.code || {}) |
|
}, |
|
variant: { |
|
preferences: bundle.variant.preferences |
|
} |
|
}; |
|
} |
|
|
|
/** |
|
* Validate a bundle specification |
|
* @private |
|
* @param {Object} spec - Bundle specification |
|
*/ |
|
_validateBundleSpec(spec) { |
|
if (!spec.id) { |
|
throw new Error("Bundle must have an ID"); |
|
} |
|
|
|
if (!spec.name) { |
|
throw new Error("Bundle must have a name"); |
|
} |
|
|
|
if (!spec.version) { |
|
throw new Error("Bundle must have a version"); |
|
} |
|
|
|
// Validate bundle ID format |
|
if (!/^[a-zA-Z0-9._-]+$/.test(spec.id)) { |
|
throw new Error("Bundle ID must contain only alphanumeric characters, dots, hyphens, and underscores"); |
|
} |
|
|
|
// Validate code if present |
|
if (spec.code) { |
|
if (typeof spec.code !== 'object') { |
|
throw new Error("Bundle code must be an object"); |
|
} |
|
|
|
// Validate code functions |
|
for (const [name, fn] of Object.entries(spec.code)) { |
|
if (typeof fn !== 'function') { |
|
throw new Error(`Bundle code '${name}' must be a function`); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Application Coherence Validator |
|
* Validates coherence of application bundles |
|
*/ |
|
class ApplicationCoherenceValidator { |
|
/** |
|
* Create a new application coherence validator |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.rules = new Map(); |
|
|
|
// Initialize standard validation rules |
|
this._initializeRules(); |
|
} |
|
|
|
/** |
|
* Initialize standard validation rules |
|
* @private |
|
*/ |
|
_initializeRules() { |
|
// Meta section validation |
|
this.registerRule('meta', (bundle) => { |
|
if (!bundle.meta) return 0; |
|
|
|
let score = 0; |
|
|
|
// Required fields |
|
if (bundle.meta.id) score += 0.2; |
|
if (bundle.meta.name) score += 0.2; |
|
if (bundle.meta.version) score += 0.2; |
|
|
|
// Optional fields |
|
if (bundle.meta.description) score += 0.1; |
|
if (bundle.meta.interfaces && Object.keys(bundle.meta.interfaces).length > 0) score += 0.2; |
|
if (bundle.meta.dependencies && Array.isArray(bundle.meta.dependencies)) score += 0.1; |
|
|
|
return score; |
|
}); |
|
|
|
// Invariant section validation |
|
this.registerRule('invariant', (bundle) => { |
|
if (!bundle.invariant) return 0; |
|
|
|
let score = 0; |
|
|
|
// Code |
|
if (bundle.invariant.code && typeof bundle.invariant.code === 'object') { |
|
score += 0.3; |
|
|
|
// Check if code contains functions |
|
const functions = Object.values(bundle.invariant.code).filter(v => typeof v === 'function'); |
|
if (functions.length > 0) score += 0.2; |
|
} |
|
|
|
// Resources |
|
if (bundle.invariant.resources && typeof bundle.invariant.resources === 'object') { |
|
score += 0.2; |
|
} |
|
|
|
// Schemas |
|
if (bundle.invariant.schemas && typeof bundle.invariant.schemas === 'object') { |
|
score += 0.2; |
|
} |
|
|
|
// Transforms |
|
if (bundle.invariant.transforms && typeof bundle.invariant.transforms === 'object') { |
|
score += 0.1; |
|
} |
|
|
|
return score; |
|
}); |
|
|
|
// Variant section validation |
|
this.registerRule('variant', (bundle) => { |
|
if (!bundle.variant) return 0; |
|
|
|
let score = 0; |
|
|
|
// State |
|
if (bundle.variant.state && typeof bundle.variant.state === 'object') { |
|
score += 0.3; |
|
} |
|
|
|
// Cache |
|
if (bundle.variant.cache && typeof bundle.variant.cache === 'object') { |
|
score += 0.3; |
|
} |
|
|
|
// Preferences |
|
if (bundle.variant.preferences && typeof bundle.variant.preferences === 'object') { |
|
score += 0.4; |
|
} |
|
|
|
return score; |
|
}); |
|
|
|
// Actions validation |
|
this.registerRule('actions', (bundle) => { |
|
if (!bundle.actions) return 0; |
|
|
|
let score = 0; |
|
|
|
// Check if actions object exists |
|
if (typeof bundle.actions === 'object') { |
|
score += 0.3; |
|
|
|
// Check if it has any functions |
|
const actionCount = Object.values(bundle.actions).filter(v => typeof v === 'function').length; |
|
if (actionCount > 0) { |
|
score += 0.7 * Math.min(1, actionCount / 3); // Scale up to 3 actions |
|
} |
|
} |
|
|
|
return score; |
|
}); |
|
|
|
// Interface coherence - check if declared interfaces match actions |
|
this.registerRule('interfaces', (bundle) => { |
|
if (!bundle.meta || !bundle.meta.interfaces || !bundle.actions) return 0; |
|
|
|
let score = 0; |
|
const interfaces = bundle.meta.interfaces; |
|
const actions = bundle.actions; |
|
|
|
// Count matching interfaces |
|
let matchCount = 0; |
|
let totalInterfaces = Object.keys(interfaces).length; |
|
|
|
if (totalInterfaces === 0) return 0.5; // Neutral score if no interfaces declared |
|
|
|
for (const name of Object.keys(interfaces)) { |
|
if (typeof actions[name] === 'function') { |
|
matchCount++; |
|
} |
|
} |
|
|
|
// Calculate match ratio |
|
score = matchCount / totalInterfaces; |
|
|
|
return score; |
|
}); |
|
} |
|
|
|
/** |
|
* Register a validation rule |
|
* @param {string} name - Rule name |
|
* @param {function} ruleFn - Rule function |
|
* @returns {ApplicationCoherenceValidator} This validator for chaining |
|
*/ |
|
registerRule(name, ruleFn) { |
|
this.rules.set(name, ruleFn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Validate coherence of an application bundle |
|
* @param {Object} bundle - Application bundle |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async validateBundle(bundle) { |
|
if (!bundle) return 0; |
|
|
|
const scores = []; |
|
const weights = []; |
|
|
|
// Apply all rules |
|
for (const [name, ruleFn] of this.rules.entries()) { |
|
try { |
|
const score = ruleFn(bundle); |
|
scores.push(score); |
|
|
|
// Set weights based on rule importance |
|
let weight = 1.0; |
|
|
|
switch (name) { |
|
case 'meta': |
|
weight = 1.0; |
|
break; |
|
case 'invariant': |
|
weight = 1.5; |
|
break; |
|
case 'variant': |
|
weight = 0.8; |
|
break; |
|
case 'actions': |
|
weight = 2.0; |
|
break; |
|
case 'interfaces': |
|
weight = 1.2; |
|
break; |
|
} |
|
|
|
weights.push(weight); |
|
} catch (error) { |
|
console.error(`Error in validation rule ${name}:`, error); |
|
scores.push(0); |
|
weights.push(1.0); |
|
} |
|
} |
|
|
|
// Calculate weighted average |
|
let totalWeight = 0; |
|
let weightedSum = 0; |
|
|
|
for (let i = 0; i < scores.length; i++) { |
|
weightedSum += scores[i] * weights[i]; |
|
totalWeight += weights[i]; |
|
} |
|
|
|
return totalWeight > 0 ? weightedSum / totalWeight : 0; |
|
} |
|
} |
|
|
|
/** |
|
* Application Bundle |
|
* Represents a deployable application package |
|
*/ |
|
class ApplicationBundle { |
|
/** |
|
* Create a new application bundle |
|
* @param {string} id - Bundle ID |
|
* @param {Object} spec - Bundle specification |
|
*/ |
|
constructor(id, spec) { |
|
this.id = id; |
|
|
|
// Meta component: contextual information |
|
this.meta = { |
|
id: spec.id || id, |
|
name: spec.name, |
|
version: spec.version, |
|
description: spec.description, |
|
dependencies: spec.dependencies || [], |
|
interfaces: spec.interfaces || {} |
|
}; |
|
|
|
// Invariant component: static code and resources |
|
this.invariant = { |
|
code: spec.code || {}, |
|
resources: spec.resources || {}, |
|
schemas: spec.schemas || {}, |
|
transforms: spec.transforms || {} |
|
}; |
|
|
|
// Variant component: dynamic state |
|
this.variant = { |
|
state: {}, |
|
cache: {}, |
|
preferences: spec.preferences || {} |
|
}; |
|
|
|
// Actions provided by the bundle |
|
this.actions = {}; |
|
|
|
// Validators for result coherence |
|
this.validators = {}; |
|
|
|
// Initialize actions from code |
|
this._initializeActions(); |
|
} |
|
|
|
/** |
|
* Initialize callable actions from code |
|
* @private |
|
*/ |
|
_initializeActions() { |
|
for (const [name, fn] of Object.entries(this.invariant.code)) { |
|
if (typeof fn === 'function') { |
|
this.actions[name] = async (params, context) => { |
|
// Create action-specific context |
|
const actionContext = { |
|
...context, |
|
meta: this.meta, |
|
resources: this.invariant.resources, |
|
state: this.variant.state, |
|
schemas: this.invariant.schemas |
|
}; |
|
|
|
// Execute the action function |
|
return await fn(params, actionContext); |
|
}; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Get bundle interface for external use |
|
* @returns {Object} External interface |
|
*/ |
|
getInterface() { |
|
const interface = {}; |
|
|
|
// Expose only the declared interfaces |
|
for (const [name, spec] of Object.entries(this.meta.interfaces)) { |
|
if (this.actions[name]) { |
|
interface[name] = async (params) => this.actions[name](params, {}); |
|
} |
|
} |
|
|
|
return interface; |
|
} |
|
|
|
/** |
|
* Register a result validator |
|
* @param {string} actionName - Action name |
|
* @param {function} validatorFn - Validator function |
|
* @returns {ApplicationBundle} This bundle for chaining |
|
*/ |
|
registerValidator(actionName, validatorFn) { |
|
this.validators[actionName] = validatorFn; |
|
return this; |
|
} |
|
} |
|
|
|
/** |
|
* System Manager for Base2 |
|
* Provides core services |
|
*/ |
|
class SystemManager { |
|
/** |
|
* Create a new system manager |
|
* @param {Base2} kernel - Kernel instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(kernel, config = {}) { |
|
this.kernel = kernel; |
|
this.services = new Map(); |
|
this.coherenceMonitor = new CoherenceMonitor(config.coherence || {}); |
|
|
|
// Initialize core services |
|
this._initializeServices(); |
|
} |
|
|
|
/** |
|
* Initialize core services |
|
* @private |
|
*/ |
|
_initializeServices() { |
|
// Memory service |
|
this.registerService('memory', { |
|
allocate: (size) => this.initializeMemory(size), |
|
free: (memory) => { /* memory cleanup logic */ }, |
|
stats: () => ({ |
|
available: 1024 * 1024 * 1024, // Mock 1GB available |
|
used: 256 * 1024 * 1024 // Mock 256MB used |
|
}) |
|
}); |
|
|
|
// Storage service |
|
this.registerService('storage', { |
|
read: async (key) => { |
|
// Mock storage implementation |
|
return { key, value: `mock-value-for-${key}` }; |
|
}, |
|
write: async (key, value) => { |
|
// Mock storage implementation |
|
return { key, stored: true }; |
|
}, |
|
delete: async (key) => { |
|
// Mock storage implementation |
|
return { key, deleted: true }; |
|
}, |
|
list: async (prefix) => { |
|
// Mock storage implementation |
|
return [ |
|
`${prefix}-1`, |
|
`${prefix}-2`, |
|
`${prefix}-3` |
|
]; |
|
} |
|
}); |
|
|
|
// Coherence service |
|
this.registerService('coherence', { |
|
measure: async () => this.measureCoherence(), |
|
validate: async (obj, threshold = 0.8) => { |
|
const coherence = await this.coherenceMonitor.measureObject(obj); |
|
return { |
|
coherence, |
|
valid: coherence >= threshold, |
|
threshold |
|
}; |
|
} |
|
}); |
|
|
|
// Scheduler service |
|
this.registerService('scheduler', { |
|
schedule: async (task, options) => { |
|
// Mock scheduler implementation |
|
return { |
|
id: `task-${Date.now()}`, |
|
scheduled: true, |
|
executionTime: Date.now() + (options.delay || 0) |
|
}; |
|
}, |
|
cancel: async (taskId) => { |
|
// Mock cancel implementation |
|
return { id: taskId, cancelled: true }; |
|
}, |
|
list: async () => { |
|
// Mock task list |
|
return [ |
|
{ id: 'task-1', status: 'pending' }, |
|
{ id: 'task-2', status: 'running' } |
|
]; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Get a system service |
|
* @param {string} name - Service name |
|
* @returns {Object} Service object |
|
*/ |
|
getService(name) { |
|
if (!this.services.has(name)) { |
|
throw new Error(`Service not found: ${name}`); |
|
} |
|
|
|
return this.services.get(name); |
|
} |
|
|
|
/** |
|
* Register a system service |
|
* @param {string} name - Service name |
|
* @param {Object} service - Service object |
|
* @returns {SystemManager} This manager for chaining |
|
*/ |
|
registerService(name, service) { |
|
// Validate service interface |
|
this._validateService(name, service); |
|
|
|
// Add to services |
|
this.services.set(name, service); |
|
|
|
return this; |
|
} |
|
|
|
/** |
|
* Measure system coherence |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async measureCoherence() { |
|
return this.coherenceMonitor.measureGlobal(); |
|
} |
|
|
|
/** |
|
* Initialize memory with Kahan summation for numerical stability |
|
* @param {number} size - Memory size |
|
* @returns {Object} Memory object |
|
*/ |
|
initializeMemory(size) { |
|
let memory = new Float64Array(size); |
|
let compensation = new Float64Array(size); |
|
|
|
return { |
|
memory, |
|
compensation, |
|
|
|
// Read value |
|
read: (index) => { |
|
if (index < 0 || index >= size) { |
|
throw new Error(`Memory index out of bounds: ${index}`); |
|
} |
|
return memory[index]; |
|
}, |
|
|
|
// Write value with Kahan summation for numerical stability |
|
write: (index, value) => { |
|
if (index < 0 || index >= size) { |
|
throw new Error(`Memory index out of bounds: ${index}`); |
|
} |
|
|
|
// Kahan summation for numerical stability |
|
const y = value - compensation[index]; |
|
const t = memory[index] + y; |
|
compensation[index] = (t - memory[index]) - y; |
|
memory[index] = t; |
|
}, |
|
|
|
// Fill range with value |
|
fill: (value, start = 0, end = size) => { |
|
if (start < 0 || end > size || start >= end) { |
|
throw new Error(`Invalid range: ${start}-${end}`); |
|
} |
|
|
|
for (let i = start; i < end; i++) { |
|
memory[i] = value; |
|
compensation[i] = 0; |
|
} |
|
}, |
|
|
|
// Get memory size |
|
size: () => size |
|
}; |
|
} |
|
|
|
/** |
|
* Validate a service interface |
|
* @private |
|
* @param {string} name - Service name |
|
* @param {Object} service - Service object |
|
*/ |
|
_validateService(name, service) { |
|
// Basic validation - ensure service is an object |
|
if (typeof service !== 'object' || service === null) { |
|
throw new Error(`Invalid service '${name}': must be an object`); |
|
} |
|
|
|
// Validate required methods based on service type |
|
switch (name) { |
|
case 'memory': |
|
this._validateMethods(service, ['allocate', 'free', 'stats']); |
|
break; |
|
|
|
case 'storage': |
|
this._validateMethods(service, ['read', 'write', 'delete', 'list']); |
|
break; |
|
|
|
case 'coherence': |
|
this._validateMethods(service, ['measure', 'validate']); |
|
break; |
|
|
|
case 'scheduler': |
|
this._validateMethods(service, ['schedule', 'cancel', 'list']); |
|
break; |
|
} |
|
} |
|
|
|
/** |
|
* Validate that an object has the required methods |
|
* @private |
|
* @param {Object} obj - Object to validate |
|
* @param {string[]} methods - Required method names |
|
*/ |
|
_validateMethods(obj, methods) { |
|
for (const method of methods) { |
|
if (typeof obj[method] !== 'function') { |
|
throw new Error(`Missing required method: ${method}`); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Coherence Monitor |
|
* Monitors and measures system coherence |
|
*/ |
|
class CoherenceMonitor { |
|
/** |
|
* Create a new coherence monitor |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.samplingRate = config.samplingRate || 0.1; |
|
this.historySize = config.historySize || 100; |
|
this.coherenceHistory = []; |
|
this.componentMonitors = new Map(); |
|
|
|
// Initialize standard component monitors |
|
this._initializeComponentMonitors(); |
|
} |
|
|
|
/** |
|
* Initialize standard component monitors |
|
* @private |
|
*/ |
|
_initializeComponentMonitors() { |
|
// Resource coherence |
|
this.registerComponentMonitor('resources', { |
|
measure: (state) => { |
|
// If no state available, return perfect coherence |
|
if (!state || !state.resources) return 1.0; |
|
|
|
const resources = state.resources; |
|
|
|
// Check for negative resource counts (indicates incoherence) |
|
let negativeCounts = 0; |
|
|
|
for (const [type, resource] of resources.entries()) { |
|
if (resource.available < 0 || resource.allocated < 0) { |
|
negativeCounts++; |
|
} |
|
} |
|
|
|
if (resources.size === 0) return 1.0; |
|
|
|
// Scale coherence based on negative counts |
|
return 1.0 - (negativeCounts / resources.size); |
|
} |
|
}); |
|
|
|
// Memory coherence |
|
this.registerComponentMonitor('memory', { |
|
measure: (state) => { |
|
// If no memory stats available, return perfect coherence |
|
if (!state || !state.memoryStats) return 1.0; |
|
|
|
const { available, used, total } = state.memoryStats; |
|
|
|
// Check for memory accounting errors |
|
if (available + used > total * 1.01) { // Allow 1% error margin |
|
return 0.5; // Significant incoherence |
|
} |
|
|
|
// Memory usage should be within limits |
|
if (used > total) { |
|
return 0.0; // Complete incoherence |
|
} |
|
|
|
// Good coherence |
|
return 1.0; |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a component monitor |
|
* @param {string} name - Component name |
|
* @param {Object} monitor - Component monitor |
|
* @returns {CoherenceMonitor} This monitor for chaining |
|
*/ |
|
registerComponentMonitor(name, monitor) { |
|
if (typeof monitor.measure !== 'function') { |
|
throw new Error(`Component monitor must have a measure function`); |
|
} |
|
|
|
this.componentMonitors.set(name, monitor); |
|
return this; |
|
} |
|
|
|
/** |
|
* Measure global system coherence |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async measureGlobal() { |
|
// Collect state for coherence measurement |
|
const state = await this._collectState(); |
|
|
|
// Measure component coherence |
|
const componentCoherences = []; |
|
|
|
for (const [name, monitor] of this.componentMonitors.entries()) { |
|
try { |
|
const coherence = monitor.measure(state); |
|
componentCoherences.push({ name, coherence }); |
|
} catch (error) { |
|
console.error(`Error measuring coherence for ${name}:`, error); |
|
componentCoherences.push({ name, coherence: 0.5 }); // Default to medium coherence on error |
|
} |
|
} |
|
|
|
// Calculate weighted coherence |
|
let totalCoherence = 0; |
|
let weightSum = 0; |
|
|
|
for (const component of componentCoherences) { |
|
let weight = 1.0; |
|
|
|
// Assign weights based on importance |
|
switch (component.name) { |
|
case 'resources': |
|
weight = 2.0; |
|
break; |
|
case 'memory': |
|
weight = 1.5; |
|
break; |
|
} |
|
|
|
totalCoherence += component.coherence * weight; |
|
weightSum += weight; |
|
} |
|
|
|
// Compute final coherence |
|
const globalCoherence = weightSum > 0 ? totalCoherence / weightSum : 1.0; |
|
|
|
// Add to history |
|
this.coherenceHistory.push({ |
|
timestamp: Date.now(), |
|
coherence: globalCoherence, |
|
components: componentCoherences |
|
}); |
|
|
|
// Trim history if needed |
|
if (this.coherenceHistory.length > this.historySize) { |
|
this.coherenceHistory = this.coherenceHistory.slice(-this.historySize); |
|
} |
|
|
|
return globalCoherence; |
|
} |
|
|
|
/** |
|
* Measure coherence of a specific object |
|
* @param {*} obj - Object to measure |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async measureObject(obj) { |
|
if (obj === null || obj === undefined) { |
|
return 1.0; // Null/undefined are coherent with themselves |
|
} |
|
|
|
if (typeof obj !== 'object') { |
|
return 1.0; // Primitive values are perfectly coherent |
|
} |
|
|
|
// For objects, check internal consistency |
|
try { |
|
// Calculate object properties size consistency |
|
const propertyCoherence = this._calculatePropertyCoherence(obj); |
|
|
|
// Check for circular references (decreases coherence) |
|
const circularCoherence = this._checkCircularReferences(obj) ? 0.7 : 1.0; |
|
|
|
// Check type consistency for array elements |
|
const typeCoherence = Array.isArray(obj) ? this._calculateArrayTypeCoherence(obj) : 1.0; |
|
|
|
// Combine coherence measures |
|
return 0.4 * propertyCoherence + 0.3 * circularCoherence + 0.3 * typeCoherence; |
|
} catch (error) { |
|
console.error("Error measuring object coherence:", error); |
|
return 0.5; // Default to medium coherence on error |
|
} |
|
} |
|
|
|
/** |
|
* Collect system state for coherence measurement |
|
* @private |
|
* @returns {Promise<Object>} System state |
|
*/ |
|
async _collectState() { |
|
// In a real implementation, this would collect actual system state |
|
// For the reference implementation, we create mock state |
|
|
|
return { |
|
resources: new Map([ |
|
['cpu', { available: 90, allocated: 10, total: 100 }], |
|
['memory', { available: 800, allocated: 200, total: 1000 }], |
|
['storage', { available: 9000, allocated: 1000, total: 10000 }] |
|
]), |
|
|
|
memoryStats: { |
|
available: 800, |
|
used: 200, |
|
total: 1000 |
|
}, |
|
|
|
// Use sampling to avoid measuring everything |
|
sampling: this.samplingRate |
|
}; |
|
} |
|
|
|
/** |
|
* Calculate property coherence for an object |
|
* @private |
|
* @param {Object} obj - Object to check |
|
* @returns {number} Property coherence |
|
*/ |
|
_calculatePropertyCoherence(obj) { |
|
if (!obj || typeof obj !== 'object') return 1.0; |
|
|
|
// Check for property size reasonableness |
|
const keys = Object.keys(obj); |
|
|
|
// Extremely large objects might indicate an issue |
|
if (keys.length > 10000) return 0.5; |
|
|
|
// Check property name patterns |
|
let unusualNames = 0; |
|
|
|
for (const key of keys) { |
|
// Check for unusual property naming (empty, very long, or non-alphanumeric) |
|
if (key === '' || key.length > 50 || !/^[a-zA-Z0-9_]+$/.test(key)) { |
|
unusualNames++; |
|
} |
|
} |
|
|
|
// Calculate unusual name ratio |
|
const unusualRatio = keys.length > 0 ? unusualNames / keys.length : 0; |
|
|
|
// Higher coherence for fewer unusual names |
|
return 1.0 - unusualRatio; |
|
} |
|
|
|
/** |
|
* Check for circular references in an object |
|
* @private |
|
* @param {Object} obj - Object to check |
|
* @returns {boolean} True if circular references found |
|
*/ |
|
_checkCircularReferences(obj) { |
|
try { |
|
JSON.stringify(obj); |
|
return false; // No circular references |
|
} catch (error) { |
|
if (error.message.includes('circular')) { |
|
return true; // Circular reference detected |
|
} |
|
// Other error |
|
return false; |
|
} |
|
} |
|
|
|
/** |
|
* Calculate type coherence for array elements |
|
* @private |
|
* @param {Array} arr - Array to check |
|
* @returns {number} Type coherence |
|
*/ |
|
_calculateArrayTypeCoherence(arr) { |
|
if (!Array.isArray(arr) || arr.length === 0) return 1.0; |
|
|
|
// Check if array elements have consistent types |
|
const types = new Map(); |
|
|
|
for (const item of arr) { |
|
const type = typeof item; |
|
types.set(type, (types.get(type) || 0) + 1); |
|
} |
|
|
|
// Perfect coherence if all elements have the same type |
|
if (types.size === 1) return 1.0; |
|
|
|
// Calculate dominant type ratio |
|
let maxCount = 0; |
|
for (const count of types.values()) { |
|
maxCount = Math.max(maxCount, count); |
|
} |
|
|
|
// Higher coherence for more consistent types |
|
return maxCount / arr.length; |
|
} |
|
} |
|
|
|
/** |
|
* Base 2: Kernel (Orchestrator) Implementation |
|
* Functions as the orchestrator of the system |
|
*/ |
|
class Base2 extends Base1 { |
|
/** |
|
* Create a new Base2 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
super(config); |
|
|
|
// Create system manager for core services |
|
this.systemManager = new SystemManager(this, config.system || {}); |
|
|
|
// Create application manager for bundle handling |
|
this.applicationManager = new ApplicationManager(this, config.application || {}); |
|
|
|
// Create resource manager for allocation |
|
this.resourceManager = new ResourceManager(this, config.resource || {}); |
|
|
|
// Create security manager for access control |
|
this.securityManager = new SecurityManager(this, config.security || {}); |
|
} |
|
|
|
/** |
|
* Execute an application |
|
* @param {string} bundleId - Bundle ID to execute |
|
* @param {string} action - Action to execute |
|
* @param {Object} parameters - Action parameters |
|
* @returns {Promise<Object>} Execution result |
|
*/ |
|
async executeApplication(bundleId, action, parameters = {}) { |
|
// Verify security first |
|
await this.securityManager.verifyAccess(bundleId, action); |
|
|
|
// Get application bundle |
|
const bundle = await this.applicationManager.getBundle(bundleId); |
|
if (!bundle) { |
|
throw new Error(`Bundle not found: ${bundleId}`); |
|
} |
|
|
|
// Allocate resources |
|
const resources = await this.resourceManager.allocateForExecution(bundle, action); |
|
|
|
try { |
|
// Execute the application action |
|
const result = await this.applicationManager.executeAction( |
|
bundle, action, parameters, resources |
|
); |
|
|
|
// Validate coherence of the result |
|
const coherence = await this._validateResultCoherence(bundle, action, result); |
|
|
|
return { |
|
result, |
|
coherence, |
|
resources: resources.usage |
|
}; |
|
} finally { |
|
// Release resources |
|
await this.resourceManager.release(resources.id); |
|
} |
|
} |
|
|
|
/** |
|
* Validate result coherence |
|
* @private |
|
* @param {Object} bundle - Application bundle |
|
* @param {string} action - Action that was executed |
|
* @param {*} result - Action result |
|
* @returns {Promise<number>} Coherence value |
|
*/ |
|
async _validateResultCoherence(bundle, action, result) { |
|
// Check if the bundle has a coherence validator for this action |
|
const bundleValidator = bundle.validators && bundle.validators[action]; |
|
if (bundleValidator) { |
|
return bundleValidator(result); |
|
} |
|
|
|
// Use default coherence validation |
|
return this.computeCoherence(); |
|
} |
|
|
|
/** |
|
* System call implementation for Base 3 |
|
* @param {string} name - System call name |
|
* @param {Object} parameters - System call parameters |
|
* @returns {Promise<Object>} System call result |
|
*/ |
|
async syscall(name, parameters = {}) { |
|
// System calls are implemented as internal applications |
|
return this.executeApplication( |
|
'system.core.syscalls', |
|
name, |
|
parameters |
|
); |
|
} |
|
|
|
/** |
|
* Install a bundle |
|
* @param {Object} bundleSpec - Bundle specification |
|
* @returns {Promise<Object>} Installation result |
|
*/ |
|
async installBundle(bundleSpec) { |
|
// Verify bundle specification |
|
if (!bundleSpec.id) { |
|
throw new Error("Bundle must have an ID"); |
|
} |
|
|
|
// Check for existing bundle |
|
const existingBundle = await this.applicationManager.getBundle(bundleSpec.id, true); |
|
if (existingBundle) { |
|
throw new Error(`Bundle already exists: ${bundleSpec.id}`); |
|
} |
|
|
|
// Create and register the bundle |
|
const bundle = await this.applicationManager.createBundle(bundleSpec); |
|
|
|
// Register bundle with security manager |
|
await this.securityManager.registerBundle(bundle); |
|
|
|
return { |
|
id: bundle.id, |
|
installed: true, |
|
interfaces: Object.keys(bundle.meta.interfaces || {}) |
|
}; |
|
} |
|
|
|
/** |
|
* Uninstall a bundle |
|
* @param {string} bundleId - Bundle ID to uninstall |
|
* @returns {Promise<Object>} Uninstallation result |
|
*/ |
|
async uninstallBundle(bundleId) { |
|
// Check if bundle exists |
|
const bundle = await this.applicationManager.getBundle(bundleId, true); |
|
if (!bundle) { |
|
throw new Error(`Bundle not found: ${bundleId}`); |
|
} |
|
|
|
// Unregister bundle from security manager |
|
await this.securityManager.unregisterBundle(bundleId); |
|
|
|
// Remove bundle from application manager |
|
await this.applicationManager.removeBundle(bundleId); |
|
|
|
return { |
|
id: bundleId, |
|
uninstalled: true |
|
}; |
|
} |
|
} |
|
|
|
/** |
|
* Enhanced Representation Model for Base1 |
|
* Extends Base0 representation with additional capabilities |
|
*/ |
|
class EnhancedRepresentationModel { |
|
/** |
|
* Create a new enhanced representation model |
|
* @param {Object} config - Configuration options |
|
* @param {RepresentationModel} baseModel - Base representation model |
|
*/ |
|
constructor(config = {}, baseModel) { |
|
this.baseModel = baseModel; |
|
this.formats = new Map(); |
|
this.transformers = new Map(); |
|
|
|
// Copy formats from base model |
|
for (const [name, format] of baseModel.formats.entries()) { |
|
this.formats.set(name, format); |
|
} |
|
|
|
// Initialize enhanced formats |
|
this._initializeFormats(config); |
|
} |
|
|
|
/** |
|
* Initialize enhanced formats |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_initializeFormats(config) { |
|
// Add structured format (for nested data) |
|
this.registerFormat('structured', { |
|
format: data => { |
|
if (typeof data !== 'object' || data === null) { |
|
return this.baseModel.represent(data, 'standard'); |
|
} |
|
|
|
// Format nested objects with indentation |
|
const formatNested = (obj, indent = 0) => { |
|
const spaces = ' '.repeat(indent); |
|
|
|
if (Array.isArray(obj)) { |
|
const items = obj.map(item => |
|
typeof item === 'object' && item !== null ? |
|
`\n${spaces} ${formatNested(item, indent + 2)}` : |
|
String(item) |
|
); |
|
|
|
return `[${items.join(',')}${items.length > 0 ? `\n${spaces}` : ''}]`; |
|
} else { |
|
const entries = Object.entries(obj).map(([key, value]) => { |
|
const valueStr = typeof value === 'object' && value !== null ? |
|
formatNested(value, indent + 2) : |
|
String(value); |
|
|
|
return `\n${spaces} "${key}": ${valueStr}`; |
|
}); |
|
|
|
return `{${entries.join(',')}${entries.length > 0 ? `\n${spaces}` : ''}}`; |
|
} |
|
}; |
|
|
|
return formatNested(data); |
|
} |
|
}); |
|
|
|
// Add HTML format (for web display) |
|
this.registerFormat('html', { |
|
format: data => { |
|
if (typeof data !== 'object' || data === null) { |
|
return `<pre>${this.baseModel.represent(data, 'standard')}</pre>`; |
|
} |
|
|
|
// Convert to HTML representation |
|
const toHtml = (obj) => { |
|
if (Array.isArray(obj)) { |
|
const items = obj.map(item => |
|
`<li>${typeof item === 'object' && item !== null ? toHtml(item) : String(item)}</li>` |
|
); |
|
return `<ul>${items.join('')}</ul>`; |
|
} else { |
|
const entries = Object.entries(obj).map(([key, value]) => { |
|
const valueHtml = typeof value === 'object' && value !== null ? |
|
toHtml(value) : |
|
String(value); |
|
|
|
return `<tr><td><strong>${key}</strong></td><td>${valueHtml}</td></tr>`; |
|
}); |
|
|
|
return `<table border="1">${entries.join('')}</table>`; |
|
} |
|
}; |
|
|
|
return toHtml(data); |
|
} |
|
}); |
|
|
|
// Add XML format |
|
this.registerFormat('xml', { |
|
format: data => { |
|
if (typeof data !== 'object' || data === null) { |
|
return `<value>${this._escapeXml(String(data))}</value>`; |
|
} |
|
|
|
// Convert to XML representation |
|
const toXml = (obj, rootTag = 'root') => { |
|
if (Array.isArray(obj)) { |
|
const items = obj.map((item, index) => |
|
typeof item === 'object' && item !== null ? |
|
toXml(item, 'item') : |
|
`<item>${this._escapeXml(String(item))}</item>` |
|
); |
|
return `<${rootTag}>${items.join('')}</${rootTag}>`; |
|
} else { |
|
const entries = Object.entries(obj).map(([key, value]) => { |
|
if (typeof value === 'object' && value !== null) { |
|
return toXml(value, key); |
|
} else { |
|
return `<${key}>${this._escapeXml(String(value))}</${key}>`; |
|
} |
|
}); |
|
|
|
return `<${rootTag}>${entries.join('')}</${rootTag}>`; |
|
} |
|
}; |
|
|
|
return `<?xml version="1.0" encoding="UTF-8"?>\n${toXml(data)}`; |
|
} |
|
}); |
|
|
|
// Register transformers |
|
this.registerTransformer('minify', data => { |
|
if (typeof data === 'object' && data !== null) { |
|
return JSON.stringify(data); |
|
} |
|
return String(data); |
|
}); |
|
|
|
this.registerTransformer('prettify', data => { |
|
if (typeof data === 'object' && data !== null) { |
|
return JSON.stringify(data, null, 2); |
|
} |
|
return String(data); |
|
}); |
|
} |
|
|
|
/** |
|
* Register a format |
|
* @param {string} name - Format name |
|
* @param {Object} format - Format object |
|
* @returns {EnhancedRepresentationModel} This model for chaining |
|
*/ |
|
registerFormat(name, format) { |
|
this.formats.set(name, format); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a transformer |
|
* @param {string} name - Transformer name |
|
* @param {function} fn - Transformer function |
|
* @returns {EnhancedRepresentationModel} This model for chaining |
|
*/ |
|
registerTransformer(name, fn) { |
|
this.transformers.set(name, fn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Represent data using specified format and transformers |
|
* @param {*} data - Data to represent |
|
* @param {string|Object} options - Format name or options object |
|
* @returns {string} Representation |
|
*/ |
|
represent(data, options = {}) { |
|
// Handle string shorthand for format |
|
if (typeof options === 'string') { |
|
options = { format: options }; |
|
} |
|
|
|
const { |
|
format = this.baseModel.defaultFormat, |
|
transform = null |
|
} = options; |
|
|
|
// Apply transformer if specified |
|
let processedData = data; |
|
if (transform && this.transformers.has(transform)) { |
|
processedData = this.transformers.get(transform)(data); |
|
} |
|
|
|
// Use enhanced format if available, otherwise fall back to base model |
|
if (this.formats.has(format)) { |
|
return this.formats.get(format).format(processedData); |
|
} else { |
|
return this.baseModel.represent(processedData, format); |
|
} |
|
} |
|
|
|
/** |
|
* Escape special XML characters |
|
* @private |
|
* @param {string} str - String to escape |
|
* @returns {string} Escaped string |
|
*/ |
|
_escapeXml(str) { |
|
return str.replace(/[&<>"']/g, match => { |
|
switch (match) { |
|
case '&': return '&'; |
|
case '<': return '<'; |
|
case '>': return '>'; |
|
case '"': return '"'; |
|
case "'": return '''; |
|
default: return match; |
|
} |
|
}); |
|
} |
|
} |
|
|
|
/** |
|
* Interaction Model for Base1 |
|
* Manages state changes and persistence |
|
*/ |
|
class InteractionModel { |
|
/** |
|
* Create a new interaction model |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.stateManagers = new Map(); |
|
this.transactionLog = []; |
|
this.currentTransaction = null; |
|
this.maxTransactionLog = config.maxTransactionLog || 100; |
|
|
|
// Initialize standard state managers |
|
this._initializeStateManagers(); |
|
} |
|
|
|
/** |
|
* Initialize standard state managers |
|
* @private |
|
*/ |
|
_initializeStateManagers() { |
|
// Resource state manager |
|
this.registerStateManager('resource', { |
|
state: { |
|
resources: new Map(), |
|
allocations: new Map() |
|
}, |
|
|
|
applyChange: (operation, parameters, result) => { |
|
const state = this.stateManagers.get('resource').state; |
|
|
|
switch (operation.name) { |
|
case 'allocate': { |
|
const { resourceType, amount } = parameters; |
|
|
|
// Update resource state |
|
if (!state.resources.has(resourceType)) { |
|
state.resources.set(resourceType, { |
|
available: 1000, // Mock initial capacity |
|
allocated: 0 |
|
}); |
|
} |
|
|
|
const resource = state.resources.get(resourceType); |
|
|
|
// Check capacity |
|
if (resource.available < amount) { |
|
throw new Error(`Insufficient ${resourceType} resources: ${resource.available} < ${amount}`); |
|
} |
|
|
|
// Update resource state |
|
resource.available -= amount; |
|
resource.allocated += amount; |
|
|
|
// Record allocation |
|
state.allocations.set(result.id, { |
|
id: result.id, |
|
resourceType, |
|
amount, |
|
timestamp: Date.now() |
|
}); |
|
|
|
return { |
|
type: 'resourceAllocation', |
|
resourceType, |
|
amount, |
|
id: result.id |
|
}; |
|
} |
|
|
|
case 'release': { |
|
const { resourceId } = parameters; |
|
|
|
// Get allocation |
|
const allocation = state.allocations.get(resourceId); |
|
if (!allocation) { |
|
throw new Error(`Allocation not found: ${resourceId}`); |
|
} |
|
|
|
// Update resource state |
|
const resource = state.resources.get(allocation.resourceType); |
|
resource.available += allocation.amount; |
|
resource.allocated -= allocation.amount; |
|
|
|
// Remove allocation |
|
state.allocations.delete(resourceId); |
|
|
|
return { |
|
type: 'resourceRelease', |
|
resourceType: allocation.resourceType, |
|
amount: allocation.amount, |
|
id: resourceId |
|
}; |
|
} |
|
|
|
default: |
|
return null; |
|
} |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* Register a state manager |
|
* @param {string} name - State manager name |
|
* @param {Object} manager - State manager object |
|
* @returns {InteractionModel} This model for chaining |
|
*/ |
|
registerStateManager(name, manager) { |
|
this.stateManagers.set(name, manager); |
|
return this; |
|
} |
|
|
|
/** |
|
* Update system state based on operation |
|
* @param {Object} operation - Operation that was executed |
|
* @param {Object} parameters - Operation parameters |
|
* @param {*} result - Operation result |
|
* @returns {Object} State change information |
|
*/ |
|
updateState(operation, parameters, result) { |
|
// Start transaction if needed |
|
if (!this.currentTransaction) { |
|
this.currentTransaction = this._beginTransaction(); |
|
} |
|
|
|
try { |
|
// Find appropriate state manager |
|
const manager = this._getStateManager(operation); |
|
|
|
if (!manager) { |
|
// No state manager for this operation |
|
return null; |
|
} |
|
|
|
// Apply state change |
|
const stateChange = manager.applyChange(operation, parameters, result); |
|
|
|
// Record in transaction |
|
this.currentTransaction.changes.push({ |
|
operation: operation.name, |
|
parameters, |
|
change: stateChange |
|
}); |
|
|
|
// Commit if this is a standalone operation |
|
if (!operation.partOfTransaction) { |
|
this._commitTransaction(); |
|
} |
|
|
|
return stateChange; |
|
} catch (error) { |
|
// Rollback on error |
|
this._rollbackTransaction(); |
|
throw error; |
|
} |
|
} |
|
|
|
/** |
|
* Begin a new transaction |
|
* @private |
|
* @returns {Object} Transaction object |
|
*/ |
|
_beginTransaction() { |
|
return { |
|
id: `txn-${Date.now()}-${Math.floor(Math.random() * 10000)}`, |
|
timestamp: Date.now(), |
|
changes: [] |
|
}; |
|
} |
|
|
|
/** |
|
* Commit the current transaction |
|
* @private |
|
*/ |
|
_commitTransaction() { |
|
if (this.currentTransaction) { |
|
// Verify transaction coherence |
|
this._validateTransactionCoherence(); |
|
|
|
// Add to log |
|
this.transactionLog.push(this.currentTransaction); |
|
|
|
// Trim log if needed |
|
if (this.transactionLog.length > this.maxTransactionLog) { |
|
this.transactionLog = this.transactionLog.slice(-this.maxTransactionLog); |
|
} |
|
|
|
// Clear current transaction |
|
this.currentTransaction = null; |
|
} |
|
} |
|
|
|
/** |
|
* Rollback the current transaction |
|
* @private |
|
*/ |
|
_rollbackTransaction() { |
|
if (this.currentTransaction) { |
|
// Revert each change in reverse order |
|
for (let i = this.currentTransaction.changes.length - 1; i >= 0; i--) { |
|
const change = this.currentTransaction.changes[i]; |
|
this._revertChange(change); |
|
} |
|
|
|
// Clear current transaction |
|
this.currentTransaction = null; |
|
} |
|
} |
|
|
|
/** |
|
* Find the appropriate state manager for an operation |
|
* @private |
|
* @param {Object} operation - Operation to find manager for |
|
* @returns {Object} State manager or null |
|
*/ |
|
_getStateManager(operation) { |
|
// Map operations to state managers |
|
switch (operation.name) { |
|
case 'allocate': |
|
case 'release': |
|
return this.stateManagers.get('resource'); |
|
default: |
|
return null; |
|
} |
|
} |
|
|
|
/** |
|
* Revert a state change |
|
* @private |
|
* @param {Object} change - Change to revert |
|
*/ |
|
_revertChange(change) { |
|
const { operation, parameters, change: stateChange } = change; |
|
|
|
if (!stateChange) return; |
|
|
|
// Get state manager |
|
let manager = null; |
|
switch (operation) { |
|
case 'allocate': |
|
case 'release': |
|
manager = this.stateManagers.get('resource'); |
|
break; |
|
} |
|
|
|
if (!manager) return; |
|
|
|
// Apply inverse operation |
|
if (operation === 'allocate') { |
|
// Revert allocation by releasing |
|
this.updateState( |
|
{ name: 'release', modifiesState: true }, |
|
{ resourceId: stateChange.id }, |
|
{ id: stateChange.id, released: true } |
|
); |
|
} else if (operation === 'release') { |
|
// Revert release by allocating |
|
this.updateState( |
|
{ name: 'allocate', modifiesState: true }, |
|
{ resourceType: stateChange.resourceType, amount: stateChange.amount }, |
|
{ id: stateChange.id, resourceType: stateChange.resourceType, amount: stateChange.amount, allocated: true } |
|
); |
|
} |
|
} |
|
|
|
/** |
|
* Validate transaction coherence |
|
* @private |
|
*/ |
|
_validateTransactionCoherence() { |
|
// Simple validation for the reference implementation |
|
// In a production system, this would involve more sophisticated checks |
|
|
|
// Check for conflicting operations |
|
const resources = new Map(); |
|
|
|
for (const change of this.currentTransaction.changes) { |
|
if (change.operation === 'allocate') { |
|
const { resourceType, amount } = change.parameters; |
|
|
|
if (!resources.has(resourceType)) { |
|
resources.set(resourceType, { allocated: 0, released: 0 }); |
|
} |
|
|
|
resources.get(resourceType).allocated += amount; |
|
} else if (change.operation === 'release') { |
|
const { resourceId } = change.parameters; |
|
const stateManager = this.stateManagers.get('resource'); |
|
const allocation = stateManager.state.allocations.get(resourceId); |
|
|
|
if (allocation) { |
|
if (!resources.has(allocation.resourceType)) { |
|
resources.set(allocation.resourceType, { allocated: 0, released: 0 }); |
|
} |
|
|
|
resources.get(allocation.resourceType).released += allocation.amount; |
|
} |
|
} |
|
} |
|
|
|
// Check for overallocations |
|
for (const [resourceType, counts] of resources.entries()) { |
|
const stateManager = this.stateManagers.get('resource'); |
|
const resource = stateManager.state.resources.get(resourceType); |
|
|
|
if (!resource) continue; |
|
|
|
const netAllocation = counts.allocated - counts.released; |
|
|
|
if (netAllocation > resource.available + counts.released) { |
|
throw new Error(`Transaction would overallocate ${resourceType}`); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Get transaction log |
|
* @param {Object} filter - Optional filter criteria |
|
* @returns {Object[]} Transaction log entries |
|
*/ |
|
getTransactionLog(filter = {}) { |
|
let log = [...this.transactionLog]; |
|
|
|
// Apply filters |
|
if (filter.startTime) { |
|
log = log.filter(txn => txn.timestamp >= filter.startTime); |
|
} |
|
|
|
if (filter.endTime) { |
|
log = log.filter(txn => txn.timestamp <= filter.endTime); |
|
} |
|
|
|
if (filter.operation) { |
|
log = log.filter(txn => txn.changes.some(c => c.operation === filter.operation)); |
|
} |
|
|
|
// Apply limit |
|
if (filter.limit && filter.limit > 0) { |
|
log = log.slice(-filter.limit); |
|
} |
|
|
|
return log; |
|
} |
|
} |
|
|
|
/** |
|
* Observation Model for Base1 |
|
* Handles monitoring, metrics, and event observation |
|
*/ |
|
class ObservationModel { |
|
/** |
|
* Create a new observation model |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.observers = new Map(); |
|
this.metrics = new Map(); |
|
this.eventLog = []; |
|
this.maxLogSize = config.maxLogSize || 1000; |
|
|
|
// Initialize default metrics |
|
this._initializeMetrics(); |
|
} |
|
|
|
/** |
|
* Initialize default metrics |
|
* @private |
|
*/ |
|
_initializeMetrics() { |
|
this.metrics.set('operationCount', 0); |
|
this.metrics.set('stateModifications', 0); |
|
this.metrics.set('lastOperationTime', 0); |
|
this.metrics.set('totalResponseTime', 0); |
|
this.metrics.set('avgResponseTime', 0); |
|
} |
|
|
|
/** |
|
* Record operation for observation |
|
* @param {Object} operation - Operation that was executed |
|
* @param {Object} parameters - Operation parameters |
|
* @returns {Object} Recorded event |
|
*/ |
|
recordOperation(operation, parameters) { |
|
const timestamp = Date.now(); |
|
|
|
// Create event object |
|
const event = { |
|
timestamp, |
|
operation: operation.name, |
|
parameters, |
|
modifiedState: operation.modifiesState || false |
|
}; |
|
|
|
// Add to event log |
|
this.eventLog.push(event); |
|
|
|
// Trim log if needed |
|
if (this.eventLog.length > this.maxLogSize) { |
|
this.eventLog = this.eventLog.slice(-this.maxLogSize); |
|
} |
|
|
|
// Notify observers |
|
this._notifyObservers(operation.name, parameters); |
|
|
|
// Update metrics |
|
this._updateMetrics(operation.name, timestamp); |
|
|
|
return event; |
|
} |
|
|
|
/** |
|
* Register observer for specific operations |
|
* @param {string} operationName - Operation to observe |
|
* @param {function} callback - Observer callback |
|
* @returns {ObservationModel} This model for chaining |
|
*/ |
|
observe(operationName, callback) { |
|
if (!this.observers.has(operationName)) { |
|
this.observers.set(operationName, []); |
|
} |
|
|
|
this.observers.get(operationName).push(callback); |
|
return this; |
|
} |
|
|
|
/** |
|
* Get metrics for system monitoring |
|
* @param {string[]} metricNames - Optional metric names to retrieve |
|
* @returns {Object} Metrics data |
|
*/ |
|
getMetrics(metricNames = null) { |
|
if (!metricNames) { |
|
return Object.fromEntries(this.metrics); |
|
} |
|
|
|
const result = {}; |
|
for (const name of metricNames) { |
|
if (this.metrics.has(name)) { |
|
result[name] = this.metrics.get(name); |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Get filtered event log |
|
* @param {Object} filter - Filter criteria |
|
* @returns {Object[]} Filtered events |
|
*/ |
|
getEvents(filter = {}) { |
|
let events = [...this.eventLog]; |
|
|
|
// Apply filters |
|
if (filter.operation) { |
|
events = events.filter(e => e.operation === filter.operation); |
|
} |
|
|
|
if (filter.startTime) { |
|
events = events.filter(e => e.timestamp >= filter.startTime); |
|
} |
|
|
|
if (filter.endTime) { |
|
events = events.filter(e => e.timestamp <= filter.endTime); |
|
} |
|
|
|
if (filter.modifiedState !== undefined) { |
|
events = events.filter(e => e.modifiedState === filter.modifiedState); |
|
} |
|
|
|
// Apply limit |
|
if (filter.limit && filter.limit > 0) { |
|
events = events.slice(-filter.limit); |
|
} |
|
|
|
return events; |
|
} |
|
|
|
/** |
|
* Notify observers of an operation |
|
* @private |
|
* @param {string} operationName - Operation name |
|
* @param {Object} parameters - Operation parameters |
|
*/ |
|
_notifyObservers(operationName, parameters) { |
|
// Notify operation-specific observers |
|
if (this.observers.has(operationName)) { |
|
for (const callback of this.observers.get(operationName)) { |
|
try { |
|
callback(operationName, parameters); |
|
} catch (error) { |
|
console.error(`Observer error for ${operationName}:`, error); |
|
} |
|
} |
|
} |
|
|
|
// Notify global observers |
|
if (this.observers.has('*')) { |
|
for (const callback of this.observers.get('*')) { |
|
try { |
|
callback(operationName, parameters); |
|
} catch (error) { |
|
console.error(`Global observer error for ${operationName}:`, error); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Update metrics based on operation |
|
* @private |
|
* @param {string} operationName - Operation name |
|
* @param {number} timestamp - Current timestamp |
|
*/ |
|
_updateMetrics(operationName, timestamp) { |
|
// Update operation count |
|
this.metrics.set('operationCount', this.metrics.get('operationCount') + 1); |
|
|
|
// Update last operation time |
|
this.metrics.set('lastOperationTime', timestamp); |
|
|
|
// For response time, we'd normally calculate this with the actual execution time |
|
// but for the reference implementation, we'll use a random value |
|
const responseTime = Math.random() * 10 + 5; // 5-15ms |
|
const totalTime = this.metrics.get('totalResponseTime') + responseTime; |
|
const count = this.metrics.get('operationCount'); |
|
|
|
this.metrics.set('totalResponseTime', totalTime); |
|
this.metrics.set('avgResponseTime', totalTime / count); |
|
|
|
// Track state modifications |
|
if (operationName === 'allocate' || operationName === 'release') { |
|
this.metrics.set('stateModifications', this.metrics.get('stateModifications') + 1); |
|
} |
|
|
|
// Update operation-specific metrics |
|
const metricKey = `${operationName}Count`; |
|
if (!this.metrics.has(metricKey)) { |
|
this.metrics.set(metricKey, 1); |
|
} else { |
|
this.metrics.set(metricKey, this.metrics.get(metricKey) + 1); |
|
} |
|
} |
|
} signature - Metric signature (e.g., [1,1,1,1] for Euclidean) |
|
* @param {number} dimension - Dimension of the base vector space |
|
*/ |
|
constructor(signature, dimension) { |
|
this.signature = signature; |
|
this.dimension = dimension; |
|
this.bladeCount = Math.pow(2, dimension); |
|
this._initializeBasisElements(); |
|
this._initializeProductTables(); |
|
} |
|
|
|
/** |
|
* Initialize basis elements for the algebra |
|
* @private |
|
*/ |
|
_initializeBasisElements() { |
|
this.basisElements = new Array(this.bladeCount); |
|
|
|
// Create basis elements with appropriate grades |
|
for (let i = 0; i < this.bladeCount; i++) { |
|
// Determine grade by counting bits |
|
const grade = this._bitCount(i); |
|
this.basisElements[i] = { |
|
index: i, |
|
grade: grade, |
|
bitPattern: i, |
|
// Convert bit pattern to e1^e2^... notation |
|
label: this._bitPatternToLabel(i) |
|
}; |
|
} |
|
} |
|
|
|
/** |
|
* Initialize product tables for efficient calculations |
|
* @private |
|
*/ |
|
_initializeProductTables() { |
|
// Create geometric product table |
|
this.geometricProductTable = new Array(this.bladeCount); |
|
// Create outer product table |
|
this.outerProductTable = new Array(this.bladeCount); |
|
// Create inner product table |
|
this.innerProductTable = new Array(this.bladeCount); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
this.geometricProductTable[i] = new Array(this.bladeCount); |
|
this.outerProductTable[i] = new Array(this.bladeCount); |
|
this.innerProductTable[i] = new Array(this.bladeCount); |
|
|
|
for (let j = 0; j < this.bladeCount; j++) { |
|
this.geometricProductTable[i][j] = this._computeGeometricProductTable(i, j); |
|
this.outerProductTable[i][j] = this._computeOuterProductTable(i, j); |
|
this.innerProductTable[i][j] = this._computeInnerProductTable(i, j); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Compute the geometric product table entry |
|
* @private |
|
* @param {number} a - First basis blade index |
|
* @param {number} b - Second basis blade index |
|
* @returns {Object} Result with product index and sign |
|
*/ |
|
_computeGeometricProductTable(a, b) { |
|
let sign = 1; |
|
let index = a ^ b; // XOR gives the resulting blade |
|
|
|
// Calculate sign based on the geometric product rules |
|
// For each swap needed, we may need to change sign depending on signature |
|
const aBits = this._getBitArray(a, this.dimension); |
|
const bBits = this._getBitArray(b, this.dimension); |
|
|
|
// Count swaps needed to sort the basis vectors |
|
for (let i = 0; i < this.dimension; i++) { |
|
if (aBits[i] === 1) { |
|
for (let j = i + 1; j < this.dimension; j++) { |
|
if (bBits[j] === 1) { |
|
sign *= -1; |
|
} |
|
} |
|
} |
|
} |
|
|
|
// Apply signature |
|
for (let i = 0; i < this.dimension; i++) { |
|
if (aBits[i] === 1 && bBits[i] === 1) { |
|
sign *= this.signature[i]; |
|
} |
|
} |
|
|
|
return { index, sign }; |
|
} |
|
|
|
/** |
|
* Compute the outer product table entry |
|
* @private |
|
* @param {number} a - First basis blade index |
|
* @param {number} b - Second basis blade index |
|
* @returns {Object} Result with product index and sign |
|
*/ |
|
_computeOuterProductTable(a, b) { |
|
// If blades share any vectors, outer product is zero |
|
if ((a & b) !== 0) { |
|
return { index: 0, sign: 0 }; |
|
} |
|
|
|
// Otherwise, use geometric product |
|
return this._computeGeometricProductTable(a, b); |
|
} |
|
|
|
/** |
|
* Compute the inner product table entry |
|
* @private |
|
* @param {number} a - First basis blade index |
|
* @param {number} b - Second basis blade index |
|
* @returns {Object} Result with product index and sign |
|
*/ |
|
_computeInnerProductTable(a, b) { |
|
const aGrade = this._bitCount(a); |
|
const bGrade = this._bitCount(b); |
|
const resultGrade = bGrade - aGrade; |
|
|
|
// Inner product is only defined when a is a proper subspace of b |
|
if (resultGrade <= 0 || (a & b) !== a) { |
|
return { index: 0, sign: 0 }; |
|
} |
|
|
|
// Use geometric product with appropriate sign |
|
const geoProd = this._computeGeometricProductTable(a, b); |
|
|
|
// Adjust sign based on inner product definition |
|
const sign = geoProd.sign * (aGrade % 2 === 0 ? 1 : -1); |
|
|
|
return { index: geoProd.index, sign }; |
|
} |
|
|
|
/** |
|
* Calculate geometric product of two multivectors |
|
* @param {MultivectorRepresentation} a - First multivector |
|
* @param {MultivectorRepresentation} b - Second multivector |
|
* @returns {MultivectorRepresentation} Result of a * b |
|
*/ |
|
geometricProduct(a, b) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
for (let j = 0; j < this.bladeCount; j++) { |
|
if (a.components[i] !== 0 && b.components[j] !== 0) { |
|
const prod = this.geometricProductTable[i][j]; |
|
result.components[prod.index] += prod.sign * a.components[i] * b.components[j]; |
|
} |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate outer product of two multivectors |
|
* @param {MultivectorRepresentation} a - First multivector |
|
* @param {MultivectorRepresentation} b - Second multivector |
|
* @returns {MultivectorRepresentation} Result of a ∧ b |
|
*/ |
|
outerProduct(a, b) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
for (let j = 0; j < this.bladeCount; j++) { |
|
if (a.components[i] !== 0 && b.components[j] !== 0) { |
|
const prod = this.outerProductTable[i][j]; |
|
if (prod.sign !== 0) { |
|
result.components[prod.index] += prod.sign * a.components[i] * b.components[j]; |
|
} |
|
} |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate inner product of two multivectors |
|
* @param {MultivectorRepresentation} a - First multivector |
|
* @param {MultivectorRepresentation} b - Second multivector |
|
* @returns {MultivectorRepresentation} Result of a · b |
|
*/ |
|
innerProduct(a, b) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
for (let j = 0; j < this.bladeCount; j++) { |
|
if (a.components[i] !== 0 && b.components[j] !== 0) { |
|
const prod = this.innerProductTable[i][j]; |
|
if (prod.sign !== 0) { |
|
result.components[prod.index] += prod.sign * a.components[i] * b.components[j]; |
|
} |
|
} |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate the reflection of a vector across a hyperplane |
|
* @param {MultivectorRepresentation} vector - Vector to reflect |
|
* @param {MultivectorRepresentation} normal - Normal to hyperplane |
|
* @returns {MultivectorRepresentation} Reflected vector |
|
*/ |
|
reflect(vector, normal) { |
|
// Reflection is -n * v * n / (n · n) |
|
const normalSquared = this.innerProduct(normal, normal).components[0]; |
|
if (Math.abs(normalSquared) < 1e-10) { |
|
throw new Error("Cannot reflect across a null hyperplane"); |
|
} |
|
|
|
const normalInv = normal.scale(1.0 / normalSquared); |
|
const n_v = this.geometricProduct(normalInv, vector); |
|
const n_v_n = this.geometricProduct(n_v, normal); |
|
|
|
return n_v_n.scale(-1); |
|
} |
|
|
|
/** |
|
* Calculate the rotation of a vector by a bivector |
|
* @param {MultivectorRepresentation} vector - Vector to rotate |
|
* @param {MultivectorRepresentation} bivector - Bivector representing rotation plane |
|
* @param {number} angle - Angle to rotate by (radians) |
|
* @returns {MultivectorRepresentation} Rotated vector |
|
*/ |
|
rotate(vector, bivector, angle) { |
|
// Normalize bivector |
|
const bivNorm = Math.sqrt(Math.abs(this.innerProduct(bivector, bivector).scalar())); |
|
const bivNormalized = bivector.scale(1.0 / bivNorm); |
|
|
|
// Create rotor R = cos(θ/2) + sin(θ/2) * B |
|
const rotor = new MultivectorRepresentation(this.dimension); |
|
rotor.components[0] = Math.cos(angle / 2); |
|
|
|
// For each grade-2 component in the bivector |
|
for (let i = 0; i < this.bladeCount; i++) { |
|
if (this.basisElements[i].grade === 2 && bivNormalized.components[i] !== 0) { |
|
rotor.components[i] = Math.sin(angle / 2) * bivNormalized.components[i]; |
|
} |
|
} |
|
|
|
// Calculate R * v * ~R |
|
const rotorRev = rotor.reverse(); |
|
const r_v = this.geometricProduct(rotor, vector); |
|
const result = this.geometricProduct(r_v, rotorRev); |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Count the number of 1 bits in a number |
|
* @private |
|
* @param {number} n - Number to count bits in |
|
* @returns {number} Number of 1 bits |
|
*/ |
|
_bitCount(n) { |
|
let count = 0; |
|
while (n > 0) { |
|
count += n & 1; |
|
n >>= 1; |
|
} |
|
return count; |
|
} |
|
|
|
/** |
|
* Convert bit pattern to basis element label (e1^e2^...) |
|
* @private |
|
* @param {number} bitPattern - Bit pattern representing basis element |
|
* @returns {string} Label for the basis element |
|
*/ |
|
_bitPatternToLabel(bitPattern) { |
|
if (bitPattern === 0) return "1"; // Scalar |
|
|
|
let label = ""; |
|
for (let i = 0; i < this.dimension; i++) { |
|
if ((bitPattern & (1 << i)) !== 0) { |
|
label += "e" + (i + 1); |
|
} |
|
} |
|
return label; |
|
} |
|
|
|
/** |
|
* Convert a number to its bit array representation |
|
* @private |
|
* @param {number} n - Number to convert |
|
* @param {number} size - Size of the bit array |
|
* @returns {number[]} Array of bits |
|
*/ |
|
_getBitArray(n, size) { |
|
const bits = new Array(size).fill(0); |
|
for (let i = 0; i < size; i++) { |
|
bits[i] = (n & (1 << i)) !== 0 ? 1 : 0; |
|
} |
|
return bits; |
|
} |
|
} |
|
|
|
/** |
|
* Representation of a multivector in Clifford algebra |
|
*/ |
|
class MultivectorRepresentation { |
|
/** |
|
* Create a new multivector |
|
* @param {number} dimension - Dimension of the vector space |
|
*/ |
|
constructor(dimension) { |
|
this.dimension = dimension; |
|
this.bladeCount = Math.pow(2, dimension); |
|
this.components = new Float64Array(this.bladeCount).fill(0); |
|
} |
|
|
|
/** |
|
* Extract components of a specific grade |
|
* @param {number} k - Grade to extract |
|
* @returns {MultivectorRepresentation} Multivector containing only k-grade components |
|
*/ |
|
grade(k) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
const indices = this._indicesOfGrade(k); |
|
|
|
for (const idx of indices) { |
|
result.components[idx] = this.components[idx]; |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Get the scalar (grade 0) part |
|
* @returns {number} Scalar part of the multivector |
|
*/ |
|
scalar() { |
|
return this.components[0]; |
|
} |
|
|
|
/** |
|
* Get the vector (grade 1) part |
|
* @returns {number[]} Vector components |
|
*/ |
|
vector() { |
|
const result = []; |
|
const indices = this._indicesOfGrade(1); |
|
|
|
for (const idx of indices) { |
|
result.push(this.components[idx]); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate the reverse of this multivector |
|
* @returns {MultivectorRepresentation} Reversed multivector |
|
*/ |
|
reverse() { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
const grade = this._gradeOfIndex(i); |
|
const sign = ((grade * (grade - 1)) / 2) % 2 === 0 ? 1 : -1; |
|
result.components[i] = sign * this.components[i]; |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Scale the multivector by a scalar |
|
* @param {number} scalar - Scalar to multiply by |
|
* @returns {MultivectorRepresentation} Scaled multivector |
|
*/ |
|
scale(scalar) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
result.components[i] = this.components[i] * scalar; |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Add another multivector to this one |
|
* @param {MultivectorRepresentation} other - Multivector to add |
|
* @returns {MultivectorRepresentation} Sum of multivectors |
|
*/ |
|
add(other) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
result.components[i] = this.components[i] + other.components[i]; |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Subtract another multivector from this one |
|
* @param {MultivectorRepresentation} other - Multivector to subtract |
|
* @returns {MultivectorRepresentation} Difference of multivectors |
|
*/ |
|
subtract(other) { |
|
const result = new MultivectorRepresentation(this.dimension); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
result.components[i] = this.components[i] - other.components[i]; |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Find the multivector norm squared (scalar product with reverse) |
|
* @returns {number} Norm squared |
|
*/ |
|
normSquared() { |
|
let sum = 0; |
|
const rev = this.reverse(); |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
for (let j = 0; j < this.bladeCount; j++) { |
|
// Only scalar part contributes to the norm |
|
if ((i ^ j) === 0) { |
|
sum += this.components[i] * rev.components[j]; |
|
} |
|
} |
|
} |
|
|
|
return sum; |
|
} |
|
|
|
/** |
|
* Calculate the multivector norm |
|
* @returns {number} Multivector norm |
|
*/ |
|
norm() { |
|
const normSq = this.normSquared(); |
|
return Math.sqrt(Math.abs(normSq)); |
|
} |
|
|
|
/** |
|
* Get all indices of basis elements with a specific grade |
|
* @private |
|
* @param {number} grade - The grade to find |
|
* @returns {number[]} Array of indices |
|
*/ |
|
_indicesOfGrade(grade) { |
|
const indices = []; |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
if (this._gradeOfIndex(i) === grade) { |
|
indices.push(i); |
|
} |
|
} |
|
|
|
return indices; |
|
} |
|
|
|
/** |
|
* Determine the grade of a basis element by its index |
|
* @private |
|
* @param {number} index - Index of the basis element |
|
* @returns {number} Grade of the basis element |
|
*/ |
|
_gradeOfIndex(index) { |
|
let count = 0; |
|
let n = index; |
|
|
|
while (n > 0) { |
|
count += n & 1; |
|
n >>= 1; |
|
} |
|
|
|
return count; |
|
} |
|
|
|
/** |
|
* Convert the multivector to a string representation |
|
* @returns {string} String representation |
|
*/ |
|
toString() { |
|
const terms = []; |
|
|
|
for (let i = 0; i < this.bladeCount; i++) { |
|
if (Math.abs(this.components[i]) > 1e-10) { |
|
let term = this.components[i].toFixed(4); |
|
|
|
if (i === 0) { |
|
// Scalar term |
|
} else { |
|
// Create basis element label |
|
let basisLabel = ""; |
|
for (let j = 0; j < this.dimension; j++) { |
|
if ((i & (1 << j)) !== 0) { |
|
basisLabel += "e" + (j + 1); |
|
} |
|
} |
|
term += basisLabel; |
|
} |
|
|
|
terms.push(term); |
|
} |
|
} |
|
|
|
return terms.length > 0 ? terms.join(" + ") : "0"; |
|
} |
|
} |
|
|
|
/** |
|
* Coherence metrics for evaluating mathematical consistency |
|
*/ |
|
class CoherenceMetrics { |
|
/** |
|
* Calculate the coherence inner product between two objects |
|
* @param {MultivectorRepresentation|number[]} a - First object |
|
* @param {MultivectorRepresentation|number[]} b - Second object |
|
* @param {number[][]} metric - Optional metric tensor for inner product |
|
* @returns {number} Inner product value |
|
*/ |
|
static coherenceInnerProduct(a, b, metric = null) { |
|
// Handle different input types |
|
const aComponents = a instanceof MultivectorRepresentation ? a.components : a; |
|
const bComponents = b instanceof MultivectorRepresentation ? b.components : b; |
|
|
|
// Default metric is identity if not specified |
|
if (!metric) { |
|
metric = Array(aComponents.length).fill().map((_, i) => |
|
Array(bComponents.length).fill().map((_, j) => i === j ? 1 : 0) |
|
); |
|
} |
|
|
|
// Calculate inner product with respect to provided metric |
|
let sum = 0; |
|
for (let i = 0; i < aComponents.length; i++) { |
|
for (let j = 0; j < bComponents.length; j++) { |
|
sum += aComponents[i] * metric[i][j] * bComponents[j]; |
|
} |
|
} |
|
|
|
return sum; |
|
} |
|
|
|
/** |
|
* Calculate the coherence norm of an object |
|
* @param {MultivectorRepresentation|number[]} a - Object to measure |
|
* @param {number[][]} metric - Optional metric tensor |
|
* @returns {number} Coherence norm |
|
*/ |
|
static coherenceNorm(a, metric = null) { |
|
return Math.sqrt(Math.abs(this.coherenceInnerProduct(a, a, metric))); |
|
} |
|
|
|
/** |
|
* Calculate normalized coherence for comparison |
|
* @param {MultivectorRepresentation|number[]} a - Object to measure |
|
* @param {number[][]} metric - Optional metric tensor |
|
* @returns {number} Normalized coherence (0-1) |
|
*/ |
|
static normalizedCoherence(a, metric = null) { |
|
const norm = this.coherenceNorm(a, metric); |
|
// Lower norm means higher coherence (1.0 is perfect) |
|
return norm > 0 ? 1.0 / (1.0 + norm) : 1.0; |
|
} |
|
|
|
/** |
|
* Calculate the coherence distance between two objects |
|
* @param {MultivectorRepresentation|number[]} a - First object |
|
* @param {MultivectorRepresentation|number[]} b - Second object |
|
* @param {number[][]} metric - Optional metric tensor |
|
* @returns {number} Coherence distance |
|
*/ |
|
static coherenceDistance(a, b, metric = null) { |
|
// For vectors, this is effectively a metric space distance |
|
const aComponents = a instanceof MultivectorRepresentation ? a.components : a; |
|
const bComponents = b instanceof MultivectorRepresentation ? b.components : b; |
|
|
|
// Create a difference vector |
|
const diff = new Array(aComponents.length); |
|
for (let i = 0; i < aComponents.length; i++) { |
|
diff[i] = aComponents[i] - bComponents[i]; |
|
} |
|
|
|
// Return the norm of the difference |
|
return this.coherenceNorm(diff, metric); |
|
} |
|
|
|
/** |
|
* Calculate similarity between two objects (1 = identical, 0 = orthogonal) |
|
* @param {MultivectorRepresentation|number[]} a - First object |
|
* @param {MultivectorRepresentation|number[]} b - Second object |
|
* @param {number[][]} metric - Optional metric tensor |
|
* @returns {number} Similarity value between 0 and 1 |
|
*/ |
|
static similarity(a, b, metric = null) { |
|
const innerProd = this.coherenceInnerProduct(a, b, metric); |
|
const normA = this.coherenceNorm(a, metric); |
|
const normB = this.coherenceNorm(b, metric); |
|
|
|
if (normA === 0 || normB === 0) return 0; |
|
|
|
// Normalized inner product |
|
const cosine = innerProd / (normA * normB); |
|
|
|
// Map from [-1, 1] to [0, 1] |
|
return (cosine + 1) / 2; |
|
} |
|
} |
|
|
|
/** |
|
* Matrix operations for Lie group and symmetry calculations |
|
*/ |
|
class Matrix { |
|
/** |
|
* Create an identity matrix of specified size |
|
* @param {number} size - Matrix size |
|
* @returns {number[][]} Identity matrix |
|
*/ |
|
static identity(size) { |
|
const matrix = new Array(size); |
|
for (let i = 0; i < size; i++) { |
|
matrix[i] = new Array(size).fill(0); |
|
matrix[i][i] = 1; |
|
} |
|
return matrix; |
|
} |
|
|
|
/** |
|
* Create a zero matrix of specified size |
|
* @param {number} rows - Number of rows |
|
* @param {number} cols - Number of columns |
|
* @returns {number[][]} Zero matrix |
|
*/ |
|
static zeros(rows, cols) { |
|
const matrix = new Array(rows); |
|
for (let i = 0; i < rows; i++) { |
|
matrix[i] = new Array(cols).fill(0); |
|
} |
|
return matrix; |
|
} |
|
|
|
/** |
|
* Multiply two matrices |
|
* @param {number[][]} a - First matrix |
|
* @param {number[][]} b - Second matrix |
|
* @returns {number[][]} Matrix product |
|
*/ |
|
static multiply(a, b) { |
|
const aRows = a.length; |
|
const aCols = a[0].length; |
|
const bRows = b.length; |
|
const bCols = b[0].length; |
|
|
|
if (aCols !== bRows) { |
|
throw new Error("Matrix dimensions do not match for multiplication"); |
|
} |
|
|
|
const result = new Array(aRows); |
|
for (let i = 0; i < aRows; i++) { |
|
result[i] = new Array(bCols).fill(0); |
|
for (let j = 0; j < bCols; j++) { |
|
for (let k = 0; k < aCols; k++) { |
|
result[i][j] += a[i][k] * b[k][j]; |
|
} |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Add two matrices |
|
* @param {number[][]} a - First matrix |
|
* @param {number[][]} b - Second matrix |
|
* @returns {number[][]} Matrix sum |
|
*/ |
|
static add(a, b) { |
|
const rows = a.length; |
|
const cols = a[0].length; |
|
|
|
if (rows !== b.length || cols !== b[0].length) { |
|
throw new Error("Matrix dimensions do not match for addition"); |
|
} |
|
|
|
const result = new Array(rows); |
|
for (let i = 0; i < rows; i++) { |
|
result[i] = new Array(cols); |
|
for (let j = 0; j < cols; j++) { |
|
result[i][j] = a[i][j] + b[i][j]; |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Multiply a matrix by a scalar |
|
* @param {number[][]} matrix - Matrix to scale |
|
* @param {number} scalar - Scalar value |
|
* @returns {number[][]} Scaled matrix |
|
*/ |
|
static scalarMultiply(matrix, scalar) { |
|
const rows = matrix.length; |
|
const cols = matrix[0].length; |
|
|
|
const result = new Array(rows); |
|
for (let i = 0; i < rows; i++) { |
|
result[i] = new Array(cols); |
|
for (let j = 0; j < cols; j++) { |
|
result[i][j] = matrix[i][j] * scalar; |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Compute the transpose of a matrix |
|
* @param {number[][]} matrix - Input matrix |
|
* @returns {number[][]} Transposed matrix |
|
*/ |
|
static transpose(matrix) { |
|
const rows = matrix.length; |
|
const cols = matrix[0].length; |
|
|
|
const result = new Array(cols); |
|
for (let i = 0; i < cols; i++) { |
|
result[i] = new Array(rows); |
|
for (let j = 0; j < rows; j++) { |
|
result[i][j] = matrix[j][i]; |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Compute the matrix exponential using a Taylor series |
|
* @param {number[][]} matrix - Input matrix |
|
* @param {number} steps - Number of terms in the series |
|
* @returns {number[][]} Matrix exponential |
|
*/ |
|
static exponential(matrix, steps = 10) { |
|
const size = matrix.length; |
|
|
|
// Start with identity matrix for the sum |
|
let result = this.identity(size); |
|
|
|
// Start with identity for the current term |
|
let term = this.identity(size); |
|
|
|
// Compute the Taylor series up to the specified number of steps |
|
for (let i = 1; i <= steps; i++) { |
|
// Multiply the current term by the matrix and divide by factorial |
|
term = this.multiply(term, matrix); |
|
|
|
const factorial = this._factorial(i); |
|
const scaled = this.scalarMultiply(term, 1.0 / factorial); |
|
|
|
// Add to the result |
|
result = this.add(result, scaled); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate the determinant of a matrix |
|
* @param {number[][]} matrix - Input matrix |
|
* @returns {number} Determinant value |
|
*/ |
|
static determinant(matrix) { |
|
const n = matrix.length; |
|
|
|
// Base case for 1x1 matrix |
|
if (n === 1) { |
|
return matrix[0][0]; |
|
} |
|
|
|
// Base case for 2x2 matrix |
|
if (n === 2) { |
|
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; |
|
} |
|
|
|
// Expand by the first row for larger matrices |
|
let result = 0; |
|
for (let j = 0; j < n; j++) { |
|
// Create submatrix by excluding first row and current column |
|
const submatrix = new Array(n - 1); |
|
for (let i = 1; i < n; i++) { |
|
submatrix[i - 1] = new Array(n - 1); |
|
for (let k = 0; k < n; k++) { |
|
if (k < j) { |
|
submatrix[i - 1][k] = matrix[i][k]; |
|
} else if (k > j) { |
|
submatrix[i - 1][k - 1] = matrix[i][k]; |
|
} |
|
} |
|
} |
|
|
|
// Add or subtract the determinant of the submatrix |
|
const sign = j % 2 === 0 ? 1 : -1; |
|
result += sign * matrix[0][j] * this.determinant(submatrix); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate factorial |
|
* @private |
|
* @param {number} n - Input value |
|
* @returns {number} n! |
|
*/ |
|
static _factorial(n) { |
|
if (n === 0 || n === 1) return 1; |
|
let result = 1; |
|
for (let i = 2; i <= n; i++) { |
|
result *= i; |
|
} |
|
return result; |
|
} |
|
} |
|
|
|
/** |
|
* Symmetry operations for geometrical transformations |
|
*/ |
|
class SymmetryOperations { |
|
/** |
|
* Create a Lie algebra generator matrix |
|
* @param {number} dimension - Dimension of the space |
|
* @param {number[]} indices - Indices [i,j] for the generator |
|
* @returns {number[][]} Generator matrix |
|
*/ |
|
static generator(dimension, indices) { |
|
const generator = Matrix.zeros(dimension, dimension); |
|
const [i, j] = indices; |
|
|
|
if (i >= 0 && i < dimension && j >= 0 && j < dimension) { |
|
generator[i][j] = 1.0; |
|
} |
|
|
|
return generator; |
|
} |
|
|
|
/** |
|
* Compute the matrix exponential for Lie group elements |
|
* @param {number[][]} matrix - Input matrix |
|
* @param {number} steps - Number of terms in the series |
|
* @returns {number[][]} Matrix exponential |
|
*/ |
|
static expMatrix(matrix, steps = 10) { |
|
return Matrix.exponential(matrix, steps); |
|
} |
|
|
|
/** |
|
* Apply a transformation that preserves specified invariants |
|
* @param {Object} object - Object to transform |
|
* @param {function} transformation - Transformation function |
|
* @param {Array} invariants - List of invariants to preserve |
|
* @returns {Object} Transformed object |
|
*/ |
|
static applyTransformation(object, transformation, invariants) { |
|
// Measure invariants before transformation |
|
const preValues = invariants.map(inv => inv.measure(object)); |
|
|
|
// Apply the transformation |
|
const result = transformation(object); |
|
|
|
// Verify invariants are preserved |
|
const postValues = invariants.map(inv => inv.measure(result)); |
|
|
|
for (let i = 0; i < invariants.length; i++) { |
|
const invariant = invariants[i]; |
|
const tolerance = invariant.tolerance || 1e-10; |
|
|
|
if (Math.abs(preValues[i] - postValues[i]) > tolerance) { |
|
throw new Error( |
|
`Invariant ${invariant.name} not preserved: ${preValues[i]} ≠ ${postValues[i]}` |
|
); |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Create a rotation transformation in the specified plane |
|
* @param {number} dimension - Space dimension |
|
* @param {number[]} planeIndices - Indices [i,j] defining the rotation plane |
|
* @param {number} angle - Rotation angle in radians |
|
* @returns {function} Rotation function |
|
*/ |
|
static createRotation(dimension, planeIndices, angle) { |
|
const [i, j] = planeIndices; |
|
|
|
// Create generator for this rotation plane |
|
const gen_ij = this.generator(dimension, [i, j]); |
|
const gen_ji = this.generator(dimension, [j, i]); |
|
|
|
// Create the bivector generator (antisymmetric) |
|
const bivector = Matrix.add(gen_ij, Matrix.scalarMultiply(gen_ji, -1)); |
|
|
|
// Scale by angle |
|
const scaled = Matrix.scalarMultiply(bivector, angle); |
|
|
|
// Create rotation matrix via exponential map |
|
const rotationMatrix = this.expMatrix(scaled); |
|
|
|
// Return function that applies this rotation |
|
return (vector) => { |
|
if (vector.length !== dimension) { |
|
throw new Error("Vector dimension does not match rotation dimension"); |
|
} |
|
|
|
// Apply rotation matrix to vector |
|
const result = new Array(dimension).fill(0); |
|
for (let k = 0; k < dimension; k++) { |
|
for (let l = 0; l < dimension; l++) { |
|
result[k] += rotationMatrix[k][l] * vector[l]; |
|
} |
|
} |
|
|
|
return result; |
|
}; |
|
} |
|
|
|
/** |
|
* Create a reflection transformation across a hyperplane |
|
* @param {number[]} normal - Normal vector to the hyperplane |
|
* @returns {function} Reflection function |
|
*/ |
|
static createReflection(normal) { |
|
const dimension = normal.length; |
|
|
|
// Normalize the normal vector |
|
const normalSquared = normal.reduce((sum, val) => sum + val * val, 0); |
|
const normalNorm = Math.sqrt(normalSquared); |
|
|
|
if (normalNorm < 1e-10) { |
|
throw new Error("Cannot reflect across hyperplane with zero normal"); |
|
} |
|
|
|
const normalizedNormal = normal.map(val => val / normalNorm); |
|
|
|
// Return function that applies this reflection |
|
return (vector) => { |
|
if (vector.length !== dimension) { |
|
throw new Error("Vector dimension does not match reflection normal dimension"); |
|
} |
|
|
|
// Calculate dot product of vector with normal |
|
const dot = vector.reduce( |
|
(sum, val, idx) => sum + val * normalizedNormal[idx], |
|
0 |
|
); |
|
|
|
// Apply reflection: v - 2(v · n)n |
|
return vector.map( |
|
(val, idx) => val - 2 * dot * normalizedNormal[idx] |
|
); |
|
}; |
|
} |
|
} |
|
|
|
/** |
|
* Manifold structure implementation |
|
*/ |
|
class ManifoldStructure { |
|
/** |
|
* Create a new manifold structure |
|
* @param {number} dimension - Manifold dimension |
|
* @param {number[][]} metric - Optional metric tensor |
|
*/ |
|
constructor(dimension, metric = null) { |
|
this.dimension = dimension; |
|
this.metric = metric || this._defaultMetric(dimension); |
|
this.points = new Map(); // Maps indices to manifold points |
|
this.fiberBundles = new Map(); // Maps point indices to fiber bundles |
|
this.boundaryPoints = new Set(); // Points on the boundary |
|
} |
|
|
|
/** |
|
* Create default Euclidean metric |
|
* @private |
|
* @param {number} dimension - Space dimension |
|
* @returns {number[][]} Metric tensor |
|
*/ |
|
_defaultMetric(dimension) { |
|
return Matrix.identity(dimension); |
|
} |
|
|
|
/** |
|
* Add a point to the manifold |
|
* @param {string|number} index - Unique identifier for the point |
|
* @param {Object} point - Point data |
|
* @param {number[]} coordinates - Coordinates in the manifold |
|
* @param {boolean} isBoundary - Whether this point is on the boundary |
|
* @returns {Object} The added point |
|
*/ |
|
addPoint(index, point, coordinates, isBoundary = false) { |
|
if (coordinates.length !== this.dimension) { |
|
throw new Error(`Point coordinates must match manifold dimension (${this.dimension})`); |
|
} |
|
|
|
const manifestedPoint = { |
|
index, |
|
data: point, |
|
coordinates, |
|
isBoundary, |
|
connections: new Set() |
|
}; |
|
|
|
this.points.set(index, manifestedPoint); |
|
|
|
if (isBoundary) { |
|
this.boundaryPoints.add(index); |
|
} |
|
|
|
return manifestedPoint; |
|
} |
|
|
|
/** |
|
* Calculate the manifold depth for a point |
|
* @param {string|number} pointIndex - Index of the point |
|
* @returns {number} Manifold depth (0 at boundary, increasing inward) |
|
*/ |
|
depth(pointIndex) { |
|
const point = this.points.get(pointIndex); |
|
if (!point) return 0; |
|
|
|
// Boundary points have zero depth |
|
if (point.isBoundary) return 0; |
|
|
|
// Calculate minimum distance to any boundary point |
|
let minDistance = Infinity; |
|
|
|
for (const boundaryIdx of this.boundaryPoints) { |
|
const boundaryPoint = this.points.get(boundaryIdx); |
|
const distance = this._distance(point.coordinates, boundaryPoint.coordinates); |
|
minDistance = Math.min(minDistance, distance); |
|
} |
|
|
|
// If there are no boundary points, use a default value |
|
if (minDistance === Infinity || this.boundaryPoints.size === 0) { |
|
return 1.0; |
|
} |
|
|
|
return minDistance; |
|
} |
|
|
|
/** |
|
* Connect two points in the manifold |
|
* @param {string|number} index1 - First point index |
|
* @param {string|number} index2 - Second point index |
|
* @param {Object} metadata - Optional connection metadata |
|
* @returns {Object} Connection object |
|
*/ |
|
connect(index1, index2, metadata = {}) { |
|
const point1 = this.points.get(index1); |
|
const point2 = this.points.get(index2); |
|
|
|
if (!point1 || !point2) { |
|
throw new Error("Cannot connect: one or both points do not exist"); |
|
} |
|
|
|
// Create connection object |
|
const connection = { |
|
indices: [index1, index2], |
|
metadata |
|
}; |
|
|
|
// Add to both points' connections |
|
point1.connections.add(index2); |
|
point2.connections.add(index1); |
|
|
|
return connection; |
|
} |
|
|
|
/** |
|
* Attach a fiber bundle at a specific point |
|
* @param {string|number} pointIndex - Index of base point |
|
* @param {Object} fiberSpace - Fiber space to attach |
|
* @returns {Object} The attached fiber bundle |
|
*/ |
|
attachFiber(pointIndex, fiberSpace) { |
|
const point = this.points.get(pointIndex); |
|
|
|
if (!point) { |
|
throw new Error(`Point with index ${pointIndex} does not exist`); |
|
} |
|
|
|
// Create fiber bundle |
|
const bundle = { |
|
basePoint: pointIndex, |
|
fiberSpace, |
|
sections: new Map() |
|
}; |
|
|
|
this.fiberBundles.set(pointIndex, bundle); |
|
|
|
return bundle; |
|
} |
|
|
|
/** |
|
* Define a section (configuration across the manifold) |
|
* @param {function} sectionFn - Function mapping (point, fiber) to fiber value |
|
* @param {string} name - Name for this section |
|
* @returns {Map} The defined section |
|
*/ |
|
defineSection(sectionFn, name) { |
|
const section = new Map(); |
|
|
|
for (const [index, point] of this.points.entries()) { |
|
const fiber = this.fiberBundles.get(index); |
|
if (fiber) { |
|
const value = sectionFn(point, fiber.fiberSpace); |
|
section.set(index, value); |
|
} |
|
} |
|
|
|
// Store named section in all bundles that have values |
|
for (const [index, value] of section.entries()) { |
|
const bundle = this.fiberBundles.get(index); |
|
if (bundle) { |
|
bundle.sections.set(name, value); |
|
} |
|
} |
|
|
|
return section; |
|
} |
|
|
|
/** |
|
* Calculate geodesic distance between points |
|
* @private |
|
* @param {number[]} coords1 - First point coordinates |
|
* @param {number[]} coords2 - Second point coordinates |
|
* @returns {number} Geodesic distance |
|
*/ |
|
_distance(coords1, coords2) { |
|
// For Euclidean metric, this is just Euclidean distance |
|
if (this._isEuclideanMetric()) { |
|
let sum = 0; |
|
for (let i = 0; i < this.dimension; i++) { |
|
const diff = coords1[i] - coords2[i]; |
|
sum += diff * diff; |
|
} |
|
return Math.sqrt(sum); |
|
} |
|
|
|
// For non-Euclidean metrics, use the metric tensor |
|
let sum = 0; |
|
for (let i = 0; i < this.dimension; i++) { |
|
for (let j = 0; j < this.dimension; j++) { |
|
const diff_i = coords1[i] - coords2[i]; |
|
const diff_j = coords1[j] - coords2[j]; |
|
sum += this.metric[i][j] * diff_i * diff_j; |
|
} |
|
} |
|
|
|
return Math.sqrt(Math.abs(sum)); |
|
} |
|
|
|
/** |
|
* Check if the metric is Euclidean |
|
* @private |
|
* @returns {boolean} True if metric is Euclidean |
|
*/ |
|
_isEuclideanMetric() { |
|
for (let i = 0; i < this.dimension; i++) { |
|
for (let j = 0; j < this.dimension; j++) { |
|
if (i === j && this.metric[i][j] !== 1) return false; |
|
if (i !== j && this.metric[i][j] !== 0) return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
/** |
|
* Find nearest neighbors to a point |
|
* @param {string|number} pointIndex - Index of the center point |
|
* @param {number} k - Number of neighbors to find |
|
* @returns {Array} Array of [index, distance] pairs |
|
*/ |
|
findNearestNeighbors(pointIndex, k = 5) { |
|
const point = this.points.get(pointIndex); |
|
if (!point) { |
|
throw new Error(`Point with index ${pointIndex} does not exist`); |
|
} |
|
|
|
const neighbors = []; |
|
|
|
for (const [idx, otherPoint] of this.points.entries()) { |
|
if (idx === pointIndex) continue; |
|
|
|
const distance = this._distance(point.coordinates, otherPoint.coordinates); |
|
neighbors.push([idx, distance]); |
|
} |
|
|
|
// Sort by distance and take first k |
|
neighbors.sort((a, b) => a[1] - b[1]); |
|
return neighbors.slice(0, k); |
|
} |
|
} |
|
|
|
// ============================================================================= |
|
// 2. Four-Tier Architecture Implementation |
|
// ============================================================================= |
|
|
|
/** |
|
* Base 0: Neural Network Specification |
|
* Abstract mathematical foundation for all components |
|
*/ |
|
class Base0 { |
|
/** |
|
* Create a new Base0 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
// Create embedding model for data representation |
|
this.embeddingModel = new EmbeddingModel(config.embedding || {}); |
|
|
|
// Create logic model for computational rules |
|
this.logicModel = new LogicModel(config.logic || {}); |
|
|
|
// Create representation model for visualization |
|
this.representationModel = new RepresentationModel(config.representation || {}); |
|
|
|
// Create spectral operator for communication and coherence |
|
this.spectralOperator = new SpectralOperator(config.spectral || {}); |
|
|
|
// Coherence threshold for validation |
|
this.threshold = config.threshold || 0.8; |
|
} |
|
|
|
/** |
|
* Compute coherence across all models |
|
* @returns {number} Overall coherence value |
|
*/ |
|
computeCoherence() { |
|
const embedCoherence = this.embeddingModel.coherence(); |
|
const logicCoherence = this.logicModel.coherence(); |
|
const reprCoherence = this.representationModel.coherence(); |
|
const spectralCoherence = this.spectralOperator.coherence(); |
|
|
|
// Combine coherence measures with appropriate weights |
|
return (0.3 * embedCoherence + |
|
0.3 * logicCoherence + |
|
0.2 * reprCoherence + |
|
0.2 * spectralCoherence); |
|
} |
|
|
|
/** |
|
* Transform an input according to all models |
|
* @param {*} input - Input data |
|
* @returns {*} Transformed output |
|
*/ |
|
transform(input) { |
|
// Apply transformations while preserving invariants |
|
const embedded = this.embeddingModel.embed(input); |
|
const processed = this.logicModel.process(embedded); |
|
const represented = this.representationModel.represent(processed); |
|
|
|
// Validate coherence of the transformation |
|
const coherence = this.computeCoherence(); |
|
if (coherence < this.threshold) { |
|
throw new Error( |
|
`Transformation violated coherence threshold: ${coherence} < ${this.threshold}` |
|
); |
|
} |
|
|
|
return represented; |
|
} |
|
} |
|
|
|
/** |
|
* Embedding Model for Base0 |
|
* Handles data representation and embedding |
|
*/ |
|
class EmbeddingModel { |
|
/** |
|
* Create a new embedding model |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.dimension = config.dimension || 512; |
|
this.clifford = new CliffordAlgebra(config.signature || [1, 1, 1, 1], |
|
config.cliffordDim || 4); |
|
this.manifold = new ManifoldStructure(config.manifoldDim || 5); |
|
this.cache = new Map(); |
|
this.coherenceThreshold = config.coherenceThreshold || 0.75; |
|
} |
|
|
|
/** |
|
* Embed data into a multivector representation |
|
* @param {*} data - Input data |
|
* @returns {MultivectorRepresentation} Embedded multivector |
|
*/ |
|
embed(data) { |
|
const cacheKey = this._getCacheKey(data); |
|
|
|
// Return cached embedding if available |
|
if (this.cache.has(cacheKey)) { |
|
return this.cache.get(cacheKey); |
|
} |
|
|
|
// Create multivector representation of data |
|
const multivector = this._createMultivector(data); |
|
|
|
// Validate coherence of embedding |
|
const coherence = CoherenceMetrics.normalizedCoherence(multivector); |
|
if (coherence < this.coherenceThreshold) { |
|
this._adjustForCoherence(multivector); |
|
} |
|
|
|
// Cache and return the embedding |
|
this.cache.set(cacheKey, multivector); |
|
return multivector; |
|
} |
|
|
|
/** |
|
* Create a cache key for data |
|
* @private |
|
* @param {*} data - Input data |
|
* @returns {string} Cache key |
|
*/ |
|
_getCacheKey(data) { |
|
if (typeof data === 'string') { |
|
return `str:${data}`; |
|
} else if (typeof data === 'number') { |
|
return `num:${data}`; |
|
} else if (Array.isArray(data)) { |
|
return `arr:${data.join(',')}`; |
|
} else if (data instanceof MultivectorRepresentation) { |
|
return `mv:${data.components.join(',')}`; |
|
} else if (typeof data === 'object') { |
|
return `obj:${JSON.stringify(data)}`; |
|
} |
|
|
|
// Default fallback |
|
return `other:${String(data)}`; |
|
} |
|
|
|
/** |
|
* Create a multivector representation of data |
|
* @private |
|
* @param {*} data - Input data |
|
* @returns {MultivectorRepresentation} Multivector representation |
|
*/ |
|
_createMultivector(data) { |
|
const multivector = new MultivectorRepresentation(this.clifford.dimension); |
|
|
|
if (typeof data === 'string') { |
|
// Embed string data |
|
this._embedStringData(data, multivector); |
|
} else if (typeof data === 'number') { |
|
// Embed numeric data |
|
this._embedNumericData(data, multivector); |
|
} else if (Array.isArray(data)) { |
|
// Embed array data |
|
this._embedArrayData(data, multivector); |
|
} else if (data instanceof MultivectorRepresentation) { |
|
// Copy existing multivector |
|
for (let i = 0; i < this.clifford.bladeCount; i++) { |
|
multivector.components[i] = data.components[i]; |
|
} |
|
} else if (typeof data === 'object') { |
|
// Embed object data |
|
this._embedObjectData(data, multivector); |
|
} |
|
|
|
return multivector; |
|
} |
|
|
|
/** |
|
* Embed string data into a multivector |
|
* @private |
|
* @param {string} str - String data |
|
* @param {MultivectorRepresentation} multivector - Target multivector |
|
*/ |
|
_embedStringData(str, multivector) { |
|
// Start with a seed value in the scalar part |
|
multivector.components[0] = 1.0; |
|
|
|
// Process each character in the string |
|
for (let i = 0; i < str.length; i++) { |
|
const charCode = str.charCodeAt(i); |
|
|
|
// Use character code to influence different blade components |
|
// This spreads the string information across the multivector |
|
|
|
// Update scalar part using a non-linear function |
|
multivector.components[0] *= Math.tanh(charCode * 0.01) + 1.0; |
|
|
|
// Distribute character information across vector components |
|
for (let j = 0; j < Math.min(4, this.clifford.dimension); j++) { |
|
const idx = 1 << j; // 2^j for basis vector |
|
const phase = (i * (j + 1)) % 8 * Math.PI / 4; // Phase based on position |
|
multivector.components[idx] += 0.1 * Math.sin(charCode * 0.1 + phase); |
|
} |
|
|
|
// Influence bivector components for pairs of characters |
|
if (i > 0) { |
|
const prevCharCode = str.charCodeAt(i - 1); |
|
for (let j = 0; j < Math.min(3, this.clifford.dimension - 1); j++) { |
|
const idx = (1 << j) | (1 << (j + 1)); // e_j ∧ e_{j+1} |
|
multivector.components[idx] += 0.01 * Math.sin(prevCharCode * charCode * 0.001); |
|
} |
|
} |
|
} |
|
|
|
// Normalize for consistent magnitude |
|
const norm = multivector.norm(); |
|
if (norm > 0) { |
|
for (let i = 0; i < this.clifford.bladeCount; i++) { |
|
multivector.components[i] /= norm; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Embed numeric data into a multivector |
|
* @private |
|
* @param {number} num - Numeric data |
|
* @param {MultivectorRepresentation} multivector - Target multivector |
|
*/ |
|
_embedNumericData(num, multivector) { |
|
// Scalar part holds the raw value |
|
multivector.components[0] = num; |
|
|
|
// Generate vector components based on transformations of the number |
|
multivector.components[1] = Math.sin(num); |
|
multivector.components[2] = Math.cos(num); |
|
if (this.clifford.dimension > 2) { |
|
multivector.components[4] = Math.sin(num * 2); |
|
multivector.components[8] = Math.cos(num * 2); |
|
} |
|
|
|
// Add bivector components encoding relationships |
|
if (this.clifford.dimension > 1) { |
|
multivector.components[3] = Math.sin(num) * Math.cos(num); // e1 ∧ e2 |
|
} |
|
|
|
// Scale for consistent magnitude |
|
const scale = 1.0 / (1.0 + Math.abs(num)); |
|
for (let i = 1; i < this.clifford.bladeCount; i++) { |
|
multivector.components[i] *= scale; |
|
} |
|
} |
|
|
|
/** |
|
* Embed array data into a multivector |
|
* @private |
|
* @param {Array} arr - Array data |
|
* @param {MultivectorRepresentation} multivector - Target multivector |
|
*/ |
|
_embedArrayData(arr, multivector) { |
|
// Use array length in scalar part |
|
multivector.components[0] = arr.length; |
|
|
|
// Map array values directly to vector components |
|
for (let i = 0; i < Math.min(arr.length, this.clifford.dimension); i++) { |
|
const idx = 1 << i; // 2^i for basis vector e_i |
|
|
|
if (typeof arr[i] === 'number') { |
|
multivector.components[idx] = arr[i]; |
|
} else if (typeof arr[i] === 'string') { |
|
// Simple hash for strings |
|
let hash = 0; |
|
for (let j = 0; j < arr[i].length; j++) { |
|
hash = (hash * 31 + arr[i].charCodeAt(j)) % 1000; |
|
} |
|
multivector.components[idx] = hash / 1000; |
|
} else if (typeof arr[i] === 'boolean') { |
|
multivector.components[idx] = arr[i] ? 1 : -1; |
|
} |
|
} |
|
|
|
// Add bivector components to represent relationships between values |
|
for (let i = 0; i < Math.min(arr.length - 1, this.clifford.dimension - 1); i++) { |
|
if (typeof arr[i] === 'number' && typeof arr[i + 1] === 'number') { |
|
const idx = (1 << i) | (1 << (i + 1)); // e_i ∧ e_{i+1} |
|
multivector.components[idx] = arr[i] - arr[i + 1]; |
|
} |
|
} |
|
|
|
// Normalize |
|
const norm = multivector.norm(); |
|
if (norm > 0) { |
|
for (let i = 0; i < this.clifford.bladeCount; i++) { |
|
multivector.components[i] /= norm; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Embed object data into a multivector |
|
* @private |
|
* @param {Object} obj - Object data |
|
* @param {MultivectorRepresentation} multivector - Target multivector |
|
*/ |
|
_embedObjectData(obj, multivector) { |
|
// Get property names |
|
const keys = Object.keys(obj); |
|
|
|
// Use number of properties in scalar part |
|
multivector.components[0] = keys.length; |
|
|
|
// Process each property |
|
for (let i = 0; i < keys.length; i++) { |
|
const key = keys[i]; |
|
const value = obj[key]; |
|
|
|
// Create a hash for the key |
|
let keyHash = 0; |
|
for (let j = 0; j < key.length; j++) { |
|
keyHash = (keyHash * 31 + key.charCodeAt(j)) % this.clifford.dimension; |
|
} |
|
|
|
// Use key hash to select basis elements to update |
|
const idx1 = 1 << (keyHash % this.clifford.dimension); |
|
|
|
if (typeof value === 'number') { |
|
multivector.components[idx1] += value; |
|
} else if (typeof value === 'string') { |
|
// Simple hash for string values |
|
let hash = 0; |
|
for (let j = 0; j < value.length; j++) { |
|
hash = (hash * 31 + value.charCodeAt(j)) % 1000; |
|
} |
|
multivector.components[idx1] += hash / 1000; |
|
} else if (typeof value === 'boolean') { |
|
multivector.components[idx1] += value ? 1 : -1; |
|
} else if (Array.isArray(value)) { |
|
// For arrays, distribute across multiple components |
|
for (let j = 0; j < Math.min(value.length, 3); j++) { |
|
if (typeof value[j] === 'number') { |
|
const idxArr = 1 << ((keyHash + j) % this.clifford.dimension); |
|
multivector.components[idxArr] += value[j] * 0.1; |
|
} |
|
} |
|
} |
|
} |
|
|
|
// Add higher-grade components for "shape" of the object |
|
if (keys.length > 1) { |
|
for (let i = 0; i < Math.min(keys.length - 1, this.clifford.dimension - 1); i++) { |
|
const key1 = keys[i]; |
|
const key2 = keys[i + 1]; |
|
|
|
if (typeof obj[key1] === 'number' && typeof obj[key2] === 'number') { |
|
const idx = (1 << i) | (1 << (i + 1)); // e_i ∧ e_{i+1} |
|
multivector.components[idx] += obj[key1] * obj[key2] * 0.01; |
|
} |
|
} |
|
} |
|
|
|
// Normalize |
|
const norm = multivector.norm(); |
|
if (norm > 0) { |
|
for (let i = 0; i < this.clifford.bladeCount; i++) { |
|
multivector.components[i] /= norm; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Adjust a multivector to improve coherence |
|
* @private |
|
* @param {MultivectorRepresentation} multivector - Multivector to adjust |
|
*/ |
|
_adjustForCoherence(multivector) { |
|
// Calculate current coherence |
|
const currentCoherence = CoherenceMetrics.normalizedCoherence(multivector); |
|
|
|
// Simple adjustment: reduce higher-grade components |
|
for (let i = 0; i < this.clifford.bladeCount; i++) { |
|
const grade = multivector._gradeOfIndex(i); |
|
if (grade > 1) { |
|
// Reduce higher-grade components to improve coherence |
|
multivector.components[i] *= 0.5; |
|
} |
|
} |
|
|
|
// Check if coherence improved |
|
const newCoherence = CoherenceMetrics.normalizedCoherence(multivector); |
|
|
|
// If coherence didn't improve enough, try a different strategy |
|
if (newCoherence < this.coherenceThreshold && |
|
(newCoherence - currentCoherence) < 0.1) { |
|
|
|
// Boost scalar component to create a more balanced representation |
|
multivector.components[0] += 0.5; |
|
|
|
// Re-normalize |
|
const norm = multivector.norm(); |
|
if (norm > 0) { |
|
for (let i = 0; i < this.clifford.bladeCount; i++) { |
|
multivector.components[i] /= norm; |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Calculate coherence of the embedding model |
|
* @returns {number} Coherence value |
|
*/ |
|
coherence() { |
|
// Implement coherence measurement for the embeddings |
|
let totalCoherence = 0; |
|
let count = 0; |
|
|
|
// Sample cached embeddings to evaluate coherence |
|
for (const embedding of this.cache.values()) { |
|
totalCoherence += CoherenceMetrics.normalizedCoherence(embedding); |
|
count++; |
|
|
|
// Limit the number of samples for performance |
|
if (count >= 10) break; |
|
} |
|
|
|
return count > 0 ? totalCoherence / count : 1.0; |
|
} |
|
} |
|
|
|
/** |
|
* Logic Model for Base0 |
|
* Controls computational rules and transformations |
|
*/ |
|
class LogicModel { |
|
/** |
|
* Create a new logic model |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.operators = new Map(); |
|
this.transformations = new Map(); |
|
this.invariants = []; |
|
|
|
// Initialize with standard operators |
|
this._initializeOperators(config); |
|
} |
|
|
|
/** |
|
* Initialize standard operators |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_initializeOperators(config) { |
|
// Add identity operator |
|
this.registerOperator('identity', input => input); |
|
|
|
// Add geometric product operator |
|
this.registerOperator('geometricProduct', (a, b, clifford) => { |
|
return clifford.geometricProduct(a, b); |
|
}); |
|
|
|
// Add outer product operator |
|
this.registerOperator('outerProduct', (a, b, clifford) => { |
|
return clifford.outerProduct(a, b); |
|
}); |
|
|
|
// Add inner product operator |
|
this.registerOperator('innerProduct', (a, b, clifford) => { |
|
return clifford.innerProduct(a, b); |
|
}); |
|
|
|
// Add grade projection operator |
|
this.registerOperator('grade', (mv, grade) => { |
|
return mv.grade(grade); |
|
}); |
|
|
|
// Add grade inversion operator |
|
this.registerOperator('gradeInversion', mv => { |
|
const result = new MultivectorRepresentation(mv.dimension); |
|
|
|
for (let i = 0; i < mv.bladeCount; i++) { |
|
const grade = mv._gradeOfIndex(i); |
|
const sign = grade % 2 === 0 ? 1 : -1; |
|
result.components[i] = sign * mv.components[i]; |
|
} |
|
|
|
return result; |
|
}); |
|
|
|
// Register transformations |
|
if (config.clifford) { |
|
// Add rotation transformation |
|
this.registerTransformation('rotate', (mv, bivector, angle) => { |
|
return config.clifford.rotate(mv, bivector, angle); |
|
}); |
|
|
|
// Add reflection transformation |
|
this.registerTransformation('reflect', (mv, normal) => { |
|
return config.clifford.reflect(mv, normal); |
|
}); |
|
} |
|
|
|
// Register standard invariants |
|
this.registerInvariant({ |
|
name: 'normPreservation', |
|
validate: (before, after) => { |
|
const normBefore = before.norm(); |
|
const normAfter = after.norm(); |
|
return Math.abs(normBefore - normAfter) < 1e-6; |
|
}, |
|
measure: mv => mv.norm() |
|
}); |
|
|
|
this.registerInvariant({ |
|
name: 'gradeConsistency', |
|
validate: (before, after) => { |
|
// Check if highest non-zero grade is preserved |
|
const gradeBefore = this._highestGrade(before); |
|
const gradeAfter = this._highestGrade(after); |
|
return gradeBefore === gradeAfter; |
|
}, |
|
measure: mv => this._highestGrade(mv) |
|
}); |
|
} |
|
|
|
/** |
|
* Register an operator |
|
* @param {string} name - Operator name |
|
* @param {function} fn - Operator function |
|
* @returns {LogicModel} This logic model for chaining |
|
*/ |
|
registerOperator(name, fn) { |
|
this.operators.set(name, fn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a transformation |
|
* @param {string} name - Transformation name |
|
* @param {function} fn - Transformation function |
|
* @returns {LogicModel} This logic model for chaining |
|
*/ |
|
registerTransformation(name, fn) { |
|
this.transformations.set(name, fn); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register an invariant |
|
* @param {Object} invariant - Invariant object |
|
* @returns {LogicModel} This logic model for chaining |
|
*/ |
|
registerInvariant(invariant) { |
|
this.invariants.push(invariant); |
|
return this; |
|
} |
|
|
|
/** |
|
* Process data according to logical rules |
|
* @param {*} data - Input data |
|
* @returns {*} Processed data |
|
*/ |
|
process(data) { |
|
// Determine applicable operators |
|
const opKeys = this._determineApplicableOperators(data); |
|
|
|
// Apply operations in correct order |
|
let result = data; |
|
for (const key of opKeys) { |
|
const operator = this.operators.get(key); |
|
result = operator.apply(result); |
|
|
|
// Validate invariants after each operation |
|
this._validateInvariants(data, result); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Apply a transformation to data |
|
* @param {string} transformName - Name of the transformation |
|
* @param {*} data - Input data |
|
* @param {*} params - Transformation parameters |
|
* @returns {*} Transformed data |
|
*/ |
|
applyTransformation(transformName, data, ...params) { |
|
const transform = this.transformations.get(transformName); |
|
if (!transform) { |
|
throw new Error(`Unknown transformation: ${transformName}`); |
|
} |
|
|
|
// Apply the transformation |
|
const result = transform(data, ...params); |
|
|
|
// Validate invariants |
|
this._validateInvariants(data, result); |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Determine which operators apply to the data |
|
* @private |
|
* @param {*} data - Input data |
|
* @returns {string[]} Applicable operator names |
|
*/ |
|
_determineApplicableOperators(data) { |
|
// Basic implementation: always use identity operator |
|
return ['identity']; |
|
} |
|
|
|
/** |
|
* Validate that invariants are preserved |
|
* @private |
|
* @param {*} before - Data before operation |
|
* @param {*} after - Data after operation |
|
*/ |
|
_validateInvariants(before, after) { |
|
for (const invariant of this.invariants) { |
|
if (!invariant.validate(before, after)) { |
|
throw new Error(`Operation violated invariant: ${invariant.name}`); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Find the highest non-zero grade in a multivector |
|
* @private |
|
* @param {MultivectorRepresentation} mv - Multivector |
|
* @returns {number} Highest grade |
|
*/ |
|
_highestGrade(mv) { |
|
let maxGrade = 0; |
|
|
|
for (let i = 0; i < mv.bladeCount; i++) { |
|
if (Math.abs(mv.components[i]) > 1e-10) { |
|
const grade = mv._gradeOfIndex(i); |
|
maxGrade = Math.max(maxGrade, grade); |
|
} |
|
} |
|
|
|
return maxGrade; |
|
} |
|
|
|
/** |
|
* Calculate coherence of the logic model |
|
* @returns {number} Coherence value |
|
*/ |
|
coherence() { |
|
// Measure coherence of the logic model |
|
|
|
// Check operator consistency (all needed operators present) |
|
const essentialOperators = ['identity', 'geometricProduct', 'outerProduct']; |
|
let operatorScore = 0; |
|
|
|
for (const op of essentialOperators) { |
|
if (this.operators.has(op)) { |
|
operatorScore += 1; |
|
} |
|
} |
|
operatorScore /= essentialOperators.length; |
|
|
|
// Check invariant coverage |
|
const invariantScore = Math.min(1.0, this.invariants.length / 2); |
|
|
|
// Combine scores |
|
return 0.7 * operatorScore + 0.3 * invariantScore; |
|
} |
|
} |
|
|
|
/** |
|
* Representation Model for Base0 |
|
* Handles visualization and output formatting |
|
*/ |
|
class RepresentationModel { |
|
/** |
|
* Create a new representation model |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.formats = new Map(); |
|
this.symmetries = new Map(); |
|
this.defaultFormat = config.defaultFormat || 'standard'; |
|
|
|
// Initialize with standard formats |
|
this._initializeFormats(config); |
|
} |
|
|
|
/** |
|
* Initialize standard formats |
|
* @private |
|
* @param {Object} config - Configuration options |
|
*/ |
|
_initializeFormats(config) { |
|
// Register standard format |
|
this.registerFormat('standard', { |
|
format: data => { |
|
if (data instanceof MultivectorRepresentation) { |
|
return data.toString(); |
|
} else if (Array.isArray(data)) { |
|
return `[${data.join(', ')}]`; |
|
} else if (typeof data === 'object') { |
|
return JSON.stringify(data, null, 2); |
|
} else { |
|
return String(data); |
|
} |
|
} |
|
}); |
|
|
|
// Register compact format |
|
this.registerFormat('compact', { |
|
format: data => { |
|
if (data instanceof MultivectorRepresentation) { |
|
// Show only non-zero components |
|
const terms = []; |
|
for (let i = 0; i < data.bladeCount; i++) { |
|
if (Math.abs(data.components[i]) > 1e-10) { |
|
if (i === 0) { |
|
terms.push(data.components[i].toFixed(2)); |
|
} else { |
|
let term = data.components[i].toFixed(2); |
|
|
|
// Add basis element label |
|
let basisLabel = ""; |
|
for (let j = 0; j < data.dimension; j++) { |
|
if ((i & (1 << j)) !== 0) { |
|
basisLabel += "e" + (j + 1); |
|
} |
|
} |
|
|
|
terms.push(`${term}${basisLabel}`); |
|
} |
|
} |
|
} |
|
return terms.length > 0 ? terms.join(" + ") : "0"; |
|
} else if (Array.isArray(data)) { |
|
return `[${data.join(',')}]`; |
|
} else if (typeof data === 'object') { |
|
return JSON.stringify(data); |
|
} else { |
|
return String(data); |
|
} |
|
} |
|
}); |
|
|
|
// Register verbose format |
|
this.registerFormat('verbose', { |
|
format: data => { |
|
if (data instanceof MultivectorRepresentation) { |
|
const parts = []; |
|
for (let i = 0; i < data.bladeCount; i++) { |
|
const grade = data._gradeOfIndex(i); |
|
let basisStr = ""; |
|
|
|
if (i === 0) { |
|
basisStr = "scalar"; |
|
} else { |
|
basisStr = ""; |
|
for (let j = 0; j < data.dimension; j++) { |
|
if ((i & (1 << j)) !== 0) { |
|
basisStr += "e" + (j + 1); |
|
} |
|
} |
|
} |
|
|
|
parts.push(`${basisStr}: ${data.components[i].toFixed(6)}`); |
|
} |
|
return parts.join('\n'); |
|
} else { |
|
return this.formats.get('standard').format(data); |
|
} |
|
} |
|
}); |
|
|
|
// Register JSON format |
|
this.registerFormat('json', { |
|
format: data => { |
|
if (data instanceof MultivectorRepresentation) { |
|
const components = {}; |
|
for (let i = 0; i < data.bladeCount; i++) { |
|
if (Math.abs(data.components[i]) > 1e-10) { |
|
let basisLabel; |
|
if (i === 0) { |
|
basisLabel = "scalar"; |
|
} else { |
|
basisLabel = ""; |
|
for (let j = 0; j < data.dimension; j++) { |
|
if ((i & (1 << j)) !== 0) { |
|
basisLabel += "e" + (j + 1); |
|
} |
|
} |
|
} |
|
components[basisLabel] = data.components[i]; |
|
} |
|
} |
|
return JSON.stringify(components, null, 2); |
|
} else { |
|
return JSON.stringify(data, null, 2); |
|
} |
|
} |
|
}); |
|
|
|
// Register symmetries |
|
this.registerSymmetry('standard', []); |
|
this.registerSymmetry('rotational', [ |
|
data => { |
|
if (data instanceof MultivectorRepresentation) { |
|
// Apply a 90-degree rotation in the e1^e2 plane |
|
const bivector = new MultivectorRepresentation(data.dimension); |
|
bivector.components[3] = 1.0; // e1^e2 |
|
|
|
if (config.clifford) { |
|
return config.clifford.rotate(data, bivector, Math.PI/2); |
|
} |
|
} |
|
return data; |
|
} |
|
]); |
|
} |
|
|
|
/** |
|
* Register a format |
|
* @param {string} name - Format name |
|
* @param {Object} format - Format object with format function |
|
* @returns {RepresentationModel} This model for chaining |
|
*/ |
|
registerFormat(name, format) { |
|
this.formats.set(name, format); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a symmetry group |
|
* @param {string} name - Symmetry group name |
|
* @param {function[]} symmetries - Array of symmetry operations |
|
* @returns {RepresentationModel} This model for chaining |
|
*/ |
|
registerSymmetry(name, symmetries) { |
|
this.symmetries.set(name, symmetries); |
|
return this; |
|
} |
|
|
|
/** |
|
* Represent data in the specified format |
|
* @param {*} data - Input data |
|
* @param {string} format - Format name |
|
* @returns {string} Formatted representation |
|
*/ |
|
represent(data, format = null) { |
|
format = format || this.defaultFormat; |
|
|
|
// Get appropriate formatter |
|
const formatter = this.formats.get(format); |
|
if (!formatter) { |
|
throw new Error(`Unknown format: ${format}`); |
|
} |
|
|
|
// Apply symmetry operations if needed |
|
const symmetrized = this._applySymmetries(data, format); |
|
|
|
// Format the data |
|
return formatter.format(symmetrized); |
|
} |
|
|
|
/** |
|
* Apply symmetry operations appropriate for the format |
|
* @private |
|
* @param {*} data - Input data |
|
* @param {string} format - Format name |
|
* @returns {*} Symmetrized data |
|
*/ |
|
_applySymmetries(data, format) { |
|
// Determine which symmetry group to use |
|
const symmetryGroup = format === 'rotational' ? 'rotational' : 'standard'; |
|
const symmetries = this.symmetries.get(symmetryGroup) || []; |
|
|
|
let result = data; |
|
for (const sym of symmetries) { |
|
result = sym(result); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Calculate coherence of the representation model |
|
* @returns {number} Coherence value |
|
*/ |
|
coherence() { |
|
// Measure coherence of representation model |
|
|
|
// Check format coverage (essential formats present) |
|
const essentialFormats = ['standard', 'compact', 'json']; |
|
let formatScore = 0; |
|
|
|
for (const fmt of essentialFormats) { |
|
if (this.formats.has(fmt)) { |
|
formatScore += 1; |
|
} |
|
} |
|
formatScore /= essentialFormats.length; |
|
|
|
// Check symmetry coverage |
|
const symmetryScore = Math.min(1.0, this.symmetries.size / 2); |
|
|
|
// Combine scores |
|
return 0.7 * formatScore + 0.3 * symmetryScore; |
|
} |
|
} |
|
|
|
/** |
|
* Spectral Operator for Base0 |
|
* Facilitates communication and maintains coherence |
|
*/ |
|
class SpectralOperator { |
|
/** |
|
* Create a new spectral operator |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.dimension = config.dimension || 128; |
|
this.operator = this._constructOperator(); |
|
this.eigenvalues = null; |
|
this.eigenvectors = null; |
|
this.primeSet = this._generatePrimes(this.dimension); |
|
} |
|
|
|
/** |
|
* Construct the spectral operator matrix |
|
* @private |
|
* @returns {number[][]} Spectral operator matrix |
|
*/ |
|
_constructOperator() { |
|
const matrix = new Array(this.dimension); |
|
|
|
for (let i = 0; i < this.dimension; i++) { |
|
matrix[i] = new Array(this.dimension).fill(0); |
|
|
|
// Fill with operator values based on prime number relationships |
|
for (let j = 0; j < this.dimension; j++) { |
|
if (this._hasSpectralRelationship(i, j)) { |
|
matrix[i][j] = this._calculateWeight(i, j); |
|
} |
|
} |
|
} |
|
|
|
return matrix; |
|
} |
|
|
|
/** |
|
* Generate prime numbers up to a limit |
|
* @private |
|
* @param {number} limit - Upper bound for primes |
|
* @returns {number[]} Array of prime numbers |
|
*/ |
|
_generatePrimes(limit) { |
|
// Sieve of Eratosthenes |
|
const sieve = new Array(limit + 1).fill(true); |
|
sieve[0] = sieve[1] = false; |
|
|
|
for (let i = 2; i * i <= limit; i++) { |
|
if (sieve[i]) { |
|
for (let j = i * i; j <= limit; j += i) { |
|
sieve[j] = false; |
|
} |
|
} |
|
} |
|
|
|
// Collect primes |
|
const primes = []; |
|
for (let i = 2; i <= limit; i++) { |
|
if (sieve[i]) { |
|
primes.push(i); |
|
} |
|
} |
|
|
|
return primes; |
|
} |
|
|
|
/** |
|
* Determine if two indices have a spectral relationship |
|
* @private |
|
* @param {number} i - First index |
|
* @param {number} j - Second index |
|
* @returns {boolean} True if related |
|
*/ |
|
_hasSpectralRelationship(i, j) { |
|
// Relationship based on prime factorization patterns |
|
if (i === j) return true; // Diagonal elements |
|
|
|
if (i < this.primeSet.length && j < this.primeSet.length) { |
|
// Relationship between prime indices |
|
return (this.primeSet[i] + this.primeSet[j]) % 4 === 1; |
|
} |
|
|
|
// General case: modular relationship with adjustment |
|
return (i * j) % this.dimension < Math.min(i, j); |
|
} |
|
|
|
/** |
|
* Calculate weight for spectral relationship |
|
* @private |
|
* @param {number} i - First index |
|
* @param {number} j - Second index |
|
* @returns {number} Weight value |
|
*/ |
|
_calculateWeight(i, j) { |
|
if (i === j) { |
|
// Diagonal weights follow prime pattern |
|
return i < this.primeSet.length ? 1.0 / (1.0 + Math.log(this.primeSet[i])) : 0.5; |
|
} |
|
|
|
// Off-diagonal weights based on prime relationships |
|
const d = Math.abs(i - j); |
|
return 0.1 * Math.exp(-d / 20) * Math.cos(i * j % 8); |
|
} |
|
|
|
/** |
|
* Compute eigendecomposition of the operator |
|
* @private |
|
*/ |
|
_computeEigendecomposition() { |
|
// This is a simplified placeholder for eigendecomposition |
|
// In a full implementation, we would use a proper linear algebra library |
|
|
|
// For now, we'll just produce a simplified approximation |
|
|
|
// Create identity-like eigenvectors for demonstration |
|
this.eigenvectors = new Array(this.dimension); |
|
this.eigenvalues = new Array(this.dimension); |
|
|
|
for (let i = 0; i < this.dimension; i++) { |
|
this.eigenvectors[i] = new Array(this.dimension).fill(0); |
|
this.eigenvectors[i][i] = 1.0; |
|
|
|
// Approximate eigenvalues with the diagonal |
|
this.eigenvalues[i] = this.operator[i][i]; |
|
} |
|
|
|
// Adjust to make them more realistic |
|
for (let i = 0; i < this.dimension; i++) { |
|
for (let j = 0; j < this.dimension; j++) { |
|
if (i !== j) { |
|
this.eigenvectors[i][j] = 0.01 * Math.sin(i * j); |
|
} |
|
} |
|
|
|
// Normalize |
|
let norm = 0; |
|
for (let j = 0; j < this.dimension; j++) { |
|
norm += this.eigenvectors[i][j] * this.eigenvectors[i][j]; |
|
} |
|
norm = Math.sqrt(norm); |
|
|
|
for (let j = 0; j < this.dimension; j++) { |
|
this.eigenvectors[i][j] /= norm; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Project a vector onto the spectral basis |
|
* @param {number[]|MultivectorRepresentation} vector - Input vector |
|
* @returns {number[]} Projected vector |
|
*/ |
|
project(vector) { |
|
// Ensure eigendecomposition is computed |
|
if (!this.eigenvalues || !this.eigenvectors) { |
|
this._computeEigendecomposition(); |
|
} |
|
|
|
// Convert input to array if it's a multivector |
|
const vectorArray = vector instanceof MultivectorRepresentation ? |
|
Array.from(vector.components) : vector; |
|
|
|
// Ensure vector is the right size |
|
const paddedVector = new Array(this.dimension).fill(0); |
|
for (let i = 0; i < Math.min(vectorArray.length, this.dimension); i++) { |
|
paddedVector[i] = vectorArray[i]; |
|
} |
|
|
|
// Project vector onto eigenvectors |
|
const projection = new Array(this.dimension).fill(0); |
|
|
|
for (let i = 0; i < this.dimension; i++) { |
|
projection[i] = 0; |
|
for (let j = 0; j < this.dimension; j++) { |
|
projection[i] += paddedVector[j] * this.eigenvectors[j][i]; |
|
} |
|
} |
|
|
|
return projection; |
|
} |
|
|
|
/** |
|
* Calculate coherence of the spectral operator |
|
* @returns {number} Coherence value |
|
*/ |
|
coherence() { |
|
// Measure coherence based on spectral properties |
|
|
|
// Ensure eigendecomposition is computed |
|
if (!this.eigenvalues || !this.eigenvectors) { |
|
this._computeEigendecomposition(); |
|
} |
|
|
|
// Calculate spectral gap (difference between largest and second eigenvalues) |
|
// Larger gap indicates higher coherence |
|
let maxEig = -Infinity; |
|
let secondEig = -Infinity; |
|
|
|
for (const eig of this.eigenvalues) { |
|
if (eig > maxEig) { |
|
secondEig = maxEig; |
|
maxEig = eig; |
|
} else if (eig > secondEig) { |
|
secondEig = eig; |
|
} |
|
} |
|
|
|
// Calculate normalized spectral gap |
|
const spectralGap = maxEig > 0 ? (maxEig - secondEig) / maxEig : 0; |
|
|
|
// Calculate eigenvalue distribution coherence |
|
// We want eigenvalues to decay at a reasonable rate |
|
let distributionScore = 0; |
|
const sortedEigs = [...this.eigenvalues].sort((a, b) => b - a); |
|
|
|
for (let i = 1; i < Math.min(10, sortedEigs.length); i++) { |
|
if (sortedEigs[i-1] > 0 && sortedEigs[i] > 0) { |
|
const ratio = sortedEigs[i] / sortedEigs[i-1]; |
|
distributionScore += ratio > 0.5 && ratio < 0.99 ? 1 : 0; |
|
} |
|
} |
|
distributionScore /= Math.min(9, sortedEigs.length - 1); |
|
|
|
// Combine scores |
|
return 0.7 * spectralGap + 0.3 * distributionScore; |
|
} |
|
} |
|
|
|
/** |
|
* Base 1: Resource Implementation |
|
* Provides lowest-level concrete implementation |
|
*/ |
|
class Base1 extends Base0 { |
|
/** |
|
* Create a new Base1 instance |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
super(config); |
|
|
|
// Create runtime model for execution |
|
this.runtimeModel = new RuntimeModel(config.runtime || {}); |
|
|
|
// Create observation model for monitoring |
|
this.observationModel = new ObservationModel(config.observation || {}); |
|
|
|
// Create interaction model for state changes |
|
this.interactionModel = new InteractionModel(config.interaction || {}); |
|
|
|
// Enhanced representation model |
|
this.representationModel = new EnhancedRepresentationModel( |
|
config.representation || {}, |
|
this.representationModel |
|
); |
|
} |
|
|
|
/** |
|
* Execute operations through the runtime |
|
* @param {Object} operation - Operation to execute |
|
* @param {Object} parameters - Operation parameters |
|
* @returns {*} Operation result |
|
*/ |
|
execute(operation, parameters) { |
|
// Log the operation |
|
this.observationModel.recordOperation(operation, parameters); |
|
|
|
// Execute via runtime model |
|
const result = this.runtimeModel.execute(operation, parameters); |
|
|
|
// Update state via interaction model if needed |
|
if (operation.modifiesState) { |
|
this.interactionModel.updateState(operation, parameters, result); |
|
} |
|
|
|
// Return appropriately represented result |
|
return this.representationModel.represent(result); |
|
} |
|
|
|
/** |
|
* Allocate a resource |
|
* @param {string} resourceType - Type of resource |
|
* @param {number} amount - Amount to allocate |
|
* @returns {Object} Allocation result |
|
*/ |
|
allocate(resourceType, amount) { |
|
return this.execute({ |
|
name: 'allocate', |
|
modifiesState: true |
|
}, { resourceType, amount }); |
|
} |
|
|
|
/** |
|
* Release a resource |
|
* @param {string} resourceId - Resource ID to release |
|
* @returns {Object} Release result |
|
*/ |
|
release(resourceId) { |
|
return this.execute({ |
|
name: 'release', |
|
modifiesState: true |
|
}, { resourceId }); |
|
} |
|
|
|
/** |
|
* Query resources |
|
* @param {string} resourceType - Type of resource to query |
|
* @param {Object} filter - Query filter |
|
* @returns {Array} Query results |
|
*/ |
|
query(resourceType, filter = {}) { |
|
return this.execute({ |
|
name: 'query', |
|
modifiesState: false |
|
}, { resourceType, filter }); |
|
} |
|
} |
|
|
|
/** |
|
* Runtime Model for Base1 |
|
* Executes operations and manages execution coherence |
|
*/ |
|
class RuntimeModel { |
|
/** |
|
* Create a new runtime model |
|
* @param {Object} config - Configuration options |
|
*/ |
|
constructor(config = {}) { |
|
this.operations = new Map(); |
|
this.coherenceValidators = new Map(); |
|
this.coherenceThreshold = config.coherenceThreshold || 0.7; |
|
|
|
// Initialize standard operations |
|
this._initializeOperations(); |
|
} |
|
|
|
/** |
|
* Initialize standard operations |
|
* @private |
|
*/ |
|
_initializeOperations() { |
|
// Register allocate operation |
|
this.registerOperation('allocate', (params) => { |
|
const { resourceType, amount } = params; |
|
|
|
// In the reference implementation, we just create a mock allocation |
|
return { |
|
id: `alloc-${Date.now()}-${Math.floor(Math.random() * 1000)}`, |
|
resourceType, |
|
amount, |
|
allocated: true |
|
}; |
|
}); |
|
|
|
// Register release operation |
|
this.registerOperation('release', (params) => { |
|
const { resourceId } = params; |
|
|
|
return { |
|
id: resourceId, |
|
released: true |
|
}; |
|
}); |
|
|
|
// Register query operation |
|
this.registerOperation('query', (params) => { |
|
const { resourceType, filter } = params; |
|
|
|
// In the reference implementation, we just return a mock result |
|
return [ |
|
{ |
|
id: `${resourceType}-1`, |
|
status: 'available', |
|
capacity: 100, |
|
used: 30 |
|
}, |
|
{ |
|
id: `${resourceType}-2`, |
|
status: 'available', |
|
capacity: 50, |
|
used: 10 |
|
} |
|
]; |
|
}); |
|
|
|
// Register coherence validators |
|
this.registerCoherenceValidator('allocate', (params, result) => { |
|
// A simple coherence check for allocation |
|
return result.allocated && result.resourceType === params.resourceType ? 1.0 : 0.0; |
|
}); |
|
|
|
this.registerCoherenceValidator('release', (params, result) => { |
|
// A simple coherence check for release |
|
return result.released && result.id === params.resourceId ? 1.0 : 0.0; |
|
}); |
|
} |
|
|
|
/** |
|
* Register an operation |
|
* @param {string} name - Operation name |
|
* @param {function} impl - Operation implementation |
|
* @returns {RuntimeModel} This model for chaining |
|
*/ |
|
registerOperation(name, impl) { |
|
this.operations.set(name, impl); |
|
return this; |
|
} |
|
|
|
/** |
|
* Register a coherence validator |
|
* @param {string} opName - Operation name |
|
* @param {function} validator - Validator function |
|
* @returns {RuntimeModel} This model for chaining |
|
*/ |
|
registerCoherenceValidator(opName, validator) { |
|
this.coherenceValidators.set(opName, validator); |
|
return this; |
|
} |
|
|
|
/** |
|
* Execute an operation |
|
* @param {Object} operation - Operation to execute |
|
* @param {Object} parameters - Operation parameters |
|
* @returns {*} Operation result |
|
*/ |
|
execute(operation, parameters) { |
|
const opName = operation.name; |
|
|
|
// Find operation implementation |
|
const impl = this.operations.get(opName); |
|
if (!impl) { |
|
throw new Error(`Unknown operation: ${opName}`); |
|
} |
|
|
|
// Validate parameters |
|
this._validateParameters(opName, parameters); |
|
|
|
// Execute the operation |
|
const result = impl(parameters); |
|
|
|
// Validate coherence of the result |
|
this._validateCoherence(opName, parameters, result); |
|
|
|
return result; |
|
} |
|
|
|
/** |
|
* Validate parameters for an operation |
|
* @private |
|
* @param {string} opName - Operation name |
|
* @param {Object} parameters - Operation parameters |
|
*/ |
|
_validateParameters(opName, parameters) { |
|
// Basic validation - check for required parameters |
|
switch (opName) { |
|
case 'allocate': |
|
if (!parameters.resourceType) { |
|
throw new Error("Missing required parameter: resourceType"); |
|
} |
|
if (typeof parameters.amount !== 'number' || parameters.amount <= 0) { |
|
throw new Error("Invalid amount: must be a positive number"); |
|
} |
|
break; |
|
|
|
case 'release': |
|
if (!parameters.resourceId) { |
|
throw new Error("Missing required parameter: resourceId"); |
|
} |
|
break; |
|
|
|
case 'query': |
|
if (!parameters.resourceType) { |
|
throw new Error("Missing required parameter: resourceType"); |
|
} |
|
break; |
|
} |
|
} |
|
|
|
/** |
|
* Validate coherence of operation result |
|
* @private |
|
* @param {string} opName - Operation name |
|
* @param {Object} parameters - Operation parameters |
|
* @param {*} result - Operation result |
|
*/ |
|
_validateCoherence(opName, parameters, result) { |
|
const validator = this.coherenceValidators.get(opName); |
|
if (validator) { |
|
const coherence = validator(parameters, result); |
|
if (coherence < this.coherenceThreshold) { |
|
throw new Error( |
|
`Operation ${opName} violated coherence: ${coherence} < ${this.coherenceThreshold}` |
|
); |
|
} |
|
} |
|
} |
|
} |