File size: 2,610 Bytes
fc93158
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import type { OmegaOperationalTurnMemoryEntry } from "./operational-memory.js";

export type OmegaUtilityBreakdown = {
  taskProgressGain: number;
  uncertaintyReduction: number;
  futureFailureRiskReduction: number;
  tokenCost: number;
  wallTimeCost: number;
  disruptionCost: number;
  total: number;
  expectedUtility?: number;
};

export type OmegaBudgetUsage = {
  observedTurns: number;
  estimatedLlmCalls: number;
  observedWallTimeMs: number;
  budgetPressure: number;
  turnPressure?: number;
};

function clampUnit(value: number): number {
  return Math.max(0, Math.min(1, value));
}

export function deriveOmegaBudgetUsage(params: {
  operationalSignals: OmegaOperationalTurnMemoryEntry[];
  maxTurnsPerCycle: number;
  maxLlmCalls: number;
  maxWallTimeMs: number;
}): OmegaBudgetUsage {
  const recentSignals = params.operationalSignals.slice(-3);
  const observedTurns = recentSignals.length;
  const estimatedLlmCalls = recentSignals.length;
  const observedWallTimeMs = recentSignals.reduce(
    (total, entry) => total + entry.latencyBreakdown.totalMs,
    0,
  );
  const turnPressure = params.maxTurnsPerCycle > 0 ? observedTurns / params.maxTurnsPerCycle : 1;
  const llmPressure = params.maxLlmCalls > 0 ? estimatedLlmCalls / params.maxLlmCalls : 1;
  const wallTimePressure = params.maxWallTimeMs > 0 ? observedWallTimeMs / params.maxWallTimeMs : 1;
  return {
    observedTurns,
    estimatedLlmCalls,
    observedWallTimeMs,
    budgetPressure: clampUnit(Math.max(turnPressure, llmPressure, wallTimePressure)),
    turnPressure,
  };
}

export function computeOmegaUtilityBreakdown(params: {
  urgency: number;
  expectedUtility: number;
  uncertaintyReduction: number;
  estimatedCost: number;
  failureRisk: number;
  budgetPressure?: number;
}): OmegaUtilityBreakdown {
  const taskProgressGain = clampUnit(params.urgency) * 0.35;
  const uncertaintyReduction = clampUnit(params.uncertaintyReduction) * 0.2;
  const futureFailureRiskReduction = clampUnit(params.expectedUtility) * 0.3;
  const tokenCost = clampUnit(params.estimatedCost) * 0.08;
  const wallTimeCost = clampUnit(params.estimatedCost) * 0.05;
  const disruptionCost =
    clampUnit(params.failureRisk) * 0.08 + clampUnit(params.budgetPressure ?? 0) * 0.06;
  return {
    taskProgressGain,
    uncertaintyReduction,
    futureFailureRiskReduction,
    tokenCost,
    wallTimeCost,
    disruptionCost,
    total:
      taskProgressGain +
      uncertaintyReduction +
      futureFailureRiskReduction -
      tokenCost -
      wallTimeCost -
      disruptionCost,
    expectedUtility: params.expectedUtility,
  };
}