openskynet / src /skynet /adaptive-continuity.ts
Darochin's picture
Add complete Skynet Brain Lab source tree
59936ca verified
export type AdaptiveContinuityInputs = {
focusStreak: number;
retainedRatio: number;
sameMode: boolean;
modeShiftCount: number;
};
export type AdaptiveContinuityPrior = {
ruleContinuityScore?: number;
adaptiveContinuityScore?: number;
adaptiveRetention?: number;
};
export type AdaptiveContinuitySnapshot = {
ruleContinuityScore: number;
adaptiveContinuityScore: number;
adaptiveRetention: number;
flux: number;
};
function clamp01(value: number): number {
return Math.max(0, Math.min(1, value));
}
function sigmoid(value: number): number {
return 1 / (1 + Math.exp(-value));
}
export function deriveRuleContinuityScore(params: AdaptiveContinuityInputs): number {
return clamp01(
0.35 +
Math.min(params.focusStreak, 4) * 0.12 +
params.retainedRatio * 0.22 +
(params.sameMode ? 0.1 : 0) -
Math.min(params.modeShiftCount, 4) * 0.04,
);
}
export function deriveAdaptiveContinuitySnapshot(params: {
inputs: AdaptiveContinuityInputs;
prior?: AdaptiveContinuityPrior;
}): AdaptiveContinuitySnapshot {
const ruleContinuityScore = deriveRuleContinuityScore(params.inputs);
const priorRule = params.prior?.ruleContinuityScore ?? ruleContinuityScore;
const priorAdaptive = params.prior?.adaptiveContinuityScore ?? ruleContinuityScore;
const focusFlux = params.inputs.focusStreak <= 1 ? 0.18 : 0;
const modeFlux = params.inputs.sameMode ? 0 : 0.12;
const scoreFlux = Math.abs(ruleContinuityScore - priorRule);
const retentionFlux = 1 - params.inputs.retainedRatio;
const flux = clamp01(scoreFlux + focusFlux + modeFlux + retentionFlux * 0.15);
const modulation = sigmoid((flux - 0.18) * 6);
const adaptiveRetention = clamp01(Math.max(0.55, Math.min(0.98, 1 - 0.35 * modulation)));
const adaptiveContinuityScore = clamp01(
adaptiveRetention * priorAdaptive + (1 - adaptiveRetention) * ruleContinuityScore,
);
return {
ruleContinuityScore,
adaptiveContinuityScore,
adaptiveRetention,
flux,
};
}