wifi-densepose/vendor/sublinear-time-solver/dist/emergence/feedback-loops.js

601 lines
24 KiB
JavaScript

/**
* Feedback Loop System for Behavior Modification
* Enables the system to learn from outcomes and modify behavior dynamically
*/
export class FeedbackLoopSystem {
feedbackHistory = [];
behaviorModifications = [];
adaptationRules = [];
behaviorParameters = new Map();
performanceMetrics = new Map();
learningCurves = new Map();
constructor() {
this.initializeDefaultRules();
this.initializeDefaultParameters();
}
/**
* Process feedback and trigger behavior modifications
*/
async processFeedback(feedback) {
// Store feedback
this.feedbackHistory.push(feedback);
// Update performance metrics
this.updatePerformanceMetrics(feedback);
// Find applicable adaptation rules
const applicableRules = this.adaptationRules.filter(rule => rule.trigger(feedback));
// Generate behavior modifications
const modifications = [];
for (const rule of applicableRules) {
const currentState = this.getCurrentBehaviorState();
const ruleMods = rule.modification(feedback, currentState);
modifications.push(...ruleMods);
}
// Apply modifications
for (const modification of modifications) {
await this.applyBehaviorModification(modification);
}
// Learn from the feedback pattern
await this.learnFromFeedbackPattern(feedback);
return modifications;
}
/**
* Register new adaptation rule
*/
registerAdaptationRule(rule) {
this.adaptationRules.push(rule);
// Sort by priority
this.adaptationRules.sort((a, b) => b.priority - a.priority);
}
/**
* Create feedback loop for continuous improvement
*/
createContinuousImprovementLoop(component, metric) {
const improvementRule = {
trigger: (feedback) => feedback.source === component,
modification: (feedback, currentState) => {
const currentMetric = this.getMetricTrend(metric);
const isImproving = this.isMetricImproving(currentMetric);
if (!isImproving) {
return this.generateImprovementModifications(component, feedback);
}
return [];
},
priority: 0.7,
learningRate: 0.1,
category: 'continuous_improvement'
};
this.registerAdaptationRule(improvementRule);
}
/**
* Implement reinforcement learning feedback loop
*/
createReinforcementLoop(actionSpace, rewardFunction) {
const reinforcementRule = {
trigger: (feedback) => actionSpace.includes(feedback.action),
modification: (feedback, currentState) => {
const reward = rewardFunction(feedback.outcome);
return this.updateActionProbabilities(feedback.action, reward, actionSpace);
},
priority: 0.8,
learningRate: 0.15,
category: 'reinforcement_learning'
};
this.registerAdaptationRule(reinforcementRule);
}
/**
* Create exploration-exploitation feedback loop
*/
createExplorationExploitationLoop(explorationRate = 0.1) {
const explorationRule = {
trigger: (feedback) => feedback.type === 'unexpected' || feedback.surprise > 0.7,
modification: (feedback, currentState) => {
// Increase exploration if we're getting unexpected results
if (feedback.surprise > 0.7) {
return [{
component: 'exploration_system',
parameter: 'exploration_rate',
oldValue: currentState.exploration_rate || explorationRate,
newValue: Math.min(1.0, (currentState.exploration_rate || explorationRate) + 0.1),
reason: 'High surprise level - increase exploration',
confidence: 0.8,
timestamp: Date.now(),
expectedImprovement: 0.2
}];
}
// Decrease exploration if we're getting predictable good results
if (feedback.type === 'success' && feedback.surprise < 0.2) {
return [{
component: 'exploration_system',
parameter: 'exploration_rate',
oldValue: currentState.exploration_rate || explorationRate,
newValue: Math.max(0.01, (currentState.exploration_rate || explorationRate) - 0.05),
reason: 'Low surprise, high success - decrease exploration',
confidence: 0.7,
timestamp: Date.now(),
expectedImprovement: 0.1
}];
}
return [];
},
priority: 0.6,
learningRate: 0.05,
category: 'exploration_exploitation'
};
this.registerAdaptationRule(explorationRule);
}
/**
* Implement meta-learning feedback loop
*/
createMetaLearningLoop() {
const metaLearningRule = {
trigger: (feedback) => this.feedbackHistory.length % 50 === 0, // Every 50 feedback signals
modification: (feedback, currentState) => {
// Analyze learning patterns and adjust learning rates
const learningEffectiveness = this.analyzeLearningEffectiveness();
return this.adjustLearningParameters(learningEffectiveness);
},
priority: 0.9,
learningRate: 0.02,
category: 'meta_learning'
};
this.registerAdaptationRule(metaLearningRule);
}
/**
* Create adaptive complexity feedback loop
*/
createComplexityAdaptationLoop() {
const complexityRule = {
trigger: (feedback) => true, // Always applicable
modification: (feedback, currentState) => {
const performanceTrend = this.getRecentPerformanceTrend();
const currentComplexity = currentState.reasoning_complexity || 0.5;
// If performance is declining, try different complexity levels
if (performanceTrend < 0.3) {
const newComplexity = this.adaptComplexity(currentComplexity, feedback);
if (newComplexity !== currentComplexity) {
return [{
component: 'reasoning_system',
parameter: 'reasoning_complexity',
oldValue: currentComplexity,
newValue: newComplexity,
reason: `Performance trend: ${performanceTrend.toFixed(2)} - adjusting complexity`,
confidence: 0.6,
timestamp: Date.now(),
expectedImprovement: Math.abs(newComplexity - currentComplexity) * 0.5
}];
}
}
return [];
},
priority: 0.5,
learningRate: 0.08,
category: 'adaptive_complexity'
};
this.registerAdaptationRule(complexityRule);
}
/**
* Apply behavior modification to system parameters
*/
async applyBehaviorModification(modification) {
const key = `${modification.component}.${modification.parameter}`;
// Store old value for potential rollback
const oldValue = this.behaviorParameters.get(key);
// Apply new value
this.behaviorParameters.set(key, modification.newValue);
// Record the modification
this.behaviorModifications.push(modification);
// Update performance tracking
this.updateLearningCurve(modification.component, modification.expectedImprovement);
console.log(`Applied behavior modification: ${modification.component}.${modification.parameter}
${JSON.stringify(modification.oldValue)} -> ${JSON.stringify(modification.newValue)}`);
}
/**
* Learn from feedback patterns to create new adaptation rules
*/
async learnFromFeedbackPattern(feedback) {
// Look for patterns in recent feedback
const recentFeedback = this.feedbackHistory.slice(-20);
// Detect recurring failure patterns
const failurePattern = this.detectFailurePattern(recentFeedback);
if (failurePattern) {
const newRule = this.createRuleFromPattern(failurePattern);
this.registerAdaptationRule(newRule);
}
// Detect success patterns
const successPattern = this.detectSuccessPattern(recentFeedback);
if (successPattern) {
const reinforcementRule = this.createReinforcementRule(successPattern);
this.registerAdaptationRule(reinforcementRule);
}
}
/**
* Initialize default adaptation rules
*/
initializeDefaultRules() {
// Error correction rule
this.registerAdaptationRule({
trigger: (feedback) => feedback.type === 'failure',
modification: (feedback, currentState) => [{
component: feedback.source,
parameter: 'error_tolerance',
oldValue: currentState.error_tolerance || 0.1,
newValue: Math.min(1.0, (currentState.error_tolerance || 0.1) + 0.05),
reason: 'Failure detected - increase error tolerance',
confidence: 0.7,
timestamp: Date.now(),
expectedImprovement: 0.1
}],
priority: 0.8,
learningRate: 0.1,
category: 'error_correction'
});
// Success reinforcement rule
this.registerAdaptationRule({
trigger: (feedback) => feedback.type === 'success' && feedback.utility > 0.8,
modification: (feedback, currentState) => [{
component: feedback.source,
parameter: 'success_bias',
oldValue: currentState.success_bias || 0.5,
newValue: Math.min(1.0, (currentState.success_bias || 0.5) + 0.02),
reason: 'High utility success - reinforce successful patterns',
confidence: 0.9,
timestamp: Date.now(),
expectedImprovement: 0.05
}],
priority: 0.7,
learningRate: 0.05,
category: 'success_reinforcement'
});
// Novelty adaptation rule
this.registerAdaptationRule({
trigger: (feedback) => feedback.type === 'novel',
modification: (feedback, currentState) => [{
component: 'novelty_system',
parameter: 'novelty_weight',
oldValue: currentState.novelty_weight || 0.3,
newValue: Math.min(1.0, (currentState.novelty_weight || 0.3) + 0.1),
reason: 'Novel outcome detected - increase novelty seeking',
confidence: 0.6,
timestamp: Date.now(),
expectedImprovement: 0.15
}],
priority: 0.5,
learningRate: 0.08,
category: 'novelty_adaptation'
});
}
/**
* Initialize default behavior parameters
*/
initializeDefaultParameters() {
this.behaviorParameters.set('reasoning_system.complexity', 0.5);
this.behaviorParameters.set('exploration_system.exploration_rate', 0.1);
this.behaviorParameters.set('learning_system.learning_rate', 0.1);
this.behaviorParameters.set('novelty_system.novelty_weight', 0.3);
this.behaviorParameters.set('error_system.error_tolerance', 0.1);
this.behaviorParameters.set('success_system.success_bias', 0.5);
}
/**
* Update performance metrics based on feedback
*/
updatePerformanceMetrics(feedback) {
const metricKey = `${feedback.source}_${feedback.type}`;
const metrics = this.performanceMetrics.get(metricKey) || [];
const score = this.calculatePerformanceScore(feedback);
metrics.push(score);
// Keep only recent metrics (last 100)
if (metrics.length > 100) {
metrics.shift();
}
this.performanceMetrics.set(metricKey, metrics);
}
/**
* Calculate performance score from feedback
*/
calculatePerformanceScore(feedback) {
let score = 0.5; // Neutral baseline
switch (feedback.type) {
case 'success':
score = 0.8 + feedback.utility * 0.2;
break;
case 'failure':
score = 0.2 - feedback.utility * 0.2;
break;
case 'partial':
score = 0.5 + feedback.utility * 0.3;
break;
case 'unexpected':
score = 0.6 + feedback.surprise * 0.4;
break;
case 'novel':
score = 0.7 + (feedback.utility + feedback.surprise) * 0.15;
break;
}
return Math.max(0, Math.min(1, score));
}
/**
* Get current behavior state
*/
getCurrentBehaviorState() {
const state = {};
for (const [key, value] of this.behaviorParameters) {
const [component, parameter] = key.split('.');
if (!state[component])
state[component] = {};
state[component][parameter] = value;
// Also add flat structure for easier access
state[parameter] = value;
}
return state;
}
/**
* Get metric trend for analysis
*/
getMetricTrend(metric) {
return this.performanceMetrics.get(metric) || [];
}
/**
* Check if metric is improving
*/
isMetricImproving(metricValues) {
if (metricValues.length < 5)
return true; // Not enough data
const recent = metricValues.slice(-5);
const older = metricValues.slice(-10, -5);
if (older.length === 0)
return true;
const recentAvg = recent.reduce((a, b) => a + b, 0) / recent.length;
const olderAvg = older.reduce((a, b) => a + b, 0) / older.length;
return recentAvg > olderAvg;
}
/**
* Generate improvement modifications
*/
generateImprovementModifications(component, feedback) {
const modifications = [];
// Suggest parameter adjustments based on failure type
if (feedback.type === 'failure') {
modifications.push({
component,
parameter: 'robustness',
oldValue: 0.5,
newValue: 0.7,
reason: 'Failure detected - increase robustness',
confidence: 0.6,
timestamp: Date.now(),
expectedImprovement: 0.2
});
}
return modifications;
}
/**
* Update action probabilities based on reinforcement learning
*/
updateActionProbabilities(action, reward, actionSpace) {
const modifications = [];
// Increase probability of rewarded actions
if (reward > 0.5) {
modifications.push({
component: 'action_system',
parameter: `${action}_probability`,
oldValue: 1.0 / actionSpace.length, // Uniform prior
newValue: Math.min(0.8, (1.0 / actionSpace.length) + reward * 0.1),
reason: `Positive reward (${reward.toFixed(2)}) for action ${action}`,
confidence: reward,
timestamp: Date.now(),
expectedImprovement: reward * 0.2
});
}
return modifications;
}
/**
* Analyze learning effectiveness
*/
analyzeLearningEffectiveness() {
const recentModifications = this.behaviorModifications.slice(-20);
if (recentModifications.length === 0)
return 0.5;
const actualImprovements = recentModifications.map(mod => {
// Compare expected vs actual improvement
const component = mod.component;
const metricKey = `${component}_improvement`;
const metrics = this.performanceMetrics.get(metricKey) || [];
if (metrics.length < 2)
return mod.expectedImprovement;
const beforeImprovement = metrics[metrics.length - 2] || 0;
const afterImprovement = metrics[metrics.length - 1] || 0;
return afterImprovement - beforeImprovement;
});
const avgActualImprovement = actualImprovements.reduce((a, b) => a + b, 0) / actualImprovements.length;
const avgExpectedImprovement = recentModifications.reduce((sum, mod) => sum + mod.expectedImprovement, 0) / recentModifications.length;
return avgExpectedImprovement > 0 ? avgActualImprovement / avgExpectedImprovement : 0.5;
}
/**
* Adjust learning parameters based on effectiveness
*/
adjustLearningParameters(effectiveness) {
const modifications = [];
// Adjust learning rates based on effectiveness
for (const rule of this.adaptationRules) {
const newLearningRate = effectiveness > 0.8 ?
Math.min(0.5, rule.learningRate * 1.1) :
Math.max(0.01, rule.learningRate * 0.9);
if (Math.abs(newLearningRate - rule.learningRate) > 0.01) {
modifications.push({
component: 'meta_learning',
parameter: `${rule.category}_learning_rate`,
oldValue: rule.learningRate,
newValue: newLearningRate,
reason: `Learning effectiveness: ${effectiveness.toFixed(2)} - adjust learning rate`,
confidence: 0.7,
timestamp: Date.now(),
expectedImprovement: Math.abs(newLearningRate - rule.learningRate) * 2
});
rule.learningRate = newLearningRate;
}
}
return modifications;
}
/**
* Get recent performance trend
*/
getRecentPerformanceTrend() {
const allMetrics = [];
for (const metrics of this.performanceMetrics.values()) {
allMetrics.push(...metrics.slice(-5)); // Recent 5 values from each metric
}
if (allMetrics.length === 0)
return 0.5;
return allMetrics.reduce((a, b) => a + b, 0) / allMetrics.length;
}
/**
* Adapt complexity based on performance
*/
adaptComplexity(currentComplexity, feedback) {
if (feedback.type === 'failure' && feedback.utility < 0.3) {
// Failure with low utility - try lower complexity
return Math.max(0.1, currentComplexity - 0.1);
}
if (feedback.type === 'success' && feedback.surprise > 0.7) {
// Successful but surprising - might benefit from higher complexity
return Math.min(1.0, currentComplexity + 0.1);
}
return currentComplexity;
}
/**
* Update learning curve for component
*/
updateLearningCurve(component, improvement) {
const curve = this.learningCurves.get(component) || [];
curve.push(improvement);
if (curve.length > 50) {
curve.shift();
}
this.learningCurves.set(component, curve);
}
/**
* Detect failure patterns in recent feedback
*/
detectFailurePattern(feedback) {
const failures = feedback.filter(f => f.type === 'failure');
if (failures.length < 3)
return null;
// Look for common failure contexts
const contexts = failures.map(f => f.context);
const commonContext = this.findCommonElements(contexts);
if (Object.keys(commonContext).length > 0) {
return {
type: 'recurring_failure',
context: commonContext,
frequency: failures.length / feedback.length
};
}
return null;
}
/**
* Detect success patterns in recent feedback
*/
detectSuccessPattern(feedback) {
const successes = feedback.filter(f => f.type === 'success' && f.utility > 0.7);
if (successes.length < 2)
return null;
return {
type: 'success_pattern',
actions: successes.map(s => s.action),
avgUtility: successes.reduce((sum, s) => sum + s.utility, 0) / successes.length
};
}
/**
* Create adaptation rule from detected pattern
*/
createRuleFromPattern(pattern) {
return {
trigger: (feedback) => {
// Check if feedback matches the pattern context
for (const [key, value] of Object.entries(pattern.context)) {
if (feedback.context[key] !== value)
return false;
}
return true;
},
modification: (feedback, currentState) => [{
component: 'pattern_system',
parameter: 'pattern_avoidance',
oldValue: 0,
newValue: 1,
reason: `Avoiding detected failure pattern: ${JSON.stringify(pattern.context)}`,
confidence: pattern.frequency,
timestamp: Date.now(),
expectedImprovement: pattern.frequency * 0.5
}],
priority: 0.8,
learningRate: 0.1,
category: 'pattern_avoidance'
};
}
/**
* Create reinforcement rule from success pattern
*/
createReinforcementRule(pattern) {
return {
trigger: (feedback) => pattern.actions.includes(feedback.action),
modification: (feedback, currentState) => [{
component: 'pattern_system',
parameter: 'pattern_reinforcement',
oldValue: 0,
newValue: pattern.avgUtility,
reason: `Reinforcing successful action pattern`,
confidence: pattern.avgUtility,
timestamp: Date.now(),
expectedImprovement: pattern.avgUtility * 0.3
}],
priority: 0.7,
learningRate: 0.08,
category: 'pattern_reinforcement'
};
}
/**
* Find common elements across contexts
*/
findCommonElements(contexts) {
if (contexts.length === 0)
return {};
const common = {};
const first = contexts[0] || {};
for (const [key, value] of Object.entries(first)) {
if (contexts.every(ctx => ctx[key] === value)) {
common[key] = value;
}
}
return common;
}
/**
* Get feedback loop statistics
*/
getStats() {
return {
totalFeedback: this.feedbackHistory.length,
totalModifications: this.behaviorModifications.length,
activeRules: this.adaptationRules.length,
behaviorParameters: this.behaviorParameters.size,
recentPerformance: this.getRecentPerformanceTrend(),
learningEffectiveness: this.analyzeLearningEffectiveness(),
mostActiveComponents: this.getMostActiveComponents(),
adaptationCategories: this.getAdaptationCategories()
};
}
getMostActiveComponents() {
const componentCounts = new Map();
for (const mod of this.behaviorModifications) {
componentCounts.set(mod.component, (componentCounts.get(mod.component) || 0) + 1);
}
return Array.from(componentCounts.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(entry => entry[0]);
}
getAdaptationCategories() {
return [...new Set(this.adaptationRules.map(rule => rule.category))];
}
}